ace.define(
	'ace/ext/searchbox',
	[
		'require',
		'exports',
		'module',
		'ace/lib/dom',
		'ace/lib/lang',
		'ace/lib/event',
		'ace/keyboard/hash_handler',
		'ace/lib/keys',
	],
	function (e, t, n) {
		'use strict'
		var r = e('../lib/dom'),
			i = e('../lib/lang'),
			s = e('../lib/event'),
			o =
				'.ace_search {background-color: #ddd;color: #666;border: 1px solid #cbcbcb;border-top: 0 none;overflow: hidden;margin: 0;padding: 4px 6px 0 4px;position: absolute;top: 0;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {margin: 0 20px 4px 0;overflow: hidden;line-height: 1.9;}.ace_replace_form {margin-right: 0;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {border-radius: 3px 0 0 3px;background-color: white;color: black;border: 1px solid #cbcbcb;border-right: 0 none;outline: 0;padding: 0;font-size: inherit;margin: 0;line-height: inherit;padding: 0 6px;min-width: 17em;vertical-align: top;min-height: 1.8em;box-sizing: content-box;}.ace_searchbtn {border: 1px solid #cbcbcb;line-height: inherit;display: inline-block;padding: 0 6px;background: #fff;border-right: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;margin: 0;position: relative;color: #666;}.ace_searchbtn:last-child {border-radius: 0 3px 3px 0;border-right: 1px solid #cbcbcb;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn:hover {background-color: #eef1f6;}.ace_searchbtn.prev, .ace_searchbtn.next {padding: 0px 0.7em}.ace_searchbtn.prev:after, .ace_searchbtn.next:after {content: "";border: solid 2px #888;width: 0.5em;height: 0.5em;border-width:  2px 0 0 2px;display:inline-block;transform: rotate(-45deg);}.ace_searchbtn.next:after {border-width: 0 2px 2px 0 ;}.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;font: 16px/16px Arial;padding: 0;height: 14px;width: 14px;top: 9px;right: 7px;position: absolute;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;box-sizing:    border-box!important;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;clear: both;}.ace_search_counter {float: left;font-family: arial;padding: 0 8px;}',
			u = e('../keyboard/hash_handler').HashHandler,
			a = e('../lib/keys'),
			f = 999
		r.importCssString(o, 'ace_searchbox')
		var l = function (e, t, n) {
			var i = r.createElement('div')
			r.buildDom(
				[
					'div',
					{ class: 'ace_search right' },
					['span', { action: 'hide', class: 'ace_searchbtn_close' }],
					[
						'div',
						{ class: 'ace_search_form' },
						[
							'input',
							{ class: 'ace_search_field', placeholder: 'Search for', spellcheck: 'false' },
						],
						['span', { action: 'findPrev', class: 'ace_searchbtn prev' }, '\u200b'],
						['span', { action: 'findNext', class: 'ace_searchbtn next' }, '\u200b'],
						['span', { action: 'findAll', class: 'ace_searchbtn', title: 'Alt-Enter' }, 'All'],
					],
					[
						'div',
						{ class: 'ace_replace_form' },
						[
							'input',
							{ class: 'ace_search_field', placeholder: 'Replace with', spellcheck: 'false' },
						],
						['span', { action: 'replaceAndFindNext', class: 'ace_searchbtn' }, 'Replace'],
						['span', { action: 'replaceAll', class: 'ace_searchbtn' }, 'All'],
					],
					[
						'div',
						{ class: 'ace_search_options' },
						[
							'span',
							{
								action: 'toggleReplace',
								class: 'ace_button',
								title: 'Toggle Replace mode',
								style: 'float:left;margin-top:-2px;padding:0 5px;',
							},
							'+',
						],
						['span', { class: 'ace_search_counter' }],
						[
							'span',
							{ action: 'toggleRegexpMode', class: 'ace_button', title: 'RegExp Search' },
							'.*',
						],
						[
							'span',
							{ action: 'toggleCaseSensitive', class: 'ace_button', title: 'CaseSensitive Search' },
							'Aa',
						],
						[
							'span',
							{ action: 'toggleWholeWords', class: 'ace_button', title: 'Whole Word Search' },
							'\\b',
						],
						[
							'span',
							{ action: 'searchInSelection', class: 'ace_button', title: 'Search In Selection' },
							'S',
						],
					],
				],
				i
			),
				(this.element = i.firstChild),
				(this.setSession = this.setSession.bind(this)),
				this.$init(),
				this.setEditor(e),
				r.importCssString(o, 'ace_searchbox', e.container)
		}
		;(function () {
			;(this.setEditor = function (e) {
				;(e.searchBox = this), e.renderer.scroller.appendChild(this.element), (this.editor = e)
			}),
				(this.setSession = function (e) {
					;(this.searchRange = null), this.$syncOptions(!0)
				}),
				(this.$initElements = function (e) {
					;(this.searchBox = e.querySelector('.ace_search_form')),
						(this.replaceBox = e.querySelector('.ace_replace_form')),
						(this.searchOption = e.querySelector('[action=searchInSelection]')),
						(this.replaceOption = e.querySelector('[action=toggleReplace]')),
						(this.regExpOption = e.querySelector('[action=toggleRegexpMode]')),
						(this.caseSensitiveOption = e.querySelector('[action=toggleCaseSensitive]')),
						(this.wholeWordOption = e.querySelector('[action=toggleWholeWords]')),
						(this.searchInput = this.searchBox.querySelector('.ace_search_field')),
						(this.replaceInput = this.replaceBox.querySelector('.ace_search_field')),
						(this.searchCounter = e.querySelector('.ace_search_counter'))
				}),
				(this.$init = function () {
					var e = this.element
					this.$initElements(e)
					var t = this
					s.addListener(e, 'mousedown', function (e) {
						setTimeout(function () {
							t.activeInput.focus()
						}, 0),
							s.stopPropagation(e)
					}),
						s.addListener(e, 'click', function (e) {
							var n = e.target || e.srcElement,
								r = n.getAttribute('action')
							r && t[r] ? t[r]() : t.$searchBarKb.commands[r] && t.$searchBarKb.commands[r].exec(t),
								s.stopPropagation(e)
						}),
						s.addCommandKeyListener(e, function (e, n, r) {
							var i = a.keyCodeToString(r),
								o = t.$searchBarKb.findKeyCommand(n, i)
							o && o.exec && (o.exec(t), s.stopEvent(e))
						}),
						(this.$onChange = i.delayedCall(function () {
							t.find(!1, !1)
						})),
						s.addListener(this.searchInput, 'input', function () {
							t.$onChange.schedule(20)
						}),
						s.addListener(this.searchInput, 'focus', function () {
							;(t.activeInput = t.searchInput), t.searchInput.value && t.highlight()
						}),
						s.addListener(this.replaceInput, 'focus', function () {
							;(t.activeInput = t.replaceInput), t.searchInput.value && t.highlight()
						})
				}),
				(this.$closeSearchBarKb = new u([
					{
						bindKey: 'Esc',
						name: 'closeSearchBar',
						exec: function (e) {
							e.searchBox.hide()
						},
					},
				])),
				(this.$searchBarKb = new u()),
				this.$searchBarKb.bindKeys({
					'Ctrl-f|Command-f': function (e) {
						var t = (e.isReplace = !e.isReplace)
						;(e.replaceBox.style.display = t ? '' : 'none'),
							(e.replaceOption.checked = !1),
							e.$syncOptions(),
							e.searchInput.focus()
					},
					'Ctrl-H|Command-Option-F': function (e) {
						if (e.editor.getReadOnly()) return
						;(e.replaceOption.checked = !0), e.$syncOptions(), e.replaceInput.focus()
					},
					'Ctrl-G|Command-G': function (e) {
						e.findNext()
					},
					'Ctrl-Shift-G|Command-Shift-G': function (e) {
						e.findPrev()
					},
					esc: function (e) {
						setTimeout(function () {
							e.hide()
						})
					},
					Return: function (e) {
						e.activeInput == e.replaceInput && e.replace(), e.findNext()
					},
					'Shift-Return': function (e) {
						e.activeInput == e.replaceInput && e.replace(), e.findPrev()
					},
					'Alt-Return': function (e) {
						e.activeInput == e.replaceInput && e.replaceAll(), e.findAll()
					},
					Tab: function (e) {
						;(e.activeInput == e.replaceInput ? e.searchInput : e.replaceInput).focus()
					},
				}),
				this.$searchBarKb.addCommands([
					{
						name: 'toggleRegexpMode',
						bindKey: { win: 'Alt-R|Alt-/', mac: 'Ctrl-Alt-R|Ctrl-Alt-/' },
						exec: function (e) {
							;(e.regExpOption.checked = !e.regExpOption.checked), e.$syncOptions()
						},
					},
					{
						name: 'toggleCaseSensitive',
						bindKey: { win: 'Alt-C|Alt-I', mac: 'Ctrl-Alt-R|Ctrl-Alt-I' },
						exec: function (e) {
							;(e.caseSensitiveOption.checked = !e.caseSensitiveOption.checked), e.$syncOptions()
						},
					},
					{
						name: 'toggleWholeWords',
						bindKey: { win: 'Alt-B|Alt-W', mac: 'Ctrl-Alt-B|Ctrl-Alt-W' },
						exec: function (e) {
							;(e.wholeWordOption.checked = !e.wholeWordOption.checked), e.$syncOptions()
						},
					},
					{
						name: 'toggleReplace',
						exec: function (e) {
							;(e.replaceOption.checked = !e.replaceOption.checked), e.$syncOptions()
						},
					},
					{
						name: 'searchInSelection',
						exec: function (e) {
							;(e.searchOption.checked = !e.searchRange),
								e.setSearchRange(e.searchOption.checked && e.editor.getSelectionRange()),
								e.$syncOptions()
						},
					},
				]),
				(this.setSearchRange = function (e) {
					;(this.searchRange = e),
						e
							? (this.searchRangeMarker = this.editor.session.addMarker(e, 'ace_active-line'))
							: this.searchRangeMarker &&
							  (this.editor.session.removeMarker(this.searchRangeMarker),
							  (this.searchRangeMarker = null))
				}),
				(this.$syncOptions = function (e) {
					r.setCssClass(this.replaceOption, 'checked', this.searchRange),
						r.setCssClass(this.searchOption, 'checked', this.searchOption.checked),
						(this.replaceOption.textContent = this.replaceOption.checked ? '-' : '+'),
						r.setCssClass(this.regExpOption, 'checked', this.regExpOption.checked),
						r.setCssClass(this.wholeWordOption, 'checked', this.wholeWordOption.checked),
						r.setCssClass(this.caseSensitiveOption, 'checked', this.caseSensitiveOption.checked)
					var t = this.editor.getReadOnly()
					;(this.replaceOption.style.display = t ? 'none' : ''),
						(this.replaceBox.style.display = this.replaceOption.checked && !t ? '' : 'none'),
						this.find(!1, !1, e)
				}),
				(this.highlight = function (e) {
					this.editor.session.highlight(e || this.editor.$search.$options.re),
						this.editor.renderer.updateBackMarkers()
				}),
				(this.find = function (e, t, n) {
					var i = this.editor.find(this.searchInput.value, {
							skipCurrent: e,
							backwards: t,
							wrap: !0,
							regExp: this.regExpOption.checked,
							caseSensitive: this.caseSensitiveOption.checked,
							wholeWord: this.wholeWordOption.checked,
							preventScroll: n,
							range: this.searchRange,
						}),
						s = !i && this.searchInput.value
					r.setCssClass(this.searchBox, 'ace_nomatch', s),
						this.editor._emit('findSearchBox', { match: !s }),
						this.highlight(),
						this.updateCounter()
				}),
				(this.updateCounter = function () {
					var e = this.editor,
						t = e.$search.$options.re,
						n = 0,
						r = 0
					if (t) {
						var i = this.searchRange ? e.session.getTextRange(this.searchRange) : e.getValue(),
							s = e.session.doc.positionToIndex(e.selection.anchor)
						this.searchRange && (s -= e.session.doc.positionToIndex(this.searchRange.start))
						var o = (t.lastIndex = 0),
							u
						while ((u = t.exec(i))) {
							n++, (o = u.index), o <= s && r++
							if (n > f) break
							if (!u[0]) {
								t.lastIndex = o += 1
								if (o >= i.length) break
							}
						}
					}
					this.searchCounter.textContent = r + ' of ' + (n > f ? f + '+' : n)
				}),
				(this.findNext = function () {
					this.find(!0, !1)
				}),
				(this.findPrev = function () {
					this.find(!0, !0)
				}),
				(this.findAll = function () {
					var e = this.editor.findAll(this.searchInput.value, {
							regExp: this.regExpOption.checked,
							caseSensitive: this.caseSensitiveOption.checked,
							wholeWord: this.wholeWordOption.checked,
						}),
						t = !e && this.searchInput.value
					r.setCssClass(this.searchBox, 'ace_nomatch', t),
						this.editor._emit('findSearchBox', { match: !t }),
						this.highlight(),
						this.hide()
				}),
				(this.replace = function () {
					this.editor.getReadOnly() || this.editor.replace(this.replaceInput.value)
				}),
				(this.replaceAndFindNext = function () {
					this.editor.getReadOnly() ||
						(this.editor.replace(this.replaceInput.value), this.findNext())
				}),
				(this.replaceAll = function () {
					this.editor.getReadOnly() || this.editor.replaceAll(this.replaceInput.value)
				}),
				(this.hide = function () {
					;(this.active = !1),
						this.setSearchRange(null),
						this.editor.off('changeSession', this.setSession),
						(this.element.style.display = 'none'),
						this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),
						this.editor.focus()
				}),
				(this.show = function (e, t) {
					;(this.active = !0),
						this.editor.on('changeSession', this.setSession),
						(this.element.style.display = ''),
						(this.replaceOption.checked = t),
						e && (this.searchInput.value = e),
						this.searchInput.focus(),
						this.searchInput.select(),
						this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb),
						this.$syncOptions(!0)
				}),
				(this.isFocused = function () {
					var e = document.activeElement
					return e == this.searchInput || e == this.replaceInput
				})
		}).call(l.prototype),
			(t.SearchBox = l),
			(t.Search = function (e, t) {
				var n = e.searchBox || new l(e)
				n.show(e.session.getTextRange(), t)
			})
	}
)
;(function () {
	ace.require(['ace/ext/searchbox'], function (m) {
		if (typeof module == 'object' && typeof exports == 'object' && module) {
			module.exports = m
		}
	})
})()
