!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("mdl-ext",[],t):"object"==typeof exports?exports["mdl-ext"]=t():e["mdl-ext"]=t()}(this,function(){return function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return e[i].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){n(113),e.exports=n(53)},function(e,t){var n=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=9,i=13,r=27,o=32,s=33,a=34,l=35,c=36,u=37,d=38,f=39,h=40,p="aria-expanded",m="aria-hidden",_="aria-multiselectable",v="aria-selected",g="is-dirty",b="is-disabled",E="is-expanded",y="is-focused",A="is-invalid",w="is-upgraded",L="data-upgraded",S="mdl-ripple",x="MaterialRipple",k="mdl-js-ripple-effect",D="mdl-js-ripple-effect--ignore-events";t.VK_TAB=n,t.VK_ENTER=i,t.VK_ESC=r,t.VK_SPACE=o,t.VK_PAGE_UP=s,t.VK_PAGE_DOWN=a,t.VK_END=l,t.VK_HOME=c,t.VK_ARROW_LEFT=u,t.VK_ARROW_UP=d,t.VK_ARROW_RIGHT=f,t.VK_ARROW_DOWN=h,t.ARIA_EXPANDED=p,t.ARIA_HIDDEN=m,t.ARIA_MULTISELECTABLE=_,t.ARIA_SELECTED=v,t.IS_DIRTY=g,t.IS_DISABLED=b,t.IS_EXPANDED=E,t.IS_FOCUSED=y,t.IS_INVALID=A,t.IS_UPGRADED=w,t.DATA_UPGRADED=L,t.MDL_RIPPLE=S,t.MDL_RIPPLE_COMPONENT=x,t.MDL_RIPPLE_EFFECT=k,t.MDL_RIPPLE_EFFECT_IGNORE_EVENTS=D},function(e,t,n){var i=n(5),r=n(1),o=n(37),s=n(11),a="prototype",l=function(e,t,n){var c,u,d,f=e&l.F,h=e&l.G,p=e&l.S,m=e&l.P,_=e&l.B,v=e&l.W,g=h?r:r[t]||(r[t]={}),b=g[a],E=h?i:p?i[t]:(i[t]||{})[a];h&&(n=t);for(c in n)u=!f&&E&&void 0!==E[c],u&&c in g||(d=u?E[c]:n[c],g[c]=h&&"function"!=typeof E[c]?n[c]:_&&u?o(d,i):v&&E[c]==d?function(e){var t=function(t,n,i){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,i)}return e.apply(this,arguments)};return t[a]=e[a],t}(d):m&&"function"==typeof d?o(Function.call,d):d,m&&((g.virtual||(g.virtual={}))[c]=d,e&l.R&&b&&!b[c]&&s(b,c,d)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t,n){var i=n(44)("wks"),r=n(46),o=n(5).Symbol,s="function"==typeof o,a=e.exports=function(e){return i[e]||(i[e]=s&&o[e]||(s?o:r)("Symbol."+e))};a.store=i},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var i=n(17);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},function(e,t){e.exports={}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var r=n(60),o=i(r);t.default=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return(0,o.default)(e)}},function(e,t,n){e.exports=!n(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var i=n(12),r=n(25);e.exports=n(9)?function(e,t,n){return i.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var i=n(6),r=n(82),o=n(101),s=Object.defineProperty;t.f=n(9)?Object.defineProperty:function(e,t,n){if(i(e),t=o(t,!0),i(n),r)try{return s(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(66),o=i(r),s=function(e,t){t||(t=window);var n=!1;return function(){for(var i=arguments.length,r=Array(i),s=0;s<i;s++)r[s]=arguments[s];n||(n=!0,window.requestAnimationFrame(function(){return n=!1,(0,o.default)(e,t,r)}))}};t.default=s,e.exports=t.default},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.jsonStringToObject=void 0;var r=n(33),o=i(r),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.replace(/'/g,'"');try{return(0,o.default)(t,JSON.parse(n))}catch(e){throw new Error("Failed to parse json string: "+n+". Error: "+e.message)}};t.jsonStringToObject=s},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.stringList=t.randomString=t.joinStrings=void 0;var r=n(65),o=i(r),s=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var i=function(e){return null!=e&&"string"==typeof e},r=function e(t){return t.reduce(function(t,n){return t.concat(Array.isArray(n)?e(n):n)},[])},s=function(e){return(0,o.default)(e).filter(function(t){return e[t]}).map(function(e){return e})};return t.filter(function(e){return!!e}).map(function(e){return i(e)?e:s(e)}).reduce(function(e,t){return e.concat(Array.isArray(t)?r(t):t)},[])},a=function(){for(var e=arguments.length,t=Array(e>1?e-1:0),n=1;n<e;n++)t[n-1]=arguments[n];var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:" ";return s.apply(void 0,t).join(i)},l=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:12;return Array(e+1).join((Math.random().toString(36)+"00000000000000000").slice(2,18)).slice(0,e)};t.joinStrings=a,t.randomString=l,t.stringList=s},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var i=n(95),r=n(39);e.exports=Object.keys||function(e){return i(e,r)}},function(e,t,n){var i=n(40),r=n(24);e.exports=function(e){return i(r(e))}},function(e,t,n){var i=n(24);e.exports=function(e){return Object(i(e))}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.tether=t.removeChildElements=t.moveElements=t.isRectInsideWindowViewport=t.isFocusable=t.getScrollParents=t.getParentElements=t.getWindowViewport=void 0;var r=n(62),o=i(r),s=function(e){for(var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];e.lastChild;)e.removeChild(e.lastChild);if(t){var n=e.style.display;e.style.display="none",e.style.display=n}},a=function(e,t){for(t||(t=e.ownerDocument.createDocumentFragment());e.firstChild;)t.appendChild(e.firstChild);return t},l=function(){return{viewportWidth:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),viewportHeight:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}},c=function(e){var t=e.top,n=e.left,i=e.bottom,r=e.right,o=l(),s=o.viewportWidth,a=o.viewportHeight;return t>=0&&n>=0&&i<=a&&r<=s},u=function(e){for(var t=[],n=e.parentNode;n;){var i=window.getComputedStyle(n);if("hidden"===i.overflowY&&"hidden"===i.overflowX||t.unshift(n),n===document.body)break;n=n.parentNode}return t},d=function(e,t){for(var n=[],i=e.parentNode;i&&i!==t;)n.unshift(i),i=i.parentNode;return n},f=function(e,t){var n=e.getBoundingClientRect(),i=l(),r=i.viewportWidth,o=i.viewportHeight;t.style.height="auto",t.offsetHeight>o&&(t.style.height=o+"px",t.style.overflowY="auto"),t.style.width="auto",t.offsetWidth>r&&(t.style.width=r+"px");var s=t.getBoundingClientRect(),a=n.top-s.top,u=n.left-s.left,d=s.top+a,f=s.left+u,h=d+s.height,p=f+s.width,m=a,_=u;if(c({top:d+n.height,left:f,bottom:h+n.height,right:p}))m=n.height+a;else if(c({top:d+n.height,left:f+n.width-s.width,bottom:h+n.height,right:f+n.width}))m=n.height+a,_=u+n.width-s.width;else if(c({top:d-s.height,left:f,bottom:h-s.height,right:p}))m=a-s.height;else if(c({top:d-s.height,left:f+n.width-s.width,bottom:h-s.height,right:f+n.width}))m=a-s.height,_=u+n.width-s.width;else if(c({top:d,left:f+n.width,bottom:h,right:p+n.width}))_=n.width+u;else if(c({top:d,left:f-n.width,bottom:h,right:p-n.width}))_=u-s.width;else if(m=a-h+o,d+n.height>=0&&h+n.height<=o?m=n.height+a:d-s.height>=0&&h-s.height<=o&&(m=a-s.height),f+s.width+n.width<=r)_=n.width+u;else if(f-s.width>=0)_=u-s.width;else{var v=f+s.width-r;_=u-v}t.style.top=t.offsetTop+m+"px",t.style.left=t.offsetLeft+_+"px"},h=function(e){if(e.hasAttribute("tabindex")){var t=e.getAttribute("tabindex");if(!(0,o.default)(t))return parseInt(t)>-1}if(e.hasAttribute("contenteditable")&&"false"!==e.getAttribute("contenteditable"))return!0;var n=/input|select|textarea|button|details/i,i=e.nodeName;if(n.test(i))return"hidden"!==e.type.toLowerCase()&&!e.disabled;if("A"===i||"AREA"===i)return!!e.href;if("IFRAME"===i){var r=window.getComputedStyle(e);return"none"!==r.getPropertyValue("display").toLowerCase()}return!1};t.getWindowViewport=l,t.getParentElements=d,t.getScrollParents=u,t.isFocusable=h,t.isRectInsideWindowViewport=c,t.moveElements=a,t.removeChildElements=s,t.tether=f},function(e,t){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var r=n(63),o=i(r);t.default=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),(0,o.default)(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}()},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var i=n(44)("keys"),r=n(46);e.exports=function(e){return i[e]||(i[e]=r(e))}},function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}},function(e,t,n){"use strict";var i=n(99)(!0);n(41)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=i(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t,n,i){return e/=i/2,e<1?n/2*e*e+t:(e--,-n/2*(e*(e-2)-1)+t)},i=function(e,t,n,i){var r=(e/=i)*e,o=r*e;return t+n*(6*o*r+-15*r*r+10*o)};t.easeInOutQuad=n,t.inOutQuintic=i},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=1e3/60,i=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n,t=e<n?n:e,i=void 0,r=null,o=0,s=function(){var e=i(o);e||a()},a=function(){r&&window.cancelAnimationFrame(r),r=null,o=0},l=function(){var e=Date.now(),n=function n(i){r&&(r=window.requestAnimationFrame(function(){return n(Date.now())}),o+=i-e,o>=t&&(s(),(o-=t)>t&&(o=0)),e=i)};r=1,n(e)};return{get started(){return null!=r},get interval(){return t},set interval(e){t=e<n?n:e},start:function(e){if("function"!=typeof e)throw new TypeError("callback parameter must be a function");i=e,l()},immediate:function(){if(!i)throw new ReferenceError("callback parameter is not defined. Call start before immediate.");s()},stop:function(){return a()}}};t.default=i,e.exports=t.default},function(e,t,n){e.exports={default:n(69),__esModule:!0}},function(e,t,n){e.exports={default:n(71),__esModule:!0}},function(e,t,n){e.exports={default:n(73),__esModule:!0}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){var i=n(36),r=n(4)("toStringTag"),o="Arguments"==i(function(){return arguments}()),s=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=s(t=Object(e),r))?n:o?i(t):"Object"==(a=i(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var i=n(34);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var i=n(17),r=n(5).document,o=i(r)&&i(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var i=n(36);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e,t,n){"use strict";var i=n(89),r=n(3),o=n(98),s=n(11),a=n(16),l=n(7),c=n(86),u=n(43),d=n(94),f=n(4)("iterator"),h=!([].keys&&"next"in[].keys()),p="@@iterator",m="keys",_="values",v=function(){return this};e.exports=function(e,t,n,g,b,E,y){c(n,t,g);var A,w,L,S=function(e){if(!h&&e in C)return C[e];switch(e){case m:return function(){return new n(this,e)};case _:return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",k=b==_,D=!1,C=e.prototype,R=C[f]||C[p]||b&&C[b],I=R||S(b),O=b?k?S("entries"):I:void 0,M="Array"==t?C.entries||R:R;if(M&&(L=d(M.call(new e)),L!==Object.prototype&&(u(L,x,!0),i||a(L,f)||s(L,f,v))),k&&R&&R.name!==_&&(D=!0,I=function(){return R.call(this)}),i&&!y||!h&&!D&&C[f]||s(C,f,I),l[t]=I,l[x]=v,b)if(A={values:k?I:S(_),keys:E?I:S(m),entries:O},y)for(w in A)w in C||o(C,w,A[w]);else r(r.P+r.F*(h||D),t,A);return A}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var i=n(12).f,r=n(16),o=n(4)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&i(e,o,{configurable:!0,value:t})}},function(e,t,n){var i=n(5),r="__core-js_shared__",o=i[r]||(i[r]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t,n){var i=n(27),r=Math.min;e.exports=function(e){return e>0?r(i(e),9007199254740991):0}},function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}},function(e,t,n){var i=n(35),r=n(4)("iterator"),o=n(7);e.exports=n(1).getIteratorMethod=function(e){if(void 0!=e)return e[r]||e["@@iterator"]||o[i(e)]}},function(e,t,n){n(105);for(var i=n(5),r=n(11),o=n(7),s=n(4)("toStringTag"),a=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],l=0;l<5;l++){var c=a[l],u=i[c],d=u&&u.prototype;d&&!d[s]&&r(d,s,c),o[c]=o.Array}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(8),o=i(r),s=n(2);!function(){var e="mdlext-accordion",t="mdlext-accordion--vertical",n="mdlext-accordion--horizontal",i="mdlext-accordion__panel",r="presentation",a="mdlext-accordion__tab",l="mdlext-accordion__tab__caption",c="tab",u="mdlext-accordion__tabpanel",d="tabpanel",f="mdlext-js-ripple-effect",h="mdlext-accordion__tab--ripple",p="mdlext-js-animation-effect",m="mdlext-accordion__tabpanel--animation",_=function(e){this.element_=e,this.init()};window.MaterialExtAccordion=_;var v=function(e){return e?e.classList.contains(i)?{panel:e,tab:e.querySelector("."+a),tabpanel:e.querySelector("."+u)}:{panel:e.parentNode,tab:e.parentNode.querySelector("."+a),tabpanel:e.parentNode.querySelector("."+u)}:{panel:null,tab:null,tabpanel:null}};_.prototype.commandHandler_=function(e){e.preventDefault(),e.stopPropagation(),e&&e.detail&&this.command(e.detail)},_.prototype.dispatchToggleEvent_=function(e,t,n){var i=new CustomEvent("toggle",{bubbles:!0,cancelable:!0,detail:{state:e,tab:t,tabpanel:n}});this.element_.dispatchEvent(i)},_.prototype.openTab_=function(e,t,n){e.classList.add(s.IS_EXPANDED),t.setAttribute(s.ARIA_EXPANDED,"true"),n.removeAttribute("hidden"),n.setAttribute(s.ARIA_HIDDEN,"false"),this.dispatchToggleEvent_("open",t,n)},_.prototype.closeTab_=function(e,t,n){e.classList.remove(s.IS_EXPANDED),t.setAttribute(s.ARIA_EXPANDED,"false"),n.setAttribute("hidden",""),n.setAttribute(s.ARIA_HIDDEN,"true"),this.dispatchToggleEvent_("close",t,n)},_.prototype.toggleTab_=function(e,t,n){this.element_.hasAttribute("disabled")||t.hasAttribute("disabled")||("true"===t.getAttribute(s.ARIA_EXPANDED).toLowerCase()?this.closeTab_(e,t,n):("true"!==this.element_.getAttribute(s.ARIA_MULTISELECTABLE).toLowerCase()&&this.closeTabs_(),this.openTab_(e,t,n)))},_.prototype.openTabs_=function(){var t=this;"true"===this.element_.getAttribute(s.ARIA_MULTISELECTABLE).toLowerCase()&&[].concat((0,o.default)(this.element_.querySelectorAll("."+e+" > ."+i))).filter(function(e){return!e.classList.contains(s.IS_EXPANDED)}).forEach(function(e){var n=e.querySelector("."+a);n.hasAttribute("disabled")||t.openTab_(e,n,e.querySelector("."+u))})},_.prototype.closeTabs_=function(){var t=this;[].concat((0,o.default)(this.element_.querySelectorAll("."+e+" > ."+i+"."+s.IS_EXPANDED))).forEach(function(e){var n=e.querySelector("."+a);n.hasAttribute("disabled")||t.closeTab_(e,n,e.querySelector("."+u))})},_.prototype.upgradeTab=function(e){var t=this,u=v(e),_=u.panel,g=u.tab,b=u.tabpanel,E=function(){_.classList.remove(s.IS_EXPANDED),g.setAttribute("tabindex","-1"),g.setAttribute(s.ARIA_EXPANDED,"false"),b.setAttribute("hidden",""),b.setAttribute(s.ARIA_HIDDEN,"true")},y=function(){g.hasAttribute(s.ARIA_EXPANDED)||g.setAttribute(s.ARIA_EXPANDED,"false"),g.setAttribute("tabindex","0"),"true"===g.getAttribute(s.ARIA_EXPANDED).toLowerCase()?(_.classList.add(s.IS_EXPANDED),b.removeAttribute("hidden"),b.setAttribute(s.ARIA_HIDDEN,"false")):(_.classList.remove(s.IS_EXPANDED),b.setAttribute("hidden",""),b.setAttribute(s.ARIA_HIDDEN,"true"))},A=function(){var e=g.querySelector("."+l);if(null!==e){var t=[].concat((0,o.default)(g.children)).filter(function(e){return e.classList&&!e.classList.contains(l)}).reduce(function(e,t){return e+t.offsetWidth},0),n=g.clientHeight-t;n>0&&(e.style["max-width"]=n+"px")}},w=function(){g.hasAttribute(s.ARIA_SELECTED)||([].concat((0,o.default)(t.element_.querySelectorAll("."+a+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute(s.ARIA_SELECTED)}),g.setAttribute(s.ARIA_SELECTED,"true"))},L=function(){t.toggleTab_(_,g,b),w()},S=function(){w()},x=function(){w()},k=function(){w()},D=function(e){if(!t.element_.hasAttribute("disabled"))if(e.keyCode===s.VK_END||e.keyCode===s.VK_HOME||e.keyCode===s.VK_ARROW_UP||e.keyCode===s.VK_ARROW_LEFT||e.keyCode===s.VK_ARROW_DOWN||e.keyCode===s.VK_ARROW_RIGHT){var n=null,r=e.keyCode;if(r===s.VK_HOME?(n=t.element_.querySelector("."+i+":first-child > ."+a),n&&n.hasAttribute("disabled")&&(n=null,r=s.VK_ARROW_DOWN)):r===s.VK_END&&(n=t.element_.querySelector("."+i+":last-child > ."+a),n&&n.hasAttribute("disabled")&&(n=null,r=s.VK_ARROW_UP)),!n){var l=_;do{if(r===s.VK_ARROW_UP||r===s.VK_ARROW_LEFT?(l=l.previousElementSibling,l||(l=t.element_.querySelector("."+i+":last-child")),l&&(n=l.querySelector("."+i+" > ."+a))):r!==s.VK_ARROW_DOWN&&r!==s.VK_ARROW_RIGHT||(l=l.nextElementSibling,l||(l=t.element_.querySelector("."+i+":first-child")),l&&(n=l.querySelector("."+i+" > ."+a))),!n||!n.hasAttribute("disabled"))break;n=null}while(l!==_)}n&&(e.preventDefault(),e.stopPropagation(),n.focus(),n.hasAttribute(s.ARIA_SELECTED)||([].concat((0,o.default)(t.element_.querySelectorAll("."+a+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute(s.ARIA_SELECTED)}),n.setAttribute(s.ARIA_SELECTED,"true")))}else e.keyCode!==s.VK_ENTER&&e.keyCode!==s.VK_SPACE||(e.preventDefault(),e.stopPropagation(),t.toggleTab_(_,g,b))};if(null===g)throw new Error("There must be a tab element for each accordion panel.");if(null===b)throw new Error("There must be a tabpanel element for each accordion panel.");_.setAttribute("role",r),g.setAttribute("role",c),b.setAttribute("role",d),g.hasAttribute("disabled")?E():y(),this.element_.classList.contains(n)&&A(),this.element_.classList.contains(f)&&g.classList.add(h),this.element_.classList.contains(p)&&b.classList.add(m),g.removeEventListener("click",L),g.removeEventListener("focus",S),g.removeEventListener("keydown",D),b.removeEventListener("click",x),b.removeEventListener("focus",k),g.addEventListener("click",L),g.addEventListener("focus",S),g.addEventListener("keydown",D),b.addEventListener("click",x,!0),b.addEventListener("focus",k,!0)},_.prototype.upgradeTab=_.prototype.upgradeTab,_.prototype.command=function(e){var t=this,n=function(e){if(void 0===e)t.openTabs_();else if(null!==e){var n=v(e),i=n.panel,r=n.tab,o=n.tabpanel;"true"!==r.getAttribute(s.ARIA_EXPANDED).toLowerCase()&&t.toggleTab_(i,r,o)}},i=function(e){if(void 0===e)t.closeTabs_();else if(null!==e){var n=v(e),i=n.panel,r=n.tab,o=n.tabpanel;"true"===r.getAttribute(s.ARIA_EXPANDED).toLowerCase()&&t.toggleTab_(i,r,o)}},r=function(e){if(e){var n=v(e),i=n.panel,r=n.tab,o=n.tabpanel;t.toggleTab_(i,r,o)}};if(e&&e.action){var o=e.action,a=e.target;switch(o.toLowerCase()){case"open":n(a);break;case"close":i(a);break;case"toggle":r(a);break;case"upgrade":a&&this.upgradeTab(a);break;default:throw new Error('Unknown action "'+o+'". Action must be one of "open", "close", "toggle" or "upgrade"')}}},_.prototype.command=_.prototype.command,_.prototype.init=function(){var r=this;if(this.element_){if(!this.element_.classList.contains(n)&&!this.element_.classList.contains(t))throw new Error('Accordion must have one of the classes "'+n+'" or "'+t+'"');this.element_.setAttribute("role","tablist"),this.element_.hasAttribute(s.ARIA_MULTISELECTABLE)||this.element_.setAttribute(s.ARIA_MULTISELECTABLE,"false"),this.element_.removeEventListener("command",this.commandHandler_),this.element_.addEventListener("command",this.commandHandler_.bind(this),!1),[].concat((0,o.default)(this.element_.querySelectorAll("."+e+" > ."+i))).forEach(function(e){return r.upgradeTab(e)}),this.element_.classList.add(s.IS_UPGRADED)}},componentHandler.register({constructor:_,classAsString:"MaterialExtAccordion",cssClass:"mdlext-js-accordion",widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(32),o=i(r),s=n(8),a=i(s),l=n(33),c=i(l),u=n(30),d=i(u),f=n(29),h=n(14),p=n(2),m="mdlext-carousel__slide__ripple-container";!function(){var e="mdlext-carousel__slide",t="list",n="listitem",i=function(e){this.element_=e,this.config_={interactive:!0,autostart:!1,type:"slide",interval:1e3,animationLoop:(0,d.default)(1e3)},this.scrollAnimation_=(0,d.default)(33),this.init()};window.MaterialExtCarousel=i,i.prototype.startSlideShow_=function(){var t=this,n=function(){var n=t.element_.querySelector("."+e+"[aria-selected]");return n&&(n.removeAttribute("aria-selected"),n=n.nextElementSibling),n||(n=t.element_.querySelector("."+e+":first-child"),t.animateScroll_(0)),!!n&&(t.moveSlideIntoViewport_(n),n.setAttribute("aria-selected",""),t.emitSelectEvent_("next",null,n),!0)},i=function(e){var n=e;"next"===e&&t.element_.scrollLeft===t.element_.scrollWidth-t.element_.clientWidth?n="prev":0===t.element_.scrollLeft&&(n="next");var i="next"===n?Math.min(t.element_.scrollLeft+t.element_.clientWidth,t.element_.scrollWidth-t.element_.clientWidth):Math.max(t.element_.scrollLeft-t.element_.clientWidth,0);return t.animateScroll_(i,1e3),n};this.config_.animationLoop.started||!function(){t.config_.animationLoop.interval=t.config_.interval;var e="next";"scroll"===t.config_.type?t.config_.animationLoop.start(function(){return e=i(e),!0}):(n(),t.config_.animationLoop.start(function(){return n()}))}()},i.prototype.cancelSlideShow_=function(){this.config_.animationLoop.started&&(this.config_.animationLoop.stop(),this.emitSelectEvent_("pause",p.VK_ESC,this.element_.querySelector("."+e+"[aria-selected]")))},i.prototype.animateScroll_=function(e,t,n){var i=this,r=this.element_.scrollLeft,o=e-r;0!==o?!function(){var s=Math.max(Math.min(Math.abs(o),t||400),100),a=0;i.scrollAnimation_.stop(),i.scrollAnimation_.start(function(t){return a+=t,a<s?(i.element_.scrollLeft=(0,f.inOutQuintic)(a,r,o,s),!0):(i.element_.scrollLeft=e,n&&n(),!1)})}():n&&n()},i.prototype.command_=function(t){var n=this,i=0,r=null,o=t.detail.action.toLowerCase();switch(this.cancelSlideShow_(),o){case"first":r=this.element_.querySelector("."+e+":first-child");break;case"last":i=this.element_.scrollWidth-this.element_.clientWidth,r=this.element_.querySelector("."+e+":last-child");break;case"scroll-prev":i=Math.max(this.element_.scrollLeft-this.element_.clientWidth,0);break;case"scroll-next":i=Math.min(this.element_.scrollLeft+this.element_.clientWidth,this.element_.scrollWidth-this.element_.clientWidth);break;case"next":case"prev":return r=this.element_.querySelector("."+e+"[aria-selected]"),void(r&&(r="next"===o?r.nextElementSibling:r.previousElementSibling,this.setAriaSelected_(r),this.emitSelectEvent_(o,null,r)));case"play":return(0,c.default)(this.config_,t.detail),void this.startSlideShow_();case"pause":return;default:return}this.animateScroll_(i,void 0,function(){if("scroll-next"===o||"scroll-prev"===o){var e=n.getSlidesInViewport_();e.length>0&&(r="scroll-next"===o?e[0]:e[e.length-1])}n.setAriaSelected_(r),n.emitSelectEvent_(o,null,r)})},i.prototype.commandHandler_=function(e){e.preventDefault(),e.stopPropagation(),e.detail&&e.detail.action&&this.command_(e)},i.prototype.keyDownHandler_=function(e){if(e&&e.target&&e.target!==this.element_){var t="first";if(e.keyCode===p.VK_HOME||e.keyCode===p.VK_END||e.keyCode===p.VK_PAGE_UP||e.keyCode===p.VK_PAGE_DOWN){e.preventDefault(),e.keyCode===p.VK_END?t="last":e.keyCode===p.VK_PAGE_UP?t="scroll-prev":e.keyCode===p.VK_PAGE_DOWN&&(t="scroll-next");var n=new CustomEvent("select",{detail:{action:t}});this.command_(n)}else if(e.keyCode===p.VK_TAB||e.keyCode===p.VK_ENTER||e.keyCode===p.VK_SPACE||e.keyCode===p.VK_ARROW_UP||e.keyCode===p.VK_ARROW_LEFT||e.keyCode===p.VK_ARROW_DOWN||e.keyCode===p.VK_ARROW_RIGHT){var i=r(e.target);if(!i)return;switch(this.cancelSlideShow_(),e.keyCode){case p.VK_ARROW_UP:case p.VK_ARROW_LEFT:t="prev",i=i.previousElementSibling;break;case p.VK_ARROW_DOWN:case p.VK_ARROW_RIGHT:t="next",i=i.nextElementSibling;break;case p.VK_TAB:e.shiftKey?(t="prev",i=i.previousElementSibling):(t="next",i=i.nextElementSibling);break;case p.VK_SPACE:case p.VK_ENTER:t="select"}i&&(e.preventDefault(),s(i),this.emitSelectEvent_(t,e.keyCode,i))}}},i.prototype.dragHandler_=function(e){var t=this;e.preventDefault(),this.cancelSlideShow_();var n=!1,i=0,o=e.clientX||(void 0!==e.touches?e.touches[0].clientX:0),a=o,l=e.target,c=function(e){var i=e.clientX||(void 0!==e.touches?e.touches[0].clientX:0),r=a-i;r<0?t.element_.scrollLeft=Math.max(t.element_.scrollLeft+r,0):r>0&&(t.element_.scrollLeft=Math.min(t.element_.scrollLeft+r,t.element_.scrollWidth-t.element_.clientWidth)),a=i,n=!1},u=function(e){e.preventDefault(),n||(i=window.requestAnimationFrame(function(){return c(e)}),n=!0)},d=function e(n){n.preventDefault(),t.element_.removeEventListener("mousemove",u),t.element_.removeEventListener("touchmove",u),window.removeEventListener("mouseup",e),window.removeEventListener("touchend",e),window.cancelAnimationFrame(i);var o=r(l);s(o),t.emitSelectEvent_("click",null,o)};this.element_.addEventListener("mousemove",u),this.element_.addEventListener("touchmove",u),window.addEventListener("mouseup",d),window.addEventListener("touchend",d)},i.prototype.clickHandler_=function(e){e.preventDefault()},i.prototype.focusHandler_=function(e){var t=r(e.target);t&&(this.setAriaSelected_(t),t.classList.add(p.IS_FOCUSED))},i.prototype.blurHandler_=function(e){var t=r(e.target);t&&t.classList.remove(p.IS_FOCUSED)},i.prototype.emitSelectEvent_=function(e,t,n){if(n){this.moveSlideIntoViewport_(n);var i=new CustomEvent("select",{bubbles:!0,cancelable:!0,detail:{command:e,keyCode:t,source:n}});this.element_.dispatchEvent(i)}},i.prototype.getSlidesInViewport_=function(){var t=this.element_.getBoundingClientRect(),n=[].concat((0,a.default)(this.element_.querySelectorAll("."+e))).filter(function(e){var n=e.getBoundingClientRect();return n.left>=t.left&&n.right<=t.right});return n},i.prototype.moveSlideIntoViewport_=function(e){var t=this.element_.getBoundingClientRect(),n=e.getBoundingClientRect();if(n.left<t.left){var i=this.element_.scrollLeft-(t.left-n.left);this.animateScroll_(i)}else if(n.right>t.right){var r=this.element_.scrollLeft-(t.right-n.right);this.animateScroll_(r)}},i.prototype.setAriaSelected_=function(t){t&&([].concat((0,a.default)(this.element_.querySelectorAll("."+e+"[aria-selected]"))).forEach(function(e){return e.removeAttribute("aria-selected")}),t.setAttribute("aria-selected",""))},i.prototype.removeListeners_=function(){this.element_.removeEventListener("focus",this.focusHandler_),this.element_.removeEventListener("blur",this.blurHandler_),this.element_.removeEventListener("keydown",this.keyDownHandler_),this.element_.removeEventListener("mousedown",this.dragHandler_),this.element_.removeEventListener("touchstart",this.dragHandler_),this.element_.removeEventListener("click",this.clickHandler_,!1),this.element_.removeEventListener("command",this.commandHandler_),this.element_.removeEventListener("mdl-componentdowngraded",this.mdlDowngrade_)};var r=function(t){return t.closest("."+e)},s=function(e){e&&e.focus()},l=function(e){if(!e.querySelector("."+m)){var t=document.createElement("span");t.classList.add(m),t.classList.add(p.MDL_RIPPLE_EFFECT);var n=document.createElement("span");n.classList.add(p.MDL_RIPPLE),t.appendChild(n);var i=e.querySelector("img");i&&(t.title=i.title),e.appendChild(t),componentHandler.upgradeElement(t,p.MDL_RIPPLE_COMPONENT)}};i.prototype.stopAnimation=function(){this.config_.animationLoop.stop()},i.prototype.stopAnimation=i.prototype.stopAnimation,i.prototype.upgradeSlides=function(){var t=this,i=this.element_.classList.contains(p.MDL_RIPPLE_EFFECT);[].concat((0,a.default)(this.element_.querySelectorAll("."+e))).forEach(function(e){e.setAttribute("role",n),t.config_.interactive?(e.getAttribute("tabindex")||e.setAttribute("tabindex","0"),i&&l(e)):e.setAttribute("tabindex","-1")})},i.prototype.upgradeSlides=i.prototype.upgradeSlides,i.prototype.getConfig=function(){return this.config_},i.prototype.getConfig=i.prototype.getConfig,i.prototype.init=function(){if(this.element_){if(this.element_.hasAttribute("data-config")&&(this.config_=(0,h.jsonStringToObject)(this.element_.getAttribute("data-config"),this.config_)),this.element_.setAttribute("role",t),(0,o.default)(this.element_.getAttribute("tabindex"))||this.element_.setAttribute("tabindex",-1),this.removeListeners_(),this.config_.interactive){var e=this.element_.classList.contains(p.MDL_RIPPLE_EFFECT);e&&this.element_.classList.add(p.MDL_RIPPLE_EFFECT_IGNORE_EVENTS),this.element_.addEventListener("focus",this.focusHandler_.bind(this),!0),this.element_.addEventListener("blur",this.blurHandler_.bind(this),!0),this.element_.addEventListener("keydown",this.keyDownHandler_.bind(this),!1),this.element_.addEventListener("mousedown",this.dragHandler_.bind(this),!1),this.element_.addEventListener("touchstart",this.dragHandler_.bind(this),!1),this.element_.addEventListener("click",this.clickHandler_.bind(this),!1)}this.element_.addEventListener("command",this.commandHandler_.bind(this),!1),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)),this.upgradeSlides(),this.element_.classList.add(p.IS_UPGRADED),this.config_.autostart&&this.startSlideShow_()}},i.prototype.mdlDowngrade_=function(){this.stopAnimation(),this.removeListeners_()},componentHandler.register({constructor:i,classAsString:"MaterialExtCarousel",cssClass:"mdlext-js-carousel",widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(22),o=i(r),s=n(23),a=i(s),l=n(2),c=n(15),u=n(21),d="mdlext-js-collapsible",f="mdlext-collapsible",h="mdlext-collapsible-group",p="mdlext-collapsible-region",m=function(){function e(t){var n=this;(0,o.default)(this,e),this.element_=null,this.controlElement_=null,this.keyDownHandler=function(e){e.keyCode!==l.VK_ENTER&&e.keyCode!==l.VK_SPACE||(e.preventDefault(),(e.target||n.controlElement).dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})))},this.clickHandler=function(e){if(!n.isDisabled){if(e.target!==n.controlElement){var t=(0,u.getParentElements)(e.target,n.controlElement);if(t.push(e.target),
t.find(function(e){return(0,u.isFocusable)(e)}))return}n.toggle()}},this.element_=t,this.init()}return(0,a.default)(e,[{key:"collapse",value:function(){if(!this.isDisabled&&this.isExpanded&&this.dispatchToggleEvent("collapse")){this.controlElement.setAttribute("aria-expanded","false");for(var e=this.regionElements.slice(0),t=e.length-1;t>=0;--t)e[t].setAttribute("hidden","")}}},{key:"expand",value:function(){this.isDisabled||this.isExpanded||this.dispatchToggleEvent("expand")&&(this.controlElement.setAttribute("aria-expanded","true"),this.regionElements.forEach(function(e){return e.removeAttribute("hidden")}))}},{key:"toggle",value:function(){this.isExpanded?this.collapse():this.expand()}},{key:"dispatchToggleEvent",value:function(e){return this.element.dispatchEvent(new CustomEvent("toggle",{bubbles:!0,cancelable:!0,detail:{action:e}}))}},{key:"disableToggle",value:function(){this.controlElement.setAttribute("aria-disabled",!0)}},{key:"enableToggle",value:function(){this.controlElement.removeAttribute("aria-disabled")}},{key:"addRegionId",value:function(e){var t=this.regionIds;t.find(function(t){return e===t})||(t.push(e),this.controlElement.setAttribute("aria-controls",t.join(" ")))}},{key:"addRegionElement",value:function(e){if(e.classList.contains(h)||e.classList.contains(p)||e.classList.add(h),!e.hasAttribute("role")){var t=e.classList.contains(h)?"group":"region";e.setAttribute("role",t)}e.hasAttribute("id")||(e.id=e.getAttribute("role")+"-"+(0,c.randomString)()),this.isExpanded?e.removeAttribute("hidden"):e.setAttribute("hidden",""),this.addRegionId(e.id)}},{key:"removeRegionElement",value:function(e){if(e&&e.id){var t=this.regionIds.filter(function(t){return t===e.id});this.controlElement.setAttribute("aria-controls",t.join(" "))}}},{key:"removeListeners",value:function(){this.controlElement.removeEventListener("keydown",this.keyDownHandler),this.controlElement.removeEventListener("click",this.clickHandler)}},{key:"init",value:function(){var e=this,t=function(){e.controlElement_=e.element.querySelector("."+f)||e.element,e.controlElement.hasAttribute("aria-expanded")||e.controlElement.setAttribute("aria-expanded","false"),"button"!==e.controlElement.nodeName.toLowerCase()&&e.controlElement.setAttribute("role","button"),(0,u.isFocusable)(e.controlElement)||e.controlElement.hasAttribute("tabindex")||e.controlElement.setAttribute("tabindex","0")},n=function(){var t=[];if(e.controlElement.hasAttribute("aria-controls"))t=e.regionElements;else for(var n=e.element.nextElementSibling;n;){if(n.classList.contains(h)||n.classList.contains(p))t.push(n);else if(n.classList.contains(d))break;n=n.nextElementSibling}t.forEach(function(t){return e.addRegionElement(t)})},i=function(){e.controlElement.addEventListener("keydown",e.keyDownHandler),e.controlElement.addEventListener("click",e.clickHandler)};t(),n(),this.removeListeners(),i()}},{key:"downgrade",value:function(){this.removeListeners()}},{key:"element",get:function(){return this.element_}},{key:"controlElement",get:function(){return this.controlElement_}},{key:"isDisabled",get:function(){return this.controlElement.hasAttribute("disabled")&&"false"!==this.controlElement.getAttribute("disabled").toLowerCase()||this.controlElement.hasAttribute("aria-disabled")&&"false"!==this.controlElement.getAttribute("aria-disabled").toLowerCase()}},{key:"isExpanded",get:function(){return this.controlElement.hasAttribute("aria-expanded")&&"true"===this.controlElement.getAttribute("aria-expanded").toLowerCase()}},{key:"regionIds",get:function(){return this.controlElement.hasAttribute("aria-controls")?this.controlElement.getAttribute("aria-controls").split(" "):[]}},{key:"regionElements",get:function(){return this.regionIds.map(function(e){return document.querySelector("#"+e)}).filter(function(e){return null!=e})}}]),e}();!function(){var e=function(e){this.element_=e,this.collapsible=null,this.init()};window.MaterialExtCollapsible=e,e.prototype.init=function(){this.element_&&(this.collapsible=new m(this.element_),this.element_.classList.add(l.IS_UPGRADED),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)))},e.prototype.mdlDowngrade_=function(){this.collapsible.downgrade()},e.prototype.getControlElement=function(){return this.collapsible.controlElement},e.prototype.getControlElement=e.prototype.getControlElement,e.prototype.getRegionElements=function(){return this.collapsible.regionElements},e.prototype.getRegionElements=e.prototype.getRegionElements,e.prototype.addRegionElements=function(){for(var e=this,t=arguments.length,n=Array(t),i=0;i<t;i++)n[i]=arguments[i];n.forEach(function(t){return e.collapsible.addRegionElement(t)})},e.prototype.addRegionElements=e.prototype.addRegionElements,e.prototype.removeRegionElements=function(){for(var e=this,t=arguments.length,n=Array(t),i=0;i<t;i++)n[i]=arguments[i];n.forEach(function(t){return e.collapsible.removeRegionElement(t)})},e.prototype.removeRegionElements=e.prototype.removeRegionElements,e.prototype.expand=function(){this.collapsible.expand()},e.prototype.expand=e.prototype.expand,e.prototype.collapse=function(){this.collapsible.collapse()},e.prototype.collapse=e.prototype.collapse,e.prototype.toggle=function(){this.collapsible.toggle()},e.prototype.toggle=e.prototype.toggle,e.prototype.isExpanded=function(){return this.collapsible.isExpanded},e.prototype.isExpanded=e.prototype.isExpanded,e.prototype.isDisabled=function(){return this.collapsible.isDisabled},e.prototype.isDisabled=e.prototype.isDisabled,e.prototype.disableToggle=function(){this.collapsible.disableToggle()},e.prototype.disableToggle=e.prototype.disableToggle,e.prototype.enableToggle=function(){this.collapsible.enableToggle()},e.prototype.enableToggle=e.prototype.enableToggle,componentHandler.register({constructor:e,classAsString:"MaterialExtCollapsible",cssClass:d,widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r,o,s=n(22),a=i(s),l=n(23),c=i(l),u=n(14),d=n(2),f="mdlext-js-formatfield",h="MaterialExtFormatfield",p=function(){return navigator.languages?navigator.languages[0]:navigator.language||navigator.userLanguage},m=(o=r=function(){function e(t){var n=this;(0,a.default)(this,e),this.options_={},this.clickHandler=function(){clearTimeout(e.timer)},this.focusInHandler=function(){n.input.readOnly||n.input.disabled||(n.input.value=n.unformatInput(),e.timer=setTimeout(function(){return n.input.select()},200))},this.focusOutHandler=function(){clearTimeout(e.timer),n.input.readOnly||n.input.disabled||n.formatValue()},this.element_=t,this.init()}return(0,c.default)(e,[{key:"stripSeparatorsFromValue",value:function(){var e=this,t=function(){return e.input.value.replace(/\s/g,"").replace(new RegExp(e.options.groupSeparator,"g"),"").replace(e.options.decimalSeparator,".")};return this.input.value?t():this.input.value}},{key:"fixSeparators",value:function(e){var t=this,n=function(){return e.replace(new RegExp(t.intlGroupSeparator_,"g"),t.options.groupSeparator).replace(t.intlDecimalSeparator_,t.options.decimalSeparator)};return e?n():e}},{key:"formatValue",value:function(){if(this.input.value){var e=new Intl.NumberFormat(this.options.locales,this.options).format(this.stripSeparatorsFromValue());"NaN"!==e&&(this.input.value=this.fixSeparators(e))}}},{key:"unformat",value:function(){var e=this,t=function(){return e.input.value.replace(/\s/g,"").replace(new RegExp(e.options.groupSeparator,"g"),"").replace(e.options.decimalSeparator,".")};return this.input.value?t():this.input.value}},{key:"unformatInput",value:function(){var e=this,t=function(){return e.input.value.replace(/\s/g,"").replace(new RegExp(e.options.groupSeparator,"g"),"")};return this.input.value?t():this.input.value}},{key:"removeListeners",value:function(){this.input.removeEventListener("click",this.clickHandler),this.input.removeEventListener("focusin",this.focusInHandler),this.input.removeEventListener("focusout",this.focusOutHandler)}},{key:"init",value:function(){var e=this,t=function(){e.input.addEventListener("click",e.clickHandler),e.input.addEventListener("focusin",e.focusInHandler),e.input.addEventListener("focusout",e.focusOutHandler)},n=function(){var t=e.element.getAttribute("data-formatfield-options")||e.input.getAttribute("data-formatfield-options");t&&(e.options_=(0,u.jsonStringToObject)(t,e.options))},i=function(){e.options.locales||(e.options.locales=p()||"en-US")},r=function(){var t=1234.5.toLocaleString(e.options.locales,{style:"decimal",useGrouping:!0,minimumFractionDigits:1,maximumFractionDigits:1});if(e.intlGroupSeparator_=t.charAt(1),e.intlDecimalSeparator_=t.charAt(t.length-2),e.options.groupSeparator=e.options.groupSeparator||e.intlGroupSeparator_,e.options.decimalSeparator=e.options.decimalSeparator||e.intlDecimalSeparator_,e.options.groupSeparator===e.options.decimalSeparator){var n='Error! options.groupSeparator, "'+e.options.groupSeparator+'" and options.decimalSeparator, '+('"'+e.options.decimalSeparator+'" should not be equal');throw new Error(n)}};this.input_=this.element.querySelector("input")||this.element,n(),i(),r(),this.formatValue(),t()}},{key:"downgrade",value:function(){this.removeListeners()}},{key:"element",get:function(){return this.element_}},{key:"input",get:function(){return this.input_}},{key:"options",get:function(){return this.options_}}]),e}(),r.timer=null,o);!function(){var e=function(e){this.element_=e,this.formatField_=null,this.init()};window.MaterialExtFormatfield=e,e.prototype.init=function(){this.element_&&(this.element_.classList.add(d.IS_UPGRADED),this.formatField_=new m(this.element_),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)))},e.prototype.getOptions=function(){return this.formatField_.options},e.prototype.getOptions=e.prototype.getOptions,e.prototype.getUnformattedValue=function(){return this.formatField_.unformat()},e.prototype.getUnformattedValue=e.prototype.getUnformattedValue,e.prototype.mdlDowngrade_=function(){this.formatField_.downgrade()},componentHandler.register({constructor:e,classAsString:h,cssClass:f,widget:!0})}()},function(e,t,n){"use strict";n(59),n(49),n(51),n(50),n(54),n(55),n(56),n(57),n(52),n(58)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(8),o=i(r),s=n(2),a="mdlext-lightboard__slide__ripple-container";!function(){var e="grid",t="mdlext-lightboard__slide",n="gridcell",i="mdlext-lightboard__slide__frame",r=function(e){this.element_=e,this.init()};window.MaterialExtLightboard=r;var l=function(e){return e?e.closest("."+t):null};r.prototype.selectSlide_=function(e){var n=l(e);n&&!n.hasAttribute("aria-selected")&&([].concat((0,o.default)(this.element_.querySelectorAll("."+t+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute("aria-selected")}),n.setAttribute("aria-selected","true"))},r.prototype.dispatchSelectEvent_=function(e){this.element_.dispatchEvent(new CustomEvent("select",{bubbles:!0,cancelable:!0,detail:{source:e}}))},r.prototype.commandHandler_=function(e){e.preventDefault(),e.stopPropagation(),e&&e.detail&&this.command(e.detail)},r.prototype.upgradeSlides=function(){var e=function(e){if(!e.querySelector("."+a)){var t=e.querySelector("."+i);if(t){var n=t;n.classList.add(a),n.classList.add(s.MDL_RIPPLE_EFFECT);var r=document.createElement("span");r.classList.add(s.MDL_RIPPLE),n.appendChild(r),componentHandler.upgradeElement(n,s.MDL_RIPPLE_COMPONENT)}}},r=this.element_.classList.contains(s.MDL_RIPPLE_EFFECT);[].concat((0,o.default)(this.element_.querySelectorAll("."+t))).forEach(function(t){t.setAttribute("role",n),t.querySelector("a")||t.setAttribute("tabindex","0"),r&&e(t)})},r.prototype.upgradeSlides=r.prototype.upgradeSlides,r.prototype.command=function(e){var n=this,i=function(){return n.element_.querySelector("."+t+":first-child")},r=function(){return n.element_.querySelector("."+t+":last-child")},o=function(){var e=n.element_.querySelector("."+t+'[aria-selected="true"]').nextElementSibling;return e?e:i()},s=function(){var e=n.element_.querySelector("."+t+'[aria-selected="true"]').previousElementSibling;return e?e:r()};if(e&&e.action){var a=e.action,c=e.target,u=void 0;switch(a.toLowerCase()){case"select":u=l(c),this.dispatchSelectEvent_(u);break;case"first":u=i();break;case"next":u=o();break;case"prev":u=s();break;case"last":u=r();break;case"upgrade":this.upgradeSlides();break;default:throw new Error('Unknown action "'+a+'". Action must be one of "first", "next", "prev", "last", "select" or "upgrade"')}if(u){var d=u.querySelector("a");d?d.focus():u.focus(),u.hasAttribute("aria-selected")||this.selectSlide_(u)}}},r.prototype.command=r.prototype.command,r.prototype.init=function(){var t=this,n=function(e){if(e.target!==t.element_){var n=void 0,i=void 0;switch(e.keyCode){case s.VK_HOME:n="first";break;case s.VK_END:n="last";break;case s.VK_ARROW_UP:case s.VK_ARROW_LEFT:n="prev";break;case s.VK_ARROW_DOWN:case s.VK_ARROW_RIGHT:n="next";break;case s.VK_ENTER:case s.VK_SPACE:n="select",i=e.target}n&&(e.preventDefault(),e.stopPropagation(),t.command({action:n,target:i}))}},i=function(e){e.preventDefault(),e.stopPropagation(),e.target!==t.element_&&t.command({action:"select",target:e.target})},r=function(e){e.preventDefault(),e.stopPropagation(),e.target!==t.element_&&t.selectSlide_(e.target)};this.element_&&(this.element_.setAttribute("role",e),this.element_.classList.contains(s.MDL_RIPPLE_EFFECT)&&this.element_.classList.add(s.MDL_RIPPLE_EFFECT_IGNORE_EVENTS),this.element_.removeEventListener("command",this.commandHandler_),this.element_.removeEventListener("keydown",n),this.element_.removeEventListener("click",i),this.element_.removeEventListener("focus",r),this.element_.addEventListener("command",this.commandHandler_.bind(this),!1),this.element_.addEventListener("keydown",n,!0),this.element_.addEventListener("click",i,!0),this.element_.addEventListener("focus",r,!0),this.upgradeSlides(),this.element_.classList.add(s.IS_UPGRADED))},componentHandler.register({constructor:r,classAsString:"MaterialExtLightboard",cssClass:"mdlext-js-lightboard",widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(8),o=i(r),s=n(32),a=i(s),l=n(67),c=i(l),u=n(64),d=i(u),f=n(31),h=i(f),p=n(13),m=i(p),_=n(2);!function(){var e="mdlext-lightbox",t="mdlext-lightbox__slider",n="mdlext-lightbox__slider__slide",i="mdlext-lightbox--sticky-footer",r="mdl-button",s=function(e){this.element_=e,this.init()};window.MaterialExtLightbox=s,s.prototype.keyDownHandler_=function(e){if(e&&(e.keyCode===_.VK_ESC||e.keyCode===_.VK_SPACE||e.keyCode===_.VK_END||e.keyCode===_.VK_HOME||e.keyCode===_.VK_ARROW_UP||e.keyCode===_.VK_ARROW_LEFT||e.keyCode===_.VK_ARROW_DOWN||e.keyCode===_.VK_ARROW_RIGHT)){e.keyCode!==_.VK_ESC&&(e.preventDefault(),e.stopPropagation());var t="first";e.keyCode===_.VK_END?t="last":e.keyCode===_.VK_ARROW_UP||e.keyCode===_.VK_ARROW_LEFT?t="prev":e.keyCode===_.VK_ARROW_DOWN||e.keyCode===_.VK_ARROW_RIGHT?t="next":e.keyCode===_.VK_SPACE?t="select":e.keyCode===_.VK_ESC&&(t="cancel"),l(t,this)}},s.prototype.buttonClickHandler_=function(t){if(t){t.preventDefault(),t.stopPropagation(),l(this.getAttribute("data-action")||"",this);var n=this.closest("."+e);n&&n.focus()}};var l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t;n.dispatchEvent(new CustomEvent("action",{bubbles:!0,cancelable:!0,detail:{action:e||"",source:t}}))},u=function(e){var t=function(e,t){return t&&e?e.offsetHeight:0},n=function(e,t){if("absolute"===window.getComputedStyle(e).position){var n=document.body.scrollTop||document.documentElement.scrollTop,i=n+(window.innerHeight-e.offsetHeight-t)/2;e.style.top=Math.max(n,i)+"px"}},r=e.parentNode,o=r&&"DIALOG"===r.nodeName?r:null;if(o&&o.hasAttribute("open")){e.style.width="auto",e.style.maxWidth="100%";var s=e.querySelector("img");s&&(e.style.maxWidth=void 0!==s.naturalWidth?s.naturalWidth+"px":s.width+"px"||"100%");var a=t(e.querySelector("footer"),e.classList.contains(i)),l=Math.max(document.documentElement.clientHeight,window.innerHeight||0)-a;if(o.offsetHeight>l)for(var c=0;o.offsetHeight>l&&++c<4;)e.style.width=e.offsetWidth*l/e.offsetHeight+"px";n(o,a)}};s.prototype.imgLoadHandler_=function(){u(this)},s.prototype.imgDragHandler_=function(e){var i=function(e,t){var n=!0,i=!1,r=void 0;try{for(var o,s=(0,h.default)((0,d.default)(t));!(n=(o=s.next()).done);n=!0){var a=(0,c.default)(o.value,2),l=a[0],u=a[1];e.style[l]=u}}catch(e){i=!0,r=e}finally{try{!n&&s.return&&s.return()}finally{if(i)throw r}}};e.preventDefault();var r=e.clientX||(void 0!==e.touches?e.touches[0].clientX:0),o=this;o.style.opacity="0.2";var s=document.createElement("div");s.classList.add(t),i(s,{width:o.offsetWidth+"px",height:o.offsetHeight+"px"});var a=document.createElement("div");a.classList.add(n),a.textContent=">",i(a,{width:o.offsetWidth+"px",height:o.offsetHeight+"px","line-height":o.offsetHeight+"px","font-size":o.offsetHeight/4+"px","text-align":"right","background-image":'url("'+(o.getAttribute("data-img-url-prev")||"")+'")'}),s.appendChild(a),a=document.createElement("div"),a.classList.add(n),i(a,{width:o.offsetWidth+"px",height:o.offsetHeight+"px","background-image":'url("'+o.src+'")'}),s.appendChild(a),a=document.createElement("div"),a.classList.add(n),a.textContent="<",i(a,{width:o.offsetWidth+"px",height:o.offsetHeight+"px","line-height":o.offsetHeight+"px","font-size":o.offsetHeight/4+"px","text-align":"left","background-image":'url("'+(o.getAttribute("data-img-url-next")||"")+'")'}),s.appendChild(a),o.parentNode.appendChild(s);var u=function(e){e.preventDefault();var t=(e.clientX||(void 0!==e.touches?e.touches[0].clientX:0))-r;s.offsetWidth-Math.abs(t)>19&&(s.style.left=t+"px")},f=function e(t){t.preventDefault(),window.removeEventListener("mousemove",u),window.removeEventListener("touchmove",u),window.removeEventListener("mouseup",e),window.removeEventListener("touchend",e);var n=s.offsetLeft;o.parentNode.removeChild(s),o.style.opacity="1.0",Math.abs(n)>19&&l(n>0?"prev":"next",o)};window.addEventListener("mousemove",u),window.addEventListener("touchmove",u),window.addEventListener("mouseup",f),window.addEventListener("touchend",f)},s.prototype.init=function(){var e=this;if(this.element_){this.element_.addEventListener("keydown",this.keyDownHandler_.bind(this.element_),!0),(0,a.default)(this.element_.getAttribute("tabindex"))||this.element_.setAttribute("tabindex",1),[].concat((0,o.default)(this.element_.querySelectorAll("."+r))).forEach(function(t){return t.addEventListener("click",e.buttonClickHandler_.bind(t),!1)});var t=this.element_.querySelector("figcaption");t&&t.addEventListener("click",this.buttonClickHandler_.bind(t),!1);var n=this.element_.querySelector("footer");n&&n.addEventListener("click",this.buttonClickHandler_.bind(n),!1);var i=this.element_.querySelector("img");i&&(i.addEventListener("load",this.imgLoadHandler_.bind(this.element_),!1),i.addEventListener("click",function(e){return e.preventDefault()},!0),i.addEventListener("mousedown",this.imgDragHandler_.bind(i),!0),i.addEventListener("touchstart",this.imgDragHandler_.bind(i),!0)),window.addEventListener("resize",(0,m.default)(function(){return u(e.element_)})),window.addEventListener("orientationchange",function(){return u(e.element_)}),this.element_.classList.add(_.IS_UPGRADED)}},componentHandler.register({constructor:s,classAsString:"MaterialExtLightbox",cssClass:"mdlext-js-lightbox"})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(22),o=i(r),s=n(23),a=i(s),l=n(8),c=i(l),u=n(15),d=n(13),f=i(d),h=n(2),p=n(21),m="mdlext-js-menu-button",_="mdlext-menu",v="mdlext-menu__item",g="mdlext-menu__item-separator",b=function(e){var t=null,n=null,i=function(){[].concat((0,c.default)(e.querySelectorAll("."+v+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute("aria-selected")})},r=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(t||e&&!e.hasAttribute("aria-selected"))&&(i(),e&&e.setAttribute("aria-selected","true"))},o=function(){return e.querySelector("."+v+'[aria-selected="true"]')},s=function(e){return e&&e.hasAttribute("disabled")},a=function(e){return e&&e.classList.contains(g)},l=function(e){e&&(e=e.closest("."+v)),e&&e.focus()},d=function(t){var n=t.nextElementSibling;if(n||(n=e.firstElementChild),s(n)||a(n))for(var i=e.children.length;n&&i-- >0;){if(!s(n)&&!a(n)){l(n);break}n=n.nextElementSibling,n||(n=e.firstElementChild)}else l(n)},f=function(t){var n=t.previousElementSibling;if(n||(n=e.lastElementChild),s(n)||a(n))for(var i=e.children.length;n&&i-- >0;){if(!s(n)&&!a(n)){l(n);break}n=n.previousElementSibling,n||(n=e.lastElementChild)}else l(n)},b=function(){var t=e.firstElementChild;s(t)||a(t)?d(t):l(t)},E=function(){var t=e.lastElementChild;s(t)||a(t)?f(t):l(t)},y=function(e){!e||s(e)||a(e)||(r(e),R(!0,e))},A=function(e){var t=e.target.closest("."+v);switch(e.keyCode){case h.VK_ARROW_UP:case h.VK_ARROW_LEFT:t?f(t):b();break;case h.VK_ARROW_DOWN:case h.VK_ARROW_RIGHT:t?d(t):E();break;case h.VK_HOME:b();break;case h.VK_END:E();break;case h.VK_SPACE:case h.VK_ENTER:y(t);break;case h.VK_ESC:R(!0);break;case h.VK_TAB:R(!0);break;default:return}e.preventDefault()},w=function(t){var n=t.relatedTarget||t.explicitOriginalTarget||document.activeElement;try{n?n.closest("."+_)!==e&&C(n)&&R():R()}catch(e){R()}},L=function(t){t.preventDefault();var n=t.target;if(n&&n.closest("."+_)===e){var i=n.closest("."+v);i&&y(i)}else C(n)&&R()},S=function(t){var n=t.target;n&&n.closest("."+_)===e||("touchstart"===t.type&&t.preventDefault(),R())},x=function(){e.addEventListener("keydown",A,!1),e.addEventListener("blur",w,!0),e.addEventListener("click",L,!0),document.documentElement.addEventListener("touchstart",S,!0)},k=function(){e.removeEventListener("keydown",A,!1),e.removeEventListener("blur",w,!0),e.removeEventListener("click",L,!0),document.documentElement.removeEventListener("touchstart",S,!0)},D=function(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"first";t=n.closest("."+m),e.style["min-width"]=Math.max(124,n.getBoundingClientRect().width)+"px",e.removeAttribute("hidden"),(0,p.tether)(n,e);var r=void 0;switch(i.toLowerCase()){case"first":b();break;case"last":E();break;case"selected":r=o(),r&&!r.hasAttribute("disabled")?l(r):b()}x()},C=function(n){var i=!1,r=n&&n.closest("."+m)||null;return r&&r.getAttribute("aria-controls")===e.id?r!==t&&(i=!0):i=!0,i},R=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;k(),e.dispatchEvent(new CustomEvent("_closemenu",{bubbles:!0,cancelable:!0,detail:{forceFocus:t,item:n}}))},I=function(){e.hasAttribute("id")||(e.id="menu-button-"+(0,u.randomString)()),e.setAttribute("tabindex","-1"),e.setAttribute("role","menu"),e.setAttribute("hidden",""),[].concat((0,c.default)(e.querySelectorAll("."+v))).forEach(function(e){e.setAttribute("tabindex","-1"),e.setAttribute("role","menuitem")}),[].concat((0,c.default)(e.querySelectorAll("."+g))).forEach(function(e){e.setAttribute("role","separator")})},O=function(){I(),n=e.parentNode,e.classList.add("is-upgraded")},M=function(){k(),e.parentNode!==n&&n.appendChild(e),e.classList.remove("is-upgraded")};return O(),{get element(){return e},set selected(e){r(e,!0)},open:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"first";return D(e,t)},removeListeners:function(){return k()},downgrade:function(){return M()}}},E=function(){function e(t){var n=this;(0,o.default)(this,e),this.keyDownHandler=function(e){if(!n.isDisabled())switch(e.keyCode){case h.VK_ARROW_UP:n.openMenu("last");break;case h.VK_ARROW_DOWN:n.openMenu();break;case h.VK_SPACE:case h.VK_ENTER:n.openMenu("selected");break;case h.VK_ESC:n.closeMenu();break;case h.VK_TAB:return void n.closeMenu();default:return}e.preventDefault()},this.clickHandler=function(){n.isDisabled()||("true"===n.element.getAttribute("aria-expanded").toLowerCase()?n.closeMenu(!0):n.openMenu("selected"))},this.recalcMenuPosition=(0,f.default)(function(){var e=n.focusElement.getBoundingClientRect(),t=n.focusElementLastScrollPosition.left-e.left,i=n.focusElementLastScrollPosition.top-e.top,r=(parseFloat(n.menu.element.style.left)||0)-t,o=(parseFloat(n.menu.element.style.top)||0)-i;n.menu.element.style.left=r+"px",n.menu.element.style.top=o+"px",n.focusElementLastScrollPosition=e}),this.positionChangeHandler=function(){n.recalcMenuPosition(n)},this.closeMenuHandler=function(e){e&&e.detail&&(e.detail.item&&e.detail.item!==n.selectedItem&&(n.selectedItem=e.detail.item,n.dispatchMenuSelect()),n.closeMenu(e.detail.forceFocus))},this.element=t,this.focusElement=void 0,this.focusElementLastScrollPosition=void 0,this.scrollElements=[],this.menu=void 0,this.selectedItem=null,this.init()}return(0,a.default)(e,[{key:"dispatchMenuSelect",value:function(){this.element.dispatchEvent(new CustomEvent("menuselect",{bubbles:!0,cancelable:!0,detail:{source:this.selectedItem}}))}},{key:"isDisabled",value:function(){return this.element.hasAttribute("disabled")}},{key:"removeListeners",value:function(){this.element.removeEventListener("keydown",this.keyDownHandler),this.element.removeEventListener("click",this.clickHandler)}},{key:"openMenu",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"first";!this.isDisabled()&&this.menu&&(this.scrollElements=(0,p.getScrollParents)(this.element),this.scrollElements.forEach(function(t){return t.addEventListener("scroll",e.positionChangeHandler)}),window.addEventListener("resize",this.positionChangeHandler),window.addEventListener("orientationchange",this.positionChangeHandler),this.menu.element.addEventListener("_closemenu",this.closeMenuHandler),this.menu.selected=this.selectedItem,this.menu.open(this.focusElement,t),this.element.setAttribute("aria-expanded","true"),this.focusElementLastScrollPosition=this.focusElement.getBoundingClientRect())}},{key:"closeMenu",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.menu&&(this.menu.removeListeners(),this.scrollElements.forEach(function(t){return t.removeEventListener("scroll",e.positionChangeHandler)}),window.removeEventListener("resize",this.positionChangeHandler),window.removeEventListener("orientationchange",this.positionChangeHandler),this.menu.element.removeEventListener("_closemenu",this.closeMenuHandler),t&&this.focus(),this.element.setAttribute("aria-expanded","false"),this.menu.element.setAttribute("hidden",""))}},{key:"focus",value:function(){this.isDisabled()||this.focusElement.focus()}},{key:"init",value:function(){var e=this,t=function(){e.element.addEventListener("keydown",e.keyDownHandler),e.element.addEventListener("click",e.clickHandler)},n=function(){e.element.setAttribute("role","button"),e.element.setAttribute("aria-expanded","false"),e.element.setAttribute("aria-haspopup","true")},i=function(){e.focusElement=e.element.querySelector('input[type="text"]'),e.focusElement||(e.focusElement=e.element,"button"!==e.focusElement.tagName.toLowerCase()&&"input"!==e.focusElement.tagName.toLowerCase()&&(e.focusElement.hasAttribute("tabindex")||e.focusElement.setAttribute("tabindex","0")))},r=function(e){return e.parentNode!==document.body?document.body.appendChild(e):e},o=function(){var t=void 0,n=e.element.getAttribute("aria-controls");return t=null!==n?document.querySelector("#"+n):e.element.parentNode.querySelector("."+_)},s=function(){var t=o();t&&(t.componentInstance?e.menu=t.componentInstance:(e.menu=b(t),t.componentInstance=e.menu,r(t)),e.element.setAttribute("aria-controls",e.menu.element.id))};i(),n(),s(),this.removeListeners(),t()}},{key:"downgrade",value:function(){var e=this;if(this.menu){var t=[].concat((0,c.default)(document.querySelectorAll("."+m+'[aria-controls="'+this.element.getAttribute("aria-controls")+'"]')));0===t.filter(function(t){return t!==e.element&&t.getAttribute("data-upgraded").indexOf("MaterialExtMenuButton")>=0}).length&&this.menu.downgrade()}this.removeListeners()}}]),e}();!function(){var e=function(e){this.element_=e,this.menuButton_=null,this.init()};window.MaterialExtMenuButton=e,e.prototype.getMenuElement=function(){return this.menuButton_.menu?this.menuButton_.menu.element:null},e.prototype.getMenuElement=e.prototype.getMenuElement,e.prototype.openMenu=function(e){this.menuButton_.openMenu(e)},e.prototype.openMenu=e.prototype.openMenu,e.prototype.closeMenu=function(){this.menuButton_.closeMenu(!0)},e.prototype.closeMenu=e.prototype.closeMenu,e.prototype.getSelectedMenuItem=function(){return this.menuButton_.selectedItem},e.prototype.getSelectedMenuItem=e.prototype.getSelectedMenuItem,e.prototype.setSelectedMenuItem=function(e){this.menuButton_.selectedItem=e},e.prototype.setSelectedMenuItem=e.prototype.setSelectedMenuItem,e.prototype.init=function(){this.element_&&(this.menuButton_=new E(this.element_),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)),this.element_.classList.add(h.IS_UPGRADED))},e.prototype.mdlDowngrade_=function(){this.menuButton_.downgrade()},componentHandler.register({constructor:e,classAsString:"MaterialExtMenuButton",cssClass:m,widget:!0})}()},function(e,t,n){"use strict";var i=n(15),r=n(2);!function(){var e="mdlext-selectfield__label",t="mdlext-selectfield__select",n=function(e){this.element_=e,this.init()};window.MaterialExtSelectfield=n,n.prototype.onFocus_=function(){this.element_.classList.add(r.IS_FOCUSED)},n.prototype.onBlur_=function(){this.element_.classList.remove(r.IS_FOCUSED)},n.prototype.onReset_=function(){this.updateClasses_()},n.prototype.updateClasses_=function(){this.checkDisabled(),this.checkValidity(),this.checkDirty(),this.checkFocus()},n.prototype.checkDisabled=function(){this.select_.disabled?this.element_.classList.add(r.IS_DISABLED):this.element_.classList.remove(r.IS_DISABLED)},n.prototype.checkDisabled=n.prototype.checkDisabled,n.prototype.checkFocus=function(){Boolean(this.element_.querySelector(":focus"))?this.element_.classList.add(r.IS_FOCUSED):this.element_.classList.remove(r.IS_FOCUSED)},n.prototype.checkFocus=n.prototype.checkFocus,n.prototype.checkValidity=function(){},n.prototype.checkValidity=n.prototype.checkValidity,n.prototype.checkDirty=function(){this.select_.value&&this.select_.value.length>0?this.element_.classList.add(r.IS_DIRTY):this.element_.classList.remove(r.IS_DIRTY)},n.prototype.checkDirty=n.prototype.checkDirty,n.prototype.disable=function(){this.select_.disabled=!0,this.updateClasses_()},n.prototype.disable=n.prototype.disable,n.prototype.enable=function(){this.select_.disabled=!1,this.updateClasses_()},n.prototype.enable=n.prototype.enable,n.prototype.change=function(e){this.select_.value=e||"",this.updateClasses_()},n.prototype.change=n.prototype.change,n.prototype.init=function(){if(this.element_&&(this.label_=this.element_.querySelector("."+e),this.select_=this.element_.querySelector("."+t))){if(this.select_.removeEventListener("change",this.updateClasses_),this.select_.removeEventListener("focus",this.onFocus_),this.select_.removeEventListener("blur",this.onBlur_),this.select_.removeEventListener("reset",this.onReset_),this.select_.addEventListener("change",this.updateClasses_.bind(this)),this.select_.addEventListener("focus",this.onFocus_.bind(this)),this.select_.addEventListener("blur",this.onBlur_.bind(this)),this.select_.addEventListener("reset",this.onReset_.bind(this)),this.label_){var n=void 0;this.select_.hasAttribute("id")?n=this.select_.id:(n="select-"+(0,i.randomString)(),this.select_.id=n),this.label_.hasAttribute("for")||this.label_.setAttribute("for",n)}var o=this.element_.classList.contains(r.IS_INVALID);this.updateClasses_(),this.element_.classList.add(r.IS_UPGRADED),o&&this.element_.classList.add(r.IS_INVALID),this.select_.hasAttribute("autofocus")&&(this.element_.focus(),this.checkFocus())}},componentHandler.register({constructor:n,classAsString:"MaterialExtSelectfield",cssClass:"mdlext-js-selectfield",
widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(13),o=i(r),s=n(14),a=n(2);!function(){var e="mdl-layout__content",t="mdlext-is-scroll",n=function(e){this.header_=e,this.content_=null,this.lastScrollTop_=0,this.config_={visibleAtScrollEnd:!1},this.mutationObserver_=null,this.drawing_=!1,this.init()};window.MaterialExtStickyHeader=n,n.prototype.recalcWidth_=function(){this.header_.style.width=this.content_.clientWidth+"px"};var i=(0,o.default)(function(e){return e.recalcWidth_()});n.prototype.resizeHandler_=function(){i(this)},n.prototype.reposition_=function(){var e=this.content_.scrollTop,n=this.lastScrollTop_-e;if(e<=0)this.header_.style.top="0",this.header_.classList.remove(t);else{if(n>0){if(n>=this.header_.offsetHeight){var i=parseInt(window.getComputedStyle(this.header_).getPropertyValue("top"))||0;0!=i&&(this.header_.style.top="0",this.header_.classList.add(t)),this.lastScrollTop_=e}return}if(n<0){this.header_.classList.add(t);var r=parseInt(window.getComputedStyle(this.header_).getPropertyValue("top"))||0;if(this.content_.scrollHeight-this.content_.scrollTop<=this.content_.offsetHeight)0!=r&&(this.header_.style.top=this.config_.visibleAtScrollEnd?"0":"-"+this.header_.offsetHeight+"px");else{r+=n;var o=this.header_.offsetHeight;this.header_.style.top=(Math.abs(r)>o?-o:r)+"px"}}}this.lastScrollTop_=e};var r=(0,o.default)(function(e){return e.reposition_()});n.prototype.scrollHandler_=function(){r(this)},n.prototype.updatePosition_=function(){this.recalcWidth_(),this.reposition_()},n.prototype.addMutationObserver_=function(){var e=this;this.mutationObserver_=new MutationObserver(function(){e.updatePosition_()}),this.mutationObserver_.observe(this.content_,{attributes:!1,childList:!0,characterData:!1,subtree:!0})},n.prototype.removeListeners_=function(){window.removeEventListener("resize",this.resizeHandler_),window.removeEventListener("orientationchange",this.resizeHandler_),this.content_&&this.content_.removeEventListener("scroll",this.scrollHandler_),this.mutationObserver_&&(this.mutationObserver_.disconnect(),this.mutationObserver_=null)},n.prototype.init=function(){this.header_&&(this.removeListeners_(),this.header_.hasAttribute("data-config")&&(this.config_=(0,s.jsonStringToObject)(this.header_.getAttribute("data-config"))),this.content_=this.header_.parentNode.querySelector("."+e)||null,this.content_&&(this.content_.style.paddingTop=this.header_.offsetHeight+"px",this.lastScrollTop_=this.content_.scrollTop,this.content_.addEventListener("scroll",this.scrollHandler_.bind(this)),window.addEventListener("resize",this.resizeHandler_.bind(this)),window.addEventListener("orientationchange",this.resizeHandler_.bind(this)),this.addMutationObserver_(),this.updatePosition_(),this.header_.classList.add(a.IS_UPGRADED)))},componentHandler.register({constructor:n,classAsString:"MaterialExtStickyHeader",cssClass:"mdlext-js-sticky-header"})}()},function(e,t,n){"use strict";n(2),n(21),n(15),n(14),n(13),n(29),n(30)},function(e,t,n){e.exports={default:n(68),__esModule:!0}},function(e,t,n){e.exports={default:n(70),__esModule:!0}},function(e,t,n){e.exports={default:n(72),__esModule:!0}},function(e,t,n){e.exports={default:n(74),__esModule:!0}},function(e,t,n){e.exports={default:n(75),__esModule:!0}},function(e,t,n){e.exports={default:n(76),__esModule:!0}},function(e,t,n){e.exports={default:n(77),__esModule:!0}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var r=n(61),o=i(r),s=n(31),a=i(s);t.default=function(){function e(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var s,l=(0,a.default)(e);!(i=(s=l.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&l.return&&l.return()}finally{if(r)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if((0,o.default)(Object(t)))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(e,t,n){n(28),n(104),e.exports=n(1).Array.from},function(e,t,n){n(48),n(28),e.exports=n(102)},function(e,t,n){n(48),n(28),e.exports=n(103)},function(e,t,n){n(106),e.exports=n(1).Number.isInteger},function(e,t,n){n(107),e.exports=n(1).Number.isNaN},function(e,t,n){n(108),e.exports=n(1).Object.assign},function(e,t,n){n(109);var i=n(1).Object;e.exports=function(e,t,n){return i.defineProperty(e,t,n)}},function(e,t,n){n(112),e.exports=n(1).Object.entries},function(e,t,n){n(110),e.exports=n(1).Object.keys},function(e,t,n){n(111),e.exports=n(1).Reflect.apply},function(e,t){e.exports=function(){}},function(e,t,n){var i=n(19),r=n(45),o=n(100);e.exports=function(e){return function(t,n,s){var a,l=i(t),c=r(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if(a=l[u++],a!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}}},function(e,t,n){"use strict";var i=n(12),r=n(25);e.exports=function(e,t,n){t in e?i.f(e,t,r(0,n)):e[t]=n}},function(e,t,n){e.exports=n(5).document&&document.documentElement},function(e,t,n){e.exports=!n(9)&&!n(10)(function(){return 7!=Object.defineProperty(n(38)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(7),r=n(4)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||o[r]===e)}},function(e,t,n){var i=n(17),r=Math.floor;e.exports=function(e){return!i(e)&&isFinite(e)&&r(e)===e}},function(e,t,n){var i=n(6);e.exports=function(e,t,n,r){try{return r?t(i(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&i(o.call(e)),t}}},function(e,t,n){"use strict";var i=n(91),r=n(25),o=n(43),s={};n(11)(s,n(4)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=i(s,{next:r(1,n)}),o(e,t+" Iterator")}},function(e,t,n){var i=n(4)("iterator"),r=!1;try{var o=[7][i]();o.return=function(){r=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var o=[7],s=o[i]();s.next=function(){return{done:n=!0}},o[i]=function(){return s},e(o)}catch(e){}return n}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t){e.exports=!0},function(e,t,n){"use strict";var i=n(18),r=n(93),o=n(42),s=n(20),a=n(40),l=Object.assign;e.exports=!l||n(10)(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=i})?function(e,t){for(var n=s(e),l=arguments.length,c=1,u=r.f,d=o.f;l>c;)for(var f,h=a(arguments[c++]),p=u?i(h).concat(u(h)):i(h),m=p.length,_=0;m>_;)d.call(h,f=p[_++])&&(n[f]=h[f]);return n}:l},function(e,t,n){var i=n(6),r=n(92),o=n(39),s=n(26)("IE_PROTO"),a=function(){},l="prototype",c=function(){var e,t=n(38)("iframe"),i=o.length,r="<",s=">";for(t.style.display="none",n(81).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(r+"script"+s+"document.F=Object"+r+"/script"+s),e.close(),c=e.F;i--;)delete c[l][o[i]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[l]=i(e),n=new a,a[l]=null,n[s]=e):n=c(),void 0===t?n:r(n,t)}},function(e,t,n){var i=n(12),r=n(6),o=n(18);e.exports=n(9)?Object.defineProperties:function(e,t){r(e);for(var n,s=o(t),a=s.length,l=0;a>l;)i.f(e,n=s[l++],t[n]);return e}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var i=n(16),r=n(20),o=n(26)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=r(e),i(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,n){var i=n(16),r=n(19),o=n(79)(!1),s=n(26)("IE_PROTO");e.exports=function(e,t){var n,a=r(e),l=0,c=[];for(n in a)n!=s&&i(a,n)&&c.push(n);for(;t.length>l;)i(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},function(e,t,n){var i=n(3),r=n(1),o=n(10);e.exports=function(e,t){var n=(r.Object||{})[e]||Object[e],s={};s[e]=t(n),i(i.S+i.F*o(function(){n(1)}),"Object",s)}},function(e,t,n){var i=n(18),r=n(19),o=n(42).f;e.exports=function(e){return function(t){for(var n,s=r(t),a=i(s),l=a.length,c=0,u=[];l>c;)o.call(s,n=a[c++])&&u.push(e?[n,s[n]]:s[n]);return u}}},function(e,t,n){e.exports=n(11)},function(e,t,n){var i=n(27),r=n(24);e.exports=function(e){return function(t,n){var o,s,a=String(r(t)),l=i(n),c=a.length;return l<0||l>=c?e?"":void 0:(o=a.charCodeAt(l),o<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):(o-55296<<10)+(s-56320)+65536)}}},function(e,t,n){var i=n(27),r=Math.max,o=Math.min;e.exports=function(e,t){return e=i(e),e<0?r(e+t,0):o(e,t)}},function(e,t,n){var i=n(17);e.exports=function(e,t){if(!i(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!i(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var i=n(6),r=n(47);e.exports=n(1).getIterator=function(e){var t=r(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return i(t.call(e))}},function(e,t,n){var i=n(35),r=n(4)("iterator"),o=n(7);e.exports=n(1).isIterable=function(e){var t=Object(e);return void 0!==t[r]||"@@iterator"in t||o.hasOwnProperty(i(t))}},function(e,t,n){"use strict";var i=n(37),r=n(3),o=n(20),s=n(85),a=n(83),l=n(45),c=n(80),u=n(47);r(r.S+r.F*!n(87)(function(e){Array.from(e)}),"Array",{from:function(e){var t,n,r,d,f=o(e),h="function"==typeof this?this:Array,p=arguments.length,m=p>1?arguments[1]:void 0,_=void 0!==m,v=0,g=u(f);if(_&&(m=i(m,p>2?arguments[2]:void 0,2)),void 0==g||h==Array&&a(g))for(t=l(f.length),n=new h(t);t>v;v++)c(n,v,_?m(f[v],v):f[v]);else for(d=g.call(f),n=new h;!(r=d.next()).done;v++)c(n,v,_?s(d,m,[r.value,v],!0):r.value);return n.length=v,n}})},function(e,t,n){"use strict";var i=n(78),r=n(88),o=n(7),s=n(19);e.exports=n(41)(Array,"Array",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,r(1)):"keys"==t?r(0,n):"values"==t?r(0,e[n]):r(0,[n,e[n]])},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},function(e,t,n){var i=n(3);i(i.S,"Number",{isInteger:n(84)})},function(e,t,n){var i=n(3);i(i.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,n){var i=n(3);i(i.S+i.F,"Object",{assign:n(90)})},function(e,t,n){var i=n(3);i(i.S+i.F*!n(9),"Object",{defineProperty:n(12).f})},function(e,t,n){var i=n(20),r=n(18);n(96)("keys",function(){return function(e){return r(i(e))}})},function(e,t,n){var i=n(3),r=n(34),o=n(6),s=(n(5).Reflect||{}).apply,a=Function.apply;i(i.S+i.F*!n(10)(function(){s(function(){})}),"Reflect",{apply:function(e,t,n){var i=r(e),l=o(n);return s?s(i,t,l):a.call(i,t,l)}})},function(e,t,n){var i=n(3),r=n(97)(!0);i(i.S,"Object",{entries:function(e){return r(e)}})},function(e,t){}])});
//# sourceMappingURL=mdl-ext.min.js.map