/**
 * @license Angular v11.2.14
 * (c) 2010-2021 Google LLC. https://angular.io/
 * License: MIT
 */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/platform-browser"),require("@angular/animations"),require("@angular/animations/browser"),require("@angular/common")):"function"==typeof define&&define.amd?define("@angular/platform-browser/animations",["exports","@angular/core","@angular/platform-browser","@angular/animations","@angular/animations/browser","@angular/common"],t):t(((e=e||self).ng=e.ng||{},e.ng.platformBrowser=e.ng.platformBrowser||{},e.ng.platformBrowser.animations={}),e.ng.core,e.ng.platformBrowser,e.ng.animations,e.ng.animations.browser,e.ng.common)}(this,(function(e,t,n,r,o,i){"use strict";
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.
    ***************************************************************************** */var a=function(e,t){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function s(e,t){function n(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function u(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function c(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(u(arguments[t]));return e}var d=function(e){function n(n,r){var o=e.call(this)||this;return o._nextAnimationId=0,o._renderer=n.createRenderer(r.body,{id:"0",encapsulation:t.ViewEncapsulation.None,styles:[],data:{animation:[]}}),o}return s(n,e),n.prototype.build=function(e){var t=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(e)?r.sequence(e):e;return h(this._renderer,null,t,"register",[n]),new p(t,this._renderer)},n}(r.AnimationBuilder);d.decorators=[{type:t.Injectable}],d.ctorParameters=function(){return[{type:t.RendererFactory2},{type:void 0,decorators:[{type:t.Inject,args:[i.DOCUMENT]}]}]};var p=function(e){function t(t,n){var r=e.call(this)||this;return r._id=t,r._renderer=n,r}return s(t,e),t.prototype.create=function(e,t){return new l(this._id,e,t||{},this._renderer)},t}(r.AnimationFactory),l=function(){function e(e,t,n,r){this.id=e,this.element=t,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",n)}return e.prototype._listen=function(e,t){return this._renderer.listen(this.element,"@@"+this.id+":"+e,t)},e.prototype._command=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return h(this._renderer,this.element,this.id,e,t)},e.prototype.onDone=function(e){this._listen("done",e)},e.prototype.onStart=function(e){this._listen("start",e)},e.prototype.onDestroy=function(e){this._listen("destroy",e)},e.prototype.init=function(){this._command("init")},e.prototype.hasStarted=function(){return this._started},e.prototype.play=function(){this._command("play"),this._started=!0},e.prototype.pause=function(){this._command("pause")},e.prototype.restart=function(){this._command("restart")},e.prototype.finish=function(){this._command("finish")},e.prototype.destroy=function(){this._command("destroy")},e.prototype.reset=function(){this._command("reset")},e.prototype.setPosition=function(e){this._command("setPosition",e)},e.prototype.getPosition=function(){var e,t;return null!==(t=null===(e=this._renderer.engine.players[+this.id])||void 0===e?void 0:e.getPosition())&&void 0!==t?t:0},e}();function h(e,t,n,r,o){return e.setProperty(t,"@@"+n+":"+r,o)}var m=function(){function e(e,t,n){this.delegate=e,this.engine=t,this._zone=n,this._currentId=0,this._microtaskId=1,this._animationCallbacksBuffer=[],this._rendererCache=new Map,this._cdRecurDepth=0,this.promise=Promise.resolve(0),t.onRemovalComplete=function(e,t){t&&t.parentNode(e)&&t.removeChild(e.parentNode,e)}}return e.prototype.createRenderer=function(e,t){var n=this,r=this.delegate.createRenderer(e,t);if(!(e&&t&&t.data&&t.data.animation)){var o=this._rendererCache.get(r);return o||(o=new f("",r,this.engine),this._rendererCache.set(r,o)),o}var i=t.id,a=t.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);var s=function(t){Array.isArray(t)?t.forEach(s):n.engine.registerTrigger(i,a,e,t.name,t)};return t.data.animation.forEach(s),new y(this,a,r,this.engine)},e.prototype.begin=function(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()},e.prototype._scheduleCountTask=function(){var e=this;this.promise.then((function(){e._microtaskId++}))},e.prototype.scheduleListenerCallback=function(e,t,n){var r=this;e>=0&&e<this._microtaskId?this._zone.run((function(){return t(n)})):(0==this._animationCallbacksBuffer.length&&Promise.resolve(null).then((function(){r._zone.run((function(){r._animationCallbacksBuffer.forEach((function(e){var t=u(e,2);(0,t[0])(t[1])})),r._animationCallbacksBuffer=[]}))})),this._animationCallbacksBuffer.push([t,n]))},e.prototype.end=function(){var e=this;this._cdRecurDepth--,0==this._cdRecurDepth&&this._zone.runOutsideAngular((function(){e._scheduleCountTask(),e.engine.flush(e._microtaskId)})),this.delegate.end&&this.delegate.end()},e.prototype.whenRenderingDone=function(){return this.engine.whenRenderingDone()},e}();m.decorators=[{type:t.Injectable}],m.ctorParameters=function(){return[{type:t.RendererFactory2},{type:o.ɵAnimationEngine},{type:t.NgZone}]};var f=function(){function e(e,t,n){this.namespaceId=e,this.delegate=t,this.engine=n,this.destroyNode=this.delegate.destroyNode?function(e){return t.destroyNode(e)}:null}return Object.defineProperty(e.prototype,"data",{get:function(){return this.delegate.data},enumerable:!1,configurable:!0}),e.prototype.destroy=function(){this.engine.destroy(this.namespaceId,this.delegate),this.delegate.destroy()},e.prototype.createElement=function(e,t){return this.delegate.createElement(e,t)},e.prototype.createComment=function(e){return this.delegate.createComment(e)},e.prototype.createText=function(e){return this.delegate.createText(e)},e.prototype.appendChild=function(e,t){this.delegate.appendChild(e,t),this.engine.onInsert(this.namespaceId,t,e,!1)},e.prototype.insertBefore=function(e,t,n,r){void 0===r&&(r=!0),this.delegate.insertBefore(e,t,n),this.engine.onInsert(this.namespaceId,t,e,r)},e.prototype.removeChild=function(e,t,n){this.engine.onRemove(this.namespaceId,t,this.delegate,n)},e.prototype.selectRootElement=function(e,t){return this.delegate.selectRootElement(e,t)},e.prototype.parentNode=function(e){return this.delegate.parentNode(e)},e.prototype.nextSibling=function(e){return this.delegate.nextSibling(e)},e.prototype.setAttribute=function(e,t,n,r){this.delegate.setAttribute(e,t,n,r)},e.prototype.removeAttribute=function(e,t,n){this.delegate.removeAttribute(e,t,n)},e.prototype.addClass=function(e,t){this.delegate.addClass(e,t)},e.prototype.removeClass=function(e,t){this.delegate.removeClass(e,t)},e.prototype.setStyle=function(e,t,n,r){this.delegate.setStyle(e,t,n,r)},e.prototype.removeStyle=function(e,t,n){this.delegate.removeStyle(e,t,n)},e.prototype.setProperty=function(e,t,n){"@"==t.charAt(0)&&"@.disabled"==t?this.disableAnimations(e,!!n):this.delegate.setProperty(e,t,n)},e.prototype.setValue=function(e,t){this.delegate.setValue(e,t)},e.prototype.listen=function(e,t,n){return this.delegate.listen(e,t,n)},e.prototype.disableAnimations=function(e,t){this.engine.disableAnimations(e,t)},e}(),y=function(e){function t(t,n,r,o){var i=e.call(this,n,r,o)||this;return i.factory=t,i.namespaceId=n,i}return s(t,e),t.prototype.setProperty=function(e,t,n){"@"==t.charAt(0)?"."==t.charAt(1)&&"@.disabled"==t?this.disableAnimations(e,n=void 0===n||!!n):this.engine.process(this.namespaceId,e,t.substr(1),n):this.delegate.setProperty(e,t,n)},t.prototype.listen=function(e,t,n){var r,o=this;if("@"==t.charAt(0)){var i=function a(e){switch(e){case"body":return document.body;case"document":return document;case"window":return window;default:return e}}(e),s=t.substr(1),c="";return"@"!=s.charAt(0)&&(s=(r=u(function d(e){var t=e.indexOf(".");return[e.substring(0,t),e.substr(t+1)]}(s),2))[0],c=r[1]),this.engine.listen(this.namespaceId,i,s,c,(function(e){o.factory.scheduleListenerCallback(e._data||-1,n,e)}))}return this.delegate.listen(e,t,n)},t}(f),g=function(e){function t(t,n,r){return e.call(this,t.body,n,r)||this}return s(t,e),t}(o.ɵAnimationEngine);function _(){return o.ɵsupportsWebAnimations()?new o.ɵWebAnimationsDriver:new o.ɵCssKeyframesDriver}function v(){return new o.ɵWebAnimationsStyleNormalizer}function b(e,t,n){return new m(e,t,n)}g.decorators=[{type:t.Injectable}],g.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[i.DOCUMENT]}]},{type:o.AnimationDriver},{type:o.ɵAnimationStyleNormalizer}]};var A,w,C=new t.InjectionToken("AnimationModuleType"),I=[{provide:r.AnimationBuilder,useClass:d},{provide:o.ɵAnimationStyleNormalizer,useFactory:v},{provide:o.ɵAnimationEngine,useClass:g},{provide:t.RendererFactory2,useFactory:b,deps:[n.ɵDomRendererFactory2,o.ɵAnimationEngine,t.NgZone]}],N=c([{provide:o.AnimationDriver,useFactory:_},{provide:C,useValue:"BrowserAnimations"}],I),k=c([{provide:o.AnimationDriver,useClass:o.ɵNoopAnimationDriver},{provide:C,useValue:"NoopAnimations"}],I);(A=function A(){}).decorators=[{type:t.NgModule,args:[{exports:[n.BrowserModule],providers:N}]}],(w=function w(){}).decorators=[{type:t.NgModule,args:[{exports:[n.BrowserModule],providers:k}]}],
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
e.ANIMATION_MODULE_TYPE=C,e.BrowserAnimationsModule=A,e.NoopAnimationsModule=w,e.ɵAnimationRenderer=y,e.ɵAnimationRendererFactory=m,e.ɵBrowserAnimationBuilder=d,e.ɵBrowserAnimationFactory=p,e.ɵInjectableAnimationEngine=g,e.ɵangular_packages_platform_browser_animations_animations_a=_,e.ɵangular_packages_platform_browser_animations_animations_b=v,e.ɵangular_packages_platform_browser_animations_animations_c=b,e.ɵangular_packages_platform_browser_animations_animations_d=N,e.ɵangular_packages_platform_browser_animations_animations_e=k,e.ɵangular_packages_platform_browser_animations_animations_f=f,Object.defineProperty(e,"__esModule",{value:!0})}));