1var mod_pagespeed_8xUL1LJfOT = "/*!\n * Lightbox for Bootstrap by @ashleydw\n * https://github.com/ashleydw/lightbox\n *\n * License: https://github.com/ashleydw/lightbox/blob/master/LICENSE\n */\n+function ($) {\n\n'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Lightbox = (function ($) {\n\n var NAME = 'ekkoLightbox';\n var JQUERY_NO_CONFLICT = $.fn[NAME];\n\n var Default = {\n title: '',\n footer: '',\n maxWidth: 9999,\n maxHeight: 9999,\n showArrows: true, //display the left / right arrows or not\n wrapping: true, //if true, gallery loops infinitely\n type: null, //force the lightbox into image / youtube mode. if null, or not image|youtube|vimeo; detect it\n alwaysShowClose: false, //always show the close button, even if there is no title\n loadingMessage: '<div class=\"ekko-lightbox-loader\"><div><div></div><div></div></div></div>', // http://tobiasahlin.com/spinkit/\n leftArrow: '<span>❮</span>',\n rightArrow: '<span>❯</span>',\n strings: {\n close: 'Close',\n fail: 'Failed to load image:',\n type: 'Could not detect remote target type. Force the type using data-type'\n },\n doc: document, // if in an iframe can specify top.document\n onShow: function onShow() {},\n onShown: function onShown() {},\n onHide: function onHide() {},\n onHidden: function onHidden() {},\n onNavigate: function onNavigate() {},\n onContentLoaded: function onContentLoaded() {}\n };\n\n var Lightbox = (function () {\n _createClass(Lightbox, null, [{\n key: 'Default',\n\n /**\n Class properties:\n _$element: null -> the <a> element currently being displayed\n _$modal: The bootstrap modal generated\n _$modalDialog: The .modal-dialog\n _$modalContent: The .modal-content\n _$modalBody: The .modal-body\n _$modalHeader: The .modal-header\n _$modalFooter: The .modal-footer\n _$lightboxContainerOne: Container of the first lightbox element\n _$lightboxContainerTwo: Container of the second lightbox element\n _$lightboxBody: First element in the container\n _$modalArrows: The overlayed arrows container\n _$galleryItems: Other <a>'s available for this gallery\n _galleryName: Name of the current data('gallery') showing\n _galleryIndex: The current index of the _$galleryItems being shown\n _config: {} the options for the modal\n _modalId: unique id for the current lightbox\n _padding / _border: CSS properties for the modal container; these are used to calculate the available space for the content\n */\n\n get: function get() {\n return Default;\n }\n }]);\n\n function Lightbox($element, config) {\n var _this = this;\n\n _classCallCheck(this, Lightbox);\n\n this._config = $.extend({}, Default, config);\n this._$modalArrows = null;\n this._galleryIndex = 0;\n this._galleryName = null;\n this._padding = null;\n this._border = null;\n this._titleIsShown = false;\n this._footerIsShown = false;\n this._wantedWidth = 0;\n this._wantedHeight = 0;\n this._touchstartX = 0;\n this._touchendX = 0;\n\n this._modalId = 'ekkoLightbox-' + Math.floor(Math.random() * 1000 + 1);\n this._$element = $element instanceof jQuery ? $element : $($element);\n\n this._isBootstrap3 = $.fn.modal.Constructor.VERSION[0] == 3;\n\n var h4 = '<h4 class=\"modal-title\">' + (this._config.title || \" \") + '</h4>';\n var btn = '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"' + this._config.strings.close + '\"><span aria-hidden=\"true\">×</span></button>';\n\n var header = '<div class=\"modal-header' + (this._config.title || this._config.alwaysShowClose ? '' : ' hide') + '\">' + (this._isBootstrap3 ? btn + h4 : h4 + btn) + '</div>';\n var footer = '<div class=\"modal-footer' + (this._config.footer ? '' : ' hide') + '\">' + (this._config.footer || \" \") + '</div>';\n var body = '<div class=\"modal-body\"><div class=\"ekko-lightbox-container\"><div class=\"ekko-lightbox-item fade in show\"></div><div class=\"ekko-lightbox-item fade\"></div></div></div>';\n var dialog = '<div class=\"modal-dialog\" role=\"document\"><div class=\"modal-content\">
1' + header + body + footer + '</div></div>';\n $(this._config.doc.body).append('<div id=\"' + this._modalId + '\" class=\"ekko-lightbox modal fade\" tabindex=\"-1\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">' + dialog + '</div>');\n\n this._$modal = $('#' + this._modalId, this._config.doc);\n this._$modalDialog = this._$modal.find('.modal-dialog').first();\n this._$modalContent = this._$modal.find('.modal-content').first();\n this._$modalBody = this._$modal.find('.modal-body').first();\n this._$modalHeader = this._$modal.find('.modal-header').first();\n this._$modalFooter = this._$modal.find('.modal-footer').first();\n\n this._$lightboxContainer = this._$modalBody.find('.ekko-lightbox-container').first();\n this._$lightboxBodyOne = this._$lightboxContainer.find('> div:first-child').first();\n this._$lightboxBodyTwo = this._$lightboxContainer.find('> div:last-child').first();\n\n this._border = this._calculateBorders();\n this._padding = this._calculatePadding();\n\n this._galleryName = this._$element.data('gallery');\n if (this._galleryName) {\n this._$galleryItems = $(document.body).find('*[data-gallery=\"' + this._galleryName + '\"]');\n this._galleryIndex = this._$galleryItems.index(this._$element);\n $(document).on('keydown.ekkoLightbox', this._navigationalBinder.bind(this));\n\n // add the directional arrows to the modal\n if (this._config.showArrows && this._$galleryItems.length > 1) {\n this._$lightboxContainer.append('<div class=\"ekko-lightbox-nav-overlay\"><a href=\"#\">' + this._config.leftArrow + '</a><a href=\"#\">' + this._config.rightArrow + '</a></div>');\n this._$modalArrows = this._$lightboxContainer.find('div.ekko-lightbox-nav-overlay').first();\n this._$lightboxContainer.on('click', 'a:first-child', function (event) {\n event.preventDefault();\n return _this.navigateLeft();\n });\n this._$lightboxContainer.on('click', 'a:last-child', function (event) {\n event.preventDefault();\n return _this.navigateRight();\n });\n this.updateNavigation();\n }\n }\n\n this._$modal.on('show.bs.modal', this._config.onShow.bind(this)).on('shown.bs.modal', function () {\n _this._toggleLoading(true);\n _this._handle();\n return _this._config.onShown.call(_this);\n }).on('hide.bs.modal', this._config.onHide.bind(this)).on('hidden.bs.modal', function () {\n if (_this._galleryName) {\n $(document).off('keydown.ekkoLightbox');\n $(window).off('resize.ekkoLightbox');\n }\n _this._$modal.remove();\n return _this._config.onHidden.call(_this);\n }).modal(this._config);\n\n $(window).on('resize.ekkoLightbox', function () {\n _this._resize(_this._wantedWidth, _this._wantedHeight);\n });\n this._$lightboxContainer.on('touchstart', function () {\n _this._touchstartX = event.changedTouches[0].screenX;\n }).on('touchend', function () {\n _this._touchendX = event.changedTouches[0].screenX;\n _this._swipeGesure();\n });\n }\n\n _createClass(Lightbox, [{\n key: 'element',\n value: function element() {\n return this._$element;\n }\n }, {\n key: 'modal',\n value: function modal() {\n return this._$modal;\n }\n }, {\n key: 'navigateTo',\n value: function navigateTo(index) {\n\n if (index < 0 || index > this._$galleryItems.length - 1) return this;\n\n this._galleryIndex = index;\n\n this.updateNavigation();\n\n this._$element = $(this._$galleryItems.get(this._galleryIndex));\n this._handle();\n }\n }, {\n key: 'navigateLeft',\n value: function navigateLeft() {\n\n if (!this._$galleryItems) return;\n\n if (this._$galleryItems.length === 1) return;\n\n if (this._galleryIndex === 0) {\n if (this._config.wrapping) this._galleryIndex = this._$galleryItems.length - 1;else return;\n } else //circular\n this._galleryIndex--;\n\n this._config.onNavigate.call(this, 'left', this._galleryIndex);\n return this.navigateTo(this._galleryIndex);\n }\n }, {\n key: 'navigateRight',\n value: function navigateRight() {\n\n if (!this._$galleryItems) return;\n\n if (this._$galleryItems.length === 1) return;\n\n if (this._galleryIndex === this._$galleryItems.length - 1) {\n if (this._config.wrapping) this._galleryIndex = 0;else return;\n } else //circular\n this._galleryIndex++;\n\n this._config.onNavigate.call(this, 'right', this._galleryIndex);\n return this.navigateTo(this._galleryIndex);\n }\n }, {\n key: 'updateNavigation',\n value: function updateNavigation() {\
1n if (!this._config.wrapping) {\n var $nav = this._$lightboxContainer.find('div.ekko-lightbox-nav-overlay');\n if (this._galleryIndex === 0) $nav.find('a:first-child').addClass('disabled');else $nav.find('a:first-child').removeClass('disabled');\n\n if (this._galleryIndex === this._$galleryItems.length - 1) $nav.find('a:last-child').addClass('disabled');else $nav.find('a:last-child').removeClass('disabled');\n }\n }\n }, {\n key: 'close',\n value: function close() {\n return this._$modal.modal('hide');\n }\n\n // helper private methods\n }, {\n key: '_navigationalBinder',\n value: function _navigationalBinder(event) {\n event = event || window.event;\n if (event.keyCode === 39) return this.navigateRight();\n if (event.keyCode === 37) return this.navigateLeft();\n }\n\n // type detection private methods\n }, {\n key: '_detectRemoteType',\n value: function _detectRemoteType(src, type) {\n\n type = type || false;\n\n if (!type && this._isImage(src)) type = 'image';\n if (!type && this._getYoutubeId(src)) type = 'youtube';\n if (!type && this._getVimeoId(src)) type = 'vimeo';\n if (!type && this._getInstagramId(src)) type = 'instagram';\n if (type == 'audio' || type == 'video' || !type && this._isMedia(src)) type = 'media';\n if (!type || ['image', 'youtube', 'vimeo', 'instagram', 'media', 'url'].indexOf(type) < 0) type = 'url';\n\n return type;\n }\n }, {\n key: '_getRemoteContentType',\n value: function _getRemoteContentType(src) {\n var response = $.ajax({\n type: 'HEAD',\n url: src,\n async: false\n });\n var contentType = response.getResponseHeader('Content-Type');\n return contentType;\n }\n }, {\n key: '_isImage',\n value: function _isImage(string) {\n return string && string.match(/(^data:image\\/.*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\\?|#).*)?$)/i);\n }\n }, {\n key: '_isMedia',\n value: function _isMedia(string) {\n return string && string.match(/(\\.(mp3|mp4|ogg|webm|wav)((\\?|#).*)?$)/i);\n }\n }, {\n key: '_containerToUse',\n value: function _containerToUse() {\n var _this2 = this;\n\n // if currently showing an image, fade it out and remove\n var $toUse = this._$lightboxBodyTwo;\n var $current = this._$lightboxBodyOne;\n\n if (this._$lightboxBodyTwo.hasClass('in')) {\n $toUse = this._$lightboxBodyOne;\n $current = this._$lightboxBodyTwo;\n }\n\n $current.removeClass('in show');\n setTimeout(function () {\n if (!_this2._$lightboxBodyTwo.hasClass('in')) _this2._$lightboxBodyTwo.empty();\n if (!_this2._$lightboxBodyOne.hasClass('in')) _this2._$lightboxBodyOne.empty();\n }, 500);\n\n $toUse.addClass('in show');\n return $toUse;\n }\n }, {\n key: '_handle',\n value: function _handle() {\n\n var $toUse = this._containerToUse();\n this._updateTitleAndFooter();\n\n var currentRemote = this._$element.attr('data-remote') || this._$element.attr('href');\n var currentType = this._detectRemoteType(currentRemote, this._$element.attr('data-type') || false);\n\n if (['image', 'youtube', 'vimeo', 'instagram', 'media', 'url'].indexOf(currentType) < 0) return this._error(this._config.strings.type);\n\n switch (currentType) {\n case 'image':\n this._preloadImage(currentRemote, $toUse);\n this._preloadImageByIndex(this._galleryIndex, 3);\n break;\n case 'youtube':\n this._showYoutubeVideo(currentRemote, $toUse);\n break;\n case 'vimeo':\n this._showVimeoVideo(this._getVimeoId(currentRemote), $toUse);\n break;\n case 'instagram':\n this._showInstagramVideo(this._getInstagramId(currentRemote), $toUse);\n break;\n case 'media':\n this._showHtml5Media(currentRemote, $toUse);\n break;\n default:\n // url\n this._loadRemoteContent(currentRemote, $toUse);\n break;\n }\n\n return this;\n }\n }, {\n key: '_getYoutubeId',\n value: function _getYoutubeId(string) {\n if (!string) return false;\n var matches = string.match(/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/);\n return matches && matches[2].length === 11 ? matches[2] : false;\n }\n }, {\n key: '_getVimeoId',\n value: function _getVimeoId(string) {\n return string && string.indexOf('vimeo') > 0 ? string : false;\n }\n }, {\n key: '_getInstagramId',\n value: function _getInstagramId(string) {\n return string && string.indexOf('instagram') > 0 ? string : false;\n }\n\n // layout private methods\n }, {\n key: '_toggleLoading',\n value: function _toggleLoading(show) {\n show = show || false;\n if (show) {\n this._$modalDialog.css('display', 'none');\n this._$modal.removeClass('in show');\n $('.modal-backdrop').append(this._config.loadingMessage);\n } else {\n this._$modalDialog.css('display', 'block');\n this._$modal.addClass('in show');\n $('.modal-backdrop').find('.ekko-lightbox-loader').remove();\n }\n return this;\n }\n }, {\n key: '_calculateBorders',\n value: function _calculateBorders() {\n return {\n top: this._totalCssByAttribute('border-top-width'),\n right: this._totalCssByAttribute('border-right-width'),\n bottom: this._totalCssByAttribute('border-bottom-width'),\n left: this._totalCssByAttribute('border-left-width')\n };\n }\n }, {\n key: '_calculatePadding',\n value: function _calculatePadding() {\n return {\n top: this._totalCssByAttribute('padding-top'),\n right: this._totalCssByAttribute('padding-right'),\n bottom: this._totalCssByAttribute('padding-bottom'),\n left: this._totalCssByAttribute('padding-left')\n };\n }\n }, {\n key: '_totalCssByAttribute',\n value: function _totalCssByAttribute(attribute) {\n return parseInt(this._$modalDialog.css(attribute), 10) + parseInt(this._$modalContent.css(attribute), 10) + parseInt(this._$modalBody.css(attribute), 10);\n }\n }, {\n key: '_updateTitleAndFooter',\n value: function _updateTitleAndFooter() {\n var title = this._$element.data('title') || \"\";\n var caption = this._$element.data('footer') || \"\";\n\n this._titleIsShown = false;\n if (title || this._config.alwaysShowClose) {\n this._titleIsShown = true;
1\n this._$modalHeader.css('display', '').find('.modal-title').html(title || \" \");\n } else this._$modalHeader.css('display', 'none');\n\n this._footerIsShown = false;\n if (caption) {\n this._footerIsShown = true;\n this._$modalFooter.css('display', '').html(caption);\n } else this._$modalFooter.css('display', 'none');\n\n return this;\n }\n }, {\n key: '_showYoutubeVideo',\n value: function _showYoutubeVideo(remote, $containerForElement) {\n var id = this._getYoutubeId(remote);\n var query = remote.indexOf('&') > 0 ? remote.substr(remote.indexOf('&')) : '';\n var width = this._$element.data('width') || 560;\n var height = this._$element.data('height') || width / (560 / 315);\n return this._showVideoIframe('//www.youtube.com/embed/' + id + '?badge=0&autoplay=1&html5=1' + query, width, height, $containerForElement);\n }\n }, {\n key: '_showVimeoVideo',\n value: function _showVimeoVideo(id, $containerForElement) {\n var width = this._$element.data('width') || 500;\n var height = this._$element.data('height') || width / (560 / 315);\n return this._showVideoIframe(id + '?autoplay=1', width, height, $containerForElement);\n }\n }, {\n key: '_showInstagramVideo',\n value: function _showInstagramVideo(id, $containerForElement) {\n // instagram load their content into
1iframe's so this can be put straight into the element\n var width = this._$element.data('width') || 612;\n var height = width + 80;\n id = id.substr(-1) !== '/' ? id + '/' : id; // ensure id has trailing slash\n $containerForElement.html('<iframe width=\"' + width + '\" height=\"' + height + '\" src=\"' + id + 'embed/\" frameborder=\"0\" allowfullscreen></iframe>');\n this._resize(width, height);\n this._config.onContentLoaded.call(this);\n if (this._$modalArrows) //hide the arrows when showing video\n this._$modalArrows.css('display', 'none');\n this._toggleLoading(false);\n return this;\n }\n }, {\n key: '_showVideoIframe',\n value: function _showVideoIframe(url, width, height, $containerForElement) {\n // should be used for videos only. for remote content use loadRemoteContent (data-type=url)\n height = height || width; // default to square\n $containerForElement.html('<div class=\"embed-responsive embed-responsive-16by9\"><iframe width=\"' + width + '\" height=\"' + height + '\" src=\"' + url + '\" frameborder=\"0\" allowfullscreen class=\"embed-responsive-item\"></iframe></div>');\n this._resize(width, height);\n this._config.onContentLoaded.call(this);\n if (this._$modalArrows) this._$modalArrows.css('display', 'none'); //hide the arrows when showing video\n this._toggleLoading(false);\n return this;\n }\n }, {\n key: '_showHtml5Media',\n value: function _showHtml5Media(url, $containerForElement) {\n // should be used for videos only. for remote content use loadRemoteContent (data-type=url)\n var contentType = this._getRemoteContentType(url);\n if (!contentType) {\n return this._error(this._config.strings.type);\n }\n var mediaType = '';\n if (contentType.indexOf('audio') > 0) {\n mediaType = 'audio';\n } else {\n mediaType = 'video';\n }\n var width = this._$element.data('width') || 560;\n var height = this._$element.data('height') || width / (560 / 315);\n $containerForElement.html('<div class=\"embed-responsive embed-responsive-16by9\"><' + mediaType + ' width=\"' + width + '\" height=\"' + height + '\" preload=\"auto\" autoplay controls class=\"embed-responsive-item\"><source src=\"' + url + '\" type=\"' + contentType + '\">' + this._config.strings.type + '</' + mediaType + '></div>');\n this._resize(width, height);\n this._config.onContentLoaded.call(this);\n if (this._$modalArrows) this._$modalArrows.css('display', 'none'); //hide the arrows when showing video\n this._toggleLoading(false);\n return this;\n }\n }, {\n key: '_loadRemoteContent',\n value: function _loadRemoteContent(url, $containerForElement) {\n var _this3 = this;\n\n var width = this._$element.data('width') || 560;\n var height = this._$element.data('height') || 560;\n\n var disableExternalCheck = this._$element.data('disableExternalCheck') || false;\n this._toggleLoading(false);\n\n // external urls are loading into an iframe\n // local ajax can be loaded into the container itself\n if (!disableExternalCheck && !this._isExternal(url)) {\n $containerForElement.load(url, $.proxy(function () {\n return _this3._$element.trigger('loaded.bs.modal');l;\n }));\n } else {\n $containerForElement.html('<iframe src=\"' + url + '\" frameborder=\"0\" allowfullscreen></iframe>');\n this._config.onContentLoaded.call(this);\n }\n\n if (this._$modalArrows) //hide the arrows when remote content\n this._$modalArrows.css('display', 'none');\n\n this._resize(width, height);\n return this;\n }\n }, {\n key: '_isExternal',\n value: function _isExternal(url) {\n var match = url.match(/^([^:\\/?#]+:)?(?:\\/\\/([^\\/?#]*))?([^?#]+)?(\\?[^#]*)?(#.*)?/);\n if (typeof match[1] === \"string\" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) return true;\n\n if (typeof match[2] === \"string\" && match[2].length > 0 && match[2].replace(new RegExp(':(' + ({\n \"http:\": 80,\n \"https:\": 443\n })[location.protocol] + ')?$'), \"\") !== location.host) return true;\n\n return false;\n }\n }, {\n key: '_error',\n value: function _error(message) {\n console.error(message);\n this._containerToUse().html(message);\n this._resize(300, 300);\n return this;\n }\n }, {\n key: '_preloadImageByIndex',\n value: function _preloadImageByIndex(startIndex, numberOfTimes) {\n\n if (!this._$galleryItems) return;\n\n var next = $(this._$galleryItems.get(startIndex), false);\n if (typeof next == 'undefined') return;\n\n var src = next.attr('data-remote') || next.attr('href');\n if (next.attr('data-type') === 'image' || this._isImage(src)) this._preloadImage(src, false);\n\n if (numberOfTimes > 0) return this._preloadImageByIndex(startIndex + 1, numberOfTimes - 1);\n }\n }, {\n key: '_preloadImage',\n value: function _preloadImage(src, $containerForImage) {\n var _this4 = this;\n\n $containerForImage = $containerForImage || false;\n\n var img = new Image();\n if ($containerForImage) {\n (function () {\n\n // if loading takes > 200ms show a loader\n var loadingTimeout = setTimeout(function () {\n $containerForImage.append(_this4._config.loadingMessage);\n }, 200);\n\n img.onload = function () {\n if (loadingTimeout) clearTimeout(loadingTimeout);\n loadingTimeout = null;\n var image = $('<img />');\n image.attr('src', img.src);\n image.addClass('img-fluid');\n\n // backward compatibility for bootstrap v3\n image.css('width', '100%');\n\n $containerForImage.html(image);\n if (_this4._$modalArrows) _this4._$modalArrows.css('display', ''); // remove display to default to css property\n\n _this4._resize(img.width, img.height);\n _this4._toggleLoading(false);\n return _this4._config.onContentLoaded.call(_this4);\n };\n img.onerror = function () {\n _this4._toggleLoading(false);\n return _this4._error(_this4._config.strings.fail + (' ' + src));\n };\n })();\n }\n\n img.src = src;\n return img;\n }\n }, {\n key: '_swipeGesure',\n value: function _swipeGesure() {\n if (this._touchendX < this._touchstartX) {\n return this.navigateRight();\n }\n if (this._touchendX > this._touchstartX) {\n return this.navigateLeft();\n }\n }\n }, {\n key: '_resize',\n value: function _resize(width, height) {\n\n height = height || width;\n this._wantedWidth = width;\n this._wantedHeight = height;
1\n\n var imageAspecRatio = width / height;\n\n // if width > the available space, scale down the expected width and height\n var widthBorderAndPadding = this._padding.left + this._padding.right + this._border.left + this._border.right;\n\n // force 10px margin if window size > 575px\n var addMargin = this._config.doc.body.clientWidth > 575 ? 20 : 0;\n var discountMargin = this._config.doc.body.clientWidth > 575 ? 0 : 20;\n\n var maxWidth = Math.min(width + widthBorderAndPadding, this._config.doc.body.clientWidth - addMargin, this._config.maxWidth);\n\n if (width + widthBorderAndPadding > maxWidth) {\n height = (maxWidth - widthBorderAndPadding - discountMargin) / imageAspecRatio;\n width = maxWidth;\n } else width = width + widthBorderAndPadding;\n\n var headerHeight = 0,\n footerHeight = 0;\n\n // as the resize is performed the modal is show, the calculate might fail\n // if so, default to the default sizes\n if (this._footerIsShown) footerHeight = this._$modalFooter.outerHeight(true) || 55;\n\n if (this._titleIsShown) headerHeight = this._$modalHeader.outerHeight(true) || 67;\n\n var borderPadding = this._padding.top + this._padding.bottom + this._border.bottom + this._border.top;\n\n //calculated each time as resizing the window can cause them to change due to Bootstraps fluid margins\n var margins = parseFloat(this._$modalDialog.css('margin-top')) + parseFloat(this._$modalDialog.css('margin-bottom'));\n\n var maxHeight = Math.min(height, $(window).height() - borderPadding - margins - headerHeight - footerHeight, this._config.maxHeight - borderPadding - headerHeight - footerHeight);\n\n if (height > maxHeight) {\n // if height > the available height, scale down the width\n width = Math.ceil(maxHeight * imageAspecR
1atio) + widthBorderAndPadding;\n }\n\n this._$lightboxContainer.css('height', maxHeight);\n this._$modalDialog.css('flex', 1).css('maxWidth', width);\n\n var modal = this._$modal.data('bs.modal');\n if (modal) {\n // v4 method is mistakenly protected\n try {\n modal._handleUpdate();\n } catch (Exception) {\n modal.handleUpdate();\n }\n }\n return this;\n }\n }], [{\n key: '_jQueryInterface',\n value: function _jQueryInterface(config) {\n var _this5 = this;\n\n config = config || {};\n return this.each(function () {\n var $this = $(_this5);\n var _config = $.extend({}, Lightbox.Default, $this.data(), typeof config === 'object' && config);\n\n new Lightbox(_this5, _config);\n });\n }\n }]);\n\n return Lightbox;\n })();\n\n $.fn[NAME] = Lightbox._jQueryInterface;\n $.fn[NAME].Constructor = Lightbox;\n $.fn[NAME].noConflict = function () {\n $.fn[NAME] = JQUERY_NO_CONFLICT;\n return Lightbox._jQueryInterface;\n };\n\n return Lightbox;\n})(jQuery);\n\n\n}(jQuery);\n\n\n"; 2var mod_pagespeed_US_NSA9LDw = "/**\n * Featherlight - ultra slim jQuery lightbox\n * Version 1.7.13 - http://noelboss.github.io/featherlight/\n *\n * Copyright 2018, Noël Raoul Bossart (http://www.noelboss.com)\n * MIT Licensed.\n**/\n!function(a){\"use strict\";function b(a,c){if(!(this instanceof b)){var d=new b(a,c);return d.open(),d}this.id=b.id++,this.setup(a,c),this.chainCallbacks(b._callbackChain)}function c(a,b){var c={};for(var d in a)d in b&&(c[d]=a[d],delete a[d]);return c}function d(a,b){var c={},d=new RegExp(\"^\"+b+\"([A-Z])(.*)\");for(var e in a){var f=e.match(d);if(f){var g=(f[1]+f[2].replace(/([A-Z])/g,\"-$1\")).toLowerCase();c[g]=a[e]}}return c}if(\"undefined\"==typeof a)return void(\"console\"in window&&window.console.info(\"Too much lightness, Featherlight needs jQuery.\"));if(a.fn.jquery.match(/-ajax/))return void(\"console\"in window&&window.console.info(\"Featherlight needs regular jQuery, not the slim version.\"));var e=[],f=function(b){return e=a.grep(e,function(a){return a!==b&&a.$instance.closest(\"body\").length>0})},g={allow:1,allowfullscreen:1,frameborder:1,height:1,longdesc:1,marginheight:1,marginwidth:1,mozallowfullscreen:1,name:1,referrerpolicy:1,sandbox:1,scrolling:1,src:1,srcdoc:1,style:1,webkitallowfullscreen:1,width:1}
2,h={keyup:\"onKeyUp\",resize:\"onResize\"},i=function(c){a.each(b.opened().reverse(),function(){return c.isDefaultPrevented()||!1!==this[h[c.type]](c)?void 0:(c.preventDefault(),c.stopPropagation(),!1)})},j=function(c){if(c!==b._globalHandlerInstalled){b._globalHandlerInstalled=c;var d=a.map(h,function(a,c){return c+\".\"+b.prototype.namespace}).join(\" \");a(window)[c?\"on\":\"off\"](d,i)}};b.prototype={constructor:b,namespace:\"featherlight\",targetAttr:\"data-featherlight\",variant:null,resetCss:!1,background:null,openTrigger:\"click\",closeTrigger:\"click\",filter:null,root:\"body\",openSpeed:250,closeSpeed:250,closeOnClick:\"background\",closeOnEsc:!0,closeIcon:\"✕\",loading:\"\",persist:!1,otherClose:null,beforeOpen:a.noop,beforeContent:a.noop,beforeClose:a.noop,afterOpen:a.noop,afterContent:a.noop,afterClose:a.noop,onKeyUp:a.noop,onResize:a.noop,type:null,contentFilters:[\"jquery\",\"image\",\"html\",\"ajax\",\"iframe\",\"text\"],setup:function(b,c){\"object\"!=typeof b||b instanceof a!=!1||c||(c=b,b=void 0);var d=a.extend(this,c,{target:b}),e=d.resetCss?d.namespace+\"-reset\":d.namespace,f=a(d.background||['<div class=\"'+e+\"-loading \"+e+'\">','<div class=\"'+e+'-content\">','<button class=\"'+e+\"-close-icon \"+d.namespace+'-close\" aria-label=\"Close\">',d.closeIcon,\"</button>\",'<div class=\"'+d.namespace+'-inner\">'+d.loading+\"</div>\",\"</div>\",\"</div>\"].join(\"\")),g=\".\"+d.namespace+\"-close\"+(d.otherClose?\",\"+d.otherClose:\"\");return d.$instance=f.clone().addClass(d.variant),d.$instance.on(d.closeTrigger+\".\"+d.namespace,function(b){if(!b.isDefaultPrevented()){var c=a(b.target);(\"background\"===d.closeOnClick&&c.is(\".\"+d.namespace)||\"anywhere\"===d.closeOnClick||c.closest(g).length)&&(d.close(b),b.preventDefault())}}),this},getContent:function(){if(this.persist!==!1&&this.$content)return this.$content;var b=this,c=this.constructor.contentFilters,d=function(a){return b.$currentTarget&&b.$currentTarget.attr(a)},e=d(b.targetAttr),f=b.target||e||\"\",g=c[b.type];if(!g&&f in c&&(g=c[f],f=b.target&&e),f=f||d(\"href\")||\"\",!g)for(var h in c)b[h]&&(g=c[h],f=b[h]);if(!g){var i=f;if(f=null,a.each(b.contentFilters,function(){return g=c[this],g.test&&(f=g.test(i)),!f&&g.regex&&i.match&&i.match(g.regex)&&(f=i),!f}),!f)return\"console\"in window&&window.console.error(\"Featherlight: no content filter found \"+(i?' for \"'+i+'\"':\" (no target specified)\")),!1}return g.process.call(b,f)},setContent:function(b){return this.$instance.removeClass(this.namespace+\"-loading\"),this.$instance.toggleClass(this.namespace+\"-iframe\",b.is(\"iframe\")),this.$instance.find(\".\"+this.namespace+\"-inner\").not(b).slice(1).remove().end().replaceWith(a.contains(this.$instance[0],b[0])?\"\":b),this.$content=b.addClass(this.namespace+\"-inner\"),this},open:function(b){var c=this;if(c.$instance.hide().appendTo(c.root),!(b&&b.isDefaultPrevented()||c.beforeOpen(b)===!1)){b&&b.preventDefault();var d=c.getContent();if(d)return e.push(c),j(!0),c.$instance.fadeIn(c.openSpeed),c.beforeContent(b),a.when(d).always(function(a){c.setContent(a),c.afterContent(b)}).then(c.$instance.promise()).done(function(){c.afterOpen(b)})}return c.$instance.detach(),a.Deferred().reject().promise()},close:function(b){var c=this,d=a.Deferred();return c.beforeClose(b)===!1?d.reject():(0===f(c).length&&j(!1),c.$instance.fadeOut(c.closeSpeed,function(){c.$instance.detach(),c.afterClose(b),d.resolve()})),d.promise()},resize:function(a,b){if(a&&b){this.$content.css(\"width\",\"\").css(\"height\",\"\");var c=Math.max(a/(this.$content.parent().width()-1),b/(this.$content.parent().height()-1));c>1&&(c=b/Math.floor(b/c),this.$content.css(\"width\",\"\"+a/c+\"px\").css(\"height\",\"\"+b/c+\"px\"))}},chainCallbacks:function(b){for(var c in b)this[c]=a.proxy(b[c],this,a.proxy(this[c],this))}},a.extend(b,{id:0,autoBind:\"[data-featherlight]\",defaults:b.prototype,contentFilters:{jquery:{regex:/^[#.]\\w/,test:function(b){return b instanceof a&&b},process:function(b){return this.persist!==!1?a(b):a(b).clone(!0)}},image:{regex:/\\.(png|jpg|jpeg|gif|tiff?|bmp|svg)(\\?\\S*)?$/i,process:function(b){var c=this,d=a.Deferred(),e=new Image,f=a('<img src=\"'+b+'\" alt=\"\" class=\"'+c.namespace+'-image\" />');
2return e.onload=function(){f.naturalWidth=e.width,f.naturalHeight=e.height,d.resolve(f)},e.onerror=function(){d.reject(f)},e.src=b,d.promise()}},html:{regex:/^\\s*<[\\w!][^<]*>/,process:function(b){return a(b)}},ajax:{regex:/./,process:function(b){var c=a.Deferred(),d=a(\"<div></div>\").load(b,function(a,b){\"error\"!==b&&c.resolve(d.contents()),c.fail()});return c.promise()}},iframe:{process:function(b){var e=new a.Deferred,f=a(\"<iframe/>\"),h=d(this,\"iframe\"),i=c(h,g);return f.hide().attr(\"src\",b).attr(i).css(h).on(\"load\",function(){e.resolve(f.show())}).appendTo(this.$instance.find(\".\"+this.namespace+\"-content\")),e.promise()}},text:{process:function(b){return a(\"<div>\",{text:b})}}},functionAttributes:[\"beforeOpen\",\"afterOpen\",\"beforeContent\",\"afterContent\",\"beforeClose\",\"afterClose\"],readElementConfig:function(b,c){var d=this,e=new RegExp(\"^data-\"+c+\"-(.*)\"),f={};return b&&b.attributes&&a.each(b.attributes,function(){var b=this.name.match(e);if(b){var c=this.value,g=a.camelCase(b[1]);if(a.inArray(g,d.functionAttributes)>=0)c=new Function(c);else try{c=JSON.parse(c)}catch(h){}f[g]=c}}),f},extend:function(b,c){var d=function(){this.constructor=b};return d.prototype=this.prototype,b.prototype=new d,b.__super__=this.prototype,a.extend(b,this,c),b.defaults=b.prototype,b},attach:function(b,c,d){var e=this;\"object\"!=typeof c||c instanceof a!=!1||d||(d=c,c=void 0),d=a.extend({},d);var f,g=d.namespace||e.defaults.namespace,h=a.extend({},e.defaults,e.readElementConfig(b[0],g),d),i=function(g){var i=a(g.currentTarget),j=a.extend({$source:b,$currentTarget:i},e.readElementConfig(b[0],h.namespace),e.readElementConfig(g.currentTarget,h.namespace),d),k=f||i.data(\"featherlight-persisted\")||new e(c,j);\"shared\"===k.persist?f=k:k.persist!==!1&&i.data(\"featherlight-persisted\",k),j.$currentTarget.blur&&j.$currentTarget.blur(),k.open(g)};return b.on(h.openTrigger+\".\"+h.namespace,h.filter,i),{filter:h.filter,handler:i}},current:function(){var a=this.opened();return a[a.length-1]||null},opened:function(){var b=this;return f(),a.grep(e,function(a){return a instanceof b})},close:function(a){var b=this.current();return b?b.close(a):void 0},_onReady:function(){var b=this;if(b.autoBind){var c=a(b.autoBind);c.each(function(){b.attach(a(this))}),a(document).on(\"click\",b.autoBind,function(d){if(!d.isDefaultPrevented()){var e=a(d.currentTarget),f=c.length;if(c=c.add(e),f!==c.length){var g=b.attach(e);(!g.filter||a(d.target).parentsUntil(e,g.filter).length>0)&&g.handler(d)}}})}},_callbackChain:{onKeyUp:function(b,c){return 27===c.keyCode?(this.closeOnEsc&&a.featherlight.close(c),!1):b(c)},beforeOpen:function(b,c){return a(document.documentElement).addClass(\"with-featherlight\"),this._previouslyActive=document.activeElement,this._$previouslyTabbable=a(\"a, input, select, textarea, iframe, button, iframe, [contentEditable=true]\").not(\"[tabindex]\").not(this.$instance.find(\"button\")),this._$previouslyWithTabIndex=a(\"[tabindex]\").not('[tabindex=\"-1\"]'),this._previousWithTabIndices=this._$previouslyWithTabIndex.map(function(b,c){return a(c).attr(\"tabindex\")}),this._$previouslyWithTabIndex.add(this._$previouslyTabbable).attr(\"tabindex\",-1),document.activeElement.blur&&document.activeElement.blur(),b(c)},afterClose:function(c,d){var e=c(d),f=this;return this._$previouslyTabbable.removeAttr(\"tabindex\"),this._$previouslyWithTabIndex.each(function(b,c){a(c).attr(\"tabindex\",f._previousWithTabIndices[b])}),this._previouslyActive.focus(),0===b.opened().length&&a(document.documentElement).removeClass(\"with-featherlight\"),e},onResize:function(a,b){return this.resize(this.$content.naturalWidth,this.$content.naturalHeight),a(b)},afterContent:function(a,b){var c=a(b);return this.$instance.find(\"[autofocus]:not([disabled])\").focus(),this.onResize(b),c}}}),a.featherlight=b,a.fn.featherlight=function(a,c){return b.attach(this,a,c),this},a(document).ready(function(){b._onReady()})}(jQuery);\n\n";
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.