tom-select-rails 2.2.2 → 2.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tom-select-rails/version.rb +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/constants.d.ts +12 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/constants.js +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/constants.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/highlight.d.ts +13 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/highlight.js +69 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/highlight.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/microevent.d.ts +20 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/microevent.js +64 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/microevent.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/microplugin.d.ts +71 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/microplugin.js +112 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/contrib/microplugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/defaults.d.ts +52 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/defaults.js +84 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/defaults.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/getSettings.d.ts +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/getSettings.js +146 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/getSettings.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/package.json +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/caret_position/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/caret_position/plugin.js +66 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/caret_position/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/change_listener/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/change_listener/plugin.js +25 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/change_listener/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/checkbox_options/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/checkbox_options/plugin.js +108 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/checkbox_options/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/checkbox_options/types.d.ts +14 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/checkbox_options/types.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/checkbox_options/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/clear_button/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/clear_button/plugin.js +44 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/clear_button/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/clear_button/types.d.ts +5 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/clear_button/types.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/clear_button/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/drag_drop/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/drag_drop/plugin.js +117 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/drag_drop/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_header/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_header/plugin.js +50 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_header/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_header/types.d.ts +8 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_header/types.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_header/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_input/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_input/plugin.js +77 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/dropdown_input/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/input_autogrow/plugin.d.ts +15 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/input_autogrow/plugin.js +47 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/input_autogrow/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/no_active_items/plugin.d.ts +15 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/no_active_items/plugin.js +22 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/no_active_items/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/no_backspace_delete/plugin.d.ts +15 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/no_backspace_delete/plugin.js +28 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/no_backspace_delete/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/optgroup_columns/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/optgroup_columns/plugin.js +51 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/optgroup_columns/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/remove_button/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/remove_button/plugin.js +61 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/remove_button/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/remove_button/types.d.ts +6 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/remove_button/types.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/remove_button/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/restore_on_backspace/plugin.d.ts +21 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/restore_on_backspace/plugin.js +24 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/restore_on_backspace/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/virtual_scroll/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/virtual_scroll/plugin.js +170 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/plugins/virtual_scroll/plugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.d.ts +2 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js +33 -5497
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.d.ts +594 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js +2147 -4555
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.d.ts +2 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js +15 -4934
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/core.d.ts +49 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/core.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/core.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/index.d.ts +2 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/index.js +19 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/index.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/settings.d.ts +79 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/settings.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/types/settings.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/utils.d.ts +95 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/utils.js +130 -114
- data/vendor/assets/javascripts/tom-select-rails/cjs/utils.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/vanilla.d.ts +76 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/vanilla.js +190 -0
- data/vendor/assets/javascripts/tom-select-rails/cjs/vanilla.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/constants.d.ts +12 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/constants.js +13 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/constants.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/highlight.d.ts +13 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/highlight.js +64 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/highlight.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/microevent.d.ts +20 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/microevent.js +61 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/microevent.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/microplugin.d.ts +71 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/microplugin.js +109 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/contrib/microplugin.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/defaults.d.ts +52 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/defaults.js +82 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/defaults.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/getSettings.d.ts +3 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/getSettings.js +143 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/getSettings.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js +26 -78
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.js +3 -2
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js +47 -96
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/types.d.ts +14 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/types.js +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js +3 -75
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/types.d.ts +5 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/types.js +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.js +187 -29
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js +27 -97
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/types.d.ts +8 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/types.js +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js +46 -117
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.d.ts +15 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js +4 -6
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.d.ts +15 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.js +2 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.d.ts +15 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js +2 -2
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js +3 -80
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.d.ts +17 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js +38 -104
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/types.d.ts +6 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/types.js +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/types.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.d.ts +21 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.js +2 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.d.ts +16 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js +56 -112
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.d.ts +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js +17 -5481
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.d.ts +594 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js +2127 -4536
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.d.ts +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js +8 -4927
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/types/core.d.ts +49 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/core.js +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/core.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/index.d.ts +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/index.js +3 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/index.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/settings.d.ts +79 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/settings.js +2 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/types/settings.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/utils.d.ts +95 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/utils.js +121 -107
- data/vendor/assets/javascripts/tom-select-rails/esm/utils.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/vanilla.d.ts +76 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/vanilla.js +172 -0
- data/vendor/assets/javascripts/tom-select-rails/esm/vanilla.js.map +1 -0
- data/vendor/assets/javascripts/tom-select-rails/js/package.json +1 -0
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js +161 -213
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/change_listener.js +3 -2
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/change_listener.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js +47 -96
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js +71 -143
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/drag_drop.js +187 -29
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/drag_drop.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js +100 -170
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js +212 -283
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js +4 -6
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_active_items.js +2 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_active_items.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js +2 -2
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js +84 -161
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js +132 -198
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/restore_on_backspace.js +2 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/restore_on_backspace.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js +270 -326
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js +1367 -1918
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js +186 -173
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js +1400 -1883
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js +366 -343
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js +1369 -1915
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js +339 -326
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/contrib/microevent.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/contrib/microplugin.d.ts +4 -4
- data/vendor/assets/javascripts/tom-select-rails/types/defaults.d.ts +1 -0
- data/vendor/assets/javascripts/tom-select-rails/types/getSettings.d.ts +2 -2
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/caret_position/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/change_listener/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/checkbox_options/plugin.d.ts +4 -3
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/checkbox_options/types.d.ts +14 -0
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/clear_button/plugin.d.ts +2 -2
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/clear_button/types.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/drag_drop/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/dropdown_header/plugin.d.ts +2 -2
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/dropdown_header/types.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/dropdown_input/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/input_autogrow/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/no_active_items/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/no_backspace_delete/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/optgroup_columns/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/remove_button/plugin.d.ts +2 -2
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/remove_button/types.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/restore_on_backspace/plugin.d.ts +3 -3
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/virtual_scroll/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/tom-select.complete.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/tom-select.d.ts +12 -14
- data/vendor/assets/javascripts/tom-select-rails/types/tom-select.popular.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/types/core.d.ts +17 -16
- data/vendor/assets/javascripts/tom-select-rails/types/types/index.d.ts +2 -2
- data/vendor/assets/javascripts/tom-select-rails/types/types/settings.d.ts +6 -5
- data/vendor/assets/javascripts/tom-select-rails/types/utils.d.ts +21 -2
- data/vendor/assets/javascripts/tom-select-rails/types/vanilla.d.ts +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css +227 -219
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css +247 -254
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css +213 -210
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css +223 -215
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/scss/_dropdown.scss +7 -10
- data/vendor/assets/stylesheets/tom-select-rails/scss/_items.scss +7 -9
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/checkbox_options.scss +8 -2
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/clear_button.scss +16 -14
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/drag_drop.scss +6 -12
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/dropdown_header.scss +3 -2
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/dropdown_input.scss +7 -11
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/input_autogrow.scss +0 -3
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/optgroup_columns.scss +7 -5
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/remove_button.scss +20 -20
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.bootstrap4.scss +33 -39
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.bootstrap5.scss +54 -80
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.default.scss +16 -14
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.scss +52 -57
- metadata +154 -7
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"tom-select.complete.min.js","sources":["../../src/contrib/microevent.ts","../../node_modules/@orchidjs/unicode-variants/dist/esm/regex.js","../../node_modules/@orchidjs/unicode-variants/dist/esm/strings.js","../../node_modules/@orchidjs/unicode-variants/dist/esm/index.js","../../node_modules/@orchidjs/sifter/dist/esm/utils.js","../../node_modules/@orchidjs/sifter/dist/esm/sifter.js","../../node_modules/@orchidjs/sifter/lib/utils.ts","../../src/vanilla.ts","../../src/contrib/highlight.ts","../../src/constants.ts","../../src/defaults.ts","../../src/utils.ts","../../src/getSettings.ts","../../src/tom-select.ts","../../src/contrib/microplugin.ts","../../src/tom-select.complete.ts","../../src/plugins/change_listener/plugin.ts","../../src/plugins/checkbox_options/plugin.ts","../../src/plugins/clear_button/plugin.ts","../../src/plugins/drag_drop/plugin.ts","../../src/plugins/dropdown_header/plugin.ts","../../src/plugins/caret_position/plugin.ts","../../src/plugins/dropdown_input/plugin.ts","../../src/plugins/input_autogrow/plugin.ts","../../src/plugins/no_backspace_delete/plugin.ts","../../src/plugins/no_active_items/plugin.ts","../../src/plugins/optgroup_columns/plugin.ts","../../src/plugins/remove_button/plugin.ts","../../src/plugins/restore_on_backspace/plugin.ts","../../src/plugins/virtual_scroll/plugin.ts"],"sourcesContent":["/**\n * MicroEvent - to make any js object an event emitter\n *\n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * @author Jerome Etienne (https://github.com/jeromeetienne)\n */\n\ntype TCallback = (...args:any) => any;\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events:string,callback:(event:string)=>any){\n\tevents.split(/\\s+/).forEach((event) =>{\n\t\tcallback(event);\n\t});\n}\n\nexport default class MicroEvent{\n\n\tpublic _events: {[key:string]:TCallback[]};\n\n\tconstructor(){\n\t\tthis._events = {};\n\t}\n\n\ton(events:string, fct:TCallback){\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = this._events[event] || [];\n\t\t\tevent_array.push(fct);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\toff(events:string, fct:TCallback){\n\t\tvar n = arguments.length;\n\t\tif( n === 0 ){\n\t\t\tthis._events = {};\n\t\t\treturn;\n\t\t}\n\n\t\tforEvents(events,(event) => {\n\n\t\t\tif (n === 1){\n\t\t\t\tdelete this._events[event];\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst event_array = this._events[event];\n\t\t\tif( event_array === undefined ) return;\n\n\t\t\tevent_array.splice(event_array.indexOf(fct), 1);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\ttrigger(events:string, ...args:any){\n\t\tvar self = this;\n\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = self._events[event];\n\t\t\tif( event_array === undefined ) return;\n\t\t\tevent_array.forEach(fct => {\n\t\t\t\tfct.apply(self, args );\n\t\t\t});\n\n\t\t});\n\t}\n};\n","/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n * @param {string[]} chars\n * @return {string}\n */\nconst arrayToPattern = chars => {\n chars = chars.filter(Boolean);\n\n if (chars.length < 2) {\n return chars[0] || '';\n }\n\n return maxValueLength(chars) == 1 ? '[' + chars.join('') + ']' : '(?:' + chars.join('|') + ')';\n};\n/**\n * @param {string[]} array\n * @return {string}\n */\n\nconst sequencePattern = array => {\n if (!hasDuplicates(array)) {\n return array.join('');\n }\n\n let pattern = '';\n let prev_char_count = 0;\n\n const prev_pattern = () => {\n if (prev_char_count > 1) {\n pattern += '{' + prev_char_count + '}';\n }\n };\n\n array.forEach((char, i) => {\n if (char === array[i - 1]) {\n prev_char_count++;\n return;\n }\n\n prev_pattern();\n pattern += char;\n prev_char_count = 1;\n });\n prev_pattern();\n return pattern;\n};\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n * @param {Set<string>} chars\n * @return {string}\n */\n\nconst setToPattern = chars => {\n let array = toArray(chars);\n return arrayToPattern(array);\n};\n/**\n *\n * https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values\n * @param {any[]} array\n */\n\nconst hasDuplicates = array => {\n return new Set(array).size !== array.length;\n};\n/**\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n * @param {string} str\n * @return {string}\n */\n\nconst escape_regex = str => {\n return (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n/**\n * Return the max length of array values\n * @param {string[]} array\n *\n */\n\nconst maxValueLength = array => {\n return array.reduce((longest, value) => Math.max(longest, unicodeLength(value)), 0);\n};\n/**\n * @param {string} str\n */\n\nconst unicodeLength = str => {\n return toArray(str).length;\n};\n/**\n * @param {any} p\n * @return {any[]}\n */\n\nconst toArray = p => Array.from(p);\n\nexport { arrayToPattern, escape_regex, hasDuplicates, maxValueLength, sequencePattern, setToPattern, toArray, unicodeLength };\n//# sourceMappingURL=regex.js.map\n","/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n * @param {string} input\n * @return {string[][]}\n */\nconst allSubstrings = input => {\n if (input.length === 1) return [[input]];\n /** @type {string[][]} */\n\n let result = [];\n const start = input.substring(1);\n const suba = allSubstrings(start);\n suba.forEach(function (subresult) {\n let tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n return result;\n};\n\nexport { allSubstrings };\n//# sourceMappingURL=strings.js.map\n","/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\nimport { toArray, setToPattern, escape_regex, arrayToPattern, sequencePattern } from './regex.js';\nexport { escape_regex } from './regex.js';\nimport { allSubstrings } from './strings.js';\n\n/**\n * @typedef {{[key:string]:string}} TUnicodeMap\n * @typedef {{[key:string]:Set<string>}} TUnicodeSets\n * @typedef {[[number,number]]} TCodePoints\n * @typedef {{folded:string,composed:string,code_point:number}} TCodePointObj\n * @typedef {{start:number,end:number,length:number,substr:string}} TSequencePart\n */\n/** @type {TCodePoints} */\n\nconst code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\n/** @type {TUnicodeMap} */\n\nlet unicode_map;\n/** @type {RegExp} */\n\nlet multi_char_reg;\nconst max_char_length = 3;\n/** @type {TUnicodeMap} */\n\nconst latin_convert = {};\n/** @type {TUnicodeMap} */\n\nconst latin_condensed = {\n '/': '⁄∕',\n '0': '߀',\n \"a\": \"ⱥɐɑ\",\n \"aa\": \"ꜳ\",\n \"ae\": \"æǽǣ\",\n \"ao\": \"ꜵ\",\n \"au\": \"ꜷ\",\n \"av\": \"ꜹꜻ\",\n \"ay\": \"ꜽ\",\n \"b\": \"ƀɓƃ\",\n \"c\": \"ꜿƈȼↄ\",\n \"d\": \"đɗɖᴅƌꮷԁɦ\",\n \"e\": \"ɛǝᴇɇ\",\n \"f\": \"ꝼƒ\",\n \"g\": \"ǥɠꞡᵹꝿɢ\",\n \"h\": \"ħⱨⱶɥ\",\n \"i\": \"ɨı\",\n \"j\": \"ɉȷ\",\n \"k\": \"ƙⱪꝁꝃꝅꞣ\",\n \"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n \"m\": \"ɱɯϻ\",\n \"n\": \"ꞥƞɲꞑᴎлԉ\",\n \"o\": \"øǿɔɵꝋꝍᴑ\",\n \"oe\": \"œ\",\n \"oi\": \"ƣ\",\n \"oo\": \"ꝏ\",\n \"ou\": \"ȣ\",\n \"p\": \"ƥᵽꝑꝓꝕρ\",\n \"q\": \"ꝗꝙɋ\",\n \"r\": \"ɍɽꝛꞧꞃ\",\n \"s\": \"ßȿꞩꞅʂ\",\n \"t\": \"ŧƭʈⱦꞇ\",\n \"th\": \"þ\",\n \"tz\": \"ꜩ\",\n \"u\": \"ʉ\",\n \"v\": \"ʋꝟʌ\",\n \"vy\": \"ꝡ\",\n \"w\": \"ⱳ\",\n \"y\": \"ƴɏỿ\",\n \"z\": \"ƶȥɀⱬꝣ\",\n \"hv\": \"ƕ\"\n};\n\nfor (let latin in latin_condensed) {\n let unicode = latin_condensed[latin] || '';\n\n for (let i = 0; i < unicode.length; i++) {\n let char = unicode.substring(i, i + 1);\n latin_convert[char] = latin;\n }\n}\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n *\n * @param {TCodePoints=} _code_points\n */\n\nconst initialize = _code_points => {\n if (unicode_map !== undefined) return;\n unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n * @param {string} str\n * @param {string} form\n */\n\nconst normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n * @param {string} str\n * @return {string}\n */\n\nconst asciifold = str => {\n return toArray(str).reduce(\n /**\n * @param {string} result\n * @param {string} char\n */\n (result, char) => {\n return result + _asciifold(char);\n }, '');\n};\n/**\n * @param {string} str\n * @return {string}\n */\n\nconst _asciifold = str => {\n str = normalize(str).toLowerCase().replace(convert_pat, (\n /** @type {string} */\n char) => {\n return latin_convert[char] || '';\n }); //return str;\n\n return normalize(str, 'NFC');\n};\n/**\n * Generate a list of unicode variants from the list of code points\n * @param {TCodePoints} code_points\n * @yield {TCodePointObj}\n */\n\nfunction* generator(code_points) {\n for (const [code_point_min, code_point_max] of code_points) {\n for (let i = code_point_min; i <= code_point_max; i++) {\n let composed = String.fromCharCode(i);\n let folded = asciifold(composed);\n\n if (folded == composed.toLowerCase()) {\n continue;\n } // skip when folded is a string longer than 3 characters long\n // bc the resulting regex patterns will be long\n // eg:\n // folded صلى الله عليه وسلم length 18 code point 65018\n // folded جل جلاله length 8 code point 65019\n\n\n if (folded.length > max_char_length) {\n continue;\n }\n\n if (folded.length == 0) {\n continue;\n }\n\n yield {\n folded: folded,\n composed: composed,\n code_point: i\n };\n }\n }\n}\n/**\n * Generate a unicode map from the list of code points\n * @param {TCodePoints} code_points\n * @return {TUnicodeSets}\n */\n\nconst generateSets = code_points => {\n /** @type {{[key:string]:Set<string>}} */\n const unicode_sets = {};\n /**\n * @param {string} folded\n * @param {string} to_add\n */\n\n const addMatching = (folded, to_add) => {\n /** @type {Set<string>} */\n const folded_set = unicode_sets[folded] || new Set();\n const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n\n if (to_add.match(patt)) {\n return;\n }\n\n folded_set.add(escape_regex(to_add));\n unicode_sets[folded] = folded_set;\n };\n\n for (let value of generator(code_points)) {\n addMatching(value.folded, value.folded);\n addMatching(value.folded, value.composed);\n }\n\n return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n *\n * @param {TCodePoints} code_points\n * @return {TUnicodeMap}\n */\n\nconst generateMap = code_points => {\n /** @type {TUnicodeSets} */\n const unicode_sets = generateSets(code_points);\n /** @type {TUnicodeMap} */\n\n const unicode_map = {};\n /** @type {string[]} */\n\n let multi_char = [];\n\n for (let folded in unicode_sets) {\n let set = unicode_sets[folded];\n\n if (set) {\n unicode_map[folded] = setToPattern(set);\n }\n\n if (folded.length > 1) {\n multi_char.push(escape_regex(folded));\n }\n }\n\n multi_char.sort((a, b) => b.length - a.length);\n const multi_char_patt = arrayToPattern(multi_char);\n multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n return unicode_map;\n};\n/**\n * Map each element of an array from it's folded value to all possible unicode matches\n * @param {string[]} strings\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst mapSequence = (strings, min_replacement = 1) => {\n let chars_replaced = 0;\n strings = strings.map(str => {\n if (unicode_map[str]) {\n chars_replaced += str.length;\n }\n\n return unicode_map[str] || str;\n });\n\n if (chars_replaced >= min_replacement) {\n return sequencePattern(strings);\n }\n\n return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n *\n *\n * @param {string} str\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst substringsToPattern = (str, min_replacement = 1) => {\n min_replacement = Math.max(min_replacement, str.length - 1);\n return arrayToPattern(allSubstrings(str).map(sub_pat => {\n return mapSequence(sub_pat, min_replacement);\n }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n *\n * @param {Sequence[]} sequences\n * @param {boolean} all\n */\n\nconst sequencesToPattern = (sequences, all = true) => {\n let min_replacement = sequences.length > 1 ? 1 : 0;\n return arrayToPattern(sequences.map(sequence => {\n let seq = [];\n const len = all ? sequence.length() : sequence.length() - 1;\n\n for (let j = 0; j < len; j++) {\n seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n }\n\n return sequencePattern(seq);\n }));\n};\n/**\n * Return true if the sequence is already in the sequences\n * @param {Sequence} needle_seq\n * @param {Sequence[]} sequences\n */\n\n\nconst inSequences = (needle_seq, sequences) => {\n for (const seq of sequences) {\n if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n continue;\n }\n\n if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n continue;\n }\n\n let needle_parts = needle_seq.parts;\n /**\n * @param {TSequencePart} part\n */\n\n const filter = part => {\n for (const needle_part of needle_parts) {\n if (needle_part.start === part.start && needle_part.substr === part.substr) {\n return false;\n }\n\n if (part.length == 1 || needle_part.length == 1) {\n continue;\n } // check for overlapping parts\n // a = ['::=','==']\n // b = ['::','===']\n // a = ['r','sm']\n // b = ['rs','m']\n\n\n if (part.start < needle_part.start && part.end > needle_part.start) {\n return true;\n }\n\n if (needle_part.start < part.start && needle_part.end > part.start) {\n return true;\n }\n }\n\n return false;\n };\n\n let filtered = seq.parts.filter(filter);\n\n if (filtered.length > 0) {\n continue;\n }\n\n return true;\n }\n\n return false;\n};\n\nclass Sequence {\n constructor() {\n /** @type {TSequencePart[]} */\n this.parts = [];\n /** @type {string[]} */\n\n this.substrs = [];\n this.start = 0;\n this.end = 0;\n }\n /**\n * @param {TSequencePart|undefined} part\n */\n\n\n add(part) {\n if (part) {\n this.parts.push(part);\n this.substrs.push(part.substr);\n this.start = Math.min(part.start, this.start);\n this.end = Math.max(part.end, this.end);\n }\n }\n\n last() {\n return this.parts[this.parts.length - 1];\n }\n\n length() {\n return this.parts.length;\n }\n /**\n * @param {number} position\n * @param {TSequencePart} last_piece\n */\n\n\n clone(position, last_piece) {\n let clone = new Sequence();\n let parts = JSON.parse(JSON.stringify(this.parts));\n let last_part = parts.pop();\n\n for (const part of parts) {\n clone.add(part);\n }\n\n let last_substr = last_piece.substr.substring(0, position - last_part.start);\n let clone_last_len = last_substr.length;\n clone.add({\n start: last_part.start,\n end: last_part.start + clone_last_len,\n length: clone_last_len,\n substr: last_substr\n });\n return clone;\n }\n\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n * ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n *\n * @param {string} str\n * @return {string|undefined}\n */\n\n\nconst getPattern = str => {\n initialize();\n str = asciifold(str);\n let pattern = '';\n let sequences = [new Sequence()];\n\n for (let i = 0; i < str.length; i++) {\n let substr = str.substring(i);\n let match = substr.match(multi_char_reg);\n const char = str.substring(i, i + 1);\n const match_str = match ? match[0] : null; // loop through sequences\n // add either the char or multi_match\n\n let overlapping = [];\n let added_types = new Set();\n\n for (const sequence of sequences) {\n const last_piece = sequence.last();\n\n if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n // if we have a multi match\n if (match_str) {\n const len = match_str.length;\n sequence.add({\n start: i,\n end: i + len,\n length: len,\n substr: match_str\n });\n added_types.add('1');\n } else {\n sequence.add({\n start: i,\n end: i + 1,\n length: 1,\n substr: char\n });\n added_types.add('2');\n }\n } else if (match_str) {\n let clone = sequence.clone(i, last_piece);\n const len = match_str.length;\n clone.add({\n start: i,\n end: i + len,\n length: len,\n substr: match_str\n });\n overlapping.push(clone);\n } else {\n // don't add char\n // adding would create invalid patterns: 234 => [2,34,4]\n added_types.add('3');\n }\n } // if we have overlapping\n\n\n if (overlapping.length > 0) {\n // ['ii','iii'] before ['i','i','iii']\n overlapping = overlapping.sort((a, b) => {\n return a.length() - b.length();\n });\n\n for (let clone of overlapping) {\n // don't add if we already have an equivalent sequence\n if (inSequences(clone, sequences)) {\n continue;\n }\n\n sequences.push(clone);\n }\n\n continue;\n } // if we haven't done anything unique\n // clean up the patterns\n // helps keep patterns smaller\n // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n\n\n if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n pattern += sequencesToPattern(sequences, false);\n let new_seq = new Sequence();\n const old_seq = sequences[0];\n\n if (old_seq) {\n new_seq.add(old_seq.last());\n }\n\n sequences = [new_seq];\n }\n }\n\n pattern += sequencesToPattern(sequences, true);\n return pattern;\n};\n\nexport { _asciifold, asciifold, code_points, generateMap, generateSets, generator, getPattern, initialize, mapSequence, normalize, substringsToPattern, unicode_map };\n//# sourceMappingURL=index.js.map\n","/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */\nimport { asciifold } from '@orchidjs/unicode-variants';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nconst getAttr = (obj, name) => {\n if (!obj) return;\n return obj[name];\n};\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\n\nconst getAttrNesting = (obj, name) => {\n if (!obj) return;\n var part,\n names = name.split(\".\");\n\n while ((part = names.shift()) && (obj = obj[part]));\n\n return obj;\n};\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\n\nconst scoreValue = (value, token, weight) => {\n var score, pos;\n if (!value) return 0;\n value = value + '';\n if (token.regex == null) return 0;\n pos = value.search(token.regex);\n if (pos === -1) return 0;\n score = token.string.length / value.length;\n if (pos === 0) score += 0.5;\n return score * weight;\n};\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\n\nconst propToArray = (obj, key) => {\n var value = obj[key];\n if (typeof value == 'function') return value;\n\n if (value && !Array.isArray(value)) {\n obj[key] = [value];\n }\n};\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\n\nconst iterate = (object, callback) => {\n if (Array.isArray(object)) {\n object.forEach(callback);\n } else {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n callback(object[key], key);\n }\n }\n }\n};\nconst cmp = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n\n a = asciifold(a + '').toLowerCase();\n b = asciifold(b + '').toLowerCase();\n if (a > b) return 1;\n if (b > a) return -1;\n return 0;\n};\n\nexport { cmp, getAttr, getAttrNesting, iterate, propToArray, scoreValue };\n//# sourceMappingURL=utils.js.map\n","/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */\nimport { iterate, cmp, propToArray, getAttrNesting, getAttr, scoreValue } from './utils.js';\nexport { cmp, getAttr, getAttrNesting, iterate, propToArray, scoreValue } from './utils.js';\nimport { escape_regex, getPattern } from '@orchidjs/unicode-variants';\nexport { getPattern } from '@orchidjs/unicode-variants';\n\n/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\nclass Sifter {\n // []|{};\n\n /**\n * Textually searches arrays and hashes of objects\n * by property (or multiple properties). Designed\n * specifically for autocomplete.\n *\n */\n constructor(items, settings) {\n this.items = void 0;\n this.settings = void 0;\n this.items = items;\n this.settings = settings || {\n diacritics: true\n };\n }\n\n /**\n * Splits a search string into an array of individual\n * regexps to be used to match results.\n *\n */\n tokenize(query, respect_word_boundaries, weights) {\n if (!query || !query.length) return [];\n const tokens = [];\n const words = query.split(/\\s+/);\n var field_regex;\n\n if (weights) {\n field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\\:(.*)$');\n }\n\n words.forEach(word => {\n let field_match;\n let field = null;\n let regex = null; // look for \"field:query\" tokens\n\n if (field_regex && (field_match = word.match(field_regex))) {\n field = field_match[1];\n word = field_match[2];\n }\n\n if (word.length > 0) {\n if (this.settings.diacritics) {\n regex = getPattern(word) || null;\n } else {\n regex = escape_regex(word);\n }\n\n if (regex && respect_word_boundaries) regex = \"\\\\b\" + regex;\n }\n\n tokens.push({\n string: word,\n regex: regex ? new RegExp(regex, 'iu') : null,\n field: field\n });\n });\n return tokens;\n }\n\n /**\n * Returns a function to be used to score individual results.\n *\n * Good matches will have a higher score than poor matches.\n * If an item is not a match, 0 will be returned by the function.\n *\n * @returns {T.ScoreFn}\n */\n getScoreFunction(query, options) {\n var search = this.prepareSearch(query, options);\n return this._getScoreFunction(search);\n }\n /**\n * @returns {T.ScoreFn}\n *\n */\n\n\n _getScoreFunction(search) {\n const tokens = search.tokens,\n token_count = tokens.length;\n\n if (!token_count) {\n return function () {\n return 0;\n };\n }\n\n const fields = search.options.fields,\n weights = search.weights,\n field_count = fields.length,\n getAttrFn = search.getAttrFn;\n\n if (!field_count) {\n return function () {\n return 1;\n };\n }\n /**\n * Calculates the score of an object\n * against the search query.\n *\n */\n\n\n const scoreObject = function () {\n if (field_count === 1) {\n return function (token, data) {\n const field = fields[0].field;\n return scoreValue(getAttrFn(data, field), token, weights[field] || 1);\n };\n }\n\n return function (token, data) {\n var sum = 0; // is the token specific to a field?\n\n if (token.field) {\n const value = getAttrFn(data, token.field);\n\n if (!token.regex && value) {\n sum += 1 / field_count;\n } else {\n sum += scoreValue(value, token, 1);\n }\n } else {\n iterate(weights, (weight, field) => {\n sum += scoreValue(getAttrFn(data, field), token, weight);\n });\n }\n\n return sum / field_count;\n };\n }();\n\n if (token_count === 1) {\n return function (data) {\n return scoreObject(tokens[0], data);\n };\n }\n\n if (search.options.conjunction === 'and') {\n return function (data) {\n var score,\n sum = 0;\n\n for (let token of tokens) {\n score = scoreObject(token, data);\n if (score <= 0) return 0;\n sum += score;\n }\n\n return sum / token_count;\n };\n } else {\n return function (data) {\n var sum = 0;\n iterate(tokens, token => {\n sum += scoreObject(token, data);\n });\n return sum / token_count;\n };\n }\n }\n\n /**\n * Returns a function that can be used to compare two\n * results, for sorting purposes. If no sorting should\n * be performed, `null` will be returned.\n *\n * @return function(a,b)\n */\n getSortFunction(query, options) {\n var search = this.prepareSearch(query, options);\n return this._getSortFunction(search);\n }\n\n _getSortFunction(search) {\n var implicit_score,\n sort_flds = [];\n const self = this,\n options = search.options,\n sort = !search.query && options.sort_empty ? options.sort_empty : options.sort;\n\n if (typeof sort == 'function') {\n return sort.bind(this);\n }\n /**\n * Fetches the specified sort field value\n * from a search result item.\n *\n */\n\n\n const get_field = function get_field(name, result) {\n if (name === '$score') return result.score;\n return search.getAttrFn(self.items[result.id], name);\n }; // parse options\n\n\n if (sort) {\n for (let s of sort) {\n if (search.query || s.field !== '$score') {\n sort_flds.push(s);\n }\n }\n } // the \"$score\" field is implied to be the primary\n // sort field, unless it's manually specified\n\n\n if (search.query) {\n implicit_score = true;\n\n for (let fld of sort_flds) {\n if (fld.field === '$score') {\n implicit_score = false;\n break;\n }\n }\n\n if (implicit_score) {\n sort_flds.unshift({\n field: '$score',\n direction: 'desc'\n });\n } // without a search.query, all items will have the same score\n\n } else {\n sort_flds = sort_flds.filter(fld => fld.field !== '$score');\n } // build function\n\n\n const sort_flds_count = sort_flds.length;\n\n if (!sort_flds_count) {\n return null;\n }\n\n return function (a, b) {\n var result, field;\n\n for (let sort_fld of sort_flds) {\n field = sort_fld.field;\n let multiplier = sort_fld.direction === 'desc' ? -1 : 1;\n result = multiplier * cmp(get_field(field, a), get_field(field, b));\n if (result) return result;\n }\n\n return 0;\n };\n }\n\n /**\n * Parses a search query and returns an object\n * with tokens and fields ready to be populated\n * with results.\n *\n */\n prepareSearch(query, optsUser) {\n const weights = {};\n var options = Object.assign({}, optsUser);\n propToArray(options, 'sort');\n propToArray(options, 'sort_empty'); // convert fields to new format\n\n if (options.fields) {\n propToArray(options, 'fields');\n const fields = [];\n options.fields.forEach(field => {\n if (typeof field == 'string') {\n field = {\n field: field,\n weight: 1\n };\n }\n\n fields.push(field);\n weights[field.field] = 'weight' in field ? field.weight : 1;\n });\n options.fields = fields;\n }\n\n return {\n options: options,\n query: query.toLowerCase().trim(),\n tokens: this.tokenize(query, options.respect_word_boundaries, weights),\n total: 0,\n items: [],\n weights: weights,\n getAttrFn: options.nesting ? getAttrNesting : getAttr\n };\n }\n\n /**\n * Searches through all items and returns a sorted array of matches.\n *\n */\n search(query, options) {\n var self = this,\n score,\n search;\n search = this.prepareSearch(query, options);\n options = search.options;\n query = search.query; // generate result scoring function\n\n const fn_score = options.score || self._getScoreFunction(search); // perform search and sort\n\n\n if (query.length) {\n iterate(self.items, (item, id) => {\n score = fn_score(item);\n\n if (options.filter === false || score > 0) {\n search.items.push({\n 'score': score,\n 'id': id\n });\n }\n });\n } else {\n iterate(self.items, (_, id) => {\n search.items.push({\n 'score': 1,\n 'id': id\n });\n });\n }\n\n const fn_sort = self._getSortFunction(search);\n\n if (fn_sort) search.items.sort(fn_sort); // apply limits\n\n search.total = search.items.length;\n\n if (typeof options.limit === 'number') {\n search.items = search.items.slice(0, options.limit);\n }\n\n return search;\n }\n\n}\n\nexport { Sifter };\n//# sourceMappingURL=sifter.js.map\n","\nimport { asciifold } from '@orchidjs/unicode-variants';\nimport * as T from './types';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tif( token.regex == null ) return 0;\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\n\tif( typeof value == 'function' ) return value;\n\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","\nimport { iterate } from '@orchidjs/sifter/lib/utils';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n","/**\n * highlight v3 | MIT license | Johann Burkard <jb@eaio.com>\n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal <beatgates@gmail.com> 2011-6-24 (added regex)\n * - Modified by Brian Reavis <brian@thirdroute.com> 2012-8-27 (cleanup)\n */\n\nimport {replaceNode} from '../vanilla';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t// Soccer -> <span class=\"highlight\">Soc</span>cer for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0]!.length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\tconst highlightChildren = ( node:Element ):void => {\n\t\tif( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' ) ){\n\t\t\tArray.from(node.childNodes).forEach(element => {\n\t\t\t\thighlightRecursive(element);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tconst highlightRecursive = ( node:Node|Element ):number => {\n\n\t\tif( node.nodeType === 3 ){\n\t\t\treturn highlightText(node as Text);\n\t\t}\n\n\t\thighlightChildren(node as Element);\n\n\t\treturn 0;\n\t};\n\n\thighlightRecursive( element );\n};\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el:HTMLElement) => {\n\tvar elements = el.querySelectorAll(\"span.highlight\");\n\tArray.prototype.forEach.call(elements, function(el:HTMLElement){\n\t\tvar parent = el.parentNode as Node;\n\t\tparent.replaceChild(el.firstChild as Node, el);\n\t\tparent.normalize();\n\t});\n};\n","export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n","\nexport default {\n\toptions: [],\n\toptgroups: [],\n\n\tplugins: [],\n\tdelimiter: ',',\n\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\tpersist: true,\n\tdiacritics: true,\n\tcreate: null,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\thighlight: true,\n\topenOnFocus: true,\n\tshouldOpen: null,\n\tmaxOptions: 50,\n\tmaxItems: null,\n\thideSelected: null,\n\tduplicates: false,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: null,\n\tallowEmptyOption: false,\n\t//closeAfterSelect: false,\n\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: null, //'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\tdisabledField: 'disabled',\n\toptgroupLabelField: 'label',\n\toptgroupValueField: 'value',\n\tlockOptgroupOrder: false,\n\n\tsortField: '$order',\n\tsearchField: ['text'],\n\tsearchConjunction: 'and',\n\n\tmode: null,\n\twrapperClass: 'ts-wrapper',\n\tcontrolClass: 'ts-control',\n\tdropdownClass: 'ts-dropdown',\n\tdropdownContentClass: 'ts-dropdown-content',\n\titemClass: 'item',\n\toptionClass: 'option',\n\n\tdropdownParent: null,\n\tcontrolInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n\n\tcopyClassesToDropdown: false,\n\n\tplaceholder: null,\n\thidePlaceholder: null,\n\n\tshouldLoad: function(query:string):boolean{\n\t\treturn query.length > 0;\n\t},\n\n\t/*\n\tload : null, // function(query, callback) { ... }\n\tscore : null, // function(search) { ... }\n\tonInitialize : null, // function() { ... }\n\tonChange : null, // function(value) { ... }\n\tonItemAdd : null, // function(value, $item) { ... }\n\tonItemRemove : null, // function(value) { ... }\n\tonClear : null, // function() { ... }\n\tonOptionAdd : null, // function(value, data) { ... }\n\tonOptionRemove : null, // function(value) { ... }\n\tonOptionClear : null, // function() { ... }\n\tonOptionGroupAdd : null, // function(id, data) { ... }\n\tonOptionGroupRemove : null, // function(id) { ... }\n\tonOptionGroupClear : null, // function() { ... }\n\tonDropdownOpen : null, // function(dropdown) { ... }\n\tonDropdownClose : null, // function(dropdown) { ... }\n\tonType : null, // function(str) { ... }\n\tonDelete : null, // function(values) { ... }\n\t*/\n\n\trender: {\n\t\t/*\n\t\titem: null,\n\t\toptgroup: null,\n\t\toptgroup_header: null,\n\t\toption: null,\n\t\toption_create: null\n\t\t*/\n\t}\n};\n","\nimport TomSelect from './tom-select';\nimport { TomLoadCallback } from './types/index';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n * 'str' -> 'str'\n * null -> ''\n * undefined -> ''\n * true -> '1'\n * false -> '0'\n * 0 -> '0'\n * 1 -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"');\n};\n\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n * - start\n * - length\n *\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n","import defaults from './defaults';\nimport { hash_key } from './utils';\nimport { TomOption, TomSettings, RecursivePartial } from './types/index';\nimport { iterate } from '@orchidjs/sifter/lib/utils';\nimport { TomInput } from './types/index';\n\n\nexport default function getSettings( input:TomInput, settings_user:RecursivePartial<TomSettings>):TomSettings{\n\tvar settings:TomSettings\t= Object.assign({}, defaults, settings_user);\n\n\tvar attr_data\t\t\t\t= settings.dataAttr;\n\tvar field_label\t\t\t\t= settings.labelField;\n\tvar field_value\t\t\t\t= settings.valueField;\n\tvar field_disabled\t\t\t= settings.disabledField;\n\tvar field_optgroup\t\t\t= settings.optgroupField;\n\tvar field_optgroup_label\t= settings.optgroupLabelField;\n\tvar field_optgroup_value\t= settings.optgroupValueField;\n\n\tvar tag_name\t\t\t\t= input.tagName.toLowerCase();\n\tvar placeholder\t\t\t\t= input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n\tif (!placeholder && !settings.allowEmptyOption) {\n\t\tlet option\t\t= input.querySelector('option[value=\"\"]');\n\t\tif( option ){\n\t\t\tplaceholder = option.textContent;\n\t\t}\n\n\t}\n\n\tvar settings_element:{\n\t\tplaceholder\t: null|string,\n\t\toptions\t\t: TomOption[],\n\t\toptgroups\t: TomOption[],\n\t\titems\t\t: string[],\n\t\tmaxItems\t: null|number,\n\t} = {\n\t\tplaceholder\t: placeholder,\n\t\toptions\t\t: [],\n\t\toptgroups\t: [],\n\t\titems\t\t: [],\n\t\tmaxItems\t: null,\n\t};\n\n\n\t/**\n\t * Initialize from a <select> element.\n\t *\n\t */\n\tvar init_select = () => {\n\t\tvar tagName;\n\t\tvar options = settings_element.options;\n\t\tvar optionsMap:{[key:string]:any} = {};\n\t\tvar group_count = 1;\n\n\t\tvar readData = (el:HTMLElement):TomOption => {\n\n\t\t\tvar data\t= Object.assign({},el.dataset); // get plain object from DOMStringMap\n\t\t\tvar json\t= attr_data && data[attr_data];\n\n\t\t\tif( typeof json === 'string' && json.length ){\n\t\t\t\tdata = Object.assign(data,JSON.parse(json));\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\t\tvar addOption = (option:HTMLOptionElement, group?:string) => {\n\n\t\t\tvar value = hash_key(option.value);\n\t\t\tif ( value == null ) return;\n\t\t\tif ( !value && !settings.allowEmptyOption) return;\n\n\t\t\t// if the option already exists, it's probably been\n\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t// existing option so that it's rendered in both places.\n\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\tif (group) {\n\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t} else if (!Array.isArray(arr)) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tvar option_data = readData(option);\n\t\t\t\toption_data[field_label] = option_data[field_label] || option.textContent;\n\t\t\t\toption_data[field_value] = option_data[field_value] || value;\n\t\t\t\toption_data[field_disabled] = option_data[field_disabled] || option.disabled;\n\t\t\t\toption_data[field_optgroup] = option_data[field_optgroup] || group;\n\t\t\t\toption_data.$option\t\t\t= option;\n\n\t\t\t\toptionsMap[value] = option_data;\n\t\t\t\toptions.push(option_data);\n\t\t\t}\n\n\t\t\tif( option.selected ){\n\t\t\t\tsettings_element.items.push(value);\n\t\t\t}\n\t\t};\n\n\t\tvar addGroup = ( optgroup:HTMLOptGroupElement ) => {\n\t\t\tvar id:string, optgroup_data\n\n\t\t\toptgroup_data\t\t\t\t\t\t\t= readData(optgroup);\n\t\t\toptgroup_data[field_optgroup_label]\t\t= optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n\t\t\toptgroup_data[field_optgroup_value]\t\t= optgroup_data[field_optgroup_value] || group_count++;\n\t\t\toptgroup_data[field_disabled]\t\t\t= optgroup_data[field_disabled] || optgroup.disabled;\n\t\t\tsettings_element.optgroups.push(optgroup_data);\n\n\t\t\tid = optgroup_data[field_optgroup_value];\n\n\t\t\titerate(optgroup.children, (option)=>{\n\t\t\t\taddOption(option as HTMLOptionElement, id);\n\t\t\t});\n\n\t\t};\n\n\t\tsettings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n\n\t\titerate(input.children,(child)=>{\n\t\t\ttagName = child.tagName.toLowerCase();\n\t\t\tif (tagName === 'optgroup') {\n\t\t\t\taddGroup(child as HTMLOptGroupElement);\n\t\t\t} else if (tagName === 'option') {\n\t\t\t\taddOption(child as HTMLOptionElement);\n\t\t\t}\n\t\t});\n\n\t};\n\n\n\t/**\n\t * Initialize from a <input type=\"text\"> element.\n\t *\n\t */\n\tvar init_textbox = () => {\n\t\tconst data_raw = input.getAttribute(attr_data);\n\n\t\tif (!data_raw) {\n\t\t\tvar value = input.value.trim() || '';\n\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\tconst values = value.split(settings.delimiter);\n\n\t\t\titerate( values, (value) => {\n\t\t\t\tconst option:TomOption = {};\n\t\t\t\toption[field_label] = value;\n\t\t\t\toption[field_value] = value;\n\t\t\t\tsettings_element.options.push(option);\n\t\t\t});\n\t\t\tsettings_element.items = values;\n\t\t} else {\n\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\titerate( settings_element.options, (opt) => {\n\t\t\t\tsettings_element.items.push(opt[field_value]);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tif (tag_name === 'select') {\n\t\tinit_select();\n\t} else {\n\t\tinit_textbox();\n\t}\n\n\treturn Object.assign( {}, defaults, settings_element, settings_user) as TomSettings;\n};\n","\nimport MicroEvent from './contrib/microevent';\nimport MicroPlugin from './contrib/microplugin';\nimport { Sifter, iterate } from '@orchidjs/sifter';\nimport { escape_regex } from '@orchidjs/unicode-variants';\nimport { TomInput, TomArgObject, TomOption, TomOptions, TomCreateFilter, TomCreateCallback, TomItem, TomSettings, TomTemplateNames, TomClearFilter, RecursivePartial } from './types/index';\nimport {highlight, removeHighlight} from './contrib/highlight';\nimport * as constants from './constants';\nimport getSettings from './getSettings';\nimport {\n\thash_key,\n\tget_hash,\n\tescape_html,\n\tdebounce_events,\n\tgetSelection,\n\tpreventDefault,\n\taddEvent,\n\tloadDebounce,\n\tisKeyDown,\n\tgetId,\n\taddSlashes,\n\tappend\n} from './utils';\n\nimport {\n\tgetDom,\n\tisHtmlString,\n\tescapeQuery,\n\ttriggerEvent,\n\tapplyCSS,\n\taddClasses,\n\tremoveClasses,\n\tparentMatch,\n\tgetTail,\n\tisEmptyObject,\n\tnodeIndex,\n\tsetAttr,\n\treplaceNode\n} from './vanilla';\n\nvar instance_i = 0;\n\nexport default class TomSelect extends MicroPlugin(MicroEvent){\n\n\tpublic control_input\t\t\t: HTMLInputElement;\n\tpublic wrapper\t\t\t\t\t: HTMLElement;\n\tpublic dropdown\t\t\t\t\t: HTMLElement;\n\tpublic control\t\t\t\t\t: HTMLElement;\n\tpublic dropdown_content\t\t\t: HTMLElement;\n\tpublic focus_node\t\t\t\t: HTMLElement;\n\n\tpublic order\t\t\t\t\t: number = 0;\n\tpublic settings\t\t\t\t\t: TomSettings;\n\tpublic input\t\t\t\t\t: TomInput;\n\tpublic tabIndex\t\t\t\t\t: number;\n\tpublic is_select_tag\t\t\t: boolean;\n\tpublic rtl\t\t\t\t\t\t: boolean;\n\tprivate inputId\t\t\t\t\t: string;\n\n\tprivate _destroy\t\t\t\t!: () => void;\n\tpublic sifter\t\t\t\t\t: Sifter;\n\n\n\tpublic isOpen\t\t\t\t\t: boolean = false;\n\tpublic isDisabled\t\t\t\t: boolean = false;\n\tpublic isRequired\t\t\t\t: boolean;\n\tpublic isInvalid\t\t\t\t: boolean = false; // @deprecated 1.8\n\tpublic isValid\t\t\t\t\t: boolean = true;\n\tpublic isLocked\t\t\t\t\t: boolean = false;\n\tpublic isFocused\t\t\t\t: boolean = false;\n\tpublic isInputHidden\t\t\t: boolean = false;\n\tpublic isSetup\t\t\t\t\t: boolean = false;\n\tpublic ignoreFocus\t\t\t\t: boolean = false;\n\tpublic ignoreHover\t\t\t\t: boolean = false;\n\tpublic hasOptions\t\t\t\t: boolean = false;\n\tpublic currentResults\t\t\t?: ReturnType<Sifter['search']>;\n\tpublic lastValue\t\t\t\t: string = '';\n\tpublic caretPos\t\t\t\t\t: number = 0;\n\tpublic loading\t\t\t\t\t: number = 0;\n\tpublic loadedSearches\t\t\t: { [key: string]: boolean } = {};\n\n\tpublic activeOption\t\t\t\t: null|HTMLElement = null;\n\tpublic activeItems\t\t\t\t: TomItem[] = [];\n\n\tpublic optgroups\t\t\t\t: TomOptions = {};\n\tpublic options\t\t\t\t\t: TomOptions = {};\n\tpublic userOptions\t\t\t\t: {[key:string]:boolean} = {};\n\tpublic items\t\t\t\t\t: string[] = [];\n\n\n\n\tconstructor( input_arg: string|TomInput, user_settings:RecursivePartial<TomSettings> ){\n\t\tsuper();\n\n\t\tinstance_i++;\n\n\t\tvar dir;\n\t\tvar input\t\t\t\t= getDom( input_arg ) as TomInput;\n\n\t\tif( input.tomselect ){\n\t\t\tthrow new Error('Tom Select already initialized on this element');\n\t\t}\n\n\n\t\tinput.tomselect\t\t\t= this;\n\n\n\t\t// detect rtl environment\n\t\tvar computedStyle\t\t= window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir\t\t\t\t\t\t= computedStyle.getPropertyValue('direction');\n\n\t\t// setup default state\n\t\tconst settings\t\t\t= getSettings( input, user_settings );\n\t\tthis.settings\t\t\t= settings;\n\t\tthis.input\t\t\t\t= input;\n\t\tthis.tabIndex\t\t\t= input.tabIndex || 0;\n\t\tthis.is_select_tag\t\t= input.tagName.toLowerCase() === 'select';\n\t\tthis.rtl\t\t\t\t= /rtl/i.test(dir);\n\t\tthis.inputId\t\t\t= getId(input, 'tomselect-'+instance_i);\n\t\tthis.isRequired\t\t\t= input.required;\n\n\n\t\t// search system\n\t\tthis.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t\t// option-dependent defaults\n\t\tsettings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof settings.hideSelected !== 'boolean') {\n\t\t\tsettings.hideSelected = settings.mode === 'multi';\n\t\t}\n\n\t\tif( typeof settings.hidePlaceholder !== 'boolean' ){\n\t\t\tsettings.hidePlaceholder = settings.mode !== 'multi';\n\t\t}\n\n\t\t// set up createFilter callback\n\t\tvar filter = settings.createFilter;\n\t\tif( typeof filter !== 'function' ){\n\n\t\t\tif( typeof filter === 'string' ){\n\t\t\t\tfilter = new RegExp(filter);\n\t\t\t}\n\n\t\t\tif( filter instanceof RegExp ){\n\t\t\t\tsettings.createFilter = (input) => (filter as RegExp).test(input);\n\t\t\t}else{\n\t\t\t\tsettings.createFilter = (value) => {\n\t\t\t\t\treturn this.settings.duplicates || !this.options[value];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\n\t\tthis.initializePlugins(settings.plugins);\n\t\tthis.setupCallbacks();\n\t\tthis.setupTemplates();\n\n\n\t\t// Create all elements\n\t\tconst wrapper\t\t\t= getDom('<div>');\n\t\tconst control\t\t\t= getDom('<div>');\n\t\tconst dropdown\t\t\t= this._render('dropdown');\n\t\tconst dropdown_content\t= getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n\n\t\tconst classes\t\t\t= this.input.getAttribute('class') || '';\n\t\tconst inputMode\t\t\t= settings.mode;\n\n\t\tvar control_input: HTMLInputElement;\n\n\n\t\taddClasses( wrapper, settings.wrapperClass, classes, inputMode);\n\n\n\t\taddClasses(control,settings.controlClass);\n\t\tappend( wrapper, control );\n\n\n\t\taddClasses(dropdown, settings.dropdownClass, inputMode);\n\t\tif( settings.copyClassesToDropdown ){\n\t\t\taddClasses( dropdown, classes);\n\t\t}\n\n\n\t\taddClasses(dropdown_content, settings.dropdownContentClass);\n\t\tappend( dropdown, dropdown_content );\n\n\t\tgetDom( settings.dropdownParent || wrapper ).appendChild( dropdown );\n\n\n\t\t// default controlInput\n\t\tif( isHtmlString(settings.controlInput) ){\n\t\t\tcontrol_input\t\t= getDom(settings.controlInput ) as HTMLInputElement;\n\n\t\t\t// set attributes\n\t\t\tvar attrs = ['autocorrect','autocapitalize','autocomplete'];\n\t\t\titerate(attrs,(attr:string) => {\n\t\t\t\tif( input.getAttribute(attr) ){\n\t\t\t\t\tsetAttr(control_input,{[attr]:input.getAttribute(attr)});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol_input.tabIndex = -1;\n\t\t\tcontrol.appendChild( control_input );\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t// dom element\n\t\t}else if( settings.controlInput ){\n\t\t\tcontrol_input\t\t= getDom( settings.controlInput ) as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t}else{\n\t\t\tcontrol_input\t\t= getDom('<input/>') as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control;\n\t\t}\n\n\t\tthis.wrapper\t\t\t= wrapper;\n\t\tthis.dropdown\t\t\t= dropdown;\n\t\tthis.dropdown_content\t= dropdown_content;\n\t\tthis.control \t\t\t= control;\n\t\tthis.control_input\t\t= control_input;\n\n\t\tthis.setup();\n\t}\n\n\t/**\n\t * set up event bindings.\n\t *\n\t */\n\tsetup(){\n\n\t\tconst self = this;\n\t\tconst settings\t\t\t\t= self.settings;\n\t\tconst control_input\t\t\t= self.control_input;\n\t\tconst dropdown\t\t\t\t= self.dropdown;\n\t\tconst dropdown_content\t\t= self.dropdown_content;\n\t\tconst wrapper\t\t\t\t= self.wrapper;\n\t\tconst control\t\t\t\t= self.control;\n\t\tconst input\t\t\t\t\t= self.input;\n\t\tconst focus_node\t\t\t= self.focus_node;\n\t\tconst passive_event\t\t\t= { passive: true };\n\t\tconst listboxId\t\t\t\t= self.inputId +'-ts-dropdown';\n\n\n\t\tsetAttr(dropdown_content,{\n\t\t\tid: listboxId\n\t\t});\n\n\t\tsetAttr(focus_node,{\n\t\t\trole:'combobox',\n\t\t\t'aria-haspopup':'listbox',\n\t\t\t'aria-expanded':'false',\n\t\t\t'aria-controls':listboxId\n\t\t});\n\n\t\tconst control_id\t= getId(focus_node,self.inputId + '-ts-control');\n\t\tconst query\t\t\t= \"label[for='\"+escapeQuery(self.inputId)+\"']\";\n\t\tconst label\t\t\t= document.querySelector(query);\n\t\tconst label_click\t= self.focus.bind(self);\n\t\tif( label ){\n\t\t\taddEvent(label,'click', label_click );\n\t\t\tsetAttr(label,{for:control_id});\n\t\t\tconst label_id = getId(label,self.inputId+'-ts-label');\n\t\t\tsetAttr(focus_node,{'aria-labelledby':label_id});\n\t\t\tsetAttr(dropdown_content,{'aria-labelledby':label_id});\n\t\t}\n\n\t\twrapper.style.width = input.style.width;\n\n\t\tif (self.plugins.names.length) {\n\t\t\tconst classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\taddClasses( [wrapper,dropdown], classes_plugins);\n\t\t}\n\n\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag ){\n\t\t\tsetAttr(input,{multiple:'multiple'});\n\t\t}\n\n\t\tif (settings.placeholder) {\n\t\t\tsetAttr(control_input,{placeholder:settings.placeholder});\n\t\t}\n\n\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\tif (!settings.splitOn && settings.delimiter) {\n\t\t\tsettings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n\t\t}\n\n\t\t// debounce user defined load() if loadThrottle > 0\n\t\t// after initializePlugins() so plugins can create/modify user defined loaders\n\t\tif( settings.load && settings.loadThrottle ){\n\t\t\tsettings.load = loadDebounce(settings.load,settings.loadThrottle)\n\t\t}\n\n\t\tself.control_input.type\t= input.type;\n\n\t\taddEvent(dropdown,'mousemove', () => {\n\t\t\tself.ignoreHover = false;\n\t\t});\n\n\t\taddEvent(dropdown,'mouseenter', (e) => {\n\n\t\t\tvar target_match = parentMatch(e.target as HTMLElement, '[data-selectable]', dropdown);\n\t\t\tif( target_match ) self.onOptionHover( e as MouseEvent, target_match );\n\n\t\t}, {capture:true});\n\n\t\t// clicking on an option should select it\n\t\taddEvent(dropdown,'click',(evt) => {\n\t\t\tconst option = parentMatch(evt.target as HTMLElement, '[data-selectable]');\n\t\t\tif( option ){\n\t\t\t\tself.onOptionSelect( evt as MouseEvent, option );\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\t\t});\n\n\t\taddEvent(control,'click', (evt) => {\n\n\t\t\tvar target_match = parentMatch( evt.target as HTMLElement, '[data-ts-item]', control);\n\t\t\tif( target_match && self.onItemSelect(evt as MouseEvent, target_match as TomItem) ){\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// retain focus (see control_input mousedown)\n\t\t\tif( control_input.value != '' ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.onClick();\n\t\t\tpreventDefault(evt,true);\n\t\t});\n\n\n\t\t// keydown on focus_node for arrow_down/arrow_up\n\t\taddEvent(focus_node,'keydown',\t\t(e) => self.onKeyDown(e as KeyboardEvent) );\n\n\t\t// keypress and input/keyup\n\t\taddEvent(control_input,'keypress',\t(e) => self.onKeyPress(e as KeyboardEvent) );\n\t\taddEvent(control_input,'input',\t\t(e) => self.onInput(e as KeyboardEvent) );\n\t\taddEvent(focus_node,'blur', \t\t(e) => self.onBlur(e as FocusEvent) );\n\t\taddEvent(focus_node,'focus',\t\t(e) => self.onFocus(e as MouseEvent) );\n\t\taddEvent(control_input,'paste',\t\t(e) => self.onPaste(e as MouseEvent) );\n\n\n\t\tconst doc_mousedown = (evt:Event) => {\n\n\t\t\t// blur if target is outside of this instance\n\t\t\t// dropdown is not always inside wrapper\n\t\t\tconst target = evt.composedPath()[0];\n\t\t\tif( !wrapper.contains(target as HTMLElement) && !dropdown.contains(target as HTMLElement) ){\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.blur();\n\t\t\t\t}\n\t\t\t\tself.inputState();\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t// retain focus by preventing native handling. if the\n\t\t\t// event target is the input it should not be modified.\n\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t// Fixes bug #212 which is no covered by tests\n\t\t\tif( target == control_input && self.isOpen ){\n\t\t\t\tevt.stopPropagation();\n\n\t\t\t// clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n\t\t\t}else{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\n\t\t};\n\n\t\tconst win_scroll = () => {\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.positionDropdown();\n\t\t\t}\n\t\t};\n\n\n\t\taddEvent(document,'mousedown', doc_mousedown);\n\t\taddEvent(window,'scroll', win_scroll, passive_event);\n\t\taddEvent(window,'resize', win_scroll, passive_event);\n\n\t\tthis._destroy = () => {\n\t\t\tdocument.removeEventListener('mousedown',doc_mousedown);\n\t\t\twindow.removeEventListener('scroll',win_scroll);\n\t\t\twindow.removeEventListener('resize',win_scroll);\n\t\t\tif( label ) label.removeEventListener('click',label_click);\n\t\t};\n\n\t\t// store original html and tab index so that they can be\n\t\t// restored when the destroy() method is called.\n\t\tthis.revertSettings = {\n\t\t\tinnerHTML : input.innerHTML,\n\t\t\ttabIndex : input.tabIndex\n\t\t};\n\n\n\t\tinput.tabIndex = -1;\n\t\tinput.insertAdjacentElement('afterend', self.wrapper);\n\n\t\tself.sync(false);\n\t\tsettings.items = [];\n\t\tdelete settings.optgroups;\n\t\tdelete settings.options;\n\n\t\taddEvent(input,'invalid', () => {\n\t\t\tif( self.isValid ){\n\t\t\t\tself.isValid = false;\n\t\t\t\tself.isInvalid = true;\n\t\t\t\tself.refreshState();\n\t\t\t}\n\t\t});\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshItems();\n\t\tself.close(false);\n\t\tself.inputState();\n\t\tself.isSetup = true;\n\n\t\tif( input.disabled ){\n\t\t\tself.disable();\n\t\t}else{\n\t\t\tself.enable(); //sets tabIndex\n\t\t}\n\n\t\tself.on('change', this.onChange);\n\n\t\taddClasses(input,'tomselected','ts-hidden-accessible');\n\t\tself.trigger('initialize');\n\n\t\t// preload options\n\t\tif (settings.preload === true) {\n\t\t\tself.preload();\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Register options and optgroups\n\t *\n\t */\n\tsetupOptions(options:TomOption[] = [], optgroups:TomOption[] = []){\n\n\t\t// build options table\n\t\tthis.addOptions(options);\n\n\n\t\t// build optgroup table\n\t\titerate( optgroups, (optgroup:TomOption) => {\n\t\t\tthis.registerOptionGroup(optgroup);\n\t\t});\n\t}\n\n\t/**\n\t * Sets up default rendering functions.\n\t */\n\tsetupTemplates() {\n\t\tvar self = this;\n\t\tvar field_label = self.settings.labelField;\n\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\n\t\tvar templates = {\n\t\t\t'optgroup': (data:TomOption) => {\n\t\t\t\tlet optgroup = document.createElement('div');\n\t\t\t\toptgroup.className = 'optgroup';\n\t\t\t\toptgroup.appendChild(data.options);\n\t\t\t\treturn optgroup;\n\n\t\t\t},\n\t\t\t'optgroup_header': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t},\n\t\t\t'option': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'item': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'option_create': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>…</div>';\n\t\t\t},\n\t\t\t'no_results':() => {\n\t\t\t\treturn '<div class=\"no-results\">No results found</div>';\n\t\t\t},\n\t\t\t'loading':() => {\n\t\t\t\treturn '<div class=\"spinner\"></div>';\n\t\t\t},\n\t\t\t'not_loading':() => {},\n\t\t\t'dropdown':() => {\n\t\t\t\treturn '<div></div>';\n\t\t\t}\n\t\t};\n\n\n\t\tself.settings.render = Object.assign({}, templates, self.settings.render);\n\t}\n\n\t/**\n\t * Maps fired events to callbacks provided\n\t * in the settings used when creating the control.\n\t */\n\tsetupCallbacks() {\n\t\tvar key, fn;\n\t\tvar callbacks:{[key:string]:string} = {\n\t\t\t'initialize' : 'onInitialize',\n\t\t\t'change' : 'onChange',\n\t\t\t'item_add' : 'onItemAdd',\n\t\t\t'item_remove' : 'onItemRemove',\n\t\t\t'item_select' : 'onItemSelect',\n\t\t\t'clear' : 'onClear',\n\t\t\t'option_add' : 'onOptionAdd',\n\t\t\t'option_remove' : 'onOptionRemove',\n\t\t\t'option_clear' : 'onOptionClear',\n\t\t\t'optgroup_add' : 'onOptionGroupAdd',\n\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t'optgroup_clear' : 'onOptionGroupClear',\n\t\t\t'dropdown_open' : 'onDropdownOpen',\n\t\t\t'dropdown_close' : 'onDropdownClose',\n\t\t\t'type' : 'onType',\n\t\t\t'load' : 'onLoad',\n\t\t\t'focus' : 'onFocus',\n\t\t\t'blur' : 'onBlur'\n\t\t};\n\n\t\tfor (key in callbacks) {\n\n\t\t\tfn = this.settings[callbacks[key] as (keyof TomSettings)];\n\t\t\tif (fn) this.on(key, fn);\n\n\t\t}\n\t}\n\n\t/**\n\t * Sync the Tom Select instance with the original input or select\n\t *\n\t */\n\tsync(get_settings:boolean=true):void{\n\t\tconst self\t\t= this;\n\t\tconst settings\t= get_settings ? getSettings( self.input, {delimiter:self.settings.delimiter} as RecursivePartial<TomSettings> ) : self.settings;\n\n\t\tself.setupOptions(settings.options,settings.optgroups);\n\n\t\tself.setValue(settings.items||[],true); // silent prevents recursion\n\n\t\tself.lastQuery = null; // so updated options will be displayed in dropdown\n\t}\n\n\t/**\n\t * Triggered when the main control element\n\t * has a click event.\n\t *\n\t */\n\tonClick():void {\n\t\tvar self = this;\n\n\t\tif( self.activeItems.length > 0 ){\n\t\t\tself.clearActiveItems();\n\t\t\tself.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.isFocused && self.isOpen ){\n\t\t\tself.blur();\n\t\t} else {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated v1.7\n\t *\n\t */\n\tonMouseDown():void {}\n\n\t/**\n\t * Triggered when the value of the control has been changed.\n\t * This should propagate the event to the original DOM\n\t * input / select element.\n\t */\n\tonChange() {\n\t\ttriggerEvent(this.input, 'input');\n\t\ttriggerEvent(this.input, 'change');\n\t}\n\n\t/**\n\t * Triggered on <input> paste.\n\t *\n\t */\n\tonPaste(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isInputHidden || self.isLocked ){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a regex or string is included, this will split the pasted\n\t\t// input and create Items for each separate value\n\t\tif( !self.settings.splitOn ){\n\t\t\treturn;\n\t\t}\n\n\t\t// Wait for pasted text to be recognized in value\n\t\tsetTimeout(() => {\n\t\t\tvar pastedText = self.inputValue();\n\t\t\tif( !pastedText.match(self.settings.splitOn)){\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar splitInput = pastedText.trim().split(self.settings.splitOn);\n\t\t\titerate( splitInput, (piece:string) => {\n\n\t\t\t\tconst hash = hash_key(piece);\n\t\t\t\tif( hash ){\n\t\t\t\t\tif( this.options[piece] ){\n\t\t\t\t\t\tself.addItem(piece);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tself.createItem(piece);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\n\t}\n\n\t/**\n\t * Triggered on <input> keypress.\n\t *\n\t */\n\tonKeyPress(e:KeyboardEvent):void {\n\t\tvar self = this;\n\t\tif(self.isLocked){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\tif (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n\t\t\tself.createItem();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keydown.\n\t *\n\t */\n\tonKeyDown(e:KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tself.ignoreHover = true;\n\n\t\tif (self.isLocked) {\n\t\t\tif (e.keyCode !== constants.KEY_TAB) {\n\t\t\t\tpreventDefault(e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.keyCode) {\n\n\t\t\t// ctrl+A: select all\n\t\t\tcase constants.KEY_A:\n\t\t\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\t\t\tif( self.control_input.value == '' ){\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// esc: close dropdown\n\t\t\tcase constants.KEY_ESC:\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tpreventDefault(e,true);\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\n\t\t\t// down: open dropdown or move selection down\n\t\t\tcase constants.KEY_DOWN:\n\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\tself.open();\n\t\t\t\t} else if (self.activeOption) {\n\t\t\t\t\tlet next = self.getAdjacent(self.activeOption, 1);\n\t\t\t\t\tif (next) self.setActiveOption(next);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// up: move selection up\n\t\t\tcase constants.KEY_UP:\n\t\t\t\tif (self.activeOption) {\n\t\t\t\t\tlet prev = self.getAdjacent(self.activeOption, -1);\n\t\t\t\t\tif (prev) self.setActiveOption(prev);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// return: select active option\n\t\t\tcase constants.KEY_RETURN:\n\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// if the option_create=null, the dropdown might be closed\n\t\t\t\t}else if (self.settings.create && self.createItem()) {\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// don't submit form when searching for a value\n\t\t\t\t}else if( document.activeElement == self.control_input && self.isOpen ){\n\t\t\t\t\tpreventDefault(e);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t// left: modifiy item selection to the left\n\t\t\tcase constants.KEY_LEFT:\n\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\treturn;\n\n\t\t\t// right: modifiy item selection to the right\n\t\t\tcase constants.KEY_RIGHT:\n\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\treturn;\n\n\t\t\t// tab: select active option and/or create item\n\t\t\tcase constants.KEY_TAB:\n\n\t\t\t\tif( self.settings.selectOnTab ){\n\t\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\n\t\t\t\t\t\t// prevent default [tab] behaviour of jump to the next field\n\t\t\t\t\t\t// if select isFull, then the dropdown won't be open and [tab] will work normally\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// delete|backspace: delete items\n\t\t\tcase constants.KEY_BACKSPACE:\n\t\t\tcase constants.KEY_DELETE:\n\t\t\t\tself.deleteSelection(e);\n\t\t\t\treturn;\n\t\t}\n\n\t\t// don't enter text in the control_input when active items are selected\n\t\tif( self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\tpreventDefault(e);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keyup.\n\t *\n\t */\n\tonInput(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isLocked ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar value = self.inputValue();\n\t\tif (self.lastValue !== value) {\n\t\t\tself.lastValue = value;\n\n\t\t\tif( self.settings.shouldLoad.call(self,value) ){\n\t\t\t\tself.load(value);\n\t\t\t}\n\n\t\t\tself.refreshOptions();\n\t\t\tself.trigger('type', value);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered when the user rolls over\n\t * an option in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionHover( evt:MouseEvent|KeyboardEvent, option:HTMLElement ):void{\n\t\tif( this.ignoreHover ) return;\n\t\tthis.setActiveOption(option, false);\n\t}\n\n\t/**\n\t * Triggered on <input> focus.\n\t *\n\t */\n\tonFocus(e?:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\t\tvar wasFocused = self.isFocused;\n\n\t\tif (self.isDisabled) {\n\t\t\tself.blur();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (self.ignoreFocus) return;\n\t\tself.isFocused = true;\n\t\tif( self.settings.preload === 'focus' ) self.preload();\n\n\t\tif (!wasFocused) self.trigger('focus');\n\n\t\tif (!self.activeItems.length) {\n\t\t\tself.showInput();\n\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t}\n\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Triggered on <input> blur.\n\t *\n\t */\n\tonBlur(e?:FocusEvent):void {\n\n\t\tif( document.hasFocus() === false ) return;\n\n\t\tvar self = this;\n\t\tif (!self.isFocused) return;\n\t\tself.isFocused = false;\n\t\tself.ignoreFocus = false;\n\n\t\tvar deactivate = () => {\n\t\t\tself.close();\n\t\t\tself.setActiveItem();\n\t\t\tself.setCaret(self.items.length);\n\t\t\tself.trigger('blur');\n\t\t};\n\n\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\tself.createItem(null, deactivate);\n\t\t} else {\n\t\t\tdeactivate();\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered when the user clicks on an option\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionSelect( evt:MouseEvent|KeyboardEvent, option:HTMLElement ){\n\t\tvar value, self = this;\n\n\n\t\t// should not be possible to trigger a option under a disabled optgroup\n\t\tif( option.parentElement && option.parentElement.matches('[data-disabled]') ){\n\t\t\treturn;\n\t\t}\n\n\n\t\tif( option.classList.contains('create') ){\n\t\t\tself.createItem(null, () => {\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = option.dataset.value;\n\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.addItem(value);\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( !self.settings.hideSelected && evt.type && /click/.test(evt.type) ){\n\t\t\t\t\tself.setActiveOption(option);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return true if the given option can be selected\n\t *\n\t */\n\tcanSelect(option:HTMLElement|null):boolean{\n\n\t\tif( this.isOpen && option && this.dropdown_content.contains(option) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Triggered when the user clicks on an item\n\t * that has been selected.\n\t *\n\t */\n\tonItemSelect( evt?:MouseEvent, item?:TomItem ):boolean{\n\t\tvar self = this;\n\n\t\tif( !self.isLocked && self.settings.mode === 'multi' ){\n\t\t\tpreventDefault(evt);\n\t\t\tself.setActiveItem(item, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines whether or not to invoke\n\t * the user-provided option provider / loader\n\t *\n\t * Note, there is a subtle difference between\n\t * this.canLoad() and this.settings.shouldLoad();\n\t *\n\t *\t- settings.shouldLoad() is a user-input validator.\n\t *\tWhen false is returned, the not_loading template\n\t *\twill be added to the dropdown\n\t *\n\t *\t- canLoad() is lower level validator that checks\n\t * \tthe Tom Select instance. There is no inherent user\n\t *\tfeedback when canLoad returns false\n\t *\n\t */\n\tcanLoad(value:string):boolean{\n\n\t\tif( !this.settings.load ) return false;\n\t\tif( this.loadedSearches.hasOwnProperty(value) ) return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Invokes the user-provided option provider / loader.\n\t *\n\t */\n\tload(value:string):void {\n\t\tconst self = this;\n\n\t\tif( !self.canLoad(value) ) return;\n\n\t\taddClasses(self.wrapper,self.settings.loadingClass);\n\t\tself.loading++;\n\n\t\tconst callback = self.loadCallback.bind(self);\n\t\tself.settings.load.call(self, value, callback);\n\t}\n\n\t/**\n\t * Invoked by the user-provided option provider\n\t *\n\t */\n\tloadCallback( options:TomOption[], optgroups:TomOption[] ):void{\n\t\tconst self = this;\n\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\tself.lastQuery = null;\n\n\t\tself.clearActiveOption(); // when new results load, focus should be on first option\n\t\tself.setupOptions(options,optgroups);\n\n\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\n\t\tif (!self.loading) {\n\t\t\tremoveClasses(self.wrapper,self.settings.loadingClass);\n\t\t}\n\n\t\tself.trigger('load', options, optgroups);\n\t}\n\n\tpreload():void{\n\t\tvar classList = this.wrapper.classList;\n\t\tif( classList.contains('preloaded') ) return;\n\t\tclassList.add('preloaded');\n\t\tthis.load('');\n\t}\n\n\n\t/**\n\t * Sets the input field of the control to the specified value.\n\t *\n\t */\n\tsetTextboxValue(value:string = '') {\n\t\tvar input = this.control_input;\n\t\tvar changed = input.value !== value;\n\t\tif (changed) {\n\t\t\tinput.value = value;\n\t\t\ttriggerEvent(input,'update');\n\t\t\tthis.lastValue = value;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the value of the control. If multiple items\n\t * can be selected (e.g. <select multiple>), this returns\n\t * an array. If only one item can be selected, this\n\t * returns a string.\n\t *\n\t */\n\tgetValue():string|string[] {\n\n\t\tif( this.is_select_tag && this.input.hasAttribute('multiple')) {\n\t\t\treturn this.items;\n\t\t}\n\n\t\treturn this.items.join(this.settings.delimiter);\n\t}\n\n\t/**\n\t * Resets the selected items to the given value.\n\t *\n\t */\n\tsetValue( value:string|string[], silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change'];\n\n\t\tdebounce_events(this, events,() => {\n\t\t\tthis.clear(silent);\n\t\t\tthis.addItems(value, silent);\n\t\t});\n\t}\n\n\n\t/**\n\t * Resets the number of max items to the given value\n\t *\n\t */\n\tsetMaxItems(value:null|number){\n\t\tif(value === 0) value = null; //reset to unlimited items.\n\t\tthis.settings.maxItems = value;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Sets the selected item.\n\t *\n\t */\n\tsetActiveItem( item?:TomItem, e?:MouseEvent|KeyboardEvent ){\n\t\tvar self = this;\n\t\tvar eventName;\n\t\tvar i, begin, end, swap;\n\t\tvar last;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\t// clear the active selection\n\t\tif( !item ){\n\t\t\tself.clearActiveItems();\n\t\t\tif (self.isFocused) {\n\t\t\t\tself.showInput();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// modify selection\n\t\teventName = e && e.type.toLowerCase();\n\n\t\tif (eventName === 'click' && isKeyDown('shiftKey',e) && self.activeItems.length) {\n\t\t\tlast\t= self.getLastActive();\n\t\t\tbegin\t= Array.prototype.indexOf.call(self.control.children, last);\n\t\t\tend\t\t= Array.prototype.indexOf.call(self.control.children, item);\n\n\t\t\tif (begin > end) {\n\t\t\t\tswap = begin;\n\t\t\t\tbegin = end;\n\t\t\t\tend = swap;\n\t\t\t}\n\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\titem = self.control.children[i] as TomItem;\n\t\t\t\tif (self.activeItems.indexOf(item) === -1) {\n\t\t\t\t\tself.setActiveItemClass(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpreventDefault(e);\n\t\t} else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT,e) ) || (eventName === 'keydown' && isKeyDown('shiftKey',e))) {\n\t\t\tif( item.classList.contains('active') ){\n\t\t\t\tself.removeActiveItem( item );\n\t\t\t} else {\n\t\t\t\tself.setActiveItemClass(item);\n\t\t\t}\n\t\t} else {\n\t\t\tself.clearActiveItems();\n\t\t\tself.setActiveItemClass(item);\n\t\t}\n\n\t\t// ensure control has focus\n\t\tself.hideInput();\n\t\tif (!self.isFocused) {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Set the active and last-active classes\n\t *\n\t */\n\tsetActiveItemClass( item:TomItem ){\n\t\tconst self = this;\n\t\tconst last_active = self.control.querySelector('.last-active');\n\t\tif( last_active ) removeClasses(last_active as HTMLElement,'last-active');\n\n\t\taddClasses(item,'active last-active');\n\t\tself.trigger('item_select', item);\n\t\tif( self.activeItems.indexOf(item) == -1 ){\n\t\t\tself.activeItems.push( item );\n\t\t}\n\t}\n\n\t/**\n\t * Remove active item\n\t *\n\t */\n\tremoveActiveItem( item:TomItem ){\n\t\tvar idx = this.activeItems.indexOf(item);\n\t\tthis.activeItems.splice(idx, 1);\n\t\tremoveClasses(item,'active');\n\t}\n\n\t/**\n\t * Clears all the active items\n\t *\n\t */\n\tclearActiveItems(){\n\t\tremoveClasses(this.activeItems,'active');\n\t\tthis.activeItems = [];\n\t}\n\n\t/**\n\t * Sets the selected item in the dropdown menu\n\t * of available options.\n\t *\n\t */\n\tsetActiveOption( option:null|HTMLElement,scroll:boolean=true ):void{\n\n\t\tif( option === this.activeOption ){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearActiveOption();\n\t\tif( !option ) return;\n\n\t\tthis.activeOption = option;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':option.getAttribute('id')});\n\t\tsetAttr(option,{'aria-selected':'true'});\n\t\taddClasses(option,'active');\n\t\tif( scroll ) this.scrollToOption(option);\n\t}\n\n\t/**\n\t * Sets the dropdown_content scrollTop to display the option\n\t *\n\t */\n\tscrollToOption( option:null|HTMLElement, behavior?:string ):void{\n\n\t\tif( !option ) return;\n\n\t\tconst content\t\t= this.dropdown_content;\n\t\tconst height_menu\t= content.clientHeight;\n\t\tconst scrollTop\t\t= content.scrollTop || 0;\n\t\tconst height_item\t= option.offsetHeight;\n\t\tconst y\t\t\t\t= option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n\t\tif (y + height_item > height_menu + scrollTop) {\n\t\t\tthis.scroll(y - height_menu + height_item, behavior);\n\n\t\t} else if (y < scrollTop) {\n\t\t\tthis.scroll(y, behavior);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll the dropdown to the given position\n\t *\n\t */\n\tscroll( scrollTop:number, behavior?:string ):void{\n\t\tconst content = this.dropdown_content;\n\t\tif( behavior ){\n\t\t\tcontent.style.scrollBehavior = behavior;\n\t\t}\n\t\tcontent.scrollTop = scrollTop;\n\t\tcontent.style.scrollBehavior = '';\n\t}\n\n\t/**\n\t * Clears the active option\n\t *\n\t */\n\tclearActiveOption(){\n\t\tif( this.activeOption ){\n\t\t\tremoveClasses(this.activeOption,'active');\n\t\t\tsetAttr(this.activeOption,{'aria-selected':null});\n\t\t}\n\t\tthis.activeOption = null;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':null});\n\t}\n\n\n\t/**\n\t * Selects all items (CTRL + A).\n\t */\n\tselectAll() {\n\t\tconst self = this;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\tconst activeItems = self.controlChildren();\n\n\t\tif( !activeItems.length ) return;\n\n\t\tself.hideInput();\n\t\tself.close();\n\n\t\tself.activeItems = activeItems;\n\t\titerate( activeItems, (item:TomItem) => {\n\t\t\tself.setActiveItemClass(item);\n\t\t});\n\n\t}\n\n\t/**\n\t * Determines if the control_input should be in a hidden or visible state\n\t *\n\t */\n\tinputState(){\n\t\tvar self = this;\n\n\t\tif( !self.control.contains(self.control_input) ) return;\n\n\t\tsetAttr(self.control_input,{placeholder:self.settings.placeholder});\n\n\t\tif( self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) ){\n\t\t\tself.setTextboxValue();\n\t\t\tself.isInputHidden = true;\n\n\t\t}else{\n\n\t\t\tif( self.settings.hidePlaceholder && self.items.length > 0 ){\n\t\t\t\tsetAttr(self.control_input,{placeholder:''});\n\t\t\t}\n\t\t\tself.isInputHidden = false;\n\t\t}\n\n\t\tself.wrapper.classList.toggle('input-hidden', self.isInputHidden );\n\t}\n\n\t/**\n\t * Hides the input element out of view, while\n\t * retaining its focus.\n\t * @deprecated 1.3\n\t */\n\thideInput() {\n\t\tthis.inputState();\n\t}\n\n\t/**\n\t * Restores input visibility.\n\t * @deprecated 1.3\n\t */\n\tshowInput() {\n\t\tthis.inputState();\n\t}\n\n\t/**\n\t * Get the input value\n\t */\n\tinputValue(){\n\t\treturn this.control_input.value.trim();\n\t}\n\n\t/**\n\t * Gives the control focus.\n\t */\n\tfocus() {\n\t\tvar self = this;\n\t\tif (self.isDisabled) return;\n\n\t\tself.ignoreFocus = true;\n\n\t\tif( self.control_input.offsetWidth ){\n\t\t\tself.control_input.focus();\n\t\t}else{\n\t\t\tself.focus_node.focus();\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tself.ignoreFocus = false;\n\t\t\tself.onFocus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Forces the control out of focus.\n\t *\n\t */\n\tblur():void {\n\t\tthis.focus_node.blur();\n\t\tthis.onBlur();\n\t}\n\n\t/**\n\t * Returns a function that scores an object\n\t * to show how good of a match it is to the\n\t * provided query.\n\t *\n\t * @return {function}\n\t */\n\tgetScoreFunction(query:string) {\n\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t}\n\n\t/**\n\t * Returns search options for sifter (the system\n\t * for scoring and sorting results).\n\t *\n\t * @see https://github.com/orchidjs/sifter.js\n\t * @return {object}\n\t */\n\tgetSearchOptions() {\n\t\tvar settings = this.settings;\n\t\tvar sort = settings.sortField;\n\t\tif (typeof settings.sortField === 'string') {\n\t\t\tsort = [{field: settings.sortField}];\n\t\t}\n\n\t\treturn {\n\t\t\tfields : settings.searchField,\n\t\t\tconjunction : settings.searchConjunction,\n\t\t\tsort : sort,\n\t\t\tnesting : settings.nesting\n\t\t};\n\t}\n\n\t/**\n\t * Searches through available options and returns\n\t * a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string) : ReturnType<Sifter['search']>{\n\t\tvar result, calculateScore;\n\t\tvar self = this;\n\t\tvar options = this.getSearchOptions();\n\n\t\t// validate user-provided result scoring function\n\t\tif ( self.settings.score ){\n\t\t\tcalculateScore = self.settings.score.call(self,query);\n\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\tthrow new Error('Tom Select \"score\" setting must be a function that returns a function');\n\t\t\t}\n\t\t}\n\n\t\t// perform search\n\t\tif (query !== self.lastQuery) {\n\t\t\tself.lastQuery\t\t\t= query;\n\t\t\tresult\t\t\t\t\t= self.sifter.search(query, Object.assign(options, {score: calculateScore}));\n\t\t\tself.currentResults\t\t= result;\n\t\t} else {\n\t\t\tresult\t\t\t\t\t= Object.assign( {}, self.currentResults);\n\t\t}\n\n\t\t// filter out selected items\n\t\tif( self.settings.hideSelected ){\n\t\t\tresult.items = result.items.filter((item) => {\n\t\t\t\tlet hashed = hash_key(item.id);\n\t\t\t\treturn !(hashed && self.items.indexOf(hashed) !== -1 );\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Refreshes the list of available options shown\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\trefreshOptions( triggerDropdown:boolean = true ){\n\t\tvar i, j, k, n, optgroup, optgroups, html:DocumentFragment, has_create_option, active_group;\n\t\tvar create;\n\t\tconst groups: {[key:string]:DocumentFragment} = {};\n\n\t\tconst groups_order:string[]\t= [];\n\t\tvar self\t\t\t\t\t= this;\n\t\tvar query\t\t\t\t\t= self.inputValue();\n\t\tconst same_query\t\t\t= query === self.lastQuery || (query == '' && self.lastQuery == null);\n\t\tvar results\t\t\t\t\t= self.search(query);\n\t\tvar active_option\t\t\t= null;\n\t\tvar show_dropdown\t\t\t= self.settings.shouldOpen || false;\n\t\tvar dropdown_content\t\t= self.dropdown_content;\n\n\n\t\tif( same_query ){\n\t\t\tactive_option\t\t\t= self.activeOption;\n\n\t\t\tif( active_option ){\n\t\t\t\tactive_group = active_option.closest('[data-group]') as HTMLElement;\n\t\t\t}\n\t\t}\n\n\t\t// build markup\n\t\tn = results.items.length;\n\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t}\n\n\t\tif( n > 0 ){\n\t\t\tshow_dropdown = true;\n\t\t}\n\n\t\t// render and group available options individually\n\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t// get option dom element\n\t\t\tlet item\t\t\t= results.items[i];\n\t\t\tif( !item ) continue;\n\n\t\t\tlet opt_value\t\t= item.id;\n\t\t\tlet option\t\t\t= self.options[opt_value];\n\n\t\t\tif( option === undefined ) continue;\n\n\t\t\tlet opt_hash\t\t= get_hash(opt_value);\n\t\t\tlet option_el\t\t= self.getOption(opt_hash,true) as HTMLElement;\n\n\t\t\t// toggle 'selected' class\n\t\t\tif( !self.settings.hideSelected ){\n\t\t\t\toption_el.classList.toggle('selected', self.items.includes(opt_hash) );\n\t\t\t}\n\n\t\t\toptgroup = option[self.settings.optgroupField] || '';\n\t\t\toptgroups = Array.isArray(optgroup) ? optgroup : [optgroup];\n\n\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\toptgroup = optgroups[j];\n\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\toptgroup = '';\n\t\t\t\t}\n\n\t\t\t\tlet group_fragment = groups[optgroup];\n\t\t\t\tif( group_fragment === undefined ){\n\t\t\t\t\tgroup_fragment = document.createDocumentFragment();\n\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t}\n\n\t\t\t\t// nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\t\t\t\tif( j > 0 ){\n\t\t\t\t\toption_el = option_el.cloneNode(true) as HTMLElement;\n\t\t\t\t\tsetAttr(option_el,{id: option.$id+'-clone-'+j,'aria-selected':null});\n\t\t\t\t\toption_el.classList.add('ts-cloned');\n\t\t\t\t\tremoveClasses(option_el,'active');\n\n\n\t\t\t\t\t// make sure we keep the activeOption in the same group\n\t\t\t\t\tif( self.activeOption && self.activeOption.dataset.value == opt_value ){\n\t\t\t\t\t\tif( active_group && active_group.dataset.group === optgroup.toString() ){\n\t\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgroup_fragment.appendChild(option_el);\n\t\t\t\tgroups[optgroup] = group_fragment;\n\t\t\t}\n\t\t}\n\n\t\t// sort optgroups\n\t\tif( self.settings.lockOptgroupOrder ){\n\t\t\tgroups_order.sort((a, b) => {\n\t\t\t\tconst grp_a\t\t= self.optgroups[a];\n\t\t\t\tconst grp_b\t\t= self.optgroups[b];\n\t\t\t\tconst a_order\t= grp_a && grp_a.$order || 0;\n\t\t\t\tconst b_order\t= grp_b && grp_b.$order || 0;\n\t\t\t\treturn a_order - b_order;\n\t\t\t});\n\t\t}\n\n\t\t// render optgroup headers & join groups\n\t\thtml = document.createDocumentFragment();\n\t\titerate( groups_order, (optgroup:string) => {\n\n\t\t\tlet group_fragment = groups[optgroup];\n\n\t\t\tif( !group_fragment || !group_fragment.children.length ) return;\n\n\t\t\tlet group_heading = self.optgroups[optgroup];\n\n\t\t\tif( group_heading !== undefined ){\n\n\t\t\t\tlet group_options = document.createDocumentFragment();\n\t\t\t\tlet header = self.render('optgroup_header', group_heading);\n\t\t\t\tappend( group_options, header );\n\t\t\t\tappend( group_options, group_fragment );\n\n\t\t\t\tlet group_html = self.render('optgroup', {group:group_heading,options:group_options} );\n\n\t\t\t\tappend( html, group_html );\n\n\t\t\t} else {\n\t\t\t\tappend( html, group_fragment );\n\t\t\t}\n\t\t});\n\n\t\tdropdown_content.innerHTML = '';\n\t\tappend( dropdown_content, html );\n\n\t\t// highlight matching terms inline\n\t\tif (self.settings.highlight) {\n\t\t\tremoveHighlight( dropdown_content );\n\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\titerate( results.tokens, (tok) => {\n\t\t\t\t\thighlight( dropdown_content, tok.regex);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// helper method for adding templates to dropdown\n\t\tvar add_template = (template:TomTemplateNames) => {\n\t\t\tlet content = self.render(template,{input:query});\n\t\t\tif( content ){\n\t\t\t\tshow_dropdown = true;\n\t\t\t\tdropdown_content.insertBefore(content, dropdown_content.firstChild);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\n\t\t// add loading message\n\t\tif( self.loading ){\n\t\t\tadd_template('loading');\n\n\t\t// invalid query\n\t\t}else if( !self.settings.shouldLoad.call(self,query) ){\n\t\t\tadd_template('not_loading');\n\n\t\t// add no_results message\n\t\t}else if( results.items.length === 0 ){\n\t\t\tadd_template('no_results');\n\n\t\t}\n\n\n\n\t\t// add create option\n\t\thas_create_option = self.canCreate(query);\n\t\tif (has_create_option) {\n\t\t\tcreate = add_template('option_create');\n\t\t}\n\n\n\t\t// activate\n\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\tif( show_dropdown ){\n\n\t\t\tif (results.items.length > 0) {\n\n\t\t\t\tif( !active_option && self.settings.mode === 'single' && self.items[0] != undefined ){\n\t\t\t\t\tactive_option = self.getOption(self.items[0]);\n\t\t\t\t}\n\n\t\t\t\tif( !dropdown_content.contains(active_option) ){\n\n\t\t\t\t\tlet active_index = 0;\n\t\t\t\t\tif( create && !self.settings.addPrecedence ){\n\t\t\t\t\t\tactive_index = 1;\n\t\t\t\t\t}\n\t\t\t\t\tactive_option = self.selectable()[active_index] as HTMLElement;\n\t\t\t\t}\n\n\t\t\t}else if( create ){\n\t\t\t\tactive_option = create;\n\t\t\t}\n\n\t\t\tif( triggerDropdown && !self.isOpen ){\n\t\t\t\tself.open();\n\t\t\t\tself.scrollToOption(active_option,'auto');\n\t\t\t}\n\t\t\tself.setActiveOption(active_option);\n\n\t\t}else{\n\t\t\tself.clearActiveOption();\n\t\t\tif( triggerDropdown && self.isOpen ){\n\t\t\t\tself.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return list of selectable options\n\t *\n\t */\n\tselectable():NodeList{\n\t\treturn this.dropdown_content.querySelectorAll('[data-selectable]');\n\t}\n\n\n\n\t/**\n\t * Adds an available option. If it already exists,\n\t * nothing will happen. Note: this does not refresh\n\t * the options list dropdown (use `refreshOptions`\n\t * for that).\n\t *\n\t * Usage:\n\t *\n\t * this.addOption(data)\n\t *\n\t */\n\taddOption( data:TomOption, user_created = false ):false|string {\n\t\tconst self = this;\n\n\t\t// @deprecated 1.7.7\n\t\t// use addOptions( array, user_created ) for adding multiple options\n\t\tif( Array.isArray(data) ){\n\t\t\tself.addOptions( data, user_created);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst key = hash_key(data[self.settings.valueField]);\n\t\tif( key === null || self.options.hasOwnProperty(key) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tdata.$order\t\t\t= data.$order || ++self.order;\n\t\tdata.$id\t\t\t= self.inputId + '-opt-' + data.$order;\n\t\tself.options[key]\t= data;\n\t\tself.lastQuery\t\t= null;\n\n\t\tif( user_created ){\n\t\t\tself.userOptions[key] = user_created;\n\t\t\tself.trigger('option_add', key, data);\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Add multiple options\n\t *\n\t */\n\taddOptions( data:TomOption[], user_created = false ):void{\n\t\titerate( data, (dat:TomOption) => {\n\t\t\tthis.addOption(dat, user_created);\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated 1.7.7\n\t */\n\tregisterOption( data:TomOption ):false|string {\n\t\treturn this.addOption(data);\n\t}\n\n\t/**\n\t * Registers an option group to the pool of option groups.\n\t *\n\t * @return {boolean|string}\n\t */\n\tregisterOptionGroup(data:TomOption) {\n\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\n\t\tif ( key === null ) return false;\n\n\t\tdata.$order = data.$order || ++this.order;\n\t\tthis.optgroups[key] = data;\n\t\treturn key;\n\t}\n\n\t/**\n\t * Registers a new optgroup for options\n\t * to be bucketed into.\n\t *\n\t */\n\taddOptionGroup(id:string, data:TomOption) {\n\t\tvar hashed_id;\n\t\tdata[this.settings.optgroupValueField] = id;\n\n\t\tif( hashed_id = this.registerOptionGroup(data) ){\n\t\t\tthis.trigger('optgroup_add', hashed_id, data);\n\t\t}\n\t}\n\n\t/**\n\t * Removes an existing option group.\n\t *\n\t */\n\tremoveOptionGroup(id:string) {\n\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\tdelete this.optgroups[id];\n\t\t\tthis.clearCache();\n\t\t\tthis.trigger('optgroup_remove', id);\n\t\t}\n\t}\n\n\t/**\n\t * Clears all existing option groups.\n\t */\n\tclearOptionGroups() {\n\t\tthis.optgroups = {};\n\t\tthis.clearCache();\n\t\tthis.trigger('optgroup_clear');\n\t}\n\n\t/**\n\t * Updates an option available for selection. If\n\t * it is visible in the selected items or options\n\t * dropdown, it will be re-rendered automatically.\n\t *\n\t */\n\tupdateOption(value:string, data:TomOption) {\n\t\tconst self = this;\n\t\tvar item_new;\n\t\tvar index_item;\n\n\t\tconst value_old\t\t= hash_key(value);\n\t\tconst value_new\t\t= hash_key(data[self.settings.valueField]);\n\n\t\t// sanity checks\n\t\tif( value_old === null ) return;\n\n\t\tconst data_old\t\t= self.options[value_old];\n\n\t\tif( data_old == undefined ) return;\n\t\tif( typeof value_new !== 'string' ) throw new Error('Value must be set in option data');\n\n\n\t\tconst option\t\t= self.getOption(value_old);\n\t\tconst item\t\t\t= self.getItem(value_old);\n\n\n\t\tdata.$order = data.$order || data_old.$order;\n\t\tdelete self.options[value_old];\n\n\t\t// invalidate render cache\n\t\t// don't remove existing node yet, we'll remove it after replacing it\n\t\tself.uncacheValue(value_new);\n\n\t\tself.options[value_new] = data;\n\n\t\t// update the option if it's in the dropdown\n\t\tif( option ){\n\t\t\tif( self.dropdown_content.contains(option) ){\n\n\t\t\t\tconst option_new\t= self._render('option', data);\n\t\t\t\treplaceNode(option, option_new);\n\n\t\t\t\tif( self.activeOption === option ){\n\t\t\t\t\tself.setActiveOption(option_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\toption.remove();\n\t\t}\n\n\t\t// update the item if we have one\n\t\tif( item ){\n\t\t\tindex_item = self.items.indexOf(value_old);\n\t\t\tif (index_item !== -1) {\n\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t}\n\n\t\t\titem_new\t= self._render('item', data);\n\n\t\t\tif( item.classList.contains('active') ) addClasses(item_new,'active');\n\n\t\t\treplaceNode( item, item_new);\n\t\t}\n\n\t\t// invalidate last query because we might have updated the sortField\n\t\tself.lastQuery = null;\n\t}\n\n\t/**\n\t * Removes a single option.\n\t *\n\t */\n\tremoveOption(value:string, silent?:boolean):void {\n\t\tconst self = this;\n\t\tvalue = get_hash(value);\n\n\t\tself.uncacheValue(value);\n\n\t\tdelete self.userOptions[value];\n\t\tdelete self.options[value];\n\t\tself.lastQuery = null;\n\t\tself.trigger('option_remove', value);\n\t\tself.removeItem(value, silent);\n\t}\n\n\t/**\n\t * Clears all options.\n\t */\n\tclearOptions(filter?:TomClearFilter ) {\n\n\t\tconst boundFilter = (filter || this.clearFilter).bind(this);\n\n\t\tthis.loadedSearches\t\t= {};\n\t\tthis.userOptions\t\t= {};\n\t\tthis.clearCache();\n\n\t\tconst selected:TomOptions\t= {};\n\t\titerate(this.options,(option:TomOption,key:string)=>{\n\t\t\tif( boundFilter(option,key as string) ){\n\t\t\t\tselected[key] = option;\n\t\t\t}\n\t\t});\n\n\t\tthis.options = this.sifter.items = selected;\n\t\tthis.lastQuery = null;\n\t\tthis.trigger('option_clear');\n\t}\n\n\t/**\n\t * Used by clearOptions() to decide whether or not an option should be removed\n\t * Return true to keep an option, false to remove\n\t *\n\t */\n\tclearFilter(option:TomOption,value:string){\n\t\tif( this.items.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns the dom element of the option\n\t * matching the given value.\n\t *\n\t */\n\tgetOption(value:undefined|null|boolean|string|number, create:boolean=false):null|HTMLElement {\n\n\t\tconst hashed = hash_key(value);\n\t\tif( hashed === null ) return null;\n\n\t\tconst option = this.options[hashed];\n\t\tif( option != undefined ){\n\n\t\t\tif( option.$div ){\n\t\t\t\treturn option.$div;\n\t\t\t}\n\n\t\t\tif( create ){\n\t\t\t\treturn this._render('option', option);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the dom element of the next or previous dom element of the same type\n\t * Note: adjacent options may not be adjacent DOM elements (optgroups)\n\t *\n\t */\n\tgetAdjacent( option:null|HTMLElement, direction:number, type:string = 'option' ) : HTMLElement|null{\n\t\tvar self = this, all;\n\n\t\tif( !option ){\n\t\t\treturn null;\n\t\t}\n\n\t\tif( type == 'item' ){\n\t\t\tall\t\t\t= self.controlChildren();\n\t\t}else{\n\t\t\tall\t\t\t= self.dropdown_content.querySelectorAll('[data-selectable]');\n\t\t}\n\n\t\tfor( let i = 0; i < all.length; i++ ){\n\t\t\tif( all[i] != option ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( direction > 0 ){\n\t\t\t\treturn all[i+1] as HTMLElement;\n\t\t\t}\n\n\t\t\treturn all[i-1] as HTMLElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Returns the dom element of the item\n\t * matching the given value.\n\t *\n\t */\n\tgetItem(item:string|TomItem|null):null|TomItem {\n\n\t\tif( typeof item == 'object' ){\n\t\t\treturn item;\n\t\t}\n\n\t\tvar value = hash_key(item);\n\t\treturn value !== null\n\t\t\t? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * \"Selects\" multiple items at once. Adds them to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItems( values:string|string[], silent?:boolean ):void{\n\t\tvar self = this;\n\n\t\tvar items = Array.isArray(values) ? values : [values];\n\t\titems = items.filter(x => self.items.indexOf(x) === -1);\n\t\tconst last_item = items[items.length - 1];\n\t\titems.forEach(item => {\n\t\t\tself.isPending = (item !== last_item);\n\t\t\tself.addItem(item, silent);\n\t\t});\n\t}\n\n\t/**\n\t * \"Selects\" an item. Adds it to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItem( value:string, silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change','dropdown_close'];\n\n\t\tdebounce_events(this, events, () => {\n\t\t\tvar item, wasFull;\n\t\t\tconst self = this;\n\t\t \tconst inputMode = self.settings.mode;\n\t\t\tconst hashed = hash_key(value);\n\n\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\n\t\t\t\tif( inputMode === 'single' ){\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( inputMode === 'single' || !self.settings.duplicates ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\n\t\t\titem = self._render('item', self.options[hashed]);\n\n\t\t\tif( self.control.contains(item) ){ // duplicates\n\t\t\t\titem = item.cloneNode(true) as HTMLElement;\n\t\t\t}\n\n\t\t\twasFull = self.isFull();\n\t\t\tself.items.splice(self.caretPos, 0, hashed);\n\t\t\tself.insertAtCaret(item);\n\n\t\t\tif (self.isSetup) {\n\n\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\tif( !self.isPending && self.settings.hideSelected ){\n\t\t\t\t\tlet option = self.getOption(hashed);\n\t\t\t\t\tlet next = self.getAdjacent(option, 1);\n\t\t\t\t\tif( next ){\n\t\t\t\t\t\tself.setActiveOption(next);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// refreshOptions after setActiveOption(),\n\t\t\t\t// otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\t\t\t\tif( !self.isPending && !self.settings.closeAfterSelect ){\n\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t}\n\n\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\tif( self.settings.closeAfterSelect != false && self.isFull() ){\n\t\t\t\t\tself.close();\n\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\tself.positionDropdown();\n\t\t\t\t}\n\n\t\t\t\tself.trigger('item_add', hashed, item);\n\n\t\t\t\tif (!self.isPending) {\n\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\tself.inputState();\n\t\t\t\tself.refreshState();\n\t\t\t}\n\n\t\t});\n\t}\n\n\t/**\n\t * Removes the selected item matching\n\t * the provided value.\n\t *\n\t */\n\tremoveItem( item:string|TomItem|null=null, silent?:boolean ){\n\t\tconst self\t\t= this;\n\t\titem\t\t\t= self.getItem(item);\n\n\t\tif( !item ) return;\n\n\t\tvar i,idx;\n\t\tconst value\t= item.dataset.value;\n\t\ti = nodeIndex(item);\n\n\t\titem.remove();\n\t\tif( item.classList.contains('active') ){\n\t\t\tidx = self.activeItems.indexOf(item);\n\t\t\tself.activeItems.splice(idx, 1);\n\t\t\tremoveClasses(item,'active');\n\t\t}\n\n\t\tself.items.splice(i, 1);\n\t\tself.lastQuery = null;\n\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\tself.removeOption(value, silent);\n\t\t}\n\n\t\tif (i < self.caretPos) {\n\t\t\tself.setCaret(self.caretPos - 1);\n\t\t}\n\n\t\tself.updateOriginalInput({silent: silent});\n\t\tself.refreshState();\n\t\tself.positionDropdown();\n\t\tself.trigger('item_remove', value, item);\n\n\t}\n\n\t/**\n\t * Invokes the `create` method provided in the\n\t * TomSelect options that should provide the data\n\t * for the new item, given the user input.\n\t *\n\t * Once this completes, it will be added\n\t * to the item list.\n\t *\n\t */\n\tcreateItem( input:null|string=null, callback:TomCreateCallback = ()=>{} ):boolean{\n\n\t\t// triggerDropdown parameter @deprecated 2.1.1\n\t\tif( arguments.length === 3 ){\n\t\t\tcallback = arguments[2];\n\t\t}\n\t\tif( typeof callback != 'function' ){\n\t\t\tcallback = () => {};\n\t\t}\n\n\t\tvar self = this;\n\t\tvar caret = self.caretPos;\n\t\tvar output;\n\t\tinput = input || self.inputValue();\n\n\t\tif (!self.canCreate(input)) {\n\t\t\tcallback();\n\t\t\treturn false;\n\t\t}\n\n\t\tself.lock();\n\n\t\tvar created = false;\n\t\tvar create = (data?:boolean|TomOption) => {\n\t\t\tself.unlock();\n\n\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\tif( typeof value !== 'string' ){\n\t\t\t\treturn callback();\n\t\t\t}\n\n\t\t\tself.setTextboxValue();\n\t\t\tself.addOption(data,true);\n\t\t\tself.setCaret(caret);\n\t\t\tself.addItem(value);\n\t\t\tcallback(data);\n\t\t\tcreated = true;\n\t\t};\n\n\t\tif( typeof self.settings.create === 'function' ){\n\t\t\toutput = self.settings.create.call(this, input, create);\n\t\t}else{\n\t\t\toutput = {\n\t\t\t\t[self.settings.labelField]: input,\n\t\t\t\t[self.settings.valueField]: input,\n\t\t\t};\n\t\t}\n\n\t\tif( !created ){\n\t\t\tcreate(output);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Re-renders the selected item lists.\n\t */\n\trefreshItems() {\n\t\tvar self = this;\n\t\tself.lastQuery = null;\n\n\t\tif (self.isSetup) {\n\t\t\tself.addItems(self.items);\n\t\t}\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Updates all state-dependent attributes\n\t * and CSS classes.\n\t */\n\trefreshState() {\n\t\tconst self = this;\n\n\t\tself.refreshValidityState();\n\n\t\tconst isFull\t= self.isFull();\n\t\tconst isLocked\t= self.isLocked;\n\n\t\tself.wrapper.classList.toggle('rtl',self.rtl);\n\n\n\t\tconst wrap_classList = self.wrapper.classList;\n\n\t\twrap_classList.toggle('focus', self.isFocused)\n\t\twrap_classList.toggle('disabled', self.isDisabled)\n\t\twrap_classList.toggle('required', self.isRequired)\n\t\twrap_classList.toggle('invalid', !self.isValid)\n\t\twrap_classList.toggle('locked', isLocked)\n\t\twrap_classList.toggle('full', isFull)\n\t\twrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden)\n\t\twrap_classList.toggle('dropdown-active', self.isOpen)\n\t\twrap_classList.toggle('has-options', isEmptyObject(self.options) )\n\t\twrap_classList.toggle('has-items', self.items.length > 0);\n\n\t}\n\n\n\t/**\n\t * Update the `required` attribute of both input and control input.\n\t *\n\t * The `required` property needs to be activated on the control input\n\t * for the error to be displayed at the right place. `required` also\n\t * needs to be temporarily deactivated on the input since the input is\n\t * hidden and can't show errors.\n\t */\n\trefreshValidityState() {\n\t\tvar self = this;\n\n\t\tif( !self.input.validity ){\n\t\t\treturn;\n\t\t}\n\n\t\tself.isValid = self.input.validity.valid;\n\t\tself.isInvalid = !self.isValid;\n\t}\n\n\t/**\n\t * Determines whether or not more items can be added\n\t * to the control without exceeding the user-defined maximum.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFull() {\n\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t}\n\n\t/**\n\t * Refreshes the original <select> or <input>\n\t * element to reflect the current state.\n\t *\n\t */\n\tupdateOriginalInput( opts:TomArgObject = {} ){\n\t\tconst self = this;\n\t\tvar option, label;\n\n\t\tconst empty_option = self.input.querySelector('option[value=\"\"]') as HTMLOptionElement;\n\n\t\tif( self.is_select_tag ){\n\n\t\t\tconst selected:HTMLOptionElement[]\t\t= [];\n\t\t\tconst has_selected:number\t\t\t\t= self.input.querySelectorAll('option:checked').length;\n\n\t\t\tfunction AddSelected(option_el:HTMLOptionElement|null, value:string, label:string):HTMLOptionElement{\n\n\t\t\t\tif( !option_el ){\n\t\t\t\t\toption_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>') as HTMLOptionElement;\n\t\t\t\t}\n\n\t\t\t\t// don't move empty option from top of list\n\t\t\t\t// fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\t\t\t\tif( option_el != empty_option ){\n\t\t\t\t\tself.input.append(option_el);\n\t\t\t\t}\n\n\t\t\t\tselected.push(option_el);\n\n\t\t\t\t// marking empty option as selected can break validation\n\t\t\t\t// fixes https://github.com/orchidjs/tom-select/issues/303\n\t\t\t\tif( option_el != empty_option || has_selected > 0 ){\n\t\t\t\t\toption_el.selected = true;\n\t\t\t\t}\n\n\t\t\t\treturn option_el;\n\t\t\t}\n\n\t\t\t// unselect all selected options\n\t\t\tself.input.querySelectorAll('option:checked').forEach((option_el:Element) => {\n\t\t\t\t(<HTMLOptionElement>option_el).selected = false;\n\t\t\t});\n\n\n\t\t\t// nothing selected?\n\t\t\tif( self.items.length == 0 && self.settings.mode == 'single' ){\n\n\t\t\t\tAddSelected(empty_option, \"\", \"\");\n\n\t\t\t// order selected <option> tags for values in self.items\n\t\t\t}else{\n\n\t\t\t\tself.items.forEach((value)=>{\n\t\t\t\t\toption\t\t\t= self.options[value]!;\n\t\t\t\t\tlabel\t\t\t= option[self.settings.labelField] || '';\n\n\t\t\t\t\tif( selected.includes(option.$option) ){\n\t\t\t\t\t\tconst reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`) as HTMLOptionElement;\n\t\t\t\t\t\tAddSelected(reuse_opt, value, label);\n\t\t\t\t\t}else{\n\t\t\t\t\t\toption.$option\t= AddSelected(option.$option, value, label);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tself.input.value = self.getValue() as string;\n\t\t}\n\n\t\tif (self.isSetup) {\n\t\t\tif (!opts.silent) {\n\t\t\t\tself.trigger('change', self.getValue() );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shows the autocomplete dropdown containing\n\t * the available options.\n\t */\n\topen() {\n\t\tvar self = this;\n\n\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\tself.isOpen = true;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'true'});\n\t\tself.refreshState();\n\t\tapplyCSS(self.dropdown,{visibility: 'hidden', display: 'block'});\n\t\tself.positionDropdown();\n\t\tapplyCSS(self.dropdown,{visibility: 'visible', display: 'block'});\n\t\tself.focus();\n\t\tself.trigger('dropdown_open', self.dropdown);\n\t}\n\n\t/**\n\t * Closes the autocomplete dropdown menu.\n\t */\n\tclose(setTextboxValue=true) {\n\t\tvar self = this;\n\t\tvar trigger = self.isOpen;\n\n\t\tif( setTextboxValue ){\n\n\t\t\t// before blur() to prevent form onchange event\n\t\t\tself.setTextboxValue();\n\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\t\t}\n\t\t}\n\n\t\tself.isOpen = false;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'false'});\n\t\tapplyCSS(self.dropdown,{display: 'none'});\n\t\tif( self.settings.hideSelected ){\n\t\t\tself.clearActiveOption();\n\t\t}\n\t\tself.refreshState();\n\n\t\tif (trigger) self.trigger('dropdown_close', self.dropdown);\n\t}\n\n\t/**\n\t * Calculates and applies the appropriate\n\t * position of the dropdown if dropdownParent = 'body'.\n\t * Otherwise, position is determined by css\n\t */\n\tpositionDropdown(){\n\n\t\tif( this.settings.dropdownParent !== 'body' ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar context\t\t\t= this.control;\n\t\tvar rect\t\t\t= context.getBoundingClientRect();\n\t\tvar top\t\t\t\t= context.offsetHeight + rect.top + window.scrollY;\n\t\tvar left\t\t\t= rect.left + window.scrollX;\n\n\n\t\tapplyCSS(this.dropdown,{\n\t\t\twidth : rect.width + 'px',\n\t\t\ttop : top + 'px',\n\t\t\tleft : left + 'px'\n\t\t});\n\n\t}\n\n\t/**\n\t * Resets / clears all selected items\n\t * from the control.\n\t *\n\t */\n\tclear(silent?:boolean) {\n\t\tvar self = this;\n\n\t\tif (!self.items.length) return;\n\n\t\tvar items = self.controlChildren();\n\t\titerate(items,(item:TomItem)=>{\n\t\t\tself.removeItem(item,true);\n\t\t});\n\n\t\tself.showInput();\n\t\tif( !silent ) self.updateOriginalInput();\n\t\tself.trigger('clear');\n\t}\n\n\t/**\n\t * A helper method for inserting an element\n\t * at the current caret position.\n\t *\n\t */\n\tinsertAtCaret(el:HTMLElement) {\n\t\tconst self\t\t= this;\n\t\tconst caret\t\t= self.caretPos;\n\t\tconst target\t= self.control;\n\n\t\ttarget.insertBefore(el, target.children[caret] || null);\n\t\tself.setCaret(caret + 1);\n\t}\n\n\t/**\n\t * Removes the current selected item(s).\n\t *\n\t */\n\tdeleteSelection(e:KeyboardEvent):boolean {\n\t\tvar direction, selection, caret, tail;\n\t\tvar self = this;\n\n\t\tdirection = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n\t\tselection = getSelection(self.control_input);\n\n\n\t\t// determine items that will be removed\n\t\tconst rm_items:TomItem[]\t= [];\n\n\t\tif (self.activeItems.length) {\n\n\t\t\ttail = getTail(self.activeItems, direction);\n\t\t\tcaret = nodeIndex(tail);\n\n\t\t\tif (direction > 0) { caret++; }\n\n\t\t\titerate(self.activeItems, (item:TomItem) => rm_items.push(item) );\n\n\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\tconst items = self.controlChildren();\n\t\t\tlet rm_item;\n\t\t\tif( direction < 0 && selection.start === 0 && selection.length === 0 ){\n\t\t\t\trm_item = items[self.caretPos - 1];\n\n\t\t\t}else if( direction > 0 && selection.start === self.inputValue().length ){\n\t\t\t\trm_item = items[self.caretPos];\n\t\t\t}\n\n\t\t\tif( rm_item !== undefined ){\n\t\t\t\trm_items.push( rm_item );\n\t\t\t}\n\t\t}\n\n\t\tif( !self.shouldDelete(rm_items,e) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tpreventDefault(e,true);\n\n\t\t// perform removal\n\t\tif (typeof caret !== 'undefined') {\n\t\t\tself.setCaret(caret);\n\t\t}\n\n\t\twhile( rm_items.length ){\n\t\t\tself.removeItem(rm_items.pop());\n\t\t}\n\n\t\tself.showInput();\n\t\tself.positionDropdown();\n\t\tself.refreshOptions(false);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if the items should be deleted\n\t */\n\tshouldDelete(items:TomItem[],evt:MouseEvent|KeyboardEvent){\n\n\t\tconst values = items.map(item => item.dataset.value);\n\n\t\t// allow the callback to abort\n\t\tif( !values.length || (typeof this.settings.onDelete === 'function' && this.settings.onDelete(values,evt) === false) ){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Selects the previous / next item (depending on the `direction` argument).\n\t *\n\t * > 0 - right\n\t * < 0 - left\n\t *\n\t */\n\tadvanceSelection(direction:number, e?:MouseEvent|KeyboardEvent) {\n\t\tvar last_active, adjacent, self = this;\n\n\t\tif (self.rtl) direction *= -1;\n\t\tif( self.inputValue().length ) return;\n\n\n\t\t// add or remove to active items\n\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) || isKeyDown('shiftKey',e) ){\n\n\t\t\tlast_active\t\t\t= self.getLastActive(direction);\n\t\t\tif( last_active ){\n\n\t\t\t\tif( !last_active.classList.contains('active') ){\n\t\t\t\t\tadjacent\t\t\t= last_active;\n\t\t\t\t}else{\n\t\t\t\t\tadjacent\t\t\t= self.getAdjacent(last_active,direction,'item');\n\t\t\t\t}\n\n\t\t\t// if no active item, get items adjacent to the control input\n\t\t\t}else if( direction > 0 ){\n\t\t\t\tadjacent\t\t\t= self.control_input.nextElementSibling;\n\t\t\t}else{\n\t\t\t\tadjacent\t\t\t= self.control_input.previousElementSibling;\n\t\t\t}\n\n\n\t\t\tif( adjacent ){\n\t\t\t\tif( adjacent.classList.contains('active') ){\n\t\t\t\t\tself.removeActiveItem(last_active);\n\t\t\t\t}\n\t\t\t\tself.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n\t\t\t}\n\n\t\t// move caret to the left or right\n\t\t}else{\n\t\t\tself.moveCaret(direction);\n\t\t}\n\t}\n\n\tmoveCaret(direction:number){}\n\n\t/**\n\t * Get the last active item\n\t *\n\t */\n\tgetLastActive(direction?:number){\n\n\t\tlet last_active = this.control.querySelector('.last-active');\n\t\tif( last_active ){\n\t\t\treturn last_active;\n\t\t}\n\n\n\t\tvar result = this.control.querySelectorAll('.active');\n\t\tif( result ){\n\t\t\treturn getTail(result,direction);\n\t\t}\n\t}\n\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tsetCaret(new_pos:number) {\n\t\tthis.caretPos = this.items.length;\n\t}\n\n\t/**\n\t * Return list of item dom elements\n\t *\n\t */\n\tcontrolChildren():TomItem[]{\n\t\treturn Array.from( this.control.querySelectorAll('[data-ts-item]') ) as TomItem[];\n\t}\n\n\t/**\n\t * Disables user input on the control. Used while\n\t * items are being asynchronously created.\n\t */\n\tlock() {\n\t\tthis.isLocked = true;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Re-enables user input on the control.\n\t */\n\tunlock() {\n\t\tthis.isLocked = false;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Disables user input on the control completely.\n\t * While disabled, it cannot receive focus.\n\t */\n\tdisable() {\n\t\tvar self = this;\n\t\tself.input.disabled\t\t\t\t= true;\n\t\tself.control_input.disabled\t\t= true;\n\t\tself.focus_node.tabIndex\t\t= -1;\n\t\tself.isDisabled\t\t\t\t\t= true;\n\t\tthis.close();\n\t\tself.lock();\n\t}\n\n\t/**\n\t * Enables the control so that it can respond\n\t * to focus and user input.\n\t */\n\tenable() {\n\t\tvar self = this;\n\t\tself.input.disabled\t\t\t\t= false;\n\t\tself.control_input.disabled\t\t= false;\n\t\tself.focus_node.tabIndex\t\t= self.tabIndex;\n\t\tself.isDisabled\t\t\t\t\t= false;\n\t\tself.unlock();\n\t}\n\n\t/**\n\t * Completely destroys the control and\n\t * unbinds all event listeners so that it can\n\t * be garbage collected.\n\t */\n\tdestroy() {\n\t\tvar self = this;\n\t\tvar revertSettings = self.revertSettings;\n\n\t\tself.trigger('destroy');\n\t\tself.off();\n\t\tself.wrapper.remove();\n\t\tself.dropdown.remove();\n\n\t\tself.input.innerHTML = revertSettings.innerHTML;\n\t\tself.input.tabIndex = revertSettings.tabIndex;\n\n\t\tremoveClasses(self.input,'tomselected','ts-hidden-accessible');\n\n\t\tself._destroy();\n\n\t\tdelete self.input.tomselect;\n\t}\n\n\t/**\n\t * A helper method for rendering \"item\" and\n\t * \"option\" templates, given the data.\n\t *\n\t */\n\trender( templateName:TomTemplateNames, data?:any ):null|HTMLElement{\n\t\tvar id, html;\n\t\tconst self = this;\n\n\t\tif( typeof this.settings.render[templateName] !== 'function' ){\n\t\t\treturn null;\n\t\t}\n\n\t\t// render markup\n\t\thtml = self.settings.render[templateName].call(this, data, escape_html);\n\n\t\tif( !html ){\n\t\t\treturn null;\n\t\t}\n\n\t\thtml = getDom( html );\n\n\t\t// add mandatory attributes\n\t\tif (templateName === 'option' || templateName === 'option_create') {\n\n\t\t\tif( data[self.settings.disabledField] ){\n\t\t\t\tsetAttr(html,{'aria-disabled':'true'});\n\t\t\t}else{\n\t\t\t\tsetAttr(html,{'data-selectable': ''});\n\t\t\t}\n\n\t\t}else if (templateName === 'optgroup') {\n\t\t\tid = data.group[self.settings.optgroupValueField];\n\t\t\tsetAttr(html,{'data-group': id});\n\t\t\tif(data.group[self.settings.disabledField]) {\n\t\t\t\tsetAttr(html,{'data-disabled': ''});\n\t\t\t}\n\t\t}\n\n\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\tconst value\t= get_hash(data[self.settings.valueField]);\n\t\t\tsetAttr(html,{'data-value': value });\n\n\n\t\t\t// make sure we have some classes if a template is overwritten\n\t\t\tif( templateName === 'item' ){\n\t\t\t\taddClasses(html,self.settings.itemClass);\n\t\t\t\tsetAttr(html,{'data-ts-item':''});\n\t\t\t}else{\n\t\t\t\taddClasses(html,self.settings.optionClass);\n\t\t\t\tsetAttr(html,{\n\t\t\t\t\trole:'option',\n\t\t\t\t\tid:data.$id\n\t\t\t\t});\n\n\t\t\t\t// update cache\n\t\t\t\tdata.$div = html;\n\t\t\t\tself.options[value] = data;\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn html;\n\n\t}\n\n\n\t/**\n\t * Type guarded rendering\n\t *\n\t */\n\t_render( templateName:TomTemplateNames, data?:any ):HTMLElement{\n\t\tconst html = this.render(templateName, data);\n\n\t\tif( html == null ){\n\t\t\tthrow 'HTMLElement expected';\n\t\t}\n\t\treturn html;\n\t}\n\n\n\t/**\n\t * Clears the render cache for a template. If\n\t * no template is given, clears all render\n\t * caches.\n\t *\n\t */\n\tclearCache():void{\n\n\t\titerate(this.options, (option:TomOption)=>{\n\t\t\tif( option.$div ){\n\t\t\t\toption.$div.remove();\n\t\t\t\tdelete option.$div;\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Removes a value from item and option caches\n\t *\n\t */\n\tuncacheValue(value:string){\n\n\t\tconst option_el\t\t\t= this.getOption(value);\n\t\tif( option_el ) option_el.remove();\n\n\t}\n\n\t/**\n\t * Determines whether or not to display the\n\t * create item prompt, given a user input.\n\t *\n\t */\n\tcanCreate( input:string ):boolean {\n\t\treturn this.settings.create && (input.length > 0) && (this.settings.createFilter as TomCreateFilter ).call(this, input);\n\t}\n\n\n\t/**\n\t * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n\t *\n\t * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n\t *\n\t * });\n\t */\n\thook( when:string, method:string, new_fn:any ){\n\t\tvar self = this;\n\t\tvar orig_method = self[method];\n\n\n\t\tself[method] = function(){\n\t\t\tvar result, result_new;\n\n\t\t\tif( when === 'after' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\tresult_new = new_fn.apply(self, arguments );\n\n\t\t\tif( when === 'instead' ){\n\t\t\t\treturn result_new;\n\t\t\t}\n\n\t\t\tif( when === 'before' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t}\n\n};\n","/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\ntype TSettings = {\n\t[key:string]:any\n}\n\ntype TPlugins = {\n\tnames: string[],\n\tsettings: TSettings,\n\trequested: {[key:string]:boolean},\n\tloaded: {[key:string]:any}\n};\n\nexport type TPluginItem = {name:string,options:{}};\nexport type TPluginHash = {[key:string]:{}};\n\n\n\n\nexport default function MicroPlugin(Interface: any ){\n\n\tInterface.plugins = {};\n\n\treturn class extends Interface{\n\n\t\tpublic plugins:TPlugins = {\n\t\t\tnames : [],\n\t\t\tsettings : {},\n\t\t\trequested : {},\n\t\t\tloaded : {}\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tstatic define(name:string, fn:(this:any,settings:TSettings)=>any){\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn' : fn\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t * ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t * [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t * {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {array|object} plugins\n\t\t */\n\t\tinitializePlugins(plugins:string[]|TPluginItem[]|TPluginHash) {\n\t\t\tvar key, name;\n\t\t\tconst self = this;\n\t\t\tconst queue:string[] = [];\n\n\t\t\tif (Array.isArray(plugins)) {\n\t\t\t\tplugins.forEach((plugin:string|TPluginItem)=>{\n\t\t\t\t\tif (typeof plugin === 'string') {\n\t\t\t\t\t\tqueue.push(plugin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugin.name] = plugin.options;\n\t\t\t\t\t\tqueue.push(plugin.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile( name = queue.shift() ){\n\t\t\t\tself.require(name);\n\t\t\t}\n\t\t}\n\n\t\tloadPlugin(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' + name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t */\n\t\trequire(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t}\n\n\t};\n\n}\n","import TomSelect from './tom-select';\n\nimport change_listener from './plugins/change_listener/plugin';\nimport checkbox_options from './plugins/checkbox_options/plugin';\nimport clear_button from './plugins/clear_button/plugin';\nimport drag_drop from './plugins/drag_drop/plugin';\nimport dropdown_header from './plugins/dropdown_header/plugin';\nimport caret_position from './plugins/caret_position/plugin';\nimport dropdown_input from './plugins/dropdown_input/plugin';\nimport input_autogrow from './plugins/input_autogrow/plugin';\nimport no_backspace_delete from './plugins/no_backspace_delete/plugin';\nimport no_active_items from './plugins/no_active_items/plugin';\nimport optgroup_columns from './plugins/optgroup_columns/plugin';\nimport remove_button from './plugins/remove_button/plugin';\nimport restore_on_backspace from './plugins/restore_on_backspace/plugin';\nimport virtual_scroll from './plugins/virtual_scroll/plugin';\n\nTomSelect.define('change_listener', change_listener);\nTomSelect.define('checkbox_options', checkbox_options);\nTomSelect.define('clear_button', clear_button);\nTomSelect.define('drag_drop', drag_drop);\nTomSelect.define('dropdown_header', dropdown_header);\nTomSelect.define('caret_position', caret_position);\nTomSelect.define('dropdown_input', dropdown_input);\nTomSelect.define('input_autogrow', input_autogrow);\nTomSelect.define('no_backspace_delete', no_backspace_delete);\nTomSelect.define('no_active_items', no_active_items);\nTomSelect.define('optgroup_columns', optgroup_columns);\nTomSelect.define('remove_button', remove_button);\nTomSelect.define('restore_on_backspace', restore_on_backspace);\nTomSelect.define('virtual_scroll', virtual_scroll);\n\nexport default TomSelect;\n","/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\taddEvent(this.input,'change',()=>{\n\t\tthis.sync();\n\t});\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { preventDefault, hash_key } from '../../utils';\nimport { getDom } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_onOptionSelect = self.onOptionSelect;\n\n\tself.settings.hideSelected = false;\n\n\n\t// update the checkbox for an option\n\tvar UpdateCheckbox = function(option:HTMLElement){\n\t\tsetTimeout(()=>{\n\t\t\tvar checkbox = option.querySelector('input');\n\t\t\tif( checkbox instanceof HTMLInputElement ){\n\t\t\t\tif( option.classList.contains('selected') ){\n\t\t\t\t\tcheckbox.checked = true;\n\t\t\t\t}else{\n\t\t\t\t\tcheckbox.checked = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},1);\n\t};\n\n\t// add checkbox to option template\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_option = self.settings.render.option;\n\n\t\tself.settings.render.option = (data, escape_html) => {\n\t\t\tvar rendered = getDom(orig_render_option.call(self, data, escape_html));\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tcheckbox.addEventListener('click',function(evt){\n\t\t\t\tpreventDefault(evt);\n\t\t\t});\n\n\t\t\tcheckbox.type = 'checkbox';\n\t\t\tconst hashed = hash_key(data[self.settings.valueField]);\n\n\n\t\t\tif( hashed && self.items.indexOf(hashed) > -1 ){\n\t\t\t\tcheckbox.checked = true;\n\t\t\t}\n\n\t\t\trendered.prepend(checkbox);\n\t\t\treturn rendered;\n\t\t};\n\t});\n\n\t// uncheck when item removed\n\tself.on('item_remove',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\toption.classList.remove('selected'); // selected class won't be removed yet\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\t// check when item added\n\tself.on('item_add',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\n\t// remove items when selected option is clicked\n\tself.hook('instead','onOptionSelect',( evt:KeyboardEvent, option:HTMLElement )=>{\n\n\t\tif( option.classList.contains('selected') ){\n\t\t\toption.classList.remove('selected')\n\t\t\tself.removeItem(option.dataset.value);\n\t\t\tself.refreshOptions();\n\t\t\tpreventDefault(evt,true);\n\t\t\treturn;\n }\n\n\t\torig_onOptionSelect.call(self, evt, option);\n\n\t\tUpdateCheckbox(option);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { CBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\tclassName: 'clear-button',\n\t\ttitle: 'Clear All',\n\t\thtml: (data:CBOptions) => {\n\t\t\treturn `<div class=\"${data.className}\" title=\"${data.title}\">⨯</div>`;\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar button = getDom(options.html(options));\n\t\tbutton.addEventListener('click',(evt)=>{\n\n\t\t\tif( self.isDisabled ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.clear();\n\n\t\t\tif( self.settings.mode === 'single' && self.settings.allowEmptyOption ){\n\t\t\t\tself.addItem('');\n\t\t\t}\n\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t});\n\t\tself.control.appendChild(button);\n\t});\n\n};\n","/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\tif (self.settings.mode !== 'multi') return;\n\n\tvar orig_lock\t\t= self.lock;\n\tvar orig_unlock\t\t= self.unlock;\n\n\tself.hook('instead','lock',()=>{\n\t\tvar sortable = $(self.control).data('sortable');\n\t\tif (sortable) sortable.disable();\n\t\treturn orig_lock.call(self);\n\t});\n\n\tself.hook('instead','unlock',()=>{\n\t\tvar sortable = $(self.control).data('sortable');\n\t\tif (sortable) sortable.enable();\n\t\treturn orig_unlock.call(self);\n\t});\n\n\tself.on('initialize',()=>{\n\t\tvar $control = $(self.control).sortable({\n\t\t\titems: '[data-value]',\n\t\t\tforcePlaceholderSize: true,\n\t\t\tdisabled: self.isLocked,\n\t\t\tstart: (e, ui) => {\n\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t},\n\t\t\tstop: ()=>{\n\t\t\t\t$control.css({overflow: 'hidden'});\n\n\t\t\t\tvar values:string[] = [];\n\t\t\t\t$control.children('[data-value]').each(function(this:HTMLElement){\n\t\t\t\t\tif( this.dataset.value ) values.push(this.dataset.value);\n\t\t\t\t});\n\n\t\t\t\tself.setValue(values);\n\t\t\t}\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { preventDefault } from '../../utils';\nimport { DHOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:DHOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttitle : 'Untitled',\n\t\theaderClass : 'dropdown-header',\n\t\ttitleRowClass : 'dropdown-header-title',\n\t\tlabelClass : 'dropdown-header-label',\n\t\tcloseClass : 'dropdown-header-close',\n\n\t\thtml: (data:DHOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t'<a class=\"' + data.closeClass + '\">×</a>' +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar header = getDom(options.html(options));\n\n\t\tvar close_link = header.querySelector('.'+options.closeClass);\n\t\tif( close_link ){\n\t\t\tclose_link.addEventListener('click',(evt)=>{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\tself.close();\n\t\t\t});\n\t\t}\n\n\t\tself.dropdown.insertBefore(header, self.dropdown.firstChild);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { nodeIndex, removeClasses } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { getDom, addClasses } from '../../vanilla';\nimport { addEvent, preventDefault } from '../../utils';\n\n\nexport default function(this:TomSelect) {\n\tconst self = this;\n\n\tself.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n\tself.hook('before','setup',()=>{\n\t\tself.focus_node\t\t= self.control;\n\n\t\taddClasses( self.control_input, 'dropdown-input');\n\n\t \tconst div = getDom('<div class=\"dropdown-input-wrap\">');\n\t\tdiv.append(self.control_input);\n\t\tself.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n\t\t// set a placeholder in the select control\n\t\tconst placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />') as HTMLInputElement;\n\t\tplaceholder.placeholder = self.settings.placeholder ||'';\n\t\tself.control.append(placeholder);\n\n\t});\n\n\n\tself.on('initialize',()=>{\n\n\t\t// set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n\t\tself.control_input.addEventListener('keydown',(evt:KeyboardEvent) =>{\n\t\t//addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n\t\t\tswitch( evt.keyCode ){\n\t\t\t\tcase constants.KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\tpreventDefault(evt,true);\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\t\t\t\tcase constants.KEY_TAB:\n\t\t\t\t\tself.focus_node.tabIndex = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn self.onKeyDown.call(self,evt);\n\t\t});\n\n\t\tself.on('blur',()=>{\n\t\t\tself.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n\t\t});\n\n\n\t\t// give the control_input focus when the dropdown is open\n\t\tself.on('dropdown_open',() =>{\n\t\t\tself.control_input.focus();\n\t\t});\n\n\t\t// prevent onBlur from closing when focus is on the control_input\n\t\tconst orig_onBlur = self.onBlur;\n\t\tself.hook('instead','onBlur',(evt?:FocusEvent)=>{\n\t\t\tif( evt && evt.relatedTarget == self.control_input ) return;\n\t\t\treturn orig_onBlur.call(self);\n\t\t});\n\n\t\taddEvent(self.control_input,'blur', () => self.onBlur() );\n\n\t\t// return focus to control to allow further keyboard input\n\t\tself.hook('before','close',() =>{\n\n\t\t\tif( !self.isOpen ) return;\n\t\t\tself.focus_node.focus({preventScroll: true});\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\tvar self\t\t\t\t\t= this;\n\n\tself.on('initialize',()=>{\n\n\n\t\tvar test_input\t\t\t\t= document.createElement('span');\n\t\tvar control\t\t\t\t\t= self.control_input;\n\t\ttest_input.style.cssText\t= 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n\n\t\tself.wrapper.appendChild(test_input);\n\n\n\t\tvar transfer_styles\t\t\t= [ 'letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform' ];\n\n\t\tfor( const style_name of transfer_styles ){\n\t\t\t// @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n\t\t\ttest_input.style[style_name] = control.style[style_name];\n\t\t}\n\n\n\t\t/**\n\t\t * Set the control width\n\t\t *\n\t\t */\n\t\tvar resize = ()=>{\n\t\t\ttest_input.textContent\t= control.value;\n\t\t\tcontrol.style.width\t\t= test_input.clientWidth+'px';\n\t\t};\n\n\t\tresize();\n\t\tself.on('update item_add item_remove',resize);\n\t\taddEvent(control,'input', resize );\n\t\taddEvent(control,'keyup', resize );\n\t\taddEvent(control,'blur', resize );\n\t\taddEvent(control,'update', resize );\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_deleteSelection = self.deleteSelection;\n\n\tthis.hook('instead','deleteSelection',(evt:KeyboardEvent) => {\n\n\t\tif( self.activeItems.length ){\n\t\t\treturn orig_deleteSelection.call(self, evt);\n\t\t}\n\n\t\treturn false;\n\t});\n\n};\n","/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tthis.hook('instead','setActiveItem',() => {});\n\tthis.hook('instead','selectAll',() => {});\n};\n","/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { parentMatch, nodeIndex } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\tvar orig_keydown = self.onKeyDown;\n\n\tself.hook('instead','onKeyDown',(evt:KeyboardEvent)=>{\n\t\tvar index, option, options, optgroup;\n\n\t\tif( !self.isOpen || !(evt.keyCode === constants.KEY_LEFT || evt.keyCode === constants.KEY_RIGHT)) {\n\t\t\treturn orig_keydown.call(self,evt);\n\t\t}\n\n\t\tself.ignoreHover\t= true;\n\t\toptgroup\t\t\t= parentMatch(self.activeOption,'[data-group]');\n\t\tindex\t\t\t\t= nodeIndex(self.activeOption,'[data-selectable]');\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( evt.keyCode === constants.KEY_LEFT ){\n\t\t\toptgroup = optgroup.previousSibling;\n\t\t} else {\n\t\t\toptgroup = optgroup.nextSibling;\n\t\t}\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\toptions\t\t\t\t= (<HTMLOptGroupElement>optgroup).querySelectorAll('[data-selectable]');\n\t\toption\t\t\t\t= options[ Math.min(options.length - 1, index) ] as HTMLElement;\n\n\t\tif( option ){\n\t\t\tself.setActiveOption(option);\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { escape_html, preventDefault, addEvent } from '../../utils';\nimport { TomOption, TomItem } from '../../types/index';\nimport { RBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:RBOptions) {\n\n\tconst options = Object.assign({\n\t\t\tlabel : '×',\n\t\t\ttitle : 'Remove',\n\t\t\tclassName : 'remove',\n\t\t\tappend : true\n\t\t}, userOptions);\n\n\n\t//options.className = 'remove-single';\n\tvar self\t\t\t= this;\n\n\t// override the render method to add remove button to each item\n\tif( !options.append ){\n\t\treturn;\n\t}\n\n\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\n\t\t\tvar item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\n\t\t\tvar close_button = getDom(html);\n\t\t\titem.appendChild(close_button);\n\n\t\t\taddEvent(close_button,'mousedown',(evt) => {\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t});\n\n\t\t\taddEvent(close_button,'click',(evt) => {\n\n\t\t\t\t// propagating will trigger the dropdown to show for single mode\n\t\t\t\tpreventDefault(evt,true);\n\n\t\t\t\tif( self.isLocked ) return;\n\t\t\t\tif( !self.shouldDelete([item],evt as MouseEvent) ) return;\n\n\t\t\t\tself.removeItem(item);\n\t\t\t\tself.refreshOptions(false);\n\t\t\t\tself.inputState();\n\t\t\t});\n\n\t\t\treturn item;\n\t\t};\n\n\t});\n\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\n\ntype TPluginOptions = {\n\ttext?:(option:TomOption)=>string,\n};\n\nexport default function(this:TomSelect, userOptions:TPluginOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttext: (option:TomOption) => {\n\t\t\treturn option[self.settings.labelField];\n\t\t}\n\t},userOptions);\n\n\tself.on('item_remove',function(value:string){\n\t\tif( !self.isFocused ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.control_input.value.trim() === '' ){\n\t\t\tvar option = self.options[value];\n\t\t\tif( option ){\n\t\t\t\tself.setTextboxValue(options.text.call(self, option));\n\t\t\t}\n\t\t}\n\t});\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\nimport { addClasses } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tconst self\t\t\t\t\t\t\t= this;\n\tconst orig_canLoad\t\t\t\t\t= self.canLoad;\n\tconst orig_clearActiveOption\t\t= self.clearActiveOption;\n\tconst orig_loadCallback\t\t\t\t= self.loadCallback;\n\n\tvar pagination:{[key:string]:any}\t= {};\n\tvar dropdown_content:HTMLElement;\n\tvar loading_more\t\t\t\t\t= false;\n\tvar load_more_opt:HTMLElement;\n\tvar default_values: string[]\t\t= [];\n\n\tif( !self.settings.shouldLoadMore ){\n\n\t\t// return true if additional results should be loaded\n\t\tself.settings.shouldLoadMore = ():boolean=>{\n\n\t\t\tconst scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\t\t\tif( scroll_percent > 0.9 ){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif( self.activeOption ){\n\t\t\t\tvar selectable\t= self.selectable();\n\t\t\t\tvar index\t\t= Array.from(selectable).indexOf(self.activeOption);\n\t\t\t\tif( index >= (selectable.length-2) ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\tif( !self.settings.firstUrl ){\n\t\tthrow 'virtual_scroll plugin requires a firstUrl() method';\n\t}\n\n\n\t// in order for virtual scrolling to work,\n\t// options need to be ordered the same way they're returned from the remote data source\n\tself.settings.sortField\t\t\t= [{field:'$order'},{field:'$score'}];\n\n\n\t// can we load more results for given query?\n\tconst canLoadMore = (query:string):boolean => {\n\n\t\tif( typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions ){\n\t\t\treturn false;\n\t\t}\n\n\t\tif( (query in pagination) && pagination[query] ){\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tconst clearFilter = (option:TomOption, value:string):boolean => {\n\t\tif( self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\n\t// set the next url that will be\n\tself.setNextUrl = (value:string,next_url:any):void => {\n\t\tpagination[value] = next_url;\n\t};\n\n\t// getUrl() to be used in settings.load()\n\tself.getUrl = (query:string):any =>{\n\n\t\tif( query in pagination ){\n\t\t\tconst next_url = pagination[query];\n\t\t\tpagination[query] = false;\n\t\t\treturn next_url;\n\t\t}\n\n\t\t// if the user goes back to a previous query\n\t\t// we need to load the first page again\n\t\tpagination = {};\n\n\t\treturn self.settings.firstUrl.call(self,query);\n\t};\n\n\n\t// don't clear the active option (and cause unwanted dropdown scroll)\n\t// while loading more results\n\tself.hook('instead','clearActiveOption',()=>{\n\n\t\tif( loading_more ){\n\t\t\treturn;\n\t\t}\n\n\t\treturn orig_clearActiveOption.call(self);\n\t});\n\n\t// override the canLoad method\n\tself.hook('instead','canLoad',(query:string)=>{\n\n\t\t// first time the query has been seen\n\t\tif( !(query in pagination) ){\n\t\t\treturn orig_canLoad.call(self,query);\n\t\t}\n\n\t\treturn canLoadMore(query);\n\t});\n\n\n\t// wrap the load\n\tself.hook('instead','loadCallback',( options:TomOption[], optgroups:TomOption[])=>{\n\n\t\tif( !loading_more ){\n\t\t\tself.clearOptions(clearFilter);\n\t\t}else if( load_more_opt ){\n\t\t\tconst first_option = options[0];\n\t\t\tif( first_option !== undefined ){\n\t\t\t\tload_more_opt.dataset.value\t\t= first_option[self.settings.valueField];\n\t\t\t}\n\t\t}\n\n\t\torig_loadCallback.call( self, options, optgroups);\n\n\t\tloading_more = false;\n\t});\n\n\n\t// add templates to dropdown\n\t//\tloading_more if we have another url in the queue\n\t//\tno_more_results if we don't have another url in the queue\n\tself.hook('after','refreshOptions',()=>{\n\n\t\tconst query\t\t= self.lastValue;\n\t\tvar option;\n\n\t\tif( canLoadMore(query) ){\n\n\t\t\toption = self.render('loading_more',{query:query});\n\t\t\tif( option ){\n\t\t\t\toption.setAttribute('data-selectable',''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\t\t\t\tload_more_opt = option;\n\t\t\t}\n\n\t\t}else if( (query in pagination) && !dropdown_content.querySelector('.no-results') ){\n\t\t\toption = self.render('no_more_results',{query:query});\n\t\t}\n\n\t\tif( option ){\n\t\t\taddClasses(option,self.settings.optionClass);\n\t\t\tdropdown_content.append( option );\n\t\t}\n\n\t});\n\n\n\t// add scroll listener and default templates\n\tself.on('initialize',()=>{\n\t\tdefault_values = Object.keys(self.options);\n\t\tdropdown_content = self.dropdown_content;\n\n\t\t// default templates\n\t\tself.settings.render = Object.assign({}, {\n\t\t\tloading_more:() => {\n\t\t\t\treturn `<div class=\"loading-more-results\">Loading more results ... </div>`;\n\t\t\t},\n\t\t\tno_more_results:() =>{\n\t\t\t\treturn `<div class=\"no-more-results\">No more results</div>`;\n\t\t\t}\n\t\t},self.settings.render);\n\n\n\t\t// watch dropdown content scroll position\n\t\tdropdown_content.addEventListener('scroll',()=>{\n\n\t\t\tif( !self.settings.shouldLoadMore.call(self) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\t\t\tif( !canLoadMore(self.lastValue) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// don't call load() too much\n\t\t\tif( loading_more ) return;\n\n\n\t\t\tloading_more = true;\n\t\t\tself.load.call(self,self.lastValue);\n\t\t});\n\t});\n\n};\n"],"names":["forEvents","events","callback","split","forEach","event","MicroEvent","constructor","this","_events","on","fct","event_array","push","off","n","arguments","length","undefined","splice","indexOf","trigger","args","self","apply","arrayToPattern","chars","filter","Boolean","maxValueLength","join","sequencePattern","array","hasDuplicates","pattern","prev_char_count","prev_pattern","char","i","setToPattern","toArray","Set","size","escape_regex","str","replace","reduce","longest","value","Math","max","unicodeLength","p","Array","from","allSubstrings","input","result","start","substring","subresult","tmp","slice","charAt","unshift","code_points","unicode_map","multi_char_reg","latin_convert","latin_condensed","/","0","a","aa","ae","ao","au","av","ay","b","c","d","e","f","g","h","j","k","l","m","o","oe","oi","oo","ou","q","r","s","t","th","tz","u","v","vy","w","y","z","hv","latin","unicode","convert_pat","RegExp","Object","keys","normalize","form","asciifold","_asciifold","toLowerCase","generateSets","unicode_sets","addMatching","folded","to_add","folded_set","patt","match","add","code_point_min","code_point_max","composed","String","fromCharCode","code_point","generator","generateMap","multi_char","set","sort","multi_char_patt","substringsToPattern","min_replacement","map","sub_pat","strings","chars_replaced","mapSequence","sequencesToPattern","sequences","all","sequence","seq","len","substrs","inSequences","needle_seq","end","needle_parts","parts","part","needle_part","substr","Sequence","[object Object]","min","position","last_piece","clone","JSON","parse","stringify","last_part","pop","last_substr","clone_last_len","getPattern","_code_points","match_str","overlapping","added_types","last","has","new_seq","old_seq","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","token","weight","score","pos","regex","search","string","propToArray","key","isArray","iterate","object","hasOwnProperty","cmp","Sifter","items","settings","diacritics","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","_getSortFunction","implicit_score","sort_flds","sort_empty","bind","get_field","id","fld","direction","sort_fld","optsUser","assign","trim","tokenize","total","nesting","fn_score","item","_","fn_sort","limit","getDom","jquery","HTMLElement","isHtmlString","tpl","document","createElement","innerHTML","content","firstChild","querySelector","arg","triggerEvent","dom_el","event_name","createEvent","initEvent","dispatchEvent","applyCSS","css","style","addClasses","elmts","classes","norm_classes","classesArray","castAsArray","el","cls","classList","removeClasses","remove","_classes","concat","parentMatch","target","selector","wrapper","contains","matches","parentNode","getTail","list","nodeIndex","amongst","nodeName","previousElementSibling","setAttr","attrs","val","attr","removeAttribute","setAttribute","replaceNode","existing","replacement","replaceChild","highlight","element","highlightText","highlightRecursive","node","nodeType","spannode","className","middlebit","splitText","index","middleclone","cloneNode","appendChild","childNodes","test","tagName","highlightChildren","KEY_SHORTCUT","navigator","userAgent","defaults","optgroups","plugins","delimiter","splitOn","persist","create","createOnBlur","createFilter","openOnFocus","shouldOpen","maxOptions","maxItems","hideSelected","duplicates","addPrecedence","selectOnTab","preload","allowEmptyOption","loadThrottle","loadingClass","dataAttr","optgroupField","valueField","labelField","disabledField","optgroupLabelField","optgroupValueField","lockOptgroupOrder","sortField","searchField","searchConjunction","mode","wrapperClass","controlClass","dropdownClass","dropdownContentClass","itemClass","optionClass","dropdownParent","controlInput","copyClassesToDropdown","placeholder","hidePlaceholder","shouldLoad","render","hash_key","get_hash","escape_html","loadDebounce","fn","delay","timeout","loading","clearTimeout","setTimeout","loadedSearches","call","debounce_events","types","type","event_args","preventDefault","evt","stop","stopPropagation","addEvent","addEventListener","isKeyDown","key_name","altKey","ctrlKey","shiftKey","metaKey","getId","existing_id","getAttribute","addSlashes","append","parent","getSettings","settings_user","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","option","textContent","optionsMap","group_count","readData","addOption","settings_element","dataset","json","group","arr","option_data","disabled","$option","selected","hasAttribute","children","child","optgroup","optgroup_data","data_raw","opt","values","init_textbox","instance_i","TomSelect","Interface","super","requested","loaded","initializePlugins","queue","plugin","require","loadPlugin","Error","MicroPlugin","input_arg","user_settings","dir","control_input","dropdown","control","dropdown_content","focus_node","order","tabIndex","is_select_tag","rtl","inputId","_destroy","sifter","isOpen","isDisabled","isRequired","isInvalid","isValid","isLocked","isFocused","isInputHidden","isSetup","ignoreFocus","ignoreHover","hasOptions","currentResults","lastValue","caretPos","activeOption","activeItems","userOptions","tomselect","window","getComputedStyle","getPropertyValue","required","setupCallbacks","setupTemplates","_render","inputMode","setup","passive_event","passive","listboxId","role","aria-haspopup","aria-expanded","control_id","escapeQuery","label","label_click","focus","for","label_id","width","classes_plugins","multiple","load","target_match","onOptionHover","capture","onOptionSelect","onItemSelect","onClick","onKeyDown","onKeyPress","onInput","onBlur","onFocus","onPaste","doc_mousedown","composedPath","blur","inputState","win_scroll","positionDropdown","removeEventListener","revertSettings","insertAdjacentElement","sync","refreshState","updateOriginalInput","refreshItems","close","disable","enable","onChange","setupOptions","addOptions","registerOptionGroup","templates","optgroup_header","escape","option_create","no_results","not_loading","callbacks","initialize","change","item_add","item_remove","item_select","clear","option_add","option_remove","option_clear","optgroup_add","optgroup_remove","optgroup_clear","dropdown_open","dropdown_close","get_settings","setValue","lastQuery","clearActiveItems","onMouseDown","pastedText","inputValue","splitInput","piece","addItem","createItem","character","keyCode","which","constants","selectAll","open","next","getAdjacent","setActiveOption","prev","canSelect","activeElement","advanceSelection","deleteSelection","refreshOptions","wasFocused","showInput","hasFocus","deactivate","setActiveItem","setCaret","parentElement","closeAfterSelect","canLoad","loadCallback","clearActiveOption","setTextboxValue","getValue","silent","addItems","setMaxItems","eventName","begin","swap","getLastActive","prototype","setActiveItemClass","removeActiveItem","hideInput","last_active","idx","scroll","aria-activedescendant","aria-selected","scrollToOption","behavior","height_menu","clientHeight","scrollTop","height_item","offsetHeight","getBoundingClientRect","top","scrollBehavior","controlChildren","toggle","offsetWidth","getScoreFunction","getSearchOptions","calculateScore","hashed","triggerDropdown","html","has_create_option","active_group","groups","groups_order","same_query","elements","results","active_option","show_dropdown","closest","opt_value","opt_hash","option_el","getOption","includes","group_fragment","createDocumentFragment","$id","toString","grp_a","grp_b","a_order","$order","group_heading","group_options","header","group_html","querySelectorAll","tok","add_template","template","insertBefore","canCreate","active_index","selectable","user_created","dat","registerOption","addOptionGroup","hashed_id","removeOptionGroup","clearCache","clearOptionGroups","updateOption","item_new","index_item","value_old","value_new","data_old","getItem","uncacheValue","option_new","removeOption","removeItem","clearOptions","boundFilter","clearFilter","$div","last_item","x","isPending","wasFull","isFull","insertAtCaret","output","caret","lock","created","unlock","refreshValidityState","wrap_classList","validity","valid","opts","empty_option","has_selected","AddSelected","visibility","display","context","rect","scrollY","left","scrollX","selection","tail","selectionStart","selectionEnd","rm_items","rm_item","shouldDelete","onDelete","adjacent","nextElementSibling","moveCaret","new_pos","destroy","templateName","aria-disabled","data-selectable","data-disabled","data-ts-item","hook","when","method","new_fn","orig_method","result_new","define","orig_onOptionSelect","UpdateCheckbox","checkbox","HTMLInputElement","checked","orig_render_option","rendered","prepend","title","button","$","sortable","orig_lock","orig_unlock","$control","forcePlaceholderSize","ui","helper","overflow","each","headerClass","titleRowClass","labelClass","closeClass","close_link","div","orig_onBlur","relatedTarget","preventScroll","test_input","cssText","style_name","resize","clientWidth","orig_deleteSelection","orig_keydown","previousSibling","nextSibling","orig_render_item","close_button","text","orig_canLoad","orig_clearActiveOption","orig_loadCallback","pagination","load_more_opt","loading_more","default_values","shouldLoadMore","scroll_percent","scrollHeight","firstUrl","canLoadMore","setNextUrl","next_url","getUrl","first_option","no_more_results"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"tom-select.complete.min.js","sources":["../../src/contrib/microevent.ts","../../node_modules/@orchidjs/unicode-variants/dist/esm/regex.js","../../node_modules/@orchidjs/unicode-variants/dist/esm/strings.js","../../node_modules/@orchidjs/unicode-variants/dist/esm/index.js","../../node_modules/@orchidjs/sifter/dist/esm/utils.js","../../node_modules/@orchidjs/sifter/dist/esm/sifter.js","../../src/utils.ts","../../src/vanilla.ts","../../src/contrib/highlight.ts","../../src/constants.ts","../../src/defaults.ts","../../src/getSettings.ts","../../src/tom-select.ts","../../src/contrib/microplugin.ts","../../src/tom-select.complete.ts","../../src/plugins/change_listener/plugin.ts","../../src/plugins/checkbox_options/plugin.ts","../../src/plugins/clear_button/plugin.ts","../../src/plugins/drag_drop/plugin.ts","../../src/plugins/dropdown_header/plugin.ts","../../src/plugins/caret_position/plugin.ts","../../src/plugins/dropdown_input/plugin.ts","../../src/plugins/input_autogrow/plugin.ts","../../src/plugins/no_backspace_delete/plugin.ts","../../src/plugins/no_active_items/plugin.ts","../../src/plugins/optgroup_columns/plugin.ts","../../src/plugins/remove_button/plugin.ts","../../src/plugins/restore_on_backspace/plugin.ts","../../src/plugins/virtual_scroll/plugin.ts"],"sourcesContent":["/**\n * MicroEvent - to make any js object an event emitter\n *\n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * @author Jerome Etienne (https://github.com/jeromeetienne)\n */\n\ntype TCallback = (...args:any) => any;\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events:string,callback:(event:string)=>any){\n\tevents.split(/\\s+/).forEach((event) =>{\n\t\tcallback(event);\n\t});\n}\n\nexport default class MicroEvent{\n\n\tpublic _events: {[key:string]:TCallback[]};\n\n\tconstructor(){\n\t\tthis._events = {};\n\t}\n\n\ton(events:string, fct:TCallback){\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = this._events[event] || [];\n\t\t\tevent_array.push(fct);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\toff(events:string, fct:TCallback){\n\t\tvar n = arguments.length;\n\t\tif( n === 0 ){\n\t\t\tthis._events = {};\n\t\t\treturn;\n\t\t}\n\n\t\tforEvents(events,(event) => {\n\n\t\t\tif (n === 1){\n\t\t\t\tdelete this._events[event];\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst event_array = this._events[event];\n\t\t\tif( event_array === undefined ) return;\n\n\t\t\tevent_array.splice(event_array.indexOf(fct), 1);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\ttrigger(events:string, ...args:any){\n\t\tvar self = this;\n\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = self._events[event];\n\t\t\tif( event_array === undefined ) return;\n\t\t\tevent_array.forEach(fct => {\n\t\t\t\tfct.apply(self, args );\n\t\t\t});\n\n\t\t});\n\t}\n};\n","/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n */\nexport const arrayToPattern = (chars) => {\n chars = chars.filter(Boolean);\n if (chars.length < 2) {\n return chars[0] || '';\n }\n return (maxValueLength(chars) == 1) ? '[' + chars.join('') + ']' : '(?:' + chars.join('|') + ')';\n};\nexport const sequencePattern = (array) => {\n if (!hasDuplicates(array)) {\n return array.join('');\n }\n let pattern = '';\n let prev_char_count = 0;\n const prev_pattern = () => {\n if (prev_char_count > 1) {\n pattern += '{' + prev_char_count + '}';\n }\n };\n array.forEach((char, i) => {\n if (char === array[i - 1]) {\n prev_char_count++;\n return;\n }\n prev_pattern();\n pattern += char;\n prev_char_count = 1;\n });\n prev_pattern();\n return pattern;\n};\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n */\nexport const setToPattern = (chars) => {\n let array = Array.from(chars);\n return arrayToPattern(array);\n};\n/**\n * https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values\n */\nexport const hasDuplicates = (array) => {\n return (new Set(array)).size !== array.length;\n};\n/**\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str) => {\n return (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n/**\n * Return the max length of array values\n */\nexport const maxValueLength = (array) => {\n return array.reduce((longest, value) => Math.max(longest, unicodeLength(value)), 0);\n};\nexport const unicodeLength = (str) => {\n return Array.from(str).length;\n};\n//# sourceMappingURL=regex.js.map","/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n */\nexport const allSubstrings = (input) => {\n if (input.length === 1)\n return [[input]];\n let result = [];\n const start = input.substring(1);\n const suba = allSubstrings(start);\n suba.forEach(function (subresult) {\n let tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n return result;\n};\n//# sourceMappingURL=strings.js.map","import { setToPattern, arrayToPattern, escape_regex, sequencePattern } from \"./regex.js\";\nimport { allSubstrings } from \"./strings.js\";\nexport const code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\nexport let unicode_map;\nlet multi_char_reg;\nconst max_char_length = 3;\nconst latin_convert = {};\nconst latin_condensed = {\n '/': '⁄∕',\n '0': '߀',\n \"a\": \"ⱥɐɑ\",\n \"aa\": \"ꜳ\",\n \"ae\": \"æǽǣ\",\n \"ao\": \"ꜵ\",\n \"au\": \"ꜷ\",\n \"av\": \"ꜹꜻ\",\n \"ay\": \"ꜽ\",\n \"b\": \"ƀɓƃ\",\n \"c\": \"ꜿƈȼↄ\",\n \"d\": \"đɗɖᴅƌꮷԁɦ\",\n \"e\": \"ɛǝᴇɇ\",\n \"f\": \"ꝼƒ\",\n \"g\": \"ǥɠꞡᵹꝿɢ\",\n \"h\": \"ħⱨⱶɥ\",\n \"i\": \"ɨı\",\n \"j\": \"ɉȷ\",\n \"k\": \"ƙⱪꝁꝃꝅꞣ\",\n \"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n \"m\": \"ɱɯϻ\",\n \"n\": \"ꞥƞɲꞑᴎлԉ\",\n \"o\": \"øǿɔɵꝋꝍᴑ\",\n \"oe\": \"œ\",\n \"oi\": \"ƣ\",\n \"oo\": \"ꝏ\",\n \"ou\": \"ȣ\",\n \"p\": \"ƥᵽꝑꝓꝕρ\",\n \"q\": \"ꝗꝙɋ\",\n \"r\": \"ɍɽꝛꞧꞃ\",\n \"s\": \"ßȿꞩꞅʂ\",\n \"t\": \"ŧƭʈⱦꞇ\",\n \"th\": \"þ\",\n \"tz\": \"ꜩ\",\n \"u\": \"ʉ\",\n \"v\": \"ʋꝟʌ\",\n \"vy\": \"ꝡ\",\n \"w\": \"ⱳ\",\n \"y\": \"ƴɏỿ\",\n \"z\": \"ƶȥɀⱬꝣ\",\n \"hv\": \"ƕ\"\n};\nfor (let latin in latin_condensed) {\n let unicode = latin_condensed[latin] || '';\n for (let i = 0; i < unicode.length; i++) {\n let char = unicode.substring(i, i + 1);\n latin_convert[char] = latin;\n }\n}\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n */\nexport const initialize = (_code_points) => {\n if (unicode_map !== undefined)\n return;\n unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n */\nexport const normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n */\nexport const asciifold = (str) => {\n return Array.from(str).reduce(\n /**\n * @param {string} result\n * @param {string} char\n */\n (result, char) => {\n return result + _asciifold(char);\n }, '');\n};\nexport const _asciifold = (str) => {\n str = normalize(str)\n .toLowerCase()\n .replace(convert_pat, (/** @type {string} */ char) => {\n return latin_convert[char] || '';\n });\n //return str;\n return normalize(str, 'NFC');\n};\n/**\n * Generate a list of unicode variants from the list of code points\n */\nexport function* generator(code_points) {\n for (const [code_point_min, code_point_max] of code_points) {\n for (let i = code_point_min; i <= code_point_max; i++) {\n let composed = String.fromCharCode(i);\n let folded = asciifold(composed);\n if (folded == composed.toLowerCase()) {\n continue;\n }\n // skip when folded is a string longer than 3 characters long\n // bc the resulting regex patterns will be long\n // eg:\n // folded صلى الله عليه وسلم length 18 code point 65018\n // folded جل جلاله length 8 code point 65019\n if (folded.length > max_char_length) {\n continue;\n }\n if (folded.length == 0) {\n continue;\n }\n yield { folded: folded, composed: composed, code_point: i };\n }\n }\n}\n/**\n * Generate a unicode map from the list of code points\n */\nexport const generateSets = (code_points) => {\n const unicode_sets = {};\n const addMatching = (folded, to_add) => {\n /** @type {Set<string>} */\n const folded_set = unicode_sets[folded] || new Set();\n const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n if (to_add.match(patt)) {\n return;\n }\n folded_set.add(escape_regex(to_add));\n unicode_sets[folded] = folded_set;\n };\n for (let value of generator(code_points)) {\n addMatching(value.folded, value.folded);\n addMatching(value.folded, value.composed);\n }\n return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n */\nexport const generateMap = (code_points) => {\n const unicode_sets = generateSets(code_points);\n const unicode_map = {};\n let multi_char = [];\n for (let folded in unicode_sets) {\n let set = unicode_sets[folded];\n if (set) {\n unicode_map[folded] = setToPattern(set);\n }\n if (folded.length > 1) {\n multi_char.push(escape_regex(folded));\n }\n }\n multi_char.sort((a, b) => b.length - a.length);\n const multi_char_patt = arrayToPattern(multi_char);\n multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n return unicode_map;\n};\n/**\n * Map each element of an array from its folded value to all possible unicode matches\n */\nexport const mapSequence = (strings, min_replacement = 1) => {\n let chars_replaced = 0;\n strings = strings.map((str) => {\n if (unicode_map[str]) {\n chars_replaced += str.length;\n }\n return unicode_map[str] || str;\n });\n if (chars_replaced >= min_replacement) {\n return sequencePattern(strings);\n }\n return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n */\nexport const substringsToPattern = (str, min_replacement = 1) => {\n min_replacement = Math.max(min_replacement, str.length - 1);\n return arrayToPattern(allSubstrings(str).map((sub_pat) => {\n return mapSequence(sub_pat, min_replacement);\n }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n */\nconst sequencesToPattern = (sequences, all = true) => {\n let min_replacement = sequences.length > 1 ? 1 : 0;\n return arrayToPattern(sequences.map((sequence) => {\n let seq = [];\n const len = all ? sequence.length() : sequence.length() - 1;\n for (let j = 0; j < len; j++) {\n seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n }\n return sequencePattern(seq);\n }));\n};\n/**\n * Return true if the sequence is already in the sequences\n */\nconst inSequences = (needle_seq, sequences) => {\n for (const seq of sequences) {\n if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n continue;\n }\n if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n continue;\n }\n let needle_parts = needle_seq.parts;\n const filter = (part) => {\n for (const needle_part of needle_parts) {\n if (needle_part.start === part.start && needle_part.substr === part.substr) {\n return false;\n }\n if (part.length == 1 || needle_part.length == 1) {\n continue;\n }\n // check for overlapping parts\n // a = ['::=','==']\n // b = ['::','===']\n // a = ['r','sm']\n // b = ['rs','m']\n if (part.start < needle_part.start && part.end > needle_part.start) {\n return true;\n }\n if (needle_part.start < part.start && needle_part.end > part.start) {\n return true;\n }\n }\n return false;\n };\n let filtered = seq.parts.filter(filter);\n if (filtered.length > 0) {\n continue;\n }\n return true;\n }\n return false;\n};\nclass Sequence {\n parts;\n substrs;\n start;\n end;\n constructor() {\n this.parts = [];\n this.substrs = [];\n this.start = 0;\n this.end = 0;\n }\n add(part) {\n if (part) {\n this.parts.push(part);\n this.substrs.push(part.substr);\n this.start = Math.min(part.start, this.start);\n this.end = Math.max(part.end, this.end);\n }\n }\n last() {\n return this.parts[this.parts.length - 1];\n }\n length() {\n return this.parts.length;\n }\n clone(position, last_piece) {\n let clone = new Sequence();\n let parts = JSON.parse(JSON.stringify(this.parts));\n let last_part = parts.pop();\n for (const part of parts) {\n clone.add(part);\n }\n let last_substr = last_piece.substr.substring(0, position - last_part.start);\n let clone_last_len = last_substr.length;\n clone.add({ start: last_part.start, end: last_part.start + clone_last_len, length: clone_last_len, substr: last_substr });\n return clone;\n }\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n * ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n */\nexport const getPattern = (str) => {\n initialize();\n str = asciifold(str);\n let pattern = '';\n let sequences = [new Sequence()];\n for (let i = 0; i < str.length; i++) {\n let substr = str.substring(i);\n let match = substr.match(multi_char_reg);\n const char = str.substring(i, i + 1);\n const match_str = match ? match[0] : null;\n // loop through sequences\n // add either the char or multi_match\n let overlapping = [];\n let added_types = new Set();\n for (const sequence of sequences) {\n const last_piece = sequence.last();\n if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n // if we have a multi match\n if (match_str) {\n const len = match_str.length;\n sequence.add({ start: i, end: i + len, length: len, substr: match_str });\n added_types.add('1');\n }\n else {\n sequence.add({ start: i, end: i + 1, length: 1, substr: char });\n added_types.add('2');\n }\n }\n else if (match_str) {\n let clone = sequence.clone(i, last_piece);\n const len = match_str.length;\n clone.add({ start: i, end: i + len, length: len, substr: match_str });\n overlapping.push(clone);\n }\n else {\n // don't add char\n // adding would create invalid patterns: 234 => [2,34,4]\n added_types.add('3');\n }\n }\n // if we have overlapping\n if (overlapping.length > 0) {\n // ['ii','iii'] before ['i','i','iii']\n overlapping = overlapping.sort((a, b) => {\n return a.length() - b.length();\n });\n for (let clone of overlapping) {\n // don't add if we already have an equivalent sequence\n if (inSequences(clone, sequences)) {\n continue;\n }\n sequences.push(clone);\n }\n continue;\n }\n // if we haven't done anything unique\n // clean up the patterns\n // helps keep patterns smaller\n // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n pattern += sequencesToPattern(sequences, false);\n let new_seq = new Sequence();\n const old_seq = sequences[0];\n if (old_seq) {\n new_seq.add(old_seq.last());\n }\n sequences = [new_seq];\n }\n }\n pattern += sequencesToPattern(sequences, true);\n return pattern;\n};\nexport { escape_regex };\n//# sourceMappingURL=index.js.map","import { asciifold } from '@orchidjs/unicode-variants';\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj, name) => {\n if (!obj)\n return;\n return obj[name];\n};\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj, name) => {\n if (!obj)\n return;\n var part, names = name.split(\".\");\n while ((part = names.shift()) && (obj = obj[part]))\n ;\n return obj;\n};\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value, token, weight) => {\n var score, pos;\n if (!value)\n return 0;\n value = value + '';\n if (token.regex == null)\n return 0;\n pos = value.search(token.regex);\n if (pos === -1)\n return 0;\n score = token.string.length / value.length;\n if (pos === 0)\n score += 0.5;\n return score * weight;\n};\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj, key) => {\n var value = obj[key];\n if (typeof value == 'function')\n return value;\n if (value && !Array.isArray(value)) {\n obj[key] = [value];\n }\n};\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object, callback) => {\n if (Array.isArray(object)) {\n object.forEach(callback);\n }\n else {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n callback(object[key], key);\n }\n }\n }\n};\nexport const cmp = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a > b ? 1 : (a < b ? -1 : 0);\n }\n a = asciifold(a + '').toLowerCase();\n b = asciifold(b + '').toLowerCase();\n if (a > b)\n return 1;\n if (b > a)\n return -1;\n return 0;\n};\n//# sourceMappingURL=utils.js.map","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\nimport { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from \"./utils.js\";\nimport { getPattern, escape_regex } from '@orchidjs/unicode-variants';\nclass Sifter {\n items; // []|{};\n settings;\n /**\n * Textually searches arrays and hashes of objects\n * by property (or multiple properties). Designed\n * specifically for autocomplete.\n *\n */\n constructor(items, settings) {\n this.items = items;\n this.settings = settings || { diacritics: true };\n }\n ;\n /**\n * Splits a search string into an array of individual\n * regexps to be used to match results.\n *\n */\n tokenize(query, respect_word_boundaries, weights) {\n if (!query || !query.length)\n return [];\n const tokens = [];\n const words = query.split(/\\s+/);\n var field_regex;\n if (weights) {\n field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\\:(.*)$');\n }\n words.forEach((word) => {\n let field_match;\n let field = null;\n let regex = null;\n // look for \"field:query\" tokens\n if (field_regex && (field_match = word.match(field_regex))) {\n field = field_match[1];\n word = field_match[2];\n }\n if (word.length > 0) {\n if (this.settings.diacritics) {\n regex = getPattern(word) || null;\n }\n else {\n regex = escape_regex(word);\n }\n if (regex && respect_word_boundaries)\n regex = \"\\\\b\" + regex;\n }\n tokens.push({\n string: word,\n regex: regex ? new RegExp(regex, 'iu') : null,\n field: field,\n });\n });\n return tokens;\n }\n ;\n /**\n * Returns a function to be used to score individual results.\n *\n * Good matches will have a higher score than poor matches.\n * If an item is not a match, 0 will be returned by the function.\n *\n * @returns {T.ScoreFn}\n */\n getScoreFunction(query, options) {\n var search = this.prepareSearch(query, options);\n return this._getScoreFunction(search);\n }\n /**\n * @returns {T.ScoreFn}\n *\n */\n _getScoreFunction(search) {\n const tokens = search.tokens, token_count = tokens.length;\n if (!token_count) {\n return function () { return 0; };\n }\n const fields = search.options.fields, weights = search.weights, field_count = fields.length, getAttrFn = search.getAttrFn;\n if (!field_count) {\n return function () { return 1; };\n }\n /**\n * Calculates the score of an object\n * against the search query.\n *\n */\n const scoreObject = (function () {\n if (field_count === 1) {\n return function (token, data) {\n const field = fields[0].field;\n return scoreValue(getAttrFn(data, field), token, weights[field] || 1);\n };\n }\n return function (token, data) {\n var sum = 0;\n // is the token specific to a field?\n if (token.field) {\n const value = getAttrFn(data, token.field);\n if (!token.regex && value) {\n sum += (1 / field_count);\n }\n else {\n sum += scoreValue(value, token, 1);\n }\n }\n else {\n iterate(weights, (weight, field) => {\n sum += scoreValue(getAttrFn(data, field), token, weight);\n });\n }\n return sum / field_count;\n };\n })();\n if (token_count === 1) {\n return function (data) {\n return scoreObject(tokens[0], data);\n };\n }\n if (search.options.conjunction === 'and') {\n return function (data) {\n var score, sum = 0;\n for (let token of tokens) {\n score = scoreObject(token, data);\n if (score <= 0)\n return 0;\n sum += score;\n }\n return sum / token_count;\n };\n }\n else {\n return function (data) {\n var sum = 0;\n iterate(tokens, (token) => {\n sum += scoreObject(token, data);\n });\n return sum / token_count;\n };\n }\n }\n ;\n /**\n * Returns a function that can be used to compare two\n * results, for sorting purposes. If no sorting should\n * be performed, `null` will be returned.\n *\n * @return function(a,b)\n */\n getSortFunction(query, options) {\n var search = this.prepareSearch(query, options);\n return this._getSortFunction(search);\n }\n _getSortFunction(search) {\n var implicit_score, sort_flds = [];\n const self = this, options = search.options, sort = (!search.query && options.sort_empty) ? options.sort_empty : options.sort;\n if (typeof sort == 'function') {\n return sort.bind(this);\n }\n /**\n * Fetches the specified sort field value\n * from a search result item.\n *\n */\n const get_field = function (name, result) {\n if (name === '$score')\n return result.score;\n return search.getAttrFn(self.items[result.id], name);\n };\n // parse options\n if (sort) {\n for (let s of sort) {\n if (search.query || s.field !== '$score') {\n sort_flds.push(s);\n }\n }\n }\n // the \"$score\" field is implied to be the primary\n // sort field, unless it's manually specified\n if (search.query) {\n implicit_score = true;\n for (let fld of sort_flds) {\n if (fld.field === '$score') {\n implicit_score = false;\n break;\n }\n }\n if (implicit_score) {\n sort_flds.unshift({ field: '$score', direction: 'desc' });\n }\n // without a search.query, all items will have the same score\n }\n else {\n sort_flds = sort_flds.filter((fld) => fld.field !== '$score');\n }\n // build function\n const sort_flds_count = sort_flds.length;\n if (!sort_flds_count) {\n return null;\n }\n return function (a, b) {\n var result, field;\n for (let sort_fld of sort_flds) {\n field = sort_fld.field;\n let multiplier = sort_fld.direction === 'desc' ? -1 : 1;\n result = multiplier * cmp(get_field(field, a), get_field(field, b));\n if (result)\n return result;\n }\n return 0;\n };\n }\n ;\n /**\n * Parses a search query and returns an object\n * with tokens and fields ready to be populated\n * with results.\n *\n */\n prepareSearch(query, optsUser) {\n const weights = {};\n var options = Object.assign({}, optsUser);\n propToArray(options, 'sort');\n propToArray(options, 'sort_empty');\n // convert fields to new format\n if (options.fields) {\n propToArray(options, 'fields');\n const fields = [];\n options.fields.forEach((field) => {\n if (typeof field == 'string') {\n field = { field: field, weight: 1 };\n }\n fields.push(field);\n weights[field.field] = ('weight' in field) ? field.weight : 1;\n });\n options.fields = fields;\n }\n return {\n options: options,\n query: query.toLowerCase().trim(),\n tokens: this.tokenize(query, options.respect_word_boundaries, weights),\n total: 0,\n items: [],\n weights: weights,\n getAttrFn: (options.nesting) ? getAttrNesting : getAttr,\n };\n }\n ;\n /**\n * Searches through all items and returns a sorted array of matches.\n *\n */\n search(query, options) {\n var self = this, score, search;\n search = this.prepareSearch(query, options);\n options = search.options;\n query = search.query;\n // generate result scoring function\n const fn_score = options.score || self._getScoreFunction(search);\n // perform search and sort\n if (query.length) {\n iterate(self.items, (item, id) => {\n score = fn_score(item);\n if (options.filter === false || score > 0) {\n search.items.push({ 'score': score, 'id': id });\n }\n });\n }\n else {\n iterate(self.items, (_, id) => {\n search.items.push({ 'score': 1, 'id': id });\n });\n }\n const fn_sort = self._getSortFunction(search);\n if (fn_sort)\n search.items.sort(fn_sort);\n // apply limits\n search.total = search.items.length;\n if (typeof options.limit === 'number') {\n search.items = search.items.slice(0, options.limit);\n }\n return search;\n }\n ;\n}\nexport { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern };\nexport * from \"./types.js\";\n//# sourceMappingURL=sifter.js.map","\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n * 'str' -> 'str'\n * null -> ''\n * undefined -> ''\n * true -> '1'\n * false -> '0'\n * 0 -> '0'\n * 1 -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n * - start\n * - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n","\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n","/**\n * highlight v3 | MIT license | Johann Burkard <jb@eaio.com>\n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal <beatgates@gmail.com> 2011-6-24 (added regex)\n * - Modified by Brian Reavis <brian@thirdroute.com> 2012-8-27 (cleanup)\n */\n\nimport {replaceNode} from '../vanilla.ts';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t// Soccer -> <span class=\"highlight\">Soc</span>cer for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0]!.length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\tconst highlightChildren = ( node:Element ):void => {\n\t\tif( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' ) ){\n\t\t\tArray.from(node.childNodes).forEach(element => {\n\t\t\t\thighlightRecursive(element);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tconst highlightRecursive = ( node:Node|Element ):number => {\n\n\t\tif( node.nodeType === 3 ){\n\t\t\treturn highlightText(node as Text);\n\t\t}\n\n\t\thighlightChildren(node as Element);\n\n\t\treturn 0;\n\t};\n\n\thighlightRecursive( element );\n};\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el:HTMLElement) => {\n\tvar elements = el.querySelectorAll(\"span.highlight\");\n\tArray.prototype.forEach.call(elements, function(el:HTMLElement){\n\t\tvar parent = el.parentNode as Node;\n\t\tparent.replaceChild(el.firstChild as Node, el);\n\t\tparent.normalize();\n\t});\n};\n","export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n","\nexport default {\n\toptions: [],\n\toptgroups: [],\n\n\tplugins: [],\n\tdelimiter: ',',\n\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\tpersist: true,\n\tdiacritics: true,\n\tcreate: null,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\thighlight: true,\n\topenOnFocus: true,\n\tshouldOpen: null,\n\tmaxOptions: 50,\n\tmaxItems: null,\n\thideSelected: null,\n\tduplicates: false,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: null,\n\tallowEmptyOption: false,\n\t//closeAfterSelect: false,\n\trefreshThrottle: 300,\n\n\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: null, //'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\tdisabledField: 'disabled',\n\toptgroupLabelField: 'label',\n\toptgroupValueField: 'value',\n\tlockOptgroupOrder: false,\n\n\tsortField: '$order',\n\tsearchField: ['text'],\n\tsearchConjunction: 'and',\n\n\tmode: null,\n\twrapperClass: 'ts-wrapper',\n\tcontrolClass: 'ts-control',\n\tdropdownClass: 'ts-dropdown',\n\tdropdownContentClass: 'ts-dropdown-content',\n\titemClass: 'item',\n\toptionClass: 'option',\n\n\tdropdownParent: null,\n\tcontrolInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n\n\tcopyClassesToDropdown: false,\n\n\tplaceholder: null,\n\thidePlaceholder: null,\n\n\tshouldLoad: function(query:string):boolean{\n\t\treturn query.length > 0;\n\t},\n\n\t/*\n\tload : null, // function(query, callback) { ... }\n\tscore : null, // function(search) { ... }\n\tonInitialize : null, // function() { ... }\n\tonChange : null, // function(value) { ... }\n\tonItemAdd : null, // function(value, $item) { ... }\n\tonItemRemove : null, // function(value) { ... }\n\tonClear : null, // function() { ... }\n\tonOptionAdd : null, // function(value, data) { ... }\n\tonOptionRemove : null, // function(value) { ... }\n\tonOptionClear : null, // function() { ... }\n\tonOptionGroupAdd : null, // function(id, data) { ... }\n\tonOptionGroupRemove : null, // function(id) { ... }\n\tonOptionGroupClear : null, // function() { ... }\n\tonDropdownOpen : null, // function(dropdown) { ... }\n\tonDropdownClose : null, // function(dropdown) { ... }\n\tonType : null, // function(str) { ... }\n\tonDelete : null, // function(values) { ... }\n\t*/\n\n\trender: {\n\t\t/*\n\t\titem: null,\n\t\toptgroup: null,\n\t\toptgroup_header: null,\n\t\toption: null,\n\t\toption_create: null\n\t\t*/\n\t}\n};\n","import defaults from './defaults.ts';\nimport { hash_key, iterate } from './utils.ts';\nimport { TomOption, TomSettings, RecursivePartial } from './types/index.ts';\nimport { TomInput } from './types/index.ts';\n\n\nexport default function getSettings( input:TomInput, settings_user:RecursivePartial<TomSettings>):TomSettings{\n\tvar settings:TomSettings\t= Object.assign({}, defaults, settings_user);\n\n\tvar attr_data\t\t\t\t= settings.dataAttr;\n\tvar field_label\t\t\t\t= settings.labelField;\n\tvar field_value\t\t\t\t= settings.valueField;\n\tvar field_disabled\t\t\t= settings.disabledField;\n\tvar field_optgroup\t\t\t= settings.optgroupField;\n\tvar field_optgroup_label\t= settings.optgroupLabelField;\n\tvar field_optgroup_value\t= settings.optgroupValueField;\n\n\tvar tag_name\t\t\t\t= input.tagName.toLowerCase();\n\tvar placeholder\t\t\t\t= input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n\tif (!placeholder && !settings.allowEmptyOption) {\n\t\tlet option\t\t= input.querySelector('option[value=\"\"]');\n\t\tif( option ){\n\t\t\tplaceholder = option.textContent;\n\t\t}\n\n\t}\n\n\tvar settings_element:{\n\t\tplaceholder\t: null|string,\n\t\toptions\t\t: TomOption[],\n\t\toptgroups\t: TomOption[],\n\t\titems\t\t: string[],\n\t\tmaxItems\t: null|number,\n\t} = {\n\t\tplaceholder\t: placeholder,\n\t\toptions\t\t: [],\n\t\toptgroups\t: [],\n\t\titems\t\t: [],\n\t\tmaxItems\t: null,\n\t};\n\n\n\t/**\n\t * Initialize from a <select> element.\n\t *\n\t */\n\tvar init_select = () => {\n\t\tvar tagName;\n\t\tvar options = settings_element.options;\n\t\tvar optionsMap:{[key:string]:any} = {};\n\t\tvar group_count = 1;\n\t\tlet $order = 0;\n\n\t\tvar readData = (el:HTMLElement):TomOption => {\n\n\t\t\tvar data\t= Object.assign({},el.dataset); // get plain object from DOMStringMap\n\t\t\tvar json\t= attr_data && data[attr_data];\n\n\t\t\tif( typeof json === 'string' && json.length ){\n\t\t\t\tdata = Object.assign(data,JSON.parse(json));\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\t\tvar addOption = (option:HTMLOptionElement, group?:string) => {\n\n\t\t\tvar value = hash_key(option.value);\n\t\t\tif ( value == null ) return;\n\t\t\tif ( !value && !settings.allowEmptyOption) return;\n\n\t\t\t// if the option already exists, it's probably been\n\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t// existing option so that it's rendered in both places.\n\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\tif (group) {\n\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t} else if (!Array.isArray(arr)) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tvar option_data = readData(option);\n\t\t\t\toption_data[field_label] = option_data[field_label] || option.textContent;\n\t\t\t\toption_data[field_value] = option_data[field_value] || value;\n\t\t\t\toption_data[field_disabled] = option_data[field_disabled] || option.disabled;\n\t\t\t\toption_data[field_optgroup] = option_data[field_optgroup] || group;\n\t\t\t\toption_data.$option\t\t\t= option;\n\t\t\t\toption_data.$order\t\t\t= option_data.$order || ++$order;\n\n\t\t\t\toptionsMap[value] = option_data;\n\t\t\t\toptions.push(option_data);\n\t\t\t}\n\n\t\t\tif( option.selected ){\n\t\t\t\tsettings_element.items.push(value);\n\t\t\t}\n\t\t};\n\n\t\tvar addGroup = ( optgroup:HTMLOptGroupElement ) => {\n\t\t\tvar id:string, optgroup_data\n\n\t\t\toptgroup_data\t\t\t\t\t\t\t= readData(optgroup);\n\t\t\toptgroup_data[field_optgroup_label]\t\t= optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n\t\t\toptgroup_data[field_optgroup_value]\t\t= optgroup_data[field_optgroup_value] || group_count++;\n\t\t\toptgroup_data[field_disabled]\t\t\t= optgroup_data[field_disabled] || optgroup.disabled;\n\t\t\toptgroup_data.$order\t\t\t\t\t= optgroup_data.$order || ++$order;\n\n\t\t\tsettings_element.optgroups.push(optgroup_data);\n\n\t\t\tid = optgroup_data[field_optgroup_value];\n\n\t\t\titerate(optgroup.children, (option)=>{\n\t\t\t\taddOption(option as HTMLOptionElement, id);\n\t\t\t});\n\n\t\t};\n\n\t\tsettings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n\n\t\titerate(input.children,(child)=>{\n\t\t\ttagName = child.tagName.toLowerCase();\n\t\t\tif (tagName === 'optgroup') {\n\t\t\t\taddGroup(child as HTMLOptGroupElement);\n\t\t\t} else if (tagName === 'option') {\n\t\t\t\taddOption(child as HTMLOptionElement);\n\t\t\t}\n\t\t});\n\n\t};\n\n\n\t/**\n\t * Initialize from a <input type=\"text\"> element.\n\t *\n\t */\n\tvar init_textbox = () => {\n\t\tconst data_raw = input.getAttribute(attr_data);\n\n\t\tif (!data_raw) {\n\t\t\tvar value = input.value.trim() || '';\n\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\tconst values = value.split(settings.delimiter);\n\n\t\t\titerate( values, (value) => {\n\t\t\t\tconst option:TomOption = {};\n\t\t\t\toption[field_label] = value;\n\t\t\t\toption[field_value] = value;\n\t\t\t\tsettings_element.options.push(option);\n\t\t\t});\n\t\t\tsettings_element.items = values;\n\t\t} else {\n\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\titerate( settings_element.options, (opt) => {\n\t\t\t\tsettings_element.items.push(opt[field_value]);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tif (tag_name === 'select') {\n\t\tinit_select();\n\t} else {\n\t\tinit_textbox();\n\t}\n\n\treturn Object.assign( {}, defaults, settings_element, settings_user) as TomSettings;\n};\n","\nimport MicroEvent from './contrib/microevent.ts';\nimport MicroPlugin from './contrib/microplugin.ts';\nimport { Sifter } from '@orchidjs/sifter';\nimport { escape_regex } from '@orchidjs/unicode-variants';\nimport { TomInput, TomArgObject, TomOption, TomOptions, TomCreateFilter, TomCreateCallback, TomItem, TomSettings, TomTemplateNames, TomClearFilter, RecursivePartial } from './types/index.ts';\nimport {highlight, removeHighlight} from './contrib/highlight.ts';\nimport * as constants from './constants.ts';\nimport getSettings from './getSettings.ts';\nimport {\n\thash_key,\n\tget_hash,\n\tescape_html,\n\tdebounce_events,\n\tgetSelection,\n\tpreventDefault,\n\taddEvent,\n\tloadDebounce,\n\ttimeout,\n\tisKeyDown,\n\tgetId,\n\taddSlashes,\n\tappend,\n\titerate\n} from './utils.ts';\n\nimport {\n\tgetDom,\n\tisHtmlString,\n\tescapeQuery,\n\ttriggerEvent,\n\tapplyCSS,\n\taddClasses,\n\tremoveClasses,\n\tparentMatch,\n\tgetTail,\n\tisEmptyObject,\n\tnodeIndex,\n\tsetAttr,\n\treplaceNode\n} from './vanilla.ts';\n\nvar instance_i = 0;\n\nexport default class TomSelect extends MicroPlugin(MicroEvent){\n\n\tpublic control_input\t\t\t: HTMLInputElement;\n\tpublic wrapper\t\t\t\t\t: HTMLElement;\n\tpublic dropdown\t\t\t\t\t: HTMLElement;\n\tpublic control\t\t\t\t\t: HTMLElement;\n\tpublic dropdown_content\t\t\t: HTMLElement;\n\tpublic focus_node\t\t\t\t: HTMLElement;\n\n\tpublic order\t\t\t\t\t: number = 0;\n\tpublic settings\t\t\t\t\t: TomSettings;\n\tpublic input\t\t\t\t\t: TomInput;\n\tpublic tabIndex\t\t\t\t\t: number;\n\tpublic is_select_tag\t\t\t: boolean;\n\tpublic rtl\t\t\t\t\t\t: boolean;\n\tprivate inputId\t\t\t\t\t: string;\n\n\tprivate _destroy\t\t\t\t!: () => void;\n\tpublic sifter\t\t\t\t\t: Sifter;\n\n\n\tpublic isOpen\t\t\t\t\t: boolean = false;\n\tpublic isDisabled\t\t\t\t: boolean = false;\n\tpublic isReadOnly\t\t\t\t: boolean = false;\n\tpublic isRequired\t\t\t\t: boolean;\n\tpublic isInvalid\t\t\t\t: boolean = false; // @deprecated 1.8\n\tpublic isValid\t\t\t\t\t: boolean = true;\n\tpublic isLocked\t\t\t\t\t: boolean = false;\n\tpublic isFocused\t\t\t\t: boolean = false;\n\tpublic isInputHidden\t\t\t: boolean = false;\n\tpublic isSetup\t\t\t\t\t: boolean = false;\n\tpublic ignoreFocus\t\t\t\t: boolean = false;\n\tpublic ignoreHover\t\t\t\t: boolean = false;\n\tpublic hasOptions\t\t\t\t: boolean = false;\n\tpublic currentResults\t\t\t?: ReturnType<Sifter['search']>;\n\tpublic lastValue\t\t\t\t: string = '';\n\tpublic caretPos\t\t\t\t\t: number = 0;\n\tpublic loading\t\t\t\t\t: number = 0;\n\tpublic loadedSearches\t\t\t: { [key: string]: boolean } = {};\n\n\tpublic activeOption\t\t\t\t: null|HTMLElement = null;\n\tpublic activeItems\t\t\t\t: TomItem[] = [];\n\n\tpublic optgroups\t\t\t\t: TomOptions = {};\n\tpublic options\t\t\t\t\t: TomOptions = {};\n\tpublic userOptions\t\t\t\t: {[key:string]:boolean} = {};\n\tpublic items\t\t\t\t\t: string[] = [];\n\n\tprivate refreshTimeout\t\t\t: null|number = null;\n\n\n\tconstructor( input_arg: string|TomInput, user_settings:RecursivePartial<TomSettings> ){\n\t\tsuper();\n\n\t\tinstance_i++;\n\n\t\tvar dir;\n\t\tvar input\t\t\t\t= getDom( input_arg ) as TomInput;\n\n\t\tif( input.tomselect ){\n\t\t\tthrow new Error('Tom Select already initialized on this element');\n\t\t}\n\n\n\t\tinput.tomselect\t\t\t= this;\n\n\n\t\t// detect rtl environment\n\t\tvar computedStyle\t\t= window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir\t\t\t\t\t\t= computedStyle.getPropertyValue('direction');\n\n\t\t// setup default state\n\t\tconst settings\t\t\t= getSettings( input, user_settings );\n\t\tthis.settings\t\t\t= settings;\n\t\tthis.input\t\t\t\t= input;\n\t\tthis.tabIndex\t\t\t= input.tabIndex || 0;\n\t\tthis.is_select_tag\t\t= input.tagName.toLowerCase() === 'select';\n\t\tthis.rtl\t\t\t\t= /rtl/i.test(dir);\n\t\tthis.inputId\t\t\t= getId(input, 'tomselect-'+instance_i);\n\t\tthis.isRequired\t\t\t= input.required;\n\n\n\t\t// search system\n\t\tthis.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t\t// option-dependent defaults\n\t\tsettings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof settings.hideSelected !== 'boolean') {\n\t\t\tsettings.hideSelected = settings.mode === 'multi';\n\t\t}\n\n\t\tif( typeof settings.hidePlaceholder !== 'boolean' ){\n\t\t\tsettings.hidePlaceholder = settings.mode !== 'multi';\n\t\t}\n\n\t\t// set up createFilter callback\n\t\tvar filter = settings.createFilter;\n\t\tif( typeof filter !== 'function' ){\n\n\t\t\tif( typeof filter === 'string' ){\n\t\t\t\tfilter = new RegExp(filter);\n\t\t\t}\n\n\t\t\tif( filter instanceof RegExp ){\n\t\t\t\tsettings.createFilter = (input: string) => (filter as RegExp).test(input);\n\t\t\t}else{\n\t\t\t\tsettings.createFilter = (value: string) => {\n\t\t\t\t\treturn this.settings.duplicates || !this.options[value];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\n\t\tthis.initializePlugins(settings.plugins);\n\t\tthis.setupCallbacks();\n\t\tthis.setupTemplates();\n\n\n\t\t// Create all elements\n\t\tconst wrapper\t\t\t= getDom('<div>');\n\t\tconst control\t\t\t= getDom('<div>');\n\t\tconst dropdown\t\t\t= this._render('dropdown');\n\t\tconst dropdown_content\t= getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n\n\t\tconst classes\t\t\t= this.input.getAttribute('class') || '';\n\t\tconst inputMode\t\t\t= settings.mode;\n\n\t\tvar control_input: HTMLInputElement;\n\n\n\t\taddClasses( wrapper, settings.wrapperClass, classes, inputMode);\n\n\n\t\taddClasses(control,settings.controlClass);\n\t\tappend( wrapper, control );\n\n\n\t\taddClasses(dropdown, settings.dropdownClass, inputMode);\n\t\tif( settings.copyClassesToDropdown ){\n\t\t\taddClasses( dropdown, classes);\n\t\t}\n\n\n\t\taddClasses(dropdown_content, settings.dropdownContentClass);\n\t\tappend( dropdown, dropdown_content );\n\n\t\tgetDom( settings.dropdownParent || wrapper ).appendChild( dropdown );\n\n\n\t\t// default controlInput\n\t\tif( isHtmlString(settings.controlInput) ){\n\t\t\tcontrol_input\t\t= getDom(settings.controlInput ) as HTMLInputElement;\n\n\t\t\t// set attributes\n\t\t\tvar attrs = ['autocorrect','autocapitalize','autocomplete','spellcheck'];\n\t\t\titerate(attrs,(attr:string) => {\n\t\t\t\tif( input.getAttribute(attr) ){\n\t\t\t\t\tsetAttr(control_input,{[attr]:input.getAttribute(attr)});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol_input.tabIndex = -1;\n\t\t\tcontrol.appendChild( control_input );\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t// dom element\n\t\t}else if( settings.controlInput ){\n\t\t\tcontrol_input\t\t= getDom( settings.controlInput ) as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t}else{\n\t\t\tcontrol_input\t\t= getDom('<input/>') as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control;\n\t\t}\n\n\t\tthis.wrapper\t\t\t= wrapper;\n\t\tthis.dropdown\t\t\t= dropdown;\n\t\tthis.dropdown_content\t= dropdown_content;\n\t\tthis.control \t\t\t= control;\n\t\tthis.control_input\t\t= control_input;\n\n\t\tthis.setup();\n\t}\n\n\t/**\n\t * set up event bindings.\n\t *\n\t */\n\tsetup(){\n\n\t\tconst self = this;\n\t\tconst settings\t\t\t\t= self.settings;\n\t\tconst control_input\t\t\t= self.control_input;\n\t\tconst dropdown\t\t\t\t= self.dropdown;\n\t\tconst dropdown_content\t\t= self.dropdown_content;\n\t\tconst wrapper\t\t\t\t= self.wrapper;\n\t\tconst control\t\t\t\t= self.control;\n\t\tconst input\t\t\t\t\t= self.input;\n\t\tconst focus_node\t\t\t= self.focus_node;\n\t\tconst passive_event\t\t\t= { passive: true };\n\t\tconst listboxId\t\t\t\t= self.inputId +'-ts-dropdown';\n\n\n\t\tsetAttr(dropdown_content,{\n\t\t\tid: listboxId\n\t\t});\n\n\t\tsetAttr(focus_node,{\n\t\t\trole:'combobox',\n\t\t\t'aria-haspopup':'listbox',\n\t\t\t'aria-expanded':'false',\n\t\t\t'aria-controls':listboxId\n\t\t});\n\n\t\tconst control_id\t= getId(focus_node,self.inputId + '-ts-control');\n\t\tconst query\t\t\t= \"label[for='\"+escapeQuery(self.inputId)+\"']\";\n\t\tconst label\t\t\t= document.querySelector(query);\n\t\tconst label_click\t= self.focus.bind(self);\n\t\tif( label ){\n\t\t\taddEvent(label,'click', label_click );\n\t\t\tsetAttr(label,{for:control_id});\n\t\t\tconst label_id = getId(label,self.inputId+'-ts-label');\n\t\t\tsetAttr(focus_node,{'aria-labelledby':label_id});\n\t\t\tsetAttr(dropdown_content,{'aria-labelledby':label_id});\n\t\t}\n\n\t\twrapper.style.width = input.style.width;\n\n\t\tif (self.plugins.names.length) {\n\t\t\tconst classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\taddClasses( [wrapper,dropdown], classes_plugins);\n\t\t}\n\n\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag ){\n\t\t\tsetAttr(input,{multiple:'multiple'});\n\t\t}\n\n\t\tif (settings.placeholder) {\n\t\t\tsetAttr(control_input,{placeholder:settings.placeholder});\n\t\t}\n\n\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\tif (!settings.splitOn && settings.delimiter) {\n\t\t\tsettings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n\t\t}\n\n\t\t// debounce user defined load() if loadThrottle > 0\n\t\t// after initializePlugins() so plugins can create/modify user defined loaders\n\t\tif( settings.load && settings.loadThrottle ){\n\t\t\tsettings.load = loadDebounce(settings.load,settings.loadThrottle)\n\t\t}\n\n\t\taddEvent(dropdown,'mousemove', () => {\n\t\t\tself.ignoreHover = false;\n\t\t});\n\n\t\taddEvent(dropdown,'mouseenter', (e) => {\n\n\t\t\tvar target_match = parentMatch(e.target as HTMLElement, '[data-selectable]', dropdown);\n\t\t\tif( target_match ) self.onOptionHover( e as MouseEvent, target_match );\n\n\t\t}, {capture:true});\n\n\t\t// clicking on an option should select it\n\t\taddEvent(dropdown,'click',(evt) => {\n\t\t\tconst option = parentMatch(evt.target as HTMLElement, '[data-selectable]');\n\t\t\tif( option ){\n\t\t\t\tself.onOptionSelect( evt as MouseEvent, option );\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\t\t});\n\n\t\taddEvent(control,'click', (evt) => {\n\n\t\t\tvar target_match = parentMatch( evt.target as HTMLElement, '[data-ts-item]', control);\n\t\t\tif( target_match && self.onItemSelect(evt as MouseEvent, target_match as TomItem) ){\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// retain focus (see control_input mousedown)\n\t\t\tif( control_input.value != '' ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.onClick();\n\t\t\tpreventDefault(evt,true);\n\t\t});\n\n\n\t\t// keydown on focus_node for arrow_down/arrow_up\n\t\taddEvent(focus_node,'keydown',\t\t(e) => self.onKeyDown(e as KeyboardEvent) );\n\n\t\t// keypress and input/keyup\n\t\taddEvent(control_input,'keypress',\t(e) => self.onKeyPress(e as KeyboardEvent) );\n\t\taddEvent(control_input,'input',\t\t(e) => self.onInput(e as KeyboardEvent) );\n\t\taddEvent(focus_node,'blur', \t\t(e) => self.onBlur(e as FocusEvent) );\n\t\taddEvent(focus_node,'focus',\t\t(e) => self.onFocus(e as MouseEvent) );\n\t\taddEvent(control_input,'paste',\t\t(e) => self.onPaste(e as MouseEvent) );\n\n\n\t\tconst doc_mousedown = (evt:Event) => {\n\n\t\t\t// blur if target is outside of this instance\n\t\t\t// dropdown is not always inside wrapper\n\t\t\tconst target = evt.composedPath()[0];\n\t\t\tif( !wrapper.contains(target as HTMLElement) && !dropdown.contains(target as HTMLElement) ){\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.blur();\n\t\t\t\t}\n\t\t\t\tself.inputState();\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t// retain focus by preventing native handling. if the\n\t\t\t// event target is the input it should not be modified.\n\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t// Fixes bug #212 which is no covered by tests\n\t\t\tif( target == control_input && self.isOpen ){\n\t\t\t\tevt.stopPropagation();\n\n\t\t\t// clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n\t\t\t}else{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\n\t\t};\n\n\t\tconst win_scroll = () => {\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.positionDropdown();\n\t\t\t}\n\t\t};\n\n\n\t\taddEvent(document,'mousedown', doc_mousedown);\n\t\taddEvent(window,'scroll', win_scroll, passive_event);\n\t\taddEvent(window,'resize', win_scroll, passive_event);\n\n\t\tthis._destroy = () => {\n\t\t\tdocument.removeEventListener('mousedown',doc_mousedown);\n\t\t\twindow.removeEventListener('scroll',win_scroll);\n\t\t\twindow.removeEventListener('resize',win_scroll);\n\t\t\tif( label ) label.removeEventListener('click',label_click);\n\t\t};\n\n\t\t// store original html and tab index so that they can be\n\t\t// restored when the destroy() method is called.\n\t\tthis.revertSettings = {\n\t\t\tinnerHTML : input.innerHTML,\n\t\t\ttabIndex : input.tabIndex\n\t\t};\n\n\n\t\tinput.tabIndex = -1;\n\t\tinput.insertAdjacentElement('afterend', self.wrapper);\n\n\t\tself.sync(false);\n\t\tsettings.items = [];\n\t\tdelete settings.optgroups;\n\t\tdelete settings.options;\n\n\t\taddEvent(input,'invalid', () => {\n\t\t\tif( self.isValid ){\n\t\t\t\tself.isValid = false;\n\t\t\t\tself.isInvalid = true;\n\t\t\t\tself.refreshState();\n\t\t\t}\n\t\t});\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshItems();\n\t\tself.close(false);\n\t\tself.inputState();\n\t\tself.isSetup = true;\n\n\t\tif( input.disabled ){\n\t\t\tself.disable();\n\t\t}else if( input.readOnly ){\n\t\t\tself.setReadOnly(true);\n\t\t}else{\n\t\t\tself.enable(); //sets tabIndex\n\t\t}\n\n\t\tself.on('change', this.onChange);\n\n\t\taddClasses(input,'tomselected','ts-hidden-accessible');\n\t\tself.trigger('initialize');\n\n\t\t// preload options\n\t\tif (settings.preload === true) {\n\t\t\tself.preload();\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Register options and optgroups\n\t *\n\t */\n\tsetupOptions(options:TomOption[] = [], optgroups:TomOption[] = []){\n\n\t\t// build options table\n\t\tthis.addOptions(options);\n\n\n\t\t// build optgroup table\n\t\titerate( optgroups, (optgroup:TomOption) => {\n\t\t\tthis.registerOptionGroup(optgroup);\n\t\t});\n\t}\n\n\t/**\n\t * Sets up default rendering functions.\n\t */\n\tsetupTemplates() {\n\t\tvar self = this;\n\t\tvar field_label = self.settings.labelField;\n\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\n\t\tvar templates = {\n\t\t\t'optgroup': (data:TomOption) => {\n\t\t\t\tlet optgroup = document.createElement('div');\n\t\t\t\toptgroup.className = 'optgroup';\n\t\t\t\toptgroup.appendChild(data.options);\n\t\t\t\treturn optgroup;\n\n\t\t\t},\n\t\t\t'optgroup_header': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t},\n\t\t\t'option': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'item': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'option_create': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>…</div>';\n\t\t\t},\n\t\t\t'no_results':() => {\n\t\t\t\treturn '<div class=\"no-results\">No results found</div>';\n\t\t\t},\n\t\t\t'loading':() => {\n\t\t\t\treturn '<div class=\"spinner\"></div>';\n\t\t\t},\n\t\t\t'not_loading':() => {},\n\t\t\t'dropdown':() => {\n\t\t\t\treturn '<div></div>';\n\t\t\t}\n\t\t};\n\n\n\t\tself.settings.render = Object.assign({}, templates, self.settings.render);\n\t}\n\n\t/**\n\t * Maps fired events to callbacks provided\n\t * in the settings used when creating the control.\n\t */\n\tsetupCallbacks() {\n\t\tvar key, fn;\n\t\tvar callbacks:{[key:string]:string} = {\n\t\t\t'initialize' : 'onInitialize',\n\t\t\t'change' : 'onChange',\n\t\t\t'item_add' : 'onItemAdd',\n\t\t\t'item_remove' : 'onItemRemove',\n\t\t\t'item_select' : 'onItemSelect',\n\t\t\t'clear' : 'onClear',\n\t\t\t'option_add' : 'onOptionAdd',\n\t\t\t'option_remove' : 'onOptionRemove',\n\t\t\t'option_clear' : 'onOptionClear',\n\t\t\t'optgroup_add' : 'onOptionGroupAdd',\n\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t'optgroup_clear' : 'onOptionGroupClear',\n\t\t\t'dropdown_open' : 'onDropdownOpen',\n\t\t\t'dropdown_close' : 'onDropdownClose',\n\t\t\t'type' : 'onType',\n\t\t\t'load' : 'onLoad',\n\t\t\t'focus' : 'onFocus',\n\t\t\t'blur' : 'onBlur'\n\t\t};\n\n\t\tfor (key in callbacks) {\n\n\t\t\tfn = this.settings[callbacks[key] as (keyof TomSettings)];\n\t\t\tif (fn) this.on(key, fn);\n\n\t\t}\n\t}\n\n\t/**\n\t * Sync the Tom Select instance with the original input or select\n\t *\n\t */\n\tsync(get_settings:boolean=true):void{\n\t\tconst self\t\t= this;\n\t\tconst settings\t= get_settings ? getSettings( self.input, {delimiter:self.settings.delimiter} as RecursivePartial<TomSettings> ) : self.settings;\n\n\t\tself.setupOptions(settings.options,settings.optgroups);\n\n\t\tself.setValue(settings.items||[],true); // silent prevents recursion\n\n\t\tself.lastQuery = null; // so updated options will be displayed in dropdown\n\t}\n\n\t/**\n\t * Triggered when the main control element\n\t * has a click event.\n\t *\n\t */\n\tonClick():void {\n\t\tvar self = this;\n\n\t\tif( self.activeItems.length > 0 ){\n\t\t\tself.clearActiveItems();\n\t\t\tself.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.isFocused && self.isOpen ){\n\t\t\tself.blur();\n\t\t} else {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated v1.7\n\t *\n\t */\n\tonMouseDown():void {}\n\n\t/**\n\t * Triggered when the value of the control has been changed.\n\t * This should propagate the event to the original DOM\n\t * input / select element.\n\t */\n\tonChange() {\n\t\ttriggerEvent(this.input, 'input');\n\t\ttriggerEvent(this.input, 'change');\n\t}\n\n\t/**\n\t * Triggered on <input> paste.\n\t *\n\t */\n\tonPaste(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isInputHidden || self.isLocked ){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a regex or string is included, this will split the pasted\n\t\t// input and create Items for each separate value\n\t\tif( !self.settings.splitOn ){\n\t\t\treturn;\n\t\t}\n\n\t\t// Wait for pasted text to be recognized in value\n\t\tsetTimeout(() => {\n\t\t\tvar pastedText = self.inputValue();\n\t\t\tif( !pastedText.match(self.settings.splitOn)){\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar splitInput = pastedText.trim().split(self.settings.splitOn);\n\t\t\titerate( splitInput, (piece:string) => {\n\n\t\t\t\tconst hash = hash_key(piece);\n\t\t\t\tif( hash ){\n\t\t\t\t\tif( this.options[piece] ){\n\t\t\t\t\t\tself.addItem(piece);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tself.createItem(piece);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\n\t}\n\n\t/**\n\t * Triggered on <input> keypress.\n\t *\n\t */\n\tonKeyPress(e:KeyboardEvent):void {\n\t\tvar self = this;\n\t\tif(self.isLocked){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\tif (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n\t\t\tself.createItem();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keydown.\n\t *\n\t */\n\tonKeyDown(e:KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tself.ignoreHover = true;\n\n\t\tif (self.isLocked) {\n\t\t\tif (e.keyCode !== constants.KEY_TAB) {\n\t\t\t\tpreventDefault(e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.keyCode) {\n\n\t\t\t// ctrl+A: select all\n\t\t\tcase constants.KEY_A:\n\t\t\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\t\t\tif( self.control_input.value == '' ){\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// esc: close dropdown\n\t\t\tcase constants.KEY_ESC:\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tpreventDefault(e,true);\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\n\t\t\t// down: open dropdown or move selection down\n\t\t\tcase constants.KEY_DOWN:\n\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\tself.open();\n\t\t\t\t} else if (self.activeOption) {\n\t\t\t\t\tlet next = self.getAdjacent(self.activeOption, 1);\n\t\t\t\t\tif (next) self.setActiveOption(next);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// up: move selection up\n\t\t\tcase constants.KEY_UP:\n\t\t\t\tif (self.activeOption) {\n\t\t\t\t\tlet prev = self.getAdjacent(self.activeOption, -1);\n\t\t\t\t\tif (prev) self.setActiveOption(prev);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// return: select active option\n\t\t\tcase constants.KEY_RETURN:\n\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// if the option_create=null, the dropdown might be closed\n\t\t\t\t}else if (self.settings.create && self.createItem()) {\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// don't submit form when searching for a value\n\t\t\t\t}else if( document.activeElement == self.control_input && self.isOpen ){\n\t\t\t\t\tpreventDefault(e);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t// left: modifiy item selection to the left\n\t\t\tcase constants.KEY_LEFT:\n\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\treturn;\n\n\t\t\t// right: modifiy item selection to the right\n\t\t\tcase constants.KEY_RIGHT:\n\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\treturn;\n\n\t\t\t// tab: select active option and/or create item\n\t\t\tcase constants.KEY_TAB:\n\n\t\t\t\tif( self.settings.selectOnTab ){\n\t\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\n\t\t\t\t\t\t// prevent default [tab] behaviour of jump to the next field\n\t\t\t\t\t\t// if select isFull, then the dropdown won't be open and [tab] will work normally\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// delete|backspace: delete items\n\t\t\tcase constants.KEY_BACKSPACE:\n\t\t\tcase constants.KEY_DELETE:\n\t\t\t\tself.deleteSelection(e);\n\t\t\t\treturn;\n\t\t}\n\n\t\t// don't enter text in the control_input when active items are selected\n\t\tif( self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\tpreventDefault(e);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keyup.\n\t *\n\t */\n\tonInput(e:MouseEvent|KeyboardEvent):void {\n\t\t\n\t\tif( this.isLocked ){\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = this.inputValue();\n\t\tif( this.lastValue === value ) return;\n\t\tthis.lastValue = value;\n\t\t\n\t\tif( value == '' ){\n\t\t\tthis._onInput();\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.refreshTimeout ){\n\t\t\twindow.clearTimeout(this.refreshTimeout);\n\t\t}\n\n\t\tthis.refreshTimeout = timeout(()=> {\n\t\t\tthis.refreshTimeout = null;\n\t\t\tthis._onInput();\n\t\t}, this.settings.refreshThrottle);\n\t}\n\n\t_onInput():void {\n\t\tconst value = this.lastValue;\n\n\t\tif( this.settings.shouldLoad.call(this,value) ){\n\t\t\tthis.load(value);\n\t\t}\n\n\t\tthis.refreshOptions();\n\t\tthis.trigger('type', value);\n\t}\n\n\t/**\n\t * Triggered when the user rolls over\n\t * an option in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionHover( evt:MouseEvent|KeyboardEvent, option:HTMLElement ):void{\n\t\tif( this.ignoreHover ) return;\n\t\tthis.setActiveOption(option, false);\n\t}\n\n\t/**\n\t * Triggered on <input> focus.\n\t *\n\t */\n\tonFocus(e?:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\t\tvar wasFocused = self.isFocused;\n\n\t\tif( self.isDisabled || self.isReadOnly ){\n\t\t\tself.blur();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (self.ignoreFocus) return;\n\t\tself.isFocused = true;\n\t\tif( self.settings.preload === 'focus' ) self.preload();\n\n\t\tif (!wasFocused) self.trigger('focus');\n\n\t\tif (!self.activeItems.length) {\n\t\t\tself.inputState();\n\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t}\n\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Triggered on <input> blur.\n\t *\n\t */\n\tonBlur(e?:FocusEvent):void {\n\n\t\tif( document.hasFocus() === false ) return;\n\n\t\tvar self = this;\n\t\tif (!self.isFocused) return;\n\t\tself.isFocused = false;\n\t\tself.ignoreFocus = false;\n\n\t\tvar deactivate = () => {\n\t\t\tself.close();\n\t\t\tself.setActiveItem();\n\t\t\tself.setCaret(self.items.length);\n\t\t\tself.trigger('blur');\n\t\t};\n\n\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\tself.createItem(null, deactivate);\n\t\t} else {\n\t\t\tdeactivate();\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered when the user clicks on an option\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionSelect( evt:MouseEvent|KeyboardEvent, option:HTMLElement ){\n\t\tvar value, self = this;\n\n\n\t\t// should not be possible to trigger a option under a disabled optgroup\n\t\tif( option.parentElement && option.parentElement.matches('[data-disabled]') ){\n\t\t\treturn;\n\t\t}\n\n\n\t\tif( option.classList.contains('create') ){\n\t\t\tself.createItem(null, () => {\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = option.dataset.value;\n\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.addItem(value);\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( !self.settings.hideSelected && evt.type && /click/.test(evt.type) ){\n\t\t\t\t\tself.setActiveOption(option);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return true if the given option can be selected\n\t *\n\t */\n\tcanSelect(option:HTMLElement|null):boolean{\n\n\t\tif( this.isOpen && option && this.dropdown_content.contains(option) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Triggered when the user clicks on an item\n\t * that has been selected.\n\t *\n\t */\n\tonItemSelect( evt?:MouseEvent, item?:TomItem ):boolean{\n\t\tvar self = this;\n\n\t\tif( !self.isLocked && self.settings.mode === 'multi' ){\n\t\t\tpreventDefault(evt);\n\t\t\tself.setActiveItem(item, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines whether or not to invoke\n\t * the user-provided option provider / loader\n\t *\n\t * Note, there is a subtle difference between\n\t * this.canLoad() and this.settings.shouldLoad();\n\t *\n\t *\t- settings.shouldLoad() is a user-input validator.\n\t *\tWhen false is returned, the not_loading template\n\t *\twill be added to the dropdown\n\t *\n\t *\t- canLoad() is lower level validator that checks\n\t * \tthe Tom Select instance. There is no inherent user\n\t *\tfeedback when canLoad returns false\n\t *\n\t */\n\tcanLoad(value:string):boolean{\n\n\t\tif( !this.settings.load ) return false;\n\t\tif( this.loadedSearches.hasOwnProperty(value) ) return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Invokes the user-provided option provider / loader.\n\t *\n\t */\n\tload(value:string):void {\n\t\tconst self = this;\n\n\t\tif( !self.canLoad(value) ) return;\n\n\t\taddClasses(self.wrapper,self.settings.loadingClass);\n\t\tself.loading++;\n\n\t\tconst callback = self.loadCallback.bind(self);\n\t\tself.settings.load.call(self, value, callback);\n\t}\n\n\t/**\n\t * Invoked by the user-provided option provider\n\t *\n\t */\n\tloadCallback( options:TomOption[], optgroups:TomOption[] ):void{\n\t\tconst self = this;\n\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\tself.lastQuery = null;\n\n\t\tself.clearActiveOption(); // when new results load, focus should be on first option\n\t\tself.setupOptions(options,optgroups);\n\n\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\n\t\tif (!self.loading) {\n\t\t\tremoveClasses(self.wrapper,self.settings.loadingClass);\n\t\t}\n\n\t\tself.trigger('load', options, optgroups);\n\t}\n\n\tpreload():void{\n\t\tvar classList = this.wrapper.classList;\n\t\tif( classList.contains('preloaded') ) return;\n\t\tclassList.add('preloaded');\n\t\tthis.load('');\n\t}\n\n\n\t/**\n\t * Sets the input field of the control to the specified value.\n\t *\n\t */\n\tsetTextboxValue(value:string = '') {\n\t\tvar input = this.control_input;\n\t\tvar changed = input.value !== value;\n\t\tif (changed) {\n\t\t\tinput.value = value;\n\t\t\ttriggerEvent(input,'update');\n\t\t\tthis.lastValue = value;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the value of the control. If multiple items\n\t * can be selected (e.g. <select multiple>), this returns\n\t * an array. If only one item can be selected, this\n\t * returns a string.\n\t *\n\t */\n\tgetValue():string|string[] {\n\n\t\tif( this.is_select_tag && this.input.hasAttribute('multiple')) {\n\t\t\treturn this.items;\n\t\t}\n\n\t\treturn this.items.join(this.settings.delimiter);\n\t}\n\n\t/**\n\t * Resets the selected items to the given value.\n\t *\n\t */\n\tsetValue( value:string|string[], silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change'];\n\n\t\tdebounce_events(this, events,() => {\n\t\t\tthis.clear(silent);\n\t\t\tthis.addItems(value, silent);\n\t\t});\n\t}\n\n\n\t/**\n\t * Resets the number of max items to the given value\n\t *\n\t */\n\tsetMaxItems(value:null|number){\n\t\tif(value === 0) value = null; //reset to unlimited items.\n\t\tthis.settings.maxItems = value;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Sets the selected item.\n\t *\n\t */\n\tsetActiveItem( item?:TomItem, e?:MouseEvent|KeyboardEvent ){\n\t\tvar self = this;\n\t\tvar eventName;\n\t\tvar i, begin, end, swap;\n\t\tvar last;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\t// clear the active selection\n\t\tif( !item ){\n\t\t\tself.clearActiveItems();\n\t\t\tif (self.isFocused) {\n\t\t\t\tself.inputState();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// modify selection\n\t\teventName = e && e.type.toLowerCase();\n\n\t\tif (eventName === 'click' && isKeyDown('shiftKey',e) && self.activeItems.length) {\n\t\t\tlast\t= self.getLastActive();\n\t\t\tbegin\t= Array.prototype.indexOf.call(self.control.children, last);\n\t\t\tend\t\t= Array.prototype.indexOf.call(self.control.children, item);\n\n\t\t\tif (begin > end) {\n\t\t\t\tswap = begin;\n\t\t\t\tbegin = end;\n\t\t\t\tend = swap;\n\t\t\t}\n\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\titem = self.control.children[i] as TomItem;\n\t\t\t\tif (self.activeItems.indexOf(item) === -1) {\n\t\t\t\t\tself.setActiveItemClass(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpreventDefault(e);\n\t\t} else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT,e) ) || (eventName === 'keydown' && isKeyDown('shiftKey',e))) {\n\t\t\tif( item.classList.contains('active') ){\n\t\t\t\tself.removeActiveItem( item );\n\t\t\t} else {\n\t\t\t\tself.setActiveItemClass(item);\n\t\t\t}\n\t\t} else {\n\t\t\tself.clearActiveItems();\n\t\t\tself.setActiveItemClass(item);\n\t\t}\n\n\t\t// ensure control has focus\n\t\tself.inputState();\n\t\tif (!self.isFocused) {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Set the active and last-active classes\n\t *\n\t */\n\tsetActiveItemClass( item:TomItem ){\n\t\tconst self = this;\n\t\tconst last_active = self.control.querySelector('.last-active');\n\t\tif( last_active ) removeClasses(last_active as HTMLElement,'last-active');\n\n\t\taddClasses(item,'active last-active');\n\t\tself.trigger('item_select', item);\n\t\tif( self.activeItems.indexOf(item) == -1 ){\n\t\t\tself.activeItems.push( item );\n\t\t}\n\t}\n\n\t/**\n\t * Remove active item\n\t *\n\t */\n\tremoveActiveItem( item:TomItem ){\n\t\tvar idx = this.activeItems.indexOf(item);\n\t\tthis.activeItems.splice(idx, 1);\n\t\tremoveClasses(item,'active');\n\t}\n\n\t/**\n\t * Clears all the active items\n\t *\n\t */\n\tclearActiveItems(){\n\t\tremoveClasses(this.activeItems,'active');\n\t\tthis.activeItems = [];\n\t}\n\n\t/**\n\t * Sets the selected item in the dropdown menu\n\t * of available options.\n\t *\n\t */\n\tsetActiveOption( option:null|HTMLElement,scroll:boolean=true ):void{\n\n\t\tif( option === this.activeOption ){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearActiveOption();\n\t\tif( !option ) return;\n\n\t\tthis.activeOption = option;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':option.getAttribute('id')});\n\t\tsetAttr(option,{'aria-selected':'true'});\n\t\taddClasses(option,'active');\n\t\tif( scroll ) this.scrollToOption(option);\n\t}\n\n\t/**\n\t * Sets the dropdown_content scrollTop to display the option\n\t *\n\t */\n\tscrollToOption( option:null|HTMLElement, behavior?:string ):void{\n\n\t\tif( !option ) return;\n\n\t\tconst content\t\t= this.dropdown_content;\n\t\tconst height_menu\t= content.clientHeight;\n\t\tconst scrollTop\t\t= content.scrollTop || 0;\n\t\tconst height_item\t= option.offsetHeight;\n\t\tconst y\t\t\t\t= option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n\t\tif (y + height_item > height_menu + scrollTop) {\n\t\t\tthis.scroll(y - height_menu + height_item, behavior);\n\n\t\t} else if (y < scrollTop) {\n\t\t\tthis.scroll(y, behavior);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll the dropdown to the given position\n\t *\n\t */\n\tscroll( scrollTop:number, behavior?:string ):void{\n\t\tconst content = this.dropdown_content;\n\t\tif( behavior ){\n\t\t\tcontent.style.scrollBehavior = behavior;\n\t\t}\n\t\tcontent.scrollTop = scrollTop;\n\t\tcontent.style.scrollBehavior = '';\n\t}\n\n\t/**\n\t * Clears the active option\n\t *\n\t */\n\tclearActiveOption(){\n\t\tif( this.activeOption ){\n\t\t\tremoveClasses(this.activeOption,'active');\n\t\t\tsetAttr(this.activeOption,{'aria-selected':null});\n\t\t}\n\t\tthis.activeOption = null;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':null});\n\t}\n\n\n\t/**\n\t * Selects all items (CTRL + A).\n\t */\n\tselectAll() {\n\t\tconst self = this;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\tconst activeItems = self.controlChildren();\n\n\t\tif( !activeItems.length ) return;\n\n\t\tself.inputState();\n\t\tself.close();\n\n\t\tself.activeItems = activeItems;\n\t\titerate( activeItems, (item:TomItem) => {\n\t\t\tself.setActiveItemClass(item);\n\t\t});\n\n\t}\n\n\t/**\n\t * Determines if the control_input should be in a hidden or visible state\n\t *\n\t */\n\tinputState(){\n\t\tvar self = this;\n\n\t\tif( !self.control.contains(self.control_input) ) return;\n\n\t\tsetAttr(self.control_input,{placeholder:self.settings.placeholder});\n\n\t\tif( self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) ){\n\t\t\tself.setTextboxValue();\n\t\t\tself.isInputHidden = true;\n\n\t\t}else{\n\n\t\t\tif( self.settings.hidePlaceholder && self.items.length > 0 ){\n\t\t\t\tsetAttr(self.control_input,{placeholder:''});\n\t\t\t}\n\t\t\tself.isInputHidden = false;\n\t\t}\n\n\t\tself.wrapper.classList.toggle('input-hidden', self.isInputHidden );\n\t}\n\n\t/**\n\t * Get the input value\n\t */\n\tinputValue(){\n\t\treturn this.control_input.value.trim();\n\t}\n\n\t/**\n\t * Gives the control focus.\n\t */\n\tfocus() {\n\t\tvar self = this;\n\t\tif( self.isDisabled || self.isReadOnly) return;\n\n\t\tself.ignoreFocus = true;\n\n\t\tif( self.control_input.offsetWidth ){\n\t\t\tself.control_input.focus();\n\t\t}else{\n\t\t\tself.focus_node.focus();\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tself.ignoreFocus = false;\n\t\t\tself.onFocus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Forces the control out of focus.\n\t *\n\t */\n\tblur():void {\n\t\tthis.focus_node.blur();\n\t\tthis.onBlur();\n\t}\n\n\t/**\n\t * Returns a function that scores an object\n\t * to show how good of a match it is to the\n\t * provided query.\n\t *\n\t * @return {function}\n\t */\n\tgetScoreFunction(query:string) {\n\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t}\n\n\t/**\n\t * Returns search options for sifter (the system\n\t * for scoring and sorting results).\n\t *\n\t * @see https://github.com/orchidjs/sifter.js\n\t * @return {object}\n\t */\n\tgetSearchOptions() {\n\t\tvar settings = this.settings;\n\t\tvar sort = settings.sortField;\n\t\tif (typeof settings.sortField === 'string') {\n\t\t\tsort = [{field: settings.sortField}];\n\t\t}\n\n\t\treturn {\n\t\t\tfields : settings.searchField,\n\t\t\tconjunction : settings.searchConjunction,\n\t\t\tsort : sort,\n\t\t\tnesting : settings.nesting\n\t\t};\n\t}\n\n\t/**\n\t * Searches through available options and returns\n\t * a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string) : ReturnType<Sifter['search']>{\n\t\tvar result, calculateScore;\n\t\tvar self = this;\n\t\tvar options = this.getSearchOptions();\n\n\t\t// validate user-provided result scoring function\n\t\tif ( self.settings.score ){\n\t\t\tcalculateScore = self.settings.score.call(self,query);\n\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\tthrow new Error('Tom Select \"score\" setting must be a function that returns a function');\n\t\t\t}\n\t\t}\n\n\t\t// perform search\n\t\tif (query !== self.lastQuery) {\n\t\t\tself.lastQuery\t\t\t= query;\n\t\t\tresult\t\t\t\t\t= self.sifter.search(query, Object.assign(options, {score: calculateScore}));\n\t\t\tself.currentResults\t\t= result;\n\t\t} else {\n\t\t\tresult\t\t\t\t\t= Object.assign( {}, self.currentResults);\n\t\t}\n\n\t\t// filter out selected items\n\t\tif( self.settings.hideSelected ){\n\t\t\tresult.items = result.items.filter((item) => {\n\t\t\t\tlet hashed = hash_key(item.id);\n\t\t\t\treturn !(hashed && self.items.indexOf(hashed) !== -1 );\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Refreshes the list of available options shown\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\trefreshOptions( triggerDropdown:boolean = true ){\n\t\tvar i, j, k, n, optgroup, optgroups, html:DocumentFragment, has_create_option, active_group;\n\t\tvar create;\n\n\t\ttype Group = {fragment:DocumentFragment,order:number,optgroup:string}\n\t\tconst groups: {[key:string]:number} = {};\n\t\tconst groups_order:Group[]\t= [];\n\n\t\tvar self\t\t\t\t\t= this;\n\t\tvar query\t\t\t\t\t= self.inputValue();\n\t\tconst same_query\t\t\t= query === self.lastQuery || (query == '' && self.lastQuery == null);\n\t\tvar results\t\t\t\t\t= self.search(query);\n\t\tvar active_option:HTMLElement|null = null;\n\t\tvar show_dropdown\t\t\t= self.settings.shouldOpen || false;\n\t\tvar dropdown_content\t\t= self.dropdown_content;\n\n\n\t\tif( same_query ){\n\t\t\tactive_option\t\t\t= self.activeOption;\n\n\t\t\tif( active_option ){\n\t\t\t\tactive_group = active_option.closest('[data-group]') as HTMLElement;\n\t\t\t}\n\t\t}\n\n\t\t// build markup\n\t\tn = results.items.length;\n\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t}\n\n\t\tif( n > 0 ){\n\t\t\tshow_dropdown = true;\n\t\t}\n\n\t\t// get fragment for group and the position of the group in group_order\n\t\tconst getGroupFragment = (optgroup:string,order:number):[number,DocumentFragment] => {\n\n\t\t\tlet group_order_i = groups[optgroup];\n\n\t\t\tif( group_order_i !== undefined ){\n\t\t\t\tlet order_group = groups_order[group_order_i];\n\t\t\t\tif( order_group !== undefined ){\n\t\t\t\t\treturn [group_order_i,order_group.fragment];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet group_fragment = document.createDocumentFragment();\n\t\t\tgroup_order_i = groups_order.length;\n\t\t\tgroups_order.push({fragment:group_fragment,order,optgroup});\n\n\t\t\treturn [group_order_i,group_fragment]\n\t\t}\n\n\t\t// render and group available options individually\n\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t// get option dom element\n\t\t\tlet item\t\t\t= results.items[i];\n\t\t\tif( !item ) continue;\n\n\t\t\tlet opt_value\t\t= item.id;\n\t\t\tlet option\t\t\t= self.options[opt_value];\n\n\t\t\tif( option === undefined ) continue;\n\n\t\t\tlet opt_hash\t\t= get_hash(opt_value);\n\t\t\tlet option_el\t\t= self.getOption(opt_hash,true) as HTMLElement;\n\n\t\t\t// toggle 'selected' class\n\t\t\tif( !self.settings.hideSelected ){\n\t\t\t\toption_el.classList.toggle('selected', self.items.includes(opt_hash) );\n\t\t\t}\n\n\t\t\toptgroup = option[self.settings.optgroupField] || '';\n\t\t\toptgroups = Array.isArray(optgroup) ? optgroup : [optgroup];\n\t\t\t\n\n\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\toptgroup = optgroups[j];\n\n\t\t\t\tlet order = option.$order;\n\t\t\t\tlet self_optgroup = self.optgroups[optgroup];\n\t\t\t\tif( self_optgroup === undefined ){\t\t\t\t\t\n\t\t\t\t\toptgroup = '';\n\t\t\t\t}else{\n\t\t\t\t\torder = self_optgroup.$order;\n\t\t\t\t}\n\n\t\t\t\tconst [group_order_i,group_fragment] = getGroupFragment(optgroup,order);\n\n\n\t\t\t\t// nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\t\t\t\tif( j > 0 ){\n\t\t\t\t\toption_el = option_el.cloneNode(true) as HTMLElement;\n\t\t\t\t\tsetAttr(option_el,{id: option.$id+'-clone-'+j,'aria-selected':null});\n\t\t\t\t\toption_el.classList.add('ts-cloned');\n\t\t\t\t\tremoveClasses(option_el,'active');\n\n\n\t\t\t\t\t// make sure we keep the activeOption in the same group\n\t\t\t\t\tif( self.activeOption && self.activeOption.dataset.value == opt_value ){\n\t\t\t\t\t\tif( active_group && active_group.dataset.group === optgroup.toString() ){\n\t\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t\tgroup_fragment.appendChild(option_el);\n\t\t\t\tif( optgroup != '' ){\n\t\t\t\t\tgroups[optgroup] = group_order_i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort optgroups\n\t\tif( self.settings.lockOptgroupOrder ){\n\t\t\tgroups_order.sort((a, b) => {\n\t\t\t\treturn a.order - b.order;\n\t\t\t});\n\t\t}\n\n\t\t// render optgroup headers & join groups\n\t\thtml = document.createDocumentFragment();\n\t\titerate( groups_order, (group_order:Group) => {\n\n\t\t\tlet group_fragment = group_order.fragment;\n\t\t\tlet optgroup = group_order.optgroup\n\n\t\t\tif( !group_fragment || !group_fragment.children.length ) return;\n\n\t\t\tlet group_heading = self.optgroups[optgroup];\n\n\t\t\tif( group_heading !== undefined ){\n\n\t\t\t\tlet group_options = document.createDocumentFragment();\n\t\t\t\tlet header = self.render('optgroup_header', group_heading);\n\t\t\t\tappend( group_options, header );\n\t\t\t\tappend( group_options, group_fragment );\n\n\t\t\t\tlet group_html = self.render('optgroup', {group:group_heading,options:group_options} );\n\n\t\t\t\tappend( html, group_html );\n\n\t\t\t} else {\n\t\t\t\tappend( html, group_fragment );\n\t\t\t}\n\t\t});\n\n\t\tdropdown_content.innerHTML = '';\n\t\tappend( dropdown_content, html );\n\n\t\t// highlight matching terms inline\n\t\tif (self.settings.highlight) {\n\t\t\tremoveHighlight( dropdown_content );\n\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\titerate( results.tokens, (tok) => {\n\t\t\t\t\thighlight( dropdown_content, tok.regex);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// helper method for adding templates to dropdown\n\t\tvar add_template = (template:TomTemplateNames) => {\n\t\t\tlet content = self.render(template,{input:query});\n\t\t\tif( content ){\n\t\t\t\tshow_dropdown = true;\n\t\t\t\tdropdown_content.insertBefore(content, dropdown_content.firstChild);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\n\t\t// add loading message\n\t\tif( self.loading ){\n\t\t\tadd_template('loading');\n\n\t\t// invalid query\n\t\t}else if( !self.settings.shouldLoad.call(self,query) ){\n\t\t\tadd_template('not_loading');\n\n\t\t// add no_results message\n\t\t}else if( results.items.length === 0 ){\n\t\t\tadd_template('no_results');\n\n\t\t}\n\n\n\n\t\t// add create option\n\t\thas_create_option = self.canCreate(query);\n\t\tif (has_create_option) {\n\t\t\tcreate = add_template('option_create');\n\t\t}\n\n\n\t\t// activate\n\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\tif( show_dropdown ){\n\n\t\t\tif (results.items.length > 0) {\n\n\t\t\t\tif( !active_option && self.settings.mode === 'single' && self.items[0] != undefined ){\n\t\t\t\t\tactive_option = self.getOption(self.items[0]);\n\t\t\t\t}\n\n\t\t\t\tif( !dropdown_content.contains(active_option) ){\n\n\t\t\t\t\tlet active_index = 0;\n\t\t\t\t\tif( create && !self.settings.addPrecedence ){\n\t\t\t\t\t\tactive_index = 1;\n\t\t\t\t\t}\n\t\t\t\t\tactive_option = self.selectable()[active_index] as HTMLElement;\n\t\t\t\t}\n\n\t\t\t}else if( create ){\n\t\t\t\tactive_option = create;\n\t\t\t}\n\n\t\t\tif( triggerDropdown && !self.isOpen ){\n\t\t\t\tself.open();\n\t\t\t\tself.scrollToOption(active_option,'auto');\n\t\t\t}\n\t\t\tself.setActiveOption(active_option);\n\n\t\t}else{\n\t\t\tself.clearActiveOption();\n\t\t\tif( triggerDropdown && self.isOpen ){\n\t\t\t\tself.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return list of selectable options\n\t *\n\t */\n\tselectable():NodeList{\n\t\treturn this.dropdown_content.querySelectorAll('[data-selectable]');\n\t}\n\n\n\n\t/**\n\t * Adds an available option. If it already exists,\n\t * nothing will happen. Note: this does not refresh\n\t * the options list dropdown (use `refreshOptions`\n\t * for that).\n\t *\n\t * Usage:\n\t *\n\t * this.addOption(data)\n\t *\n\t */\n\taddOption( data:TomOption, user_created = false ):false|string {\n\t\tconst self = this;\n\n\t\t// @deprecated 1.7.7\n\t\t// use addOptions( array, user_created ) for adding multiple options\n\t\tif( Array.isArray(data) ){\n\t\t\tself.addOptions( data, user_created);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst key = hash_key(data[self.settings.valueField]);\n\t\tif( key === null || self.options.hasOwnProperty(key) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tdata.$order\t\t\t= data.$order || ++self.order;\n\t\tdata.$id\t\t\t= self.inputId + '-opt-' + data.$order;\n\t\tself.options[key]\t= data;\n\t\tself.lastQuery\t\t= null;\n\n\t\tif( user_created ){\n\t\t\tself.userOptions[key] = user_created;\n\t\t\tself.trigger('option_add', key, data);\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Add multiple options\n\t *\n\t */\n\taddOptions( data:TomOption[], user_created = false ):void{\n\t\titerate( data, (dat:TomOption) => {\n\t\t\tthis.addOption(dat, user_created);\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated 1.7.7\n\t */\n\tregisterOption( data:TomOption ):false|string {\n\t\treturn this.addOption(data);\n\t}\n\n\t/**\n\t * Registers an option group to the pool of option groups.\n\t *\n\t * @return {boolean|string}\n\t */\n\tregisterOptionGroup(data:TomOption) {\n\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\n\t\tif ( key === null ) return false;\n\n\t\tdata.$order = data.$order || ++this.order;\n\t\tthis.optgroups[key] = data;\n\t\treturn key;\n\t}\n\n\t/**\n\t * Registers a new optgroup for options\n\t * to be bucketed into.\n\t *\n\t */\n\taddOptionGroup(id:string, data:TomOption) {\n\t\tvar hashed_id;\n\t\tdata[this.settings.optgroupValueField] = id;\n\n\t\tif( hashed_id = this.registerOptionGroup(data) ){\n\t\t\tthis.trigger('optgroup_add', hashed_id, data);\n\t\t}\n\t}\n\n\t/**\n\t * Removes an existing option group.\n\t *\n\t */\n\tremoveOptionGroup(id:string) {\n\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\tdelete this.optgroups[id];\n\t\t\tthis.clearCache();\n\t\t\tthis.trigger('optgroup_remove', id);\n\t\t}\n\t}\n\n\t/**\n\t * Clears all existing option groups.\n\t */\n\tclearOptionGroups() {\n\t\tthis.optgroups = {};\n\t\tthis.clearCache();\n\t\tthis.trigger('optgroup_clear');\n\t}\n\n\t/**\n\t * Updates an option available for selection. If\n\t * it is visible in the selected items or options\n\t * dropdown, it will be re-rendered automatically.\n\t *\n\t */\n\tupdateOption(value:string, data:TomOption) {\n\t\tconst self = this;\n\t\tvar item_new;\n\t\tvar index_item;\n\n\t\tconst value_old\t\t= hash_key(value);\n\t\tconst value_new\t\t= hash_key(data[self.settings.valueField]);\n\n\t\t// sanity checks\n\t\tif( value_old === null ) return;\n\n\t\tconst data_old\t\t= self.options[value_old];\n\n\t\tif( data_old == undefined ) return;\n\t\tif( typeof value_new !== 'string' ) throw new Error('Value must be set in option data');\n\n\n\t\tconst option\t\t= self.getOption(value_old);\n\t\tconst item\t\t\t= self.getItem(value_old);\n\n\n\t\tdata.$order = data.$order || data_old.$order;\n\t\tdelete self.options[value_old];\n\n\t\t// invalidate render cache\n\t\t// don't remove existing node yet, we'll remove it after replacing it\n\t\tself.uncacheValue(value_new);\n\n\t\tself.options[value_new] = data;\n\n\t\t// update the option if it's in the dropdown\n\t\tif( option ){\n\t\t\tif( self.dropdown_content.contains(option) ){\n\n\t\t\t\tconst option_new\t= self._render('option', data);\n\t\t\t\treplaceNode(option, option_new);\n\n\t\t\t\tif( self.activeOption === option ){\n\t\t\t\t\tself.setActiveOption(option_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\toption.remove();\n\t\t}\n\n\t\t// update the item if we have one\n\t\tif( item ){\n\t\t\tindex_item = self.items.indexOf(value_old);\n\t\t\tif (index_item !== -1) {\n\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t}\n\n\t\t\titem_new\t= self._render('item', data);\n\n\t\t\tif( item.classList.contains('active') ) addClasses(item_new,'active');\n\n\t\t\treplaceNode( item, item_new);\n\t\t}\n\n\t\t// invalidate last query because we might have updated the sortField\n\t\tself.lastQuery = null;\n\t}\n\n\t/**\n\t * Removes a single option.\n\t *\n\t */\n\tremoveOption(value:string, silent?:boolean):void {\n\t\tconst self = this;\n\t\tvalue = get_hash(value);\n\n\t\tself.uncacheValue(value);\n\n\t\tdelete self.userOptions[value];\n\t\tdelete self.options[value];\n\t\tself.lastQuery = null;\n\t\tself.trigger('option_remove', value);\n\t\tself.removeItem(value, silent);\n\t}\n\n\t/**\n\t * Clears all options.\n\t */\n\tclearOptions(filter?:TomClearFilter ) {\n\n\t\tconst boundFilter = (filter || this.clearFilter).bind(this);\n\n\t\tthis.loadedSearches\t\t= {};\n\t\tthis.userOptions\t\t= {};\n\t\tthis.clearCache();\n\n\t\tconst selected:TomOptions\t= {};\n\t\titerate(this.options,(option:TomOption,key:string)=>{\n\t\t\tif( boundFilter(option,key as string) ){\n\t\t\t\tselected[key] = option;\n\t\t\t}\n\t\t});\n\n\t\tthis.options = this.sifter.items = selected;\n\t\tthis.lastQuery = null;\n\t\tthis.trigger('option_clear');\n\t}\n\n\t/**\n\t * Used by clearOptions() to decide whether or not an option should be removed\n\t * Return true to keep an option, false to remove\n\t *\n\t */\n\tclearFilter(option:TomOption,value:string){\n\t\tif( this.items.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns the dom element of the option\n\t * matching the given value.\n\t *\n\t */\n\tgetOption(value:undefined|null|boolean|string|number, create:boolean=false):null|HTMLElement {\n\n\t\tconst hashed = hash_key(value);\n\t\tif( hashed === null ) return null;\n\n\t\tconst option = this.options[hashed];\n\t\tif( option != undefined ){\n\n\t\t\tif( option.$div ){\n\t\t\t\treturn option.$div;\n\t\t\t}\n\n\t\t\tif( create ){\n\t\t\t\treturn this._render('option', option);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the dom element of the next or previous dom element of the same type\n\t * Note: adjacent options may not be adjacent DOM elements (optgroups)\n\t *\n\t */\n\tgetAdjacent( option:null|HTMLElement, direction:number, type:string = 'option' ) : HTMLElement|null{\n\t\tvar self = this, all;\n\n\t\tif( !option ){\n\t\t\treturn null;\n\t\t}\n\n\t\tif( type == 'item' ){\n\t\t\tall\t\t\t= self.controlChildren();\n\t\t}else{\n\t\t\tall\t\t\t= self.dropdown_content.querySelectorAll('[data-selectable]');\n\t\t}\n\n\t\tfor( let i = 0; i < all.length; i++ ){\n\t\t\tif( all[i] != option ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( direction > 0 ){\n\t\t\t\treturn all[i+1] as HTMLElement;\n\t\t\t}\n\n\t\t\treturn all[i-1] as HTMLElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Returns the dom element of the item\n\t * matching the given value.\n\t *\n\t */\n\tgetItem(item:string|TomItem|null):null|TomItem {\n\n\t\tif( typeof item == 'object' ){\n\t\t\treturn item;\n\t\t}\n\n\t\tvar value = hash_key(item);\n\t\treturn value !== null\n\t\t\t? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * \"Selects\" multiple items at once. Adds them to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItems( values:string|string[], silent?:boolean ):void{\n\t\tvar self = this;\n\n\t\tvar items = Array.isArray(values) ? values : [values];\n\t\titems = items.filter(x => self.items.indexOf(x) === -1);\n\t\tconst last_item = items[items.length - 1];\n\t\titems.forEach(item => {\n\t\t\tself.isPending = (item !== last_item);\n\t\t\tself.addItem(item, silent);\n\t\t});\n\t}\n\n\t/**\n\t * \"Selects\" an item. Adds it to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItem( value:string, silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change','dropdown_close'];\n\n\t\tdebounce_events(this, events, () => {\n\t\t\tvar item, wasFull;\n\t\t\tconst self = this;\n\t\t \tconst inputMode = self.settings.mode;\n\t\t\tconst hashed = hash_key(value);\n\n\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\n\t\t\t\tif( inputMode === 'single' ){\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( inputMode === 'single' || !self.settings.duplicates ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\n\t\t\titem = self._render('item', self.options[hashed]);\n\n\t\t\tif( self.control.contains(item) ){ // duplicates\n\t\t\t\titem = item.cloneNode(true) as HTMLElement;\n\t\t\t}\n\n\t\t\twasFull = self.isFull();\n\t\t\tself.items.splice(self.caretPos, 0, hashed);\n\t\t\tself.insertAtCaret(item);\n\n\t\t\tif (self.isSetup) {\n\n\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\tif( !self.isPending && self.settings.hideSelected ){\n\t\t\t\t\tlet option = self.getOption(hashed);\n\t\t\t\t\tlet next = self.getAdjacent(option, 1);\n\t\t\t\t\tif( next ){\n\t\t\t\t\t\tself.setActiveOption(next);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// refreshOptions after setActiveOption(),\n\t\t\t\t// otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\t\t\t\tif( !self.isPending && !self.settings.closeAfterSelect ){\n\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t}\n\n\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\tif( self.settings.closeAfterSelect != false && self.isFull() ){\n\t\t\t\t\tself.close();\n\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\tself.positionDropdown();\n\t\t\t\t}\n\n\t\t\t\tself.trigger('item_add', hashed, item);\n\n\t\t\t\tif (!self.isPending) {\n\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\tself.inputState();\n\t\t\t\tself.refreshState();\n\t\t\t}\n\n\t\t});\n\t}\n\n\t/**\n\t * Removes the selected item matching\n\t * the provided value.\n\t *\n\t */\n\tremoveItem( item:string|TomItem|null=null, silent?:boolean ){\n\t\tconst self\t\t= this;\n\t\titem\t\t\t= self.getItem(item);\n\n\t\tif( !item ) return;\n\n\t\tvar i,idx;\n\t\tconst value\t= item.dataset.value;\n\t\ti = nodeIndex(item);\n\n\t\titem.remove();\n\t\tif( item.classList.contains('active') ){\n\t\t\tidx = self.activeItems.indexOf(item);\n\t\t\tself.activeItems.splice(idx, 1);\n\t\t\tremoveClasses(item,'active');\n\t\t}\n\n\t\tself.items.splice(i, 1);\n\t\tself.lastQuery = null;\n\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\tself.removeOption(value, silent);\n\t\t}\n\n\t\tif (i < self.caretPos) {\n\t\t\tself.setCaret(self.caretPos - 1);\n\t\t}\n\n\t\tself.updateOriginalInput({silent: silent});\n\t\tself.refreshState();\n\t\tself.positionDropdown();\n\t\tself.trigger('item_remove', value, item);\n\n\t}\n\n\t/**\n\t * Invokes the `create` method provided in the\n\t * TomSelect options that should provide the data\n\t * for the new item, given the user input.\n\t *\n\t * Once this completes, it will be added\n\t * to the item list.\n\t *\n\t */\n\tcreateItem( input:null|string=null, callback:TomCreateCallback = ()=>{} ):boolean{\n\n\t\t// triggerDropdown parameter @deprecated 2.1.1\n\t\tif( arguments.length === 3 ){\n\t\t\tcallback = arguments[2];\n\t\t}\n\t\tif( typeof callback != 'function' ){\n\t\t\tcallback = () => {};\n\t\t}\n\n\t\tvar self = this;\n\t\tvar caret = self.caretPos;\n\t\tvar output;\n\t\tinput = input || self.inputValue();\n\n\t\tif (!self.canCreate(input)) {\n\t\t\tcallback();\n\t\t\treturn false;\n\t\t}\n\n\t\tself.lock();\n\n\t\tvar created = false;\n\t\tvar create = (data?:boolean|TomOption) => {\n\t\t\tself.unlock();\n\n\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\tif( typeof value !== 'string' ){\n\t\t\t\treturn callback();\n\t\t\t}\n\n\t\t\tself.setTextboxValue();\n\t\t\tself.addOption(data,true);\n\t\t\tself.setCaret(caret);\n\t\t\tself.addItem(value);\n\t\t\tcallback(data);\n\t\t\tcreated = true;\n\t\t};\n\n\t\tif( typeof self.settings.create === 'function' ){\n\t\t\toutput = self.settings.create.call(this, input, create);\n\t\t}else{\n\t\t\toutput = {\n\t\t\t\t[self.settings.labelField]: input,\n\t\t\t\t[self.settings.valueField]: input,\n\t\t\t};\n\t\t}\n\n\t\tif( !created ){\n\t\t\tcreate(output);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Re-renders the selected item lists.\n\t */\n\trefreshItems() {\n\t\tvar self = this;\n\t\tself.lastQuery = null;\n\n\t\tif (self.isSetup) {\n\t\t\tself.addItems(self.items);\n\t\t}\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Updates all state-dependent attributes\n\t * and CSS classes.\n\t */\n\trefreshState() {\n\t\tconst self = this;\n\n\t\tself.refreshValidityState();\n\n\t\tconst isFull\t= self.isFull();\n\t\tconst isLocked\t= self.isLocked;\n\n\t\tself.wrapper.classList.toggle('rtl',self.rtl);\n\n\n\t\tconst wrap_classList = self.wrapper.classList;\n\n\t\twrap_classList.toggle('focus', self.isFocused)\n\t\twrap_classList.toggle('disabled', self.isDisabled)\n\t\twrap_classList.toggle('readonly', self.isReadOnly)\n\t\twrap_classList.toggle('required', self.isRequired)\n\t\twrap_classList.toggle('invalid', !self.isValid)\n\t\twrap_classList.toggle('locked', isLocked)\n\t\twrap_classList.toggle('full', isFull)\n\t\twrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden)\n\t\twrap_classList.toggle('dropdown-active', self.isOpen)\n\t\twrap_classList.toggle('has-options', isEmptyObject(self.options) )\n\t\twrap_classList.toggle('has-items', self.items.length > 0);\n\n\t}\n\n\n\t/**\n\t * Update the `required` attribute of both input and control input.\n\t *\n\t * The `required` property needs to be activated on the control input\n\t * for the error to be displayed at the right place. `required` also\n\t * needs to be temporarily deactivated on the input since the input is\n\t * hidden and can't show errors.\n\t */\n\trefreshValidityState() {\n\t\tvar self = this;\n\n\t\tif( !self.input.validity ){\n\t\t\treturn;\n\t\t}\n\n\t\tself.isValid = self.input.validity.valid;\n\t\tself.isInvalid = !self.isValid;\n\t}\n\n\t/**\n\t * Determines whether or not more items can be added\n\t * to the control without exceeding the user-defined maximum.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFull() {\n\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t}\n\n\t/**\n\t * Refreshes the original <select> or <input>\n\t * element to reflect the current state.\n\t *\n\t */\n\tupdateOriginalInput( opts:TomArgObject = {} ){\n\t\tconst self = this;\n\t\tvar option, label;\n\n\t\tconst empty_option = self.input.querySelector('option[value=\"\"]') as HTMLOptionElement;\n\n\t\tif( self.is_select_tag ){\n\n\t\t\tconst selected:HTMLOptionElement[]\t\t= [];\n\t\t\tconst has_selected:number\t\t\t\t= self.input.querySelectorAll('option:checked').length;\n\n\t\t\tfunction AddSelected(option_el:HTMLOptionElement|null, value:string, label:string):HTMLOptionElement{\n\n\t\t\t\tif( !option_el ){\n\t\t\t\t\toption_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>') as HTMLOptionElement;\n\t\t\t\t}\n\n\t\t\t\t// don't move empty option from top of list\n\t\t\t\t// fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\t\t\t\tif( option_el != empty_option ){\n\t\t\t\t\tself.input.append(option_el);\n\t\t\t\t}\n\n\t\t\t\tselected.push(option_el);\n\n\t\t\t\t// marking empty option as selected can break validation\n\t\t\t\t// fixes https://github.com/orchidjs/tom-select/issues/303\n\t\t\t\tif( option_el != empty_option || has_selected > 0 ){\n\t\t\t\t\toption_el.selected = true;\n\t\t\t\t}\n\n\t\t\t\treturn option_el;\n\t\t\t}\n\n\t\t\t// unselect all selected options\n\t\t\tself.input.querySelectorAll('option:checked').forEach((option_el:Element) => {\n\t\t\t\t(<HTMLOptionElement>option_el).selected = false;\n\t\t\t});\n\n\n\t\t\t// nothing selected?\n\t\t\tif( self.items.length == 0 && self.settings.mode == 'single' ){\n\n\t\t\t\tAddSelected(empty_option, \"\", \"\");\n\n\t\t\t// order selected <option> tags for values in self.items\n\t\t\t}else{\n\n\t\t\t\tself.items.forEach((value)=>{\n\t\t\t\t\toption\t\t\t= self.options[value]!;\n\t\t\t\t\tlabel\t\t\t= option[self.settings.labelField] || '';\n\n\t\t\t\t\tif( selected.includes(option.$option) ){\n\t\t\t\t\t\tconst reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`) as HTMLOptionElement;\n\t\t\t\t\t\tAddSelected(reuse_opt, value, label);\n\t\t\t\t\t}else{\n\t\t\t\t\t\toption.$option\t= AddSelected(option.$option, value, label);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tself.input.value = self.getValue() as string;\n\t\t}\n\n\t\tif (self.isSetup) {\n\t\t\tif (!opts.silent) {\n\t\t\t\tself.trigger('change', self.getValue() );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shows the autocomplete dropdown containing\n\t * the available options.\n\t */\n\topen() {\n\t\tvar self = this;\n\n\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\tself.isOpen = true;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'true'});\n\t\tself.refreshState();\n\t\tapplyCSS(self.dropdown,{visibility: 'hidden', display: 'block'});\n\t\tself.positionDropdown();\n\t\tapplyCSS(self.dropdown,{visibility: 'visible', display: 'block'});\n\t\tself.focus();\n\t\tself.trigger('dropdown_open', self.dropdown);\n\t}\n\n\t/**\n\t * Closes the autocomplete dropdown menu.\n\t */\n\tclose(setTextboxValue=true) {\n\t\tvar self = this;\n\t\tvar trigger = self.isOpen;\n\n\t\tif( setTextboxValue ){\n\n\t\t\t// before blur() to prevent form onchange event\n\t\t\tself.setTextboxValue();\n\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.inputState();\n\t\t\t}\n\t\t}\n\n\t\tself.isOpen = false;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'false'});\n\t\tapplyCSS(self.dropdown,{display: 'none'});\n\t\tif( self.settings.hideSelected ){\n\t\t\tself.clearActiveOption();\n\t\t}\n\t\tself.refreshState();\n\n\t\tif (trigger) self.trigger('dropdown_close', self.dropdown);\n\t}\n\n\t/**\n\t * Calculates and applies the appropriate\n\t * position of the dropdown if dropdownParent = 'body'.\n\t * Otherwise, position is determined by css\n\t */\n\tpositionDropdown(){\n\n\t\tif( this.settings.dropdownParent !== 'body' ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar context\t\t\t= this.control;\n\t\tvar rect\t\t\t= context.getBoundingClientRect();\n\t\tvar top\t\t\t\t= context.offsetHeight + rect.top + window.scrollY;\n\t\tvar left\t\t\t= rect.left + window.scrollX;\n\n\n\t\tapplyCSS(this.dropdown,{\n\t\t\twidth : rect.width + 'px',\n\t\t\ttop : top + 'px',\n\t\t\tleft : left + 'px'\n\t\t});\n\n\t}\n\n\t/**\n\t * Resets / clears all selected items\n\t * from the control.\n\t *\n\t */\n\tclear(silent?:boolean) {\n\t\tvar self = this;\n\n\t\tif (!self.items.length) return;\n\n\t\tvar items = self.controlChildren();\n\t\titerate(items,(item:TomItem)=>{\n\t\t\tself.removeItem(item,true);\n\t\t});\n\n\t\tself.inputState();\n\t\tif( !silent ) self.updateOriginalInput();\n\t\tself.trigger('clear');\n\t}\n\n\t/**\n\t * A helper method for inserting an element\n\t * at the current caret position.\n\t *\n\t */\n\tinsertAtCaret(el:HTMLElement) {\n\t\tconst self\t\t= this;\n\t\tconst caret\t\t= self.caretPos;\n\t\tconst target\t= self.control;\n\n\t\ttarget.insertBefore(el, target.children[caret] || null);\n\t\tself.setCaret(caret + 1);\n\t}\n\n\t/**\n\t * Removes the current selected item(s).\n\t *\n\t */\n\tdeleteSelection(e:KeyboardEvent):boolean {\n\t\tvar direction, selection, caret, tail;\n\t\tvar self = this;\n\n\t\tdirection = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n\t\tselection = getSelection(self.control_input);\n\n\n\t\t// determine items that will be removed\n\t\tconst rm_items:TomItem[]\t= [];\n\n\t\tif (self.activeItems.length) {\n\n\t\t\ttail = getTail(self.activeItems, direction);\n\t\t\tcaret = nodeIndex(tail);\n\n\t\t\tif (direction > 0) { caret++; }\n\n\t\t\titerate(self.activeItems, (item:TomItem) => rm_items.push(item) );\n\n\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\tconst items = self.controlChildren();\n\t\t\tlet rm_item;\n\t\t\tif( direction < 0 && selection.start === 0 && selection.length === 0 ){\n\t\t\t\trm_item = items[self.caretPos - 1];\n\n\t\t\t}else if( direction > 0 && selection.start === self.inputValue().length ){\n\t\t\t\trm_item = items[self.caretPos];\n\t\t\t}\n\n\t\t\tif( rm_item !== undefined ){\n\t\t\t\trm_items.push( rm_item );\n\t\t\t}\n\t\t}\n\n\t\tif( !self.shouldDelete(rm_items,e) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tpreventDefault(e,true);\n\n\t\t// perform removal\n\t\tif (typeof caret !== 'undefined') {\n\t\t\tself.setCaret(caret);\n\t\t}\n\n\t\twhile( rm_items.length ){\n\t\t\tself.removeItem(rm_items.pop());\n\t\t}\n\n\t\tself.inputState();\n\t\tself.positionDropdown();\n\t\tself.refreshOptions(false);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if the items should be deleted\n\t */\n\tshouldDelete(items:TomItem[],evt:MouseEvent|KeyboardEvent){\n\n\t\tconst values = items.map(item => item.dataset.value);\n\n\t\t// allow the callback to abort\n\t\tif( !values.length || (typeof this.settings.onDelete === 'function' && this.settings.onDelete(values,evt) === false) ){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Selects the previous / next item (depending on the `direction` argument).\n\t *\n\t * > 0 - right\n\t * < 0 - left\n\t *\n\t */\n\tadvanceSelection(direction:number, e?:MouseEvent|KeyboardEvent) {\n\t\tvar last_active, adjacent, self = this;\n\n\t\tif (self.rtl) direction *= -1;\n\t\tif( self.inputValue().length ) return;\n\n\n\t\t// add or remove to active items\n\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) || isKeyDown('shiftKey',e) ){\n\n\t\t\tlast_active\t\t\t= self.getLastActive(direction);\n\t\t\tif( last_active ){\n\n\t\t\t\tif( !last_active.classList.contains('active') ){\n\t\t\t\t\tadjacent\t\t\t= last_active;\n\t\t\t\t}else{\n\t\t\t\t\tadjacent\t\t\t= self.getAdjacent(last_active,direction,'item');\n\t\t\t\t}\n\n\t\t\t// if no active item, get items adjacent to the control input\n\t\t\t}else if( direction > 0 ){\n\t\t\t\tadjacent\t\t\t= self.control_input.nextElementSibling;\n\t\t\t}else{\n\t\t\t\tadjacent\t\t\t= self.control_input.previousElementSibling;\n\t\t\t}\n\n\n\t\t\tif( adjacent ){\n\t\t\t\tif( adjacent.classList.contains('active') ){\n\t\t\t\t\tself.removeActiveItem(last_active);\n\t\t\t\t}\n\t\t\t\tself.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n\t\t\t}\n\n\t\t// move caret to the left or right\n\t\t}else{\n\t\t\tself.moveCaret(direction);\n\t\t}\n\t}\n\n\tmoveCaret(direction:number){}\n\n\t/**\n\t * Get the last active item\n\t *\n\t */\n\tgetLastActive(direction?:number){\n\n\t\tlet last_active = this.control.querySelector('.last-active');\n\t\tif( last_active ){\n\t\t\treturn last_active;\n\t\t}\n\n\n\t\tvar result = this.control.querySelectorAll('.active');\n\t\tif( result ){\n\t\t\treturn getTail(result,direction);\n\t\t}\n\t}\n\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tsetCaret(new_pos:number) {\n\t\tthis.caretPos = this.items.length;\n\t}\n\n\t/**\n\t * Return list of item dom elements\n\t *\n\t */\n\tcontrolChildren():TomItem[]{\n\t\treturn Array.from( this.control.querySelectorAll('[data-ts-item]') ) as TomItem[];\n\t}\n\n\t/**\n\t * Disables user input on the control. Used while\n\t * items are being asynchronously created.\n\t */\n\tlock() {\n\t\tthis.setLocked(true);\n\t}\n\n\t/**\n\t * Re-enables user input on the control.\n\t */\n\tunlock() {\n\t\tthis.setLocked(false);\n\t}\n\n\t/**\n\t * Disable or enable user input on the control\n\t */\n\tsetLocked( lock:boolean = this.isReadOnly || this.isDisabled ){\n\t\tthis.isLocked = lock;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Disables user input on the control completely.\n\t * While disabled, it cannot receive focus.\n\t */\n\tdisable() {\n\t\tthis.setDisabled(true);\n\t\tthis.close();\n\t}\n\n\t/**\n\t * Enables the control so that it can respond\n\t * to focus and user input.\n\t */\n\tenable() {\n\t\tthis.setDisabled(false);\n\t}\n\n\tsetDisabled(disabled:boolean){\n\t\tthis.focus_node.tabIndex\t\t= disabled ? -1 : this.tabIndex;\n\t\tthis.isDisabled\t\t\t\t\t= disabled;\n\t\tthis.input.disabled\t\t\t\t= disabled;\n\t\tthis.control_input.disabled\t\t= disabled;\n\t\tthis.setLocked();\n\t}\n\n\tsetReadOnly(isReadOnly:boolean){\n\t\tthis.isReadOnly\t\t\t\t\t= isReadOnly;\n\t\tthis.input.readOnly\t\t\t\t= isReadOnly;\n\t\tthis.control_input.readOnly\t\t= isReadOnly;\n\t\tthis.setLocked();\n\t}\n\n\t/**\n\t * Completely destroys the control and\n\t * unbinds all event listeners so that it can\n\t * be garbage collected.\n\t */\n\tdestroy() {\n\t\tvar self = this;\n\t\tvar revertSettings = self.revertSettings;\n\n\t\tself.trigger('destroy');\n\t\tself.off();\n\t\tself.wrapper.remove();\n\t\tself.dropdown.remove();\n\n\t\tself.input.innerHTML = revertSettings.innerHTML;\n\t\tself.input.tabIndex = revertSettings.tabIndex;\n\n\t\tremoveClasses(self.input,'tomselected','ts-hidden-accessible');\n\n\t\tself._destroy();\n\n\t\tdelete self.input.tomselect;\n\t}\n\n\t/**\n\t * A helper method for rendering \"item\" and\n\t * \"option\" templates, given the data.\n\t *\n\t */\n\trender( templateName:TomTemplateNames, data?:any ):null|HTMLElement{\n\t\tvar id, html;\n\t\tconst self = this;\n\n\t\tif( typeof this.settings.render[templateName] !== 'function' ){\n\t\t\treturn null;\n\t\t}\n\n\t\t// render markup\n\t\thtml = self.settings.render[templateName].call(this, data, escape_html);\n\n\t\tif( !html ){\n\t\t\treturn null;\n\t\t}\n\n\t\thtml = getDom( html );\n\n\t\t// add mandatory attributes\n\t\tif (templateName === 'option' || templateName === 'option_create') {\n\n\t\t\tif( data[self.settings.disabledField] ){\n\t\t\t\tsetAttr(html,{'aria-disabled':'true'});\n\t\t\t}else{\n\t\t\t\tsetAttr(html,{'data-selectable': ''});\n\t\t\t}\n\n\t\t}else if (templateName === 'optgroup') {\n\t\t\tid = data.group[self.settings.optgroupValueField];\n\t\t\tsetAttr(html,{'data-group': id});\n\t\t\tif(data.group[self.settings.disabledField]) {\n\t\t\t\tsetAttr(html,{'data-disabled': ''});\n\t\t\t}\n\t\t}\n\n\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\tconst value\t= get_hash(data[self.settings.valueField]);\n\t\t\tsetAttr(html,{'data-value': value });\n\n\n\t\t\t// make sure we have some classes if a template is overwritten\n\t\t\tif( templateName === 'item' ){\n\t\t\t\taddClasses(html,self.settings.itemClass);\n\t\t\t\tsetAttr(html,{'data-ts-item':''});\n\t\t\t}else{\n\t\t\t\taddClasses(html,self.settings.optionClass);\n\t\t\t\tsetAttr(html,{\n\t\t\t\t\trole:'option',\n\t\t\t\t\tid:data.$id\n\t\t\t\t});\n\n\t\t\t\t// update cache\n\t\t\t\tdata.$div = html;\n\t\t\t\tself.options[value] = data;\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn html;\n\n\t}\n\n\n\t/**\n\t * Type guarded rendering\n\t *\n\t */\n\t_render( templateName:TomTemplateNames, data?:any ):HTMLElement{\n\t\tconst html = this.render(templateName, data);\n\n\t\tif( html == null ){\n\t\t\tthrow 'HTMLElement expected';\n\t\t}\n\t\treturn html;\n\t}\n\n\n\t/**\n\t * Clears the render cache for a template. If\n\t * no template is given, clears all render\n\t * caches.\n\t *\n\t */\n\tclearCache():void{\n\n\t\titerate(this.options, (option:TomOption)=>{\n\t\t\tif( option.$div ){\n\t\t\t\toption.$div.remove();\n\t\t\t\tdelete option.$div;\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Removes a value from item and option caches\n\t *\n\t */\n\tuncacheValue(value:string){\n\n\t\tconst option_el\t\t\t= this.getOption(value);\n\t\tif( option_el ) option_el.remove();\n\n\t}\n\n\t/**\n\t * Determines whether or not to display the\n\t * create item prompt, given a user input.\n\t *\n\t */\n\tcanCreate( input:string ):boolean {\n\t\treturn this.settings.create && (input.length > 0) && (this.settings.createFilter as TomCreateFilter ).call(this, input);\n\t}\n\n\n\t/**\n\t * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n\t *\n\t * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n\t *\n\t * });\n\t */\n\thook( when:string, method:string, new_fn:any ){\n\t\tvar self = this;\n\t\tvar orig_method = self[method];\n\n\n\t\tself[method] = function(){\n\t\t\tvar result, result_new;\n\n\t\t\tif( when === 'after' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\tresult_new = new_fn.apply(self, arguments );\n\n\t\t\tif( when === 'instead' ){\n\t\t\t\treturn result_new;\n\t\t\t}\n\n\t\t\tif( when === 'before' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t}\n\n};\n","/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\ntype TSettings = {\n\t[key:string]:any\n}\n\ntype TPlugins = {\n\tnames: string[],\n\tsettings: TSettings,\n\trequested: {[key:string]:boolean},\n\tloaded: {[key:string]:any}\n};\n\nexport type TPluginItem = {name:string,options:{}};\nexport type TPluginHash = {[key:string]:{}};\n\n\n\n\nexport default function MicroPlugin(Interface: any ){\n\n\tInterface.plugins = {};\n\n\treturn class extends Interface{\n\n\t\tpublic plugins:TPlugins = {\n\t\t\tnames : [],\n\t\t\tsettings : {},\n\t\t\trequested : {},\n\t\t\tloaded : {}\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tstatic define(name:string, fn:(this:any,settings:TSettings)=>any){\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn' : fn\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t * ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t * [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t * {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {array|object} plugins\n\t\t */\n\t\tinitializePlugins(plugins:string[]|TPluginItem[]|TPluginHash) {\n\t\t\tvar key, name;\n\t\t\tconst self = this;\n\t\t\tconst queue:string[] = [];\n\n\t\t\tif (Array.isArray(plugins)) {\n\t\t\t\tplugins.forEach((plugin:string|TPluginItem)=>{\n\t\t\t\t\tif (typeof plugin === 'string') {\n\t\t\t\t\t\tqueue.push(plugin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugin.name] = plugin.options;\n\t\t\t\t\t\tqueue.push(plugin.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile( name = queue.shift() ){\n\t\t\t\tself.require(name);\n\t\t\t}\n\t\t}\n\n\t\tloadPlugin(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' + name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t */\n\t\trequire(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t}\n\n\t};\n\n}\n","import TomSelect from './tom-select.ts';\n\nimport change_listener from './plugins/change_listener/plugin.ts';\nimport checkbox_options from './plugins/checkbox_options/plugin.ts';\nimport clear_button from './plugins/clear_button/plugin.ts';\nimport drag_drop from './plugins/drag_drop/plugin.ts';\nimport dropdown_header from './plugins/dropdown_header/plugin.ts';\nimport caret_position from './plugins/caret_position/plugin.ts';\nimport dropdown_input from './plugins/dropdown_input/plugin.ts';\nimport input_autogrow from './plugins/input_autogrow/plugin.ts';\nimport no_backspace_delete from './plugins/no_backspace_delete/plugin.ts';\nimport no_active_items from './plugins/no_active_items/plugin.ts';\nimport optgroup_columns from './plugins/optgroup_columns/plugin.ts';\nimport remove_button from './plugins/remove_button/plugin.ts';\nimport restore_on_backspace from './plugins/restore_on_backspace/plugin.ts';\nimport virtual_scroll from './plugins/virtual_scroll/plugin.ts';\n\nTomSelect.define('change_listener', change_listener);\nTomSelect.define('checkbox_options', checkbox_options);\nTomSelect.define('clear_button', clear_button);\nTomSelect.define('drag_drop', drag_drop);\nTomSelect.define('dropdown_header', dropdown_header);\nTomSelect.define('caret_position', caret_position);\nTomSelect.define('dropdown_input', dropdown_input);\nTomSelect.define('input_autogrow', input_autogrow);\nTomSelect.define('no_backspace_delete', no_backspace_delete);\nTomSelect.define('no_active_items', no_active_items);\nTomSelect.define('optgroup_columns', optgroup_columns);\nTomSelect.define('remove_button', remove_button);\nTomSelect.define('restore_on_backspace', restore_on_backspace);\nTomSelect.define('virtual_scroll', virtual_scroll);\n\nexport default TomSelect;\n","/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { addEvent } from '../../utils.ts';\n\nexport default function(this:TomSelect) {\n\taddEvent(this.input,'change',()=>{\n\t\tthis.sync();\n\t});\n};\n","/**\n * Plugin: \"checkbox_options\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { TomTemplate } from '../../types/index.ts';\nimport { preventDefault, hash_key } from '../../utils.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { CBOptions } from './types.ts';\n\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tvar self = this;\n\tvar orig_onOptionSelect = self.onOptionSelect;\n\n\tself.settings.hideSelected = false;\n\n\tconst cbOptions : CBOptions = Object.assign({\n\t\t// so that the user may add different ones as well\n\t\tclassName : \"tomselect-checkbox\",\n\n\t\t// the following default to the historic plugin's values\n\t\tcheckedClassNames : undefined,\n\t\tuncheckedClassNames : undefined,\n\t}, userOptions);\n\n\n\tvar UpdateChecked = function(checkbox:HTMLInputElement, toCheck : boolean) {\n\t\tif( toCheck ){\n\t\t\tcheckbox.checked = true;\n\t\t\tif (cbOptions.uncheckedClassNames) {\n\t\t\t\tcheckbox.classList.remove(...cbOptions.uncheckedClassNames);\n\t\t\t}\n\t\t\tif (cbOptions.checkedClassNames) {\n\t\t\t\tcheckbox.classList.add(...cbOptions.checkedClassNames);\n\t\t\t}\n\t\t}else{\n\t\t\tcheckbox.checked = false;\n\t\t\tif (cbOptions.checkedClassNames) {\n\t\t\t\tcheckbox.classList.remove(...cbOptions.checkedClassNames);\n\t\t\t}\n\t\t\tif (cbOptions.uncheckedClassNames) {\n\t\t\t\tcheckbox.classList.add(...cbOptions.uncheckedClassNames);\n\t\t\t}\n\t\t}\n\t}\n\n\t// update the checkbox for an option\n\tvar UpdateCheckbox = function(option:HTMLElement){\n\t\tsetTimeout(()=>{\n\t\t\tvar checkbox = option.querySelector('input.' + cbOptions.className);\n\t\t\tif( checkbox instanceof HTMLInputElement ){\n\t\t\t\tUpdateChecked(checkbox, option.classList.contains('selected'));\n\t\t\t}\n\t\t},1);\n\t};\n\n\t// add checkbox to option template\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_option = self.settings.render.option;\n\n\t\tself.settings.render.option = ((data, escape_html) => {\n\t\t\tvar rendered = getDom(orig_render_option.call(self, data, escape_html));\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tif (cbOptions.className) {\n\t\t\t\tcheckbox.classList.add(cbOptions.className);\n\t\t\t}\n\t\t\tcheckbox.addEventListener('click',function(evt){\n\t\t\t\tpreventDefault(evt);\n\t\t\t});\n\n\t\t\tcheckbox.type = 'checkbox';\n\t\t\tconst hashed = hash_key(data[self.settings.valueField]);\n\n\t\t\tUpdateChecked(checkbox, !!(hashed && self.items.indexOf(hashed) > -1) );\n\n\t\t\trendered.prepend(checkbox);\n\t\t\treturn rendered;\n\t\t}) satisfies TomTemplate;\n\t});\n\n\t// uncheck when item removed\n\tself.on('item_remove',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\toption.classList.remove('selected'); // selected class won't be removed yet\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\t// check when item added\n\tself.on('item_add',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\n\t// remove items when selected option is clicked\n\tself.hook('instead','onOptionSelect',( evt:KeyboardEvent, option:HTMLElement )=>{\n\n\t\tif( option.classList.contains('selected') ){\n\t\t\toption.classList.remove('selected')\n\t\t\tself.removeItem(option.dataset.value);\n\t\t\tself.refreshOptions();\n\t\t\tpreventDefault(evt,true);\n\t\t\treturn;\n }\n\n\t\torig_onOptionSelect.call(self, evt, option);\n\n\t\tUpdateCheckbox(option);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { CBOptions } from './types.ts';\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\tclassName: 'clear-button',\n\t\ttitle: 'Clear All',\n\t\thtml: (data:CBOptions) => {\n\t\t\treturn `<div class=\"${data.className}\" title=\"${data.title}\">⨯</div>`;\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar button = getDom(options.html(options));\n\t\tbutton.addEventListener('click',(evt)=>{\n\n\t\t\tif( self.isLocked ) return;\n\n\t\t\tself.clear();\n\n\t\t\tif( self.settings.mode === 'single' && self.settings.allowEmptyOption ){\n\t\t\t\tself.addItem('');\n\t\t\t}\n\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t});\n\t\tself.control.appendChild(button);\n\t});\n\n};\n","/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { TomOption, TomItem } from '../../types/index.ts';\nimport { escape_html, preventDefault, addEvent } from '../../utils.ts';\nimport { getDom, setAttr } from '../../vanilla.ts';\n\n\nconst insertAfter = (referenceNode:Element, newNode:Element) => {\n\treferenceNode.parentNode?.insertBefore(newNode, referenceNode.nextSibling);\n}\n\nconst insertBefore = (referenceNode:Element, newNode:Element) => {\n\treferenceNode.parentNode?.insertBefore(newNode, referenceNode);\n}\n\nconst isBefore = (referenceNode:Element|undefined|null, newNode:Element|undefined|null) =>{\n\t\n\tdo{\n\t\tnewNode = newNode?.previousElementSibling;\n\n\t\tif( referenceNode == newNode ){\n\t\t\treturn true;\n\t\t}\n\n\t}while( newNode && newNode.previousElementSibling );\n\n\treturn false;\n}\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tif (self.settings.mode !== 'multi') return;\n\n\tvar orig_lock\t\t= self.lock;\n\tvar orig_unlock\t\t= self.unlock;\n\tlet sortable = true;\n\t\tlet drag_item:TomItem|undefined;\n\n\n\t/**\n\t * Add draggable attribute to item\n\t */\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\t\t\tconst item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\t\t\tsetAttr(item,{'draggable':'true'});\n\n\n\t\t\t// prevent doc_mousedown (see tom-select.ts)\n\t\t\tconst mousedown = (evt:Event) => {\n\t\t\t\tif( !sortable ) preventDefault(evt);\n\t\t\t\tevt.stopPropagation();\n\t\t\t}\n\n\t\t\tconst dragStart = (evt:Event) => {\n\t\t\t\tdrag_item = item;\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\titem.classList.add('ts-dragging');\n\t\t\t\t}, 0);\n\t\t\t\t\n\t\t\t}\n\n\t\t\tconst dragOver = (evt:Event) =>{\n\t\t\t\tevt.preventDefault();\n\t\t\t\titem.classList.add('ts-drag-over');\n\t\t\t\tmoveitem(item,drag_item);\n\t\t\t}\n\n\t\t\tconst dragLeave = () => {\n\t\t\t\titem.classList.remove('ts-drag-over');\n\t\t\t}\n\n\t\t\tconst moveitem = (targetitem:TomItem, dragitem:TomItem|undefined) => {\n\t\t\t\tif( dragitem === undefined ) return;\n\t\t\t\t\n\t\t\t\tif( isBefore(dragitem,item) ){\n\t\t\t\t\tinsertAfter(targetitem,dragitem);\n\t\t\t\t}else{\n\t\t\t\t\tinsertBefore(targetitem,dragitem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst dragend = () => {\n\t\t\t\tdocument.querySelectorAll('.ts-drag-over').forEach(el=> el.classList.remove('ts-drag-over'));\n\t\t\t\tdrag_item?.classList.remove('ts-dragging');\n\t\t\t\tdrag_item = undefined;\n\n\t\t\t\tvar values:string[] = [];\n\t\t\t\tself.control.querySelectorAll(`[data-value]`).forEach((el:Element)=> {\n\t\t\t\t\tif( (<HTMLOptionElement>el).dataset.value ){\n\t\t\t\t\t\tlet value = (<HTMLOptionElement>el).dataset.value;\n\t\t\t\t\t\tif( value ){\n\t\t\t\t\t\t\tvalues.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tself.setValue(values);\n\t\t\t}\t\n\n\n\t\t\taddEvent(item,'mousedown', mousedown);\n\t\t\taddEvent(item,'dragstart', dragStart);\n\t\t\taddEvent(item,'dragenter', dragOver)\n\t\t\taddEvent(item,'dragover', dragOver);\n\t\t\taddEvent(item,'dragleave', dragLeave);\n\t\t\taddEvent(item,'dragend', dragend);\n\t\t\t\t\n\t\t\treturn item;\n\t\t}\t\n\t});\n\n\n\n\tself.hook('instead','lock',()=>{\n\t\tsortable = false;\n\t\treturn orig_lock.call(self);\n\t});\n\n\tself.hook('instead','unlock',()=>{\n\t\tsortable = true;\n\t\treturn orig_unlock.call(self);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { preventDefault } from '../../utils.ts';\nimport { DHOptions } from './types.ts';\n\nexport default function(this:TomSelect, userOptions:DHOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttitle : 'Untitled',\n\t\theaderClass : 'dropdown-header',\n\t\ttitleRowClass : 'dropdown-header-title',\n\t\tlabelClass : 'dropdown-header-label',\n\t\tcloseClass : 'dropdown-header-close',\n\n\t\thtml: (data:DHOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t'<a class=\"' + data.closeClass + '\">×</a>' +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar header = getDom(options.html(options));\n\n\t\tvar close_link = header.querySelector('.'+options.closeClass);\n\t\tif( close_link ){\n\t\t\tclose_link.addEventListener('click',(evt)=>{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\tself.close();\n\t\t\t});\n\t\t}\n\n\t\tself.dropdown.insertBefore(header, self.dropdown.firstChild);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { nodeIndex, removeClasses } from '../../vanilla.ts';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport * as constants from '../../constants.ts';\nimport { getDom, addClasses } from '../../vanilla.ts';\nimport { addEvent, preventDefault } from '../../utils.ts';\n\n\nexport default function(this:TomSelect) {\n\tconst self = this;\n\n\tself.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n\tself.hook('before','setup',()=>{\n\t\tself.focus_node\t\t= self.control;\n\n\t\taddClasses( self.control_input, 'dropdown-input');\n\n\t \tconst div = getDom('<div class=\"dropdown-input-wrap\">');\n\t\tdiv.append(self.control_input);\n\t\tself.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n\t\t// set a placeholder in the select control\n\t\tconst placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />') as HTMLInputElement;\n\t\tplaceholder.placeholder = self.settings.placeholder ||'';\n\t\tself.control.append(placeholder);\n\n\t});\n\n\n\tself.on('initialize',()=>{\n\n\t\t// set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n\t\tself.control_input.addEventListener('keydown',(evt:KeyboardEvent) =>{\n\t\t//addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n\t\t\tswitch( evt.keyCode ){\n\t\t\t\tcase constants.KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\tpreventDefault(evt,true);\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\t\t\t\tcase constants.KEY_TAB:\n\t\t\t\t\tself.focus_node.tabIndex = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn self.onKeyDown.call(self,evt);\n\t\t});\n\n\t\tself.on('blur',()=>{\n\t\t\tself.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n\t\t});\n\n\n\t\t// give the control_input focus when the dropdown is open\n\t\tself.on('dropdown_open',() =>{\n\t\t\tself.control_input.focus();\n\t\t});\n\n\t\t// prevent onBlur from closing when focus is on the control_input\n\t\tconst orig_onBlur = self.onBlur;\n\t\tself.hook('instead','onBlur',(evt?:FocusEvent)=>{\n\t\t\tif( evt && evt.relatedTarget == self.control_input ) return;\n\t\t\treturn orig_onBlur.call(self);\n\t\t});\n\n\t\taddEvent(self.control_input,'blur', () => self.onBlur() );\n\n\t\t// return focus to control to allow further keyboard input\n\t\tself.hook('before','close',() =>{\n\n\t\t\tif( !self.isOpen ) return;\n\t\t\tself.focus_node.focus({preventScroll: true});\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { addEvent } from '../../utils.ts';\n\nexport default function(this:TomSelect) {\n\tvar self\t\t\t\t\t= this;\n\n\tself.on('initialize',()=>{\n\n\n\t\tvar test_input\t\t\t\t= document.createElement('span');\n\t\tvar control\t\t\t\t\t= self.control_input;\n\t\ttest_input.style.cssText\t= 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n\n\t\tself.wrapper.appendChild(test_input);\n\n\n\t\tvar transfer_styles\t\t\t= [ 'letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform' ];\n\n\t\tfor( const style_name of transfer_styles ){\n\t\t\t// @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n\t\t\ttest_input.style[style_name] = control.style[style_name];\n\t\t}\n\n\n\t\t/**\n\t\t * Set the control width\n\t\t *\n\t\t */\n\t\tvar resize = ()=>{\n\t\t\ttest_input.textContent\t= control.value;\n\t\t\tcontrol.style.width\t\t= test_input.clientWidth+'px';\n\t\t};\n\n\t\tresize();\n\t\tself.on('update item_add item_remove',resize);\n\t\taddEvent(control,'input', resize );\n\t\taddEvent(control,'keyup', resize );\n\t\taddEvent(control,'blur', resize );\n\t\taddEvent(control,'update', resize );\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_deleteSelection = self.deleteSelection;\n\n\tthis.hook('instead','deleteSelection',(evt:KeyboardEvent) => {\n\n\t\tif( self.activeItems.length ){\n\t\t\treturn orig_deleteSelection.call(self, evt);\n\t\t}\n\n\t\treturn false;\n\t});\n\n};\n","/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\n\nexport default function(this:TomSelect) {\n\tthis.hook('instead','setActiveItem',() => {});\n\tthis.hook('instead','selectAll',() => {});\n};\n","/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport * as constants from '../../constants.ts';\nimport { parentMatch, nodeIndex } from '../../vanilla.ts';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\tvar orig_keydown = self.onKeyDown;\n\n\tself.hook('instead','onKeyDown',(evt:KeyboardEvent)=>{\n\t\tvar index, option, options, optgroup;\n\n\t\tif( !self.isOpen || !(evt.keyCode === constants.KEY_LEFT || evt.keyCode === constants.KEY_RIGHT)) {\n\t\t\treturn orig_keydown.call(self,evt);\n\t\t}\n\n\t\tself.ignoreHover\t= true;\n\t\toptgroup\t\t\t= parentMatch(self.activeOption,'[data-group]');\n\t\tindex\t\t\t\t= nodeIndex(self.activeOption,'[data-selectable]');\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( evt.keyCode === constants.KEY_LEFT ){\n\t\t\toptgroup = optgroup.previousSibling;\n\t\t} else {\n\t\t\toptgroup = optgroup.nextSibling;\n\t\t}\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\toptions\t\t\t\t= (<HTMLOptGroupElement>optgroup).querySelectorAll('[data-selectable]');\n\t\toption\t\t\t\t= options[ Math.min(options.length - 1, index) ] as HTMLElement;\n\n\t\tif( option ){\n\t\t\tself.setActiveOption(option);\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { escape_html, preventDefault, addEvent } from '../../utils.ts';\nimport { TomOption, TomItem } from '../../types/index.ts';\nimport { RBOptions } from './types.ts';\n\nexport default function(this:TomSelect, userOptions:RBOptions) {\n\n\tconst options = Object.assign({\n\t\t\tlabel : '×',\n\t\t\ttitle : 'Remove',\n\t\t\tclassName : 'remove',\n\t\t\tappend : true\n\t\t}, userOptions);\n\n\n\t//options.className = 'remove-single';\n\tvar self\t\t\t= this;\n\n\t// override the render method to add remove button to each item\n\tif( !options.append ){\n\t\treturn;\n\t}\n\n\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\n\t\t\tvar item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\n\t\t\tvar close_button = getDom(html);\n\t\t\titem.appendChild(close_button);\n\n\t\t\taddEvent(close_button,'mousedown',(evt) => {\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t});\n\n\t\t\taddEvent(close_button,'click',(evt) => {\n\n\t\t\t\tif( self.isLocked ) return;\n\n\t\t\t\t// propagating will trigger the dropdown to show for single mode\n\t\t\t\tpreventDefault(evt,true);\n\n\t\t\t\tif( self.isLocked ) return;\n\t\t\t\tif( !self.shouldDelete([item],evt as MouseEvent) ) return;\n\n\t\t\t\tself.removeItem(item);\n\t\t\t\tself.refreshOptions(false);\n\t\t\t\tself.inputState();\n\t\t\t});\n\n\t\t\treturn item;\n\t\t};\n\n\t});\n\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nimport type TomSelect from '../../tom-select.ts';\nimport { TomOption } from '../../types/index.ts';\n\ntype TPluginOptions = {\n\ttext?:(option:TomOption)=>string,\n};\n\nexport default function(this:TomSelect, userOptions:TPluginOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttext: (option:TomOption) => {\n\t\t\treturn option[self.settings.labelField];\n\t\t}\n\t},userOptions);\n\n\tself.on('item_remove',function(value:string){\n\t\tif( !self.isFocused ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.control_input.value.trim() === '' ){\n\t\t\tvar option = self.options[value];\n\t\t\tif( option ){\n\t\t\t\tself.setTextboxValue(options.text.call(self, option));\n\t\t\t}\n\t\t}\n\t});\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the 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 of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { TomOption } from '../../types/index.ts';\nimport { addClasses } from '../../vanilla.ts';\n\nexport default function(this:TomSelect) {\n\tconst self\t\t\t\t\t\t\t= this;\n\tconst orig_canLoad\t\t\t\t\t= self.canLoad;\n\tconst orig_clearActiveOption\t\t= self.clearActiveOption;\n\tconst orig_loadCallback\t\t\t\t= self.loadCallback;\n\n\tvar pagination:{[key:string]:any}\t= {};\n\tvar dropdown_content:HTMLElement;\n\tvar loading_more\t\t\t\t\t= false;\n\tvar load_more_opt:HTMLElement;\n\tvar default_values: string[]\t\t= [];\n\n\tif( !self.settings.shouldLoadMore ){\n\n\t\t// return true if additional results should be loaded\n\t\tself.settings.shouldLoadMore = ():boolean=>{\n\n\t\t\tconst scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\t\t\tif( scroll_percent > 0.9 ){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif( self.activeOption ){\n\t\t\t\tvar selectable\t= self.selectable();\n\t\t\t\tvar index\t\t= Array.from(selectable).indexOf(self.activeOption);\n\t\t\t\tif( index >= (selectable.length-2) ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\tif( !self.settings.firstUrl ){\n\t\tthrow 'virtual_scroll plugin requires a firstUrl() method';\n\t}\n\n\n\t// in order for virtual scrolling to work,\n\t// options need to be ordered the same way they're returned from the remote data source\n\tself.settings.sortField\t\t\t= [{field:'$order'},{field:'$score'}];\n\n\n\t// can we load more results for given query?\n\tconst canLoadMore = (query:string):boolean => {\n\n\t\tif( typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions ){\n\t\t\treturn false;\n\t\t}\n\n\t\tif( (query in pagination) && pagination[query] ){\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tconst clearFilter = (option:TomOption, value:string):boolean => {\n\t\tif( self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\n\t// set the next url that will be\n\tself.setNextUrl = (value:string,next_url:any):void => {\n\t\tpagination[value] = next_url;\n\t};\n\n\t// getUrl() to be used in settings.load()\n\tself.getUrl = (query:string):any =>{\n\n\t\tif( query in pagination ){\n\t\t\tconst next_url = pagination[query];\n\t\t\tpagination[query] = false;\n\t\t\treturn next_url;\n\t\t}\n\n\t\t// if the user goes back to a previous query\n\t\t// we need to load the first page again\n\t\tself.clearPagination();\n\n\t\treturn self.settings.firstUrl.call(self,query);\n\t};\n\n\t// clear pagination\n\tself.clearPagination = ():void =>{\n\t\tpagination = {};\n\t};\n\n\t// don't clear the active option (and cause unwanted dropdown scroll)\n\t// while loading more results\n\tself.hook('instead','clearActiveOption',()=>{\n\n\t\tif( loading_more ){\n\t\t\treturn;\n\t\t}\n\n\t\treturn orig_clearActiveOption.call(self);\n\t});\n\n\t// override the canLoad method\n\tself.hook('instead','canLoad',(query:string)=>{\n\n\t\t// first time the query has been seen\n\t\tif( !(query in pagination) ){\n\t\t\treturn orig_canLoad.call(self,query);\n\t\t}\n\n\t\treturn canLoadMore(query);\n\t});\n\n\n\t// wrap the load\n\tself.hook('instead','loadCallback',( options:TomOption[], optgroups:TomOption[])=>{\n\n\t\tif( !loading_more ){\n\t\t\tself.clearOptions(clearFilter);\n\t\t}else if( load_more_opt ){\n\t\t\tconst first_option = options[0];\n\t\t\tif( first_option !== undefined ){\n\t\t\t\tload_more_opt.dataset.value\t\t= first_option[self.settings.valueField];\n\t\t\t}\n\t\t}\n\n\t\torig_loadCallback.call( self, options, optgroups);\n\n\t\tloading_more = false;\n\t});\n\n\n\t// add templates to dropdown\n\t//\tloading_more if we have another url in the queue\n\t//\tno_more_results if we don't have another url in the queue\n\tself.hook('after','refreshOptions',()=>{\n\n\t\tconst query\t\t= self.lastValue;\n\t\tvar option;\n\n\t\tif( canLoadMore(query) ){\n\n\t\t\toption = self.render('loading_more',{query:query});\n\t\t\tif( option ){\n\t\t\t\toption.setAttribute('data-selectable',''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\t\t\t\tload_more_opt = option;\n\t\t\t}\n\n\t\t}else if( (query in pagination) && !dropdown_content.querySelector('.no-results') ){\n\t\t\toption = self.render('no_more_results',{query:query});\n\t\t}\n\n\t\tif( option ){\n\t\t\taddClasses(option,self.settings.optionClass);\n\t\t\tdropdown_content.append( option );\n\t\t}\n\n\t});\n\n\n\t// add scroll listener and default templates\n\tself.on('initialize',()=>{\n\t\tdefault_values = Object.keys(self.options);\n\t\tdropdown_content = self.dropdown_content;\n\n\t\t// default templates\n\t\tself.settings.render = Object.assign({}, {\n\t\t\tloading_more:() => {\n\t\t\t\treturn `<div class=\"loading-more-results\">Loading more results ... </div>`;\n\t\t\t},\n\t\t\tno_more_results:() =>{\n\t\t\t\treturn `<div class=\"no-more-results\">No more results</div>`;\n\t\t\t}\n\t\t},self.settings.render);\n\n\n\t\t// watch dropdown content scroll position\n\t\tdropdown_content.addEventListener('scroll',()=>{\n\n\t\t\tif( !self.settings.shouldLoadMore.call(self) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\t\t\tif( !canLoadMore(self.lastValue) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// don't call load() too much\n\t\t\tif( loading_more ) return;\n\n\n\t\t\tloading_more = true;\n\t\t\tself.load.call(self,self.lastValue);\n\t\t});\n\t});\n\n};\n"],"names":["forEvents","events","callback","split","forEach","event","MicroEvent","constructor","this","_events","on","fct","event_array","push","off","n","arguments","length","undefined","splice","indexOf","trigger","args","self","apply","arrayToPattern","chars","filter","Boolean","maxValueLength","join","sequencePattern","array","hasDuplicates","pattern","prev_char_count","prev_pattern","char","i","setToPattern","Array","from","Set","size","escape_regex","str","replace","reduce","longest","value","Math","max","unicodeLength","allSubstrings","input","result","start","substring","subresult","tmp","slice","charAt","unshift","code_points","unicode_map","multi_char_reg","latin_convert","latin_condensed","a","aa","ae","ao","au","av","ay","b","c","d","e","f","g","h","j","k","l","m","o","oe","oi","oo","ou","p","q","r","s","t","th","tz","u","v","vy","w","y","z","hv","latin","unicode","convert_pat","RegExp","Object","keys","normalize","form","asciifold","_asciifold","toLowerCase","generateSets","unicode_sets","addMatching","folded","to_add","folded_set","patt","match","add","code_point_min","code_point_max","composed","String","fromCharCode","code_point","generator","generateMap","multi_char","set","sort","multi_char_patt","substringsToPattern","min_replacement","map","sub_pat","strings","chars_replaced","mapSequence","sequencesToPattern","sequences","all","sequence","seq","len","substrs","inSequences","needle_seq","end","needle_parts","parts","part","needle_part","substr","Sequence","min","last","clone","position","last_piece","JSON","parse","stringify","last_part","pop","last_substr","clone_last_len","getPattern","match_str","overlapping","added_types","has","new_seq","old_seq","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","token","weight","score","pos","regex","search","string","propToArray","key","isArray","iterate","object","hasOwnProperty","cmp","Sifter","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","implicit_score","sort_flds","sort_empty","bind","get_field","id","fld","direction","sort_fld","optsUser","assign","trim","total","fn_score","item","_","fn_sort","limit","hash_key","get_hash","escape_html","loadDebounce","fn","delay","timeout","loading","clearTimeout","setTimeout","loadedSearches","call","debounce_events","types","type","event_args","preventDefault","evt","stop","stopPropagation","addEvent","target","addEventListener","isKeyDown","key_name","altKey","ctrlKey","shiftKey","metaKey","getId","el","existing_id","getAttribute","setAttribute","addSlashes","append","parent","node","getDom","jquery","HTMLElement","isHtmlString","tpl","document","createElement","innerHTML","content","firstChild","querySelector","arg","triggerEvent","dom_el","event_name","createEvent","initEvent","dispatchEvent","applyCSS","css","style","addClasses","elmts","classes","norm_classes","classesArray","castAsArray","cls","classList","removeClasses","remove","_classes","concat","parentMatch","selector","wrapper","contains","matches","parentNode","getTail","list","nodeIndex","amongst","nodeName","previousElementSibling","setAttr","attrs","val","attr","removeAttribute","replaceNode","existing","replacement","replaceChild","highlight","element","highlightRecursive","nodeType","spannode","className","middlebit","splitText","index","middleclone","cloneNode","appendChild","highlightText","childNodes","test","tagName","highlightChildren","KEY_SHORTCUT","navigator","userAgent","defaults","optgroups","plugins","delimiter","splitOn","persist","create","createOnBlur","createFilter","openOnFocus","shouldOpen","maxOptions","maxItems","hideSelected","duplicates","addPrecedence","selectOnTab","preload","allowEmptyOption","refreshThrottle","loadThrottle","loadingClass","dataAttr","optgroupField","valueField","labelField","disabledField","optgroupLabelField","optgroupValueField","lockOptgroupOrder","sortField","searchField","searchConjunction","mode","wrapperClass","controlClass","dropdownClass","dropdownContentClass","itemClass","optionClass","dropdownParent","controlInput","copyClassesToDropdown","placeholder","hidePlaceholder","shouldLoad","render","getSettings","settings_user","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","option","textContent","settings_element","init_select","optionsMap","group_count","$order","readData","dataset","json","addOption","group","arr","option_data","disabled","$option","selected","hasAttribute","children","child","optgroup","optgroup_data","init_textbox","data_raw","opt","values","instance_i","TomSelect","Interface","super","requested","loaded","define","initializePlugins","queue","plugin","require","loadPlugin","Error","MicroPlugin","input_arg","user_settings","dir","order","isOpen","isDisabled","isReadOnly","isInvalid","isValid","isLocked","isFocused","isInputHidden","isSetup","ignoreFocus","ignoreHover","hasOptions","lastValue","caretPos","activeOption","activeItems","userOptions","refreshTimeout","tomselect","window","getComputedStyle","getPropertyValue","tabIndex","is_select_tag","rtl","inputId","isRequired","required","sifter","setupCallbacks","setupTemplates","control","dropdown","_render","dropdown_content","inputMode","control_input","focus_node","setup","passive_event","passive","listboxId","role","control_id","escapeQuery","label","label_click","focus","for","label_id","width","classes_plugins","multiple","load","target_match","onOptionHover","capture","onOptionSelect","onItemSelect","onClick","onKeyDown","onKeyPress","onInput","onBlur","onFocus","onPaste","doc_mousedown","composedPath","blur","inputState","win_scroll","positionDropdown","_destroy","removeEventListener","revertSettings","insertAdjacentElement","sync","refreshState","updateOriginalInput","refreshItems","close","disable","readOnly","setReadOnly","enable","onChange","setupOptions","addOptions","registerOptionGroup","templates","optgroup_header","escape","option_create","no_results","not_loading","callbacks","initialize","change","item_add","item_remove","item_select","clear","option_add","option_remove","option_clear","optgroup_add","optgroup_remove","optgroup_clear","dropdown_open","dropdown_close","get_settings","setValue","lastQuery","clearActiveItems","onMouseDown","pastedText","inputValue","splitInput","piece","addItem","createItem","character","keyCode","which","constants","selectAll","open","next","getAdjacent","setActiveOption","prev","canSelect","activeElement","advanceSelection","deleteSelection","_onInput","refreshOptions","wasFocused","hasFocus","deactivate","setActiveItem","setCaret","parentElement","closeAfterSelect","canLoad","loadCallback","clearActiveOption","setTextboxValue","getValue","silent","addItems","setMaxItems","eventName","begin","swap","getLastActive","prototype","setActiveItemClass","removeActiveItem","last_active","idx","scroll","scrollToOption","behavior","height_menu","clientHeight","scrollTop","height_item","offsetHeight","getBoundingClientRect","top","scrollBehavior","controlChildren","toggle","offsetWidth","getSearchOptions","nesting","calculateScore","currentResults","hashed","triggerDropdown","html","has_create_option","active_group","groups","groups_order","same_query","results","active_option","show_dropdown","closest","getGroupFragment","group_order_i","order_group","fragment","group_fragment","createDocumentFragment","opt_value","opt_hash","option_el","getOption","includes","self_optgroup","$id","toString","elements","group_order","group_heading","group_options","header","group_html","querySelectorAll","tok","add_template","template","insertBefore","canCreate","active_index","selectable","user_created","dat","registerOption","addOptionGroup","hashed_id","removeOptionGroup","clearCache","clearOptionGroups","updateOption","item_new","index_item","value_old","value_new","data_old","getItem","uncacheValue","option_new","removeOption","removeItem","clearOptions","boundFilter","clearFilter","$div","last_item","x","isPending","wasFull","isFull","insertAtCaret","output","caret","lock","created","unlock","refreshValidityState","wrap_classList","validity","valid","opts","empty_option","has_selected","AddSelected","visibility","display","context","rect","scrollY","left","scrollX","selection","tail","selectionStart","selectionEnd","rm_items","rm_item","shouldDelete","onDelete","adjacent","nextElementSibling","moveCaret","new_pos","setLocked","setDisabled","destroy","templateName","hook","when","method","new_fn","orig_method","result_new","orig_onOptionSelect","cbOptions","checkedClassNames","uncheckedClassNames","UpdateChecked","checkbox","toCheck","checked","UpdateCheckbox","HTMLInputElement","orig_render_option","rendered","prepend","title","button","orig_lock","orig_unlock","drag_item","sortable","orig_render_item","draggable","dragOver","moveitem","targetitem","dragitem","insertAfter","referenceNode","newNode","_referenceNode$parent","isBefore","_newNode","nextSibling","_referenceNode$parent2","dragLeave","dragend","_drag_item","headerClass","titleRowClass","labelClass","closeClass","close_link","div","orig_onBlur","relatedTarget","preventScroll","test_input","cssText","style_name","resize","clientWidth","orig_deleteSelection","orig_keydown","previousSibling","close_button","text","orig_canLoad","orig_clearActiveOption","orig_loadCallback","load_more_opt","pagination","loading_more","default_values","shouldLoadMore","scrollHeight","firstUrl","canLoadMore","setNextUrl","next_url","getUrl","clearPagination","first_option","no_more_results"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5]}
|