!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/core"),require("@angular/common"),require("@angular/cdk/scrolling"),require("@angular/cdk/platform"),require("@angular/cdk/coercion"),require("rxjs"),require("rxjs/operators"),require("@angular/cdk/bidi")):"function"==typeof define&&define.amd?define("@angular/cdk/drag-drop",["exports","@angular/core","@angular/common","@angular/cdk/scrolling","@angular/cdk/platform","@angular/cdk/coercion","rxjs","rxjs/operators","@angular/cdk/bidi"],e):e(((t=t||self).ng=t.ng||{},t.ng.cdk=t.ng.cdk||{},t.ng.cdk.dragDrop={}),t.ng.core,t.ng.common,t.ng.cdk.scrolling,t.ng.cdk.platform,t.ng.cdk.coercion,t.rxjs,t.rxjs.operators,t.ng.cdk.bidi)}(this,(function(t,e,i,r,n,o,s,a,c){"use strict";
/**
     * @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
     */function l(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function h(t,e){var i=e?"":"none";l(t.style,{touchAction:e?"":"none",webkitUserDrag:e?"":"none",webkitTapHighlightColor:e?"":"transparent",userSelect:i,msUserSelect:i,webkitUserSelect:i,MozUserSelect:i})}function p(t,e){var i=t.style;i.position=e?"":"fixed",i.top=i.opacity=e?"":"0",i.left=e?"":"-999em"}
/**
     * @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
     */function d(t){var e=t.toLowerCase().indexOf("ms")>-1?1:1e3;return parseFloat(t)*e}function u(t,e){return t.getPropertyValue(e).split(",").map((function(t){return t.trim()}))}
/**
     * @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
     */function g(t){var e=t.getBoundingClientRect();return{top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.width,height:e.height}}function _(t,e,i){return i>=t.top&&i<=t.bottom&&e>=t.left&&e<=t.right}function f(t,e,i){t.top+=e,t.bottom=t.top+t.height,t.left+=i,t.right=t.left+t.width}function m(t,e,i,r){var n=t.width*e,o=t.height*e;return r>t.top-o&&r<t.bottom+o&&i>t.left-n&&i<t.right+n}
/**
     * @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
     */var v=function(){function t(t,e){this._document=t,this._viewportRuler=e,this.positions=new Map}return t.prototype.clear=function(){this.positions.clear()},t.prototype.cache=function(t){var e=this;this.clear(),this.positions.set(this._document,{scrollPosition:this._viewportRuler.getViewportScrollPosition()}),t.forEach((function(t){e.positions.set(t,{scrollPosition:{top:t.scrollTop,left:t.scrollLeft},clientRect:g(t)})}))},t.prototype.handleScroll=function(t){var e=t.target,i=this.positions.get(e);if(!i)return null;var r,n,o=e===this._document?e.documentElement:e,s=i.scrollPosition;if(e===this._document){var a=this._viewportRuler.getViewportScrollPosition();r=a.top,n=a.left}else r=e.scrollTop,n=e.scrollLeft;var c=s.top-r,l=s.left-n;return this.positions.forEach((function(t,i){t.clientRect&&e!==i&&o.contains(i)&&f(t.clientRect,c,l)})),s.top=r,s.left=n,{top:c,left:l}},t}();
/**
     * @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
     */function y(t){var e=t.cloneNode(!0),i=e.querySelectorAll("[id]"),r=t.nodeName.toLowerCase();e.removeAttribute("id");for(var n=0;n<i.length;n++)i[n].removeAttribute("id");return"canvas"===r?P(t,e):"input"!==r&&"select"!==r&&"textarea"!==r||S(t,e),D("canvas",t,e,P),D("input, textarea, select",t,e,S),e}function D(t,e,i,r){var n=e.querySelectorAll(t);if(n.length)for(var o=i.querySelectorAll(t),s=0;s<n.length;s++)r(n[s],o[s])}var b=0;function S(t,e){"file"!==e.type&&(e.value=t.value),"radio"===e.type&&e.name&&(e.name="mat-clone-"+e.name+"-"+b++)}function P(t,e){var i=e.getContext("2d");if(i)try{i.drawImage(t,0,0)}catch(t){}}
/**
     * @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
     */var w=n.normalizePassiveListenerOptions({passive:!0}),E=n.normalizePassiveListenerOptions({passive:!1}),R=function(){function t(t,e,i,r,n,o){var a=this;this._config=e,this._document=i,this._ngZone=r,this._viewportRuler=n,this._dragDropRegistry=o,this._passiveTransform={x:0,y:0},this._activeTransform={x:0,y:0},this._moveEvents=new s.Subject,this._pointerMoveSubscription=s.Subscription.EMPTY,this._pointerUpSubscription=s.Subscription.EMPTY,this._scrollSubscription=s.Subscription.EMPTY,this._resizeSubscription=s.Subscription.EMPTY,this._boundaryElement=null,this._nativeInteractionsEnabled=!0,this._handles=[],this._disabledHandles=new Set,this._direction="ltr",this.dragStartDelay=0,this._disabled=!1,this.beforeStarted=new s.Subject,this.started=new s.Subject,this.released=new s.Subject,this.ended=new s.Subject,this.entered=new s.Subject,this.exited=new s.Subject,this.dropped=new s.Subject,this.moved=this._moveEvents,this._pointerDown=function(t){if(a.beforeStarted.next(),a._handles.length){var e=a._handles.find((function(e){var i=t.target;return!!i&&(i===e||e.contains(i))}));!e||a._disabledHandles.has(e)||a.disabled||a._initializeDragSequence(e,t)}else a.disabled||a._initializeDragSequence(a._rootElement,t)},this._pointerMove=function(t){var e=a._getPointerPositionOnPage(t);if(a._hasStartedDragging){a._boundaryElement&&(a._previewRect&&(a._previewRect.width||a._previewRect.height)||(a._previewRect=(a._preview||a._rootElement).getBoundingClientRect())),t.preventDefault();var i=a._getConstrainedPointerPosition(e);if(a._hasMoved=!0,a._lastKnownPointerPosition=e,a._updatePointerDirectionDelta(i),a._dropContainer)a._updateActiveDropContainer(i,e);else{var r=a._activeTransform;r.x=i.x-a._pickupPositionOnPage.x+a._passiveTransform.x,r.y=i.y-a._pickupPositionOnPage.y+a._passiveTransform.y,a._applyRootElementTransform(r.x,r.y),"undefined"!=typeof SVGElement&&a._rootElement instanceof SVGElement&&a._rootElement.setAttribute("transform","translate("+r.x+" "+r.y+")")}a._moveEvents.observers.length&&a._ngZone.run((function(){a._moveEvents.next({source:a,pointerPosition:i,event:t,distance:a._getDragDistance(i),delta:a._pointerDirectionDelta})}))}else if(Math.abs(e.x-a._pickupPositionOnPage.x)+Math.abs(e.y-a._pickupPositionOnPage.y)>=a._config.dragStartThreshold){var n=Date.now()>=a._dragStartTime+a._getDragStartDelay(t),o=a._dropContainer;if(!n)return void a._endDragSequence(t);o&&(o.isDragging()||o.isReceiving())||(t.preventDefault(),a._hasStartedDragging=!0,a._ngZone.run((function(){return a._startDragSequence(t)})))}},this._pointerUp=function(t){a._endDragSequence(t)},this.withRootElement(t).withParent(e.parentDragRef||null),this._parentPositions=new v(i,n),o.registerDragItem(this)}return Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled||!(!this._dropContainer||!this._dropContainer.disabled)},set:function(t){var e=o.coerceBooleanProperty(t);e!==this._disabled&&(this._disabled=e,this._toggleNativeDragInteractions(),this._handles.forEach((function(t){return h(t,e)})))},enumerable:!1,configurable:!0}),t.prototype.getPlaceholderElement=function(){return this._placeholder},t.prototype.getRootElement=function(){return this._rootElement},t.prototype.getVisibleElement=function(){return this.isDragging()?this.getPlaceholderElement():this.getRootElement()},t.prototype.withHandles=function(t){var e=this;this._handles=t.map((function(t){return o.coerceElement(t)})),this._handles.forEach((function(t){return h(t,e.disabled)})),this._toggleNativeDragInteractions();var i=new Set;return this._disabledHandles.forEach((function(t){e._handles.indexOf(t)>-1&&i.add(t)})),this._disabledHandles=i,this},t.prototype.withPreviewTemplate=function(t){return this._previewTemplate=t,this},t.prototype.withPlaceholderTemplate=function(t){return this._placeholderTemplate=t,this},t.prototype.withRootElement=function(t){var e=this,i=o.coerceElement(t);return i!==this._rootElement&&(this._rootElement&&this._removeRootElementListeners(this._rootElement),this._ngZone.runOutsideAngular((function(){i.addEventListener("mousedown",e._pointerDown,E),i.addEventListener("touchstart",e._pointerDown,w)})),this._initialTransform=void 0,this._rootElement=i),"undefined"!=typeof SVGElement&&this._rootElement instanceof SVGElement&&(this._ownerSVGElement=this._rootElement.ownerSVGElement),this},t.prototype.withBoundaryElement=function(t){var e=this;return this._boundaryElement=t?o.coerceElement(t):null,this._resizeSubscription.unsubscribe(),t&&(this._resizeSubscription=this._viewportRuler.change(10).subscribe((function(){return e._containInsideBoundaryOnResize()}))),this},t.prototype.withParent=function(t){return this._parentDragRef=t,this},t.prototype.dispose=function(){this._removeRootElementListeners(this._rootElement),this.isDragging()&&C(this._rootElement),C(this._anchor),this._destroyPreview(),this._destroyPlaceholder(),this._dragDropRegistry.removeDragItem(this),this._removeSubscriptions(),this.beforeStarted.complete(),this.started.complete(),this.released.complete(),this.ended.complete(),this.entered.complete(),this.exited.complete(),this.dropped.complete(),this._moveEvents.complete(),this._handles=[],this._disabledHandles.clear(),this._dropContainer=void 0,this._resizeSubscription.unsubscribe(),this._parentPositions.clear(),this._boundaryElement=this._rootElement=this._ownerSVGElement=this._placeholderTemplate=this._previewTemplate=this._anchor=this._parentDragRef=null},t.prototype.isDragging=function(){return this._hasStartedDragging&&this._dragDropRegistry.isDragging(this)},t.prototype.reset=function(){this._rootElement.style.transform=this._initialTransform||"",this._activeTransform={x:0,y:0},this._passiveTransform={x:0,y:0}},t.prototype.disableHandle=function(t){!this._disabledHandles.has(t)&&this._handles.indexOf(t)>-1&&(this._disabledHandles.add(t),h(t,!0))},t.prototype.enableHandle=function(t){this._disabledHandles.has(t)&&(this._disabledHandles.delete(t),h(t,this.disabled))},t.prototype.withDirection=function(t){return this._direction=t,this},t.prototype._withDropContainer=function(t){this._dropContainer=t},t.prototype.getFreeDragPosition=function(){var t=this.isDragging()?this._activeTransform:this._passiveTransform;return{x:t.x,y:t.y}},t.prototype.setFreeDragPosition=function(t){return this._activeTransform={x:0,y:0},this._passiveTransform.x=t.x,this._passiveTransform.y=t.y,this._dropContainer||this._applyRootElementTransform(t.x,t.y),this},t.prototype._sortFromLastPointerPosition=function(){var t=this._lastKnownPointerPosition;t&&this._dropContainer&&this._updateActiveDropContainer(this._getConstrainedPointerPosition(t),t)},t.prototype._removeSubscriptions=function(){this._pointerMoveSubscription.unsubscribe(),this._pointerUpSubscription.unsubscribe(),this._scrollSubscription.unsubscribe()},t.prototype._destroyPreview=function(){this._preview&&C(this._preview),this._previewRef&&this._previewRef.destroy(),this._preview=this._previewRef=null},t.prototype._destroyPlaceholder=function(){this._placeholder&&C(this._placeholder),this._placeholderRef&&this._placeholderRef.destroy(),this._placeholder=this._placeholderRef=null},t.prototype._endDragSequence=function(t){var e=this;this._dragDropRegistry.isDragging(this)&&(this._removeSubscriptions(),this._dragDropRegistry.stopDragging(this),this._toggleNativeDragInteractions(),this._handles&&(this._rootElement.style.webkitTapHighlightColor=this._rootElementTapHighlight),this._hasStartedDragging&&(this.released.next({source:this}),this._dropContainer?(this._dropContainer._stopScrolling(),this._animatePreviewToPlaceholder().then((function(){e._cleanupDragArtifacts(t),e._cleanupCachedDimensions(),e._dragDropRegistry.stopDragging(e)}))):(this._passiveTransform.x=this._activeTransform.x,this._passiveTransform.y=this._activeTransform.y,this._ngZone.run((function(){e.ended.next({source:e,distance:e._getDragDistance(e._getPointerPositionOnPage(t))})})),this._cleanupCachedDimensions(),this._dragDropRegistry.stopDragging(this))))},t.prototype._startDragSequence=function(t){k(t)&&(this._lastTouchEventTime=Date.now()),this._toggleNativeDragInteractions();var e=this._dropContainer;if(e){var i=this._rootElement,r=i.parentNode,n=this._preview=this._createPreviewElement(),o=this._placeholder=this._createPlaceholderElement(),s=this._anchor=this._anchor||this._document.createComment(""),a=this._getShadowRoot();r.insertBefore(s,i),p(i,!1),this._document.body.appendChild(r.replaceChild(o,i)),function c(t,e){return e||t.fullscreenElement||t.webkitFullscreenElement||t.mozFullScreenElement||t.msFullscreenElement||t.body}(this._document,a).appendChild(n),this.started.next({source:this}),e.start(),this._initialContainer=e,this._initialIndex=e.getItemIndex(this)}else this.started.next({source:this}),this._initialContainer=this._initialIndex=void 0;this._parentPositions.cache(e?e.getScrollableParents():[])},t.prototype._initializeDragSequence=function(t,e){var i=this;this._parentDragRef&&e.stopPropagation();var r=this.isDragging(),n=k(e),o=!n&&0!==e.button,s=this._rootElement,a=!n&&this._lastTouchEventTime&&this._lastTouchEventTime+800>Date.now();if(e.target&&e.target.draggable&&"mousedown"===e.type&&e.preventDefault(),!(r||o||a)){this._handles.length&&(this._rootElementTapHighlight=s.style.webkitTapHighlightColor||"",s.style.webkitTapHighlightColor="transparent"),this._hasStartedDragging=this._hasMoved=!1,this._removeSubscriptions(),this._pointerMoveSubscription=this._dragDropRegistry.pointerMove.subscribe(this._pointerMove),this._pointerUpSubscription=this._dragDropRegistry.pointerUp.subscribe(this._pointerUp),this._scrollSubscription=this._dragDropRegistry.scroll.subscribe((function(t){i._updateOnScroll(t)})),this._boundaryElement&&(this._boundaryRect=g(this._boundaryElement));var c=this._previewTemplate;this._pickupPositionInElement=c&&c.template&&!c.matchSize?{x:0,y:0}:this._getPointerPositionInElement(t,e);var l=this._pickupPositionOnPage=this._lastKnownPointerPosition=this._getPointerPositionOnPage(e);this._pointerDirectionDelta={x:0,y:0},this._pointerPositionAtLastDirectionChange={x:l.x,y:l.y},this._dragStartTime=Date.now(),this._dragDropRegistry.startDragging(this,e)}},t.prototype._cleanupDragArtifacts=function(t){var e=this;p(this._rootElement,!0),this._anchor.parentNode.replaceChild(this._rootElement,this._anchor),this._destroyPreview(),this._destroyPlaceholder(),this._boundaryRect=this._previewRect=void 0,this._ngZone.run((function(){var i=e._dropContainer,r=i.getItemIndex(e),n=e._getPointerPositionOnPage(t),o=e._getDragDistance(e._getPointerPositionOnPage(t)),s=i._isOverContainer(n.x,n.y);e.ended.next({source:e,distance:o}),e.dropped.next({item:e,currentIndex:r,previousIndex:e._initialIndex,container:i,previousContainer:e._initialContainer,isPointerOverContainer:s,distance:o}),i.drop(e,r,e._initialIndex,e._initialContainer,s,o),e._dropContainer=e._initialContainer}))},t.prototype._updateActiveDropContainer=function(t,e){var i=this,r=t.x,n=t.y,o=e.x,s=e.y,a=this._initialContainer._getSiblingContainerFromPosition(this,r,n);!a&&this._dropContainer!==this._initialContainer&&this._initialContainer._isOverContainer(r,n)&&(a=this._initialContainer),a&&a!==this._dropContainer&&this._ngZone.run((function(){i.exited.next({item:i,container:i._dropContainer}),i._dropContainer.exit(i),i._dropContainer=a,i._dropContainer.enter(i,r,n,a===i._initialContainer&&a.sortingDisabled?i._initialIndex:void 0),i.entered.next({item:i,container:a,currentIndex:a.getItemIndex(i)})})),this._dropContainer._startScrollingIfNecessary(o,s),this._dropContainer._sortItem(this,r,n,this._pointerDirectionDelta),this._preview.style.transform=x(r-this._pickupPositionInElement.x,n-this._pickupPositionInElement.y)},t.prototype._createPreviewElement=function(){var t,e=this._previewTemplate,i=this.previewClass,r=e?e.template:null;if(r&&e){var n=e.matchSize?this._rootElement.getBoundingClientRect():null,o=e.viewContainer.createEmbeddedView(r,e.context);o.detectChanges(),t=T(o,this._document),this._previewRef=o,e.matchSize?O(t,n):t.style.transform=x(this._pickupPositionOnPage.x,this._pickupPositionOnPage.y)}else{var s=this._rootElement;O(t=y(s),s.getBoundingClientRect())}return l(t.style,{pointerEvents:"none",margin:"0",position:"fixed",top:"0",left:"0",zIndex:""+(this._config.zIndex||1e3)}),h(t,!1),t.classList.add("cdk-drag-preview"),t.setAttribute("dir",this._direction),i&&(Array.isArray(i)?i.forEach((function(e){return t.classList.add(e)})):t.classList.add(i)),t},t.prototype._animatePreviewToPlaceholder=function(){var t=this;if(!this._hasMoved)return Promise.resolve();var e=this._placeholder.getBoundingClientRect();this._preview.classList.add("cdk-drag-animating"),this._preview.style.transform=x(e.left,e.top);var i=function r(t){var e=getComputedStyle(t),i=u(e,"transition-property"),r=i.find((function(t){return"transform"===t||"all"===t}));if(!r)return 0;var n=i.indexOf(r),o=u(e,"transition-duration"),s=u(e,"transition-delay");return d(o[n])+d(s[n])}(this._preview);return 0===i?Promise.resolve():this._ngZone.runOutsideAngular((function(){return new Promise((function(e){var r=function(i){(!i||i.target===t._preview&&"transform"===i.propertyName)&&(t._preview.removeEventListener("transitionend",r),e(),clearTimeout(n))},n=setTimeout(r,1.5*i);t._preview.addEventListener("transitionend",r)}))}))},t.prototype._createPlaceholderElement=function(){var t,e=this._placeholderTemplate,i=e?e.template:null;return i?(this._placeholderRef=e.viewContainer.createEmbeddedView(i,e.context),this._placeholderRef.detectChanges(),t=T(this._placeholderRef,this._document)):t=y(this._rootElement),t.classList.add("cdk-drag-placeholder"),t},t.prototype._getPointerPositionInElement=function(t,e){var i=this._rootElement.getBoundingClientRect(),r=t===this._rootElement?null:t,n=r?r.getBoundingClientRect():i,o=k(e)?e.targetTouches[0]:e,s=this._getViewportScrollPosition();return{x:n.left-i.left+(o.pageX-n.left-s.left),y:n.top-i.top+(o.pageY-n.top-s.top)}},t.prototype._getPointerPositionOnPage=function(t){var e=this._getViewportScrollPosition(),i=k(t)?t.touches[0]||t.changedTouches[0]||{pageX:0,pageY:0}:t,r=i.pageX-e.left,n=i.pageY-e.top;if(this._ownerSVGElement){var o=this._ownerSVGElement.getScreenCTM();if(o){var s=this._ownerSVGElement.createSVGPoint();return s.x=r,s.y=n,s.matrixTransform(o.inverse())}}return{x:r,y:n}},t.prototype._getConstrainedPointerPosition=function(t){var e=this._dropContainer?this._dropContainer.lockAxis:null,i=this.constrainPosition?this.constrainPosition(t,this):t,r=i.x,n=i.y;if("x"===this.lockAxis||"x"===e?n=this._pickupPositionOnPage.y:"y"!==this.lockAxis&&"y"!==e||(r=this._pickupPositionOnPage.x),this._boundaryRect){var o=this._pickupPositionInElement,s=o.x,a=o.y,c=this._boundaryRect,l=this._previewRect,h=c.top+a,p=c.bottom-(l.height-a);r=I(r,c.left+s,c.right-(l.width-s)),n=I(n,h,p)}return{x:r,y:n}},t.prototype._updatePointerDirectionDelta=function(t){var e=t.x,i=t.y,r=this._pointerDirectionDelta,n=this._pointerPositionAtLastDirectionChange,o=Math.abs(e-n.x),s=Math.abs(i-n.y);return o>this._config.pointerDirectionChangeThreshold&&(r.x=e>n.x?1:-1,n.x=e),s>this._config.pointerDirectionChangeThreshold&&(r.y=i>n.y?1:-1,n.y=i),r},t.prototype._toggleNativeDragInteractions=function(){if(this._rootElement&&this._handles){var t=this._handles.length>0||!this.isDragging();t!==this._nativeInteractionsEnabled&&(this._nativeInteractionsEnabled=t,h(this._rootElement,t))}},t.prototype._removeRootElementListeners=function(t){t.removeEventListener("mousedown",this._pointerDown,E),t.removeEventListener("touchstart",this._pointerDown,w)},t.prototype._applyRootElementTransform=function(t,e){var i=x(t,e);null==this._initialTransform&&(this._initialTransform=this._rootElement.style.transform||""),this._rootElement.style.transform=this._initialTransform?i+" "+this._initialTransform:i},t.prototype._getDragDistance=function(t){var e=this._pickupPositionOnPage;return e?{x:t.x-e.x,y:t.y-e.y}:{x:0,y:0}},t.prototype._cleanupCachedDimensions=function(){this._boundaryRect=this._previewRect=void 0,this._parentPositions.clear()},t.prototype._containInsideBoundaryOnResize=function(){var t=this._passiveTransform,e=t.x,i=t.y;if(!(0===e&&0===i||this.isDragging())&&this._boundaryElement){var r=this._boundaryElement.getBoundingClientRect(),n=this._rootElement.getBoundingClientRect();if(!(0===r.width&&0===r.height||0===n.width&&0===n.height)){var o=r.left-n.left,s=n.right-r.right,a=r.top-n.top,c=n.bottom-r.bottom;r.width>n.width?(o>0&&(e+=o),s>0&&(e-=s)):e=0,r.height>n.height?(a>0&&(i+=a),c>0&&(i-=c)):i=0,e===this._passiveTransform.x&&i===this._passiveTransform.y||this.setFreeDragPosition({y:i,x:e})}}},t.prototype._getDragStartDelay=function(t){var e=this.dragStartDelay;return"number"==typeof e?e:k(t)?e.touch:e?e.mouse:0},t.prototype._updateOnScroll=function(t){var e=this._parentPositions.handleScroll(t);if(e){var i=t.target;this._boundaryRect&&(i===this._document||i!==this._boundaryElement&&i.contains(this._boundaryElement))&&f(this._boundaryRect,e.top,e.left),this._pickupPositionOnPage.x+=e.left,this._pickupPositionOnPage.y+=e.top,this._dropContainer||(this._activeTransform.x-=e.left,this._activeTransform.y-=e.top,this._applyRootElementTransform(this._activeTransform.x,this._activeTransform.y))}},t.prototype._getViewportScrollPosition=function(){var t=this._parentPositions.positions.get(this._document);return t?t.scrollPosition:this._viewportRuler.getViewportScrollPosition()},t.prototype._getShadowRoot=function(){return void 0===this._cachedShadowRoot&&(this._cachedShadowRoot=n._getShadowRoot(this._rootElement)),this._cachedShadowRoot},t}();function x(t,e){return"translate3d("+Math.round(t)+"px, "+Math.round(e)+"px, 0)"}function I(t,e,i){return Math.max(e,Math.min(i,t))}function C(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function k(t){return"t"===t.type[0]}function T(t,e){var i=t.rootNodes;if(1===i.length&&i[0].nodeType===e.ELEMENT_NODE)return i[0];var r=e.createElement("div");return i.forEach((function(t){return r.appendChild(t)})),r}function O(t,e){t.style.width=e.width+"px",t.style.height=e.height+"px",t.style.transform=x(e.left,e.top)}
/*! *****************************************************************************
    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.
    ***************************************************************************** */function L(t,e){var i="function"==typeof Symbol&&t[Symbol.iterator];if(!i)return t;var r,n,o=i.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(t){n={error:t}}finally{try{r&&!r.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}return s}function A(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(L(arguments[e]));return t}
/**
     * @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
     */
function j(t,e,i){var r=M(e,t.length-1),n=M(i,t.length-1);if(r!==n){for(var o=t[r],s=n<r?-1:1,a=r;a!==n;a+=s)t[a]=t[a+s];t[n]=o}}function M(t,e){return Math.max(0,Math.min(e,t))}var z=function(){function t(t,e,i,r,n){var c=this;this._dragDropRegistry=e,this._ngZone=r,this._viewportRuler=n,this.disabled=!1,this.sortingDisabled=!1,this.autoScrollDisabled=!1,this.autoScrollStep=2,this.enterPredicate=function(){return!0},this.sortPredicate=function(){return!0},this.beforeStarted=new s.Subject,this.entered=new s.Subject,this.exited=new s.Subject,this.dropped=new s.Subject,this.sorted=new s.Subject,this._isDragging=!1,this._itemPositions=[],this._previousSwap={drag:null,delta:0,overlaps:!1},this._draggables=[],this._siblings=[],this._orientation="vertical",this._activeSiblings=new Set,this._direction="ltr",this._viewportScrollSubscription=s.Subscription.EMPTY,this._verticalScrollDirection=0,this._horizontalScrollDirection=0,this._stopScrollTimers=new s.Subject,this._cachedShadowRoot=null,this._startScrollInterval=function(){c._stopScrolling(),s.interval(0,s.animationFrameScheduler).pipe(a.takeUntil(c._stopScrollTimers)).subscribe((function(){var t=c._scrollNode,e=c.autoScrollStep;1===c._verticalScrollDirection?F(t,-e):2===c._verticalScrollDirection&&F(t,e),1===c._horizontalScrollDirection?H(t,-e):2===c._horizontalScrollDirection&&H(t,e)}))},this.element=o.coerceElement(t),this._document=i,this.withScrollableParents([this.element]),e.registerDropContainer(this),this._parentPositions=new v(i,n)}return t.prototype.dispose=function(){this._stopScrolling(),this._stopScrollTimers.complete(),this._viewportScrollSubscription.unsubscribe(),this.beforeStarted.complete(),this.entered.complete(),this.exited.complete(),this.dropped.complete(),this.sorted.complete(),this._activeSiblings.clear(),this._scrollNode=null,this._parentPositions.clear(),this._dragDropRegistry.removeDropContainer(this)},t.prototype.isDragging=function(){return this._isDragging},t.prototype.start=function(){this._draggingStarted(),this._notifyReceivingSiblings()},t.prototype.enter=function(t,e,i,r){var n;this._draggingStarted(),null==r?-1===(n=this.sortingDisabled?this._draggables.indexOf(t):-1)&&(n=this._getItemIndexFromPointerPosition(t,e,i)):n=r;var s=this._activeDraggables,a=s.indexOf(t),c=t.getPlaceholderElement(),l=s[n];if(l===t&&(l=s[n+1]),a>-1&&s.splice(a,1),l&&!this._dragDropRegistry.isDragging(l)){var h=l.getRootElement();h.parentElement.insertBefore(c,h),s.splice(n,0,t)}else if(this._shouldEnterAsFirstChild(e,i)){var p=s[0].getRootElement();p.parentNode.insertBefore(c,p),s.unshift(t)}else o.coerceElement(this.element).appendChild(c),s.push(t);c.style.transform="",this._cacheItemPositions(),this._cacheParentPositions(),this._notifyReceivingSiblings(),this.entered.next({item:t,container:this,currentIndex:this.getItemIndex(t)})},t.prototype.exit=function(t){this._reset(),this.exited.next({item:t,container:this})},t.prototype.drop=function(t,e,i,r,n,o){this._reset(),this.dropped.next({item:t,currentIndex:e,previousIndex:i,container:this,previousContainer:r,isPointerOverContainer:n,distance:o})},t.prototype.withItems=function(t){var e=this,i=this._draggables;return this._draggables=t,t.forEach((function(t){return t._withDropContainer(e)})),this.isDragging()&&(i.filter((function(t){return t.isDragging()})).every((function(e){return-1===t.indexOf(e)}))?this._reset():this._cacheItems()),this},t.prototype.withDirection=function(t){return this._direction=t,this},t.prototype.connectedTo=function(t){return this._siblings=t.slice(),this},t.prototype.withOrientation=function(t){return this._orientation=t,this},t.prototype.withScrollableParents=function(t){var e=o.coerceElement(this.element);return this._scrollableElements=-1===t.indexOf(e)?A([e],t):t.slice(),this},t.prototype.getScrollableParents=function(){return this._scrollableElements},t.prototype.getItemIndex=function(t){return this._isDragging?N("horizontal"===this._orientation&&"rtl"===this._direction?this._itemPositions.slice().reverse():this._itemPositions,(function(e){return e.drag===t})):this._draggables.indexOf(t)},t.prototype.isReceiving=function(){return this._activeSiblings.size>0},t.prototype._sortItem=function(t,e,i,r){if(!this.sortingDisabled&&this._clientRect&&m(this._clientRect,.05,e,i)){var n=this._itemPositions,o=this._getItemIndexFromPointerPosition(t,e,i,r);if(!(-1===o&&n.length>0)){var s="horizontal"===this._orientation,a=N(n,(function(e){return e.drag===t})),c=n[o],l=c.clientRect,h=a>o?1:-1,p=this._getItemOffsetPx(n[a].clientRect,l,h),d=this._getSiblingOffsetPx(a,n,h),u=n.slice();j(n,a,o),this.sorted.next({previousIndex:a,currentIndex:o,container:this,item:t}),n.forEach((function(e,i){if(u[i]!==e){var r=e.drag===t,n=r?p:d,o=r?t.getPlaceholderElement():e.drag.getRootElement();e.offset+=n,s?(o.style.transform="translate3d("+Math.round(e.offset)+"px, 0, 0)",f(e.clientRect,0,n)):(o.style.transform="translate3d(0, "+Math.round(e.offset)+"px, 0)",f(e.clientRect,n,0))}})),this._previousSwap.overlaps=_(l,e,i),this._previousSwap.drag=c.drag,this._previousSwap.delta=s?r.x:r.y}}},t.prototype._startScrollingIfNecessary=function(t,e){var i=this;if(!this.autoScrollDisabled){var r,n=0,o=0;if(this._parentPositions.positions.forEach((function(s,a){var c;a!==i._document&&s.clientRect&&!r&&m(s.clientRect,.05,t,e)&&(c=L(function l(t,e,i,r){var n=V(e,r),o=G(e,i),s=0,a=0;if(n){var c=t.scrollTop;1===n?c>0&&(s=1):t.scrollHeight-c>t.clientHeight&&(s=2)}if(o){var l=t.scrollLeft;1===o?l>0&&(a=1):t.scrollWidth-l>t.clientWidth&&(a=2)}return[s,a]}
/**
     * @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
     */(a,s.clientRect,t,e),2),o=c[1],((n=c[0])||o)&&(r=a))})),!n&&!o){var s=this._viewportRuler.getViewportSize(),a=s.width,c=s.height,l={width:a,height:c,top:0,right:a,bottom:c,left:0};n=V(l,e),o=G(l,t),r=window}!r||n===this._verticalScrollDirection&&o===this._horizontalScrollDirection&&r===this._scrollNode||(this._verticalScrollDirection=n,this._horizontalScrollDirection=o,this._scrollNode=r,(n||o)&&r?this._ngZone.runOutsideAngular(this._startScrollInterval):this._stopScrolling())}},t.prototype._stopScrolling=function(){this._stopScrollTimers.next()},t.prototype._draggingStarted=function(){var t=o.coerceElement(this.element).style;this.beforeStarted.next(),this._isDragging=!0,this._initialScrollSnap=t.msScrollSnapType||t.scrollSnapType||"",t.scrollSnapType=t.msScrollSnapType="none",this._cacheItems(),this._viewportScrollSubscription.unsubscribe(),this._listenToScrollEvents()},t.prototype._cacheParentPositions=function(){var t=o.coerceElement(this.element);this._parentPositions.cache(this._scrollableElements),this._clientRect=this._parentPositions.positions.get(t).clientRect},t.prototype._cacheItemPositions=function(){var t="horizontal"===this._orientation;this._itemPositions=this._activeDraggables.map((function(t){var e=t.getVisibleElement();return{drag:t,offset:0,clientRect:g(e)}})).sort((function(e,i){return t?e.clientRect.left-i.clientRect.left:e.clientRect.top-i.clientRect.top}))},t.prototype._reset=function(){var t=this;this._isDragging=!1;var e=o.coerceElement(this.element).style;e.scrollSnapType=e.msScrollSnapType=this._initialScrollSnap,this._activeDraggables.forEach((function(t){var e=t.getRootElement();e&&(e.style.transform="")})),this._siblings.forEach((function(e){return e._stopReceiving(t)})),this._activeDraggables=[],this._itemPositions=[],this._previousSwap.drag=null,this._previousSwap.delta=0,this._previousSwap.overlaps=!1,this._stopScrolling(),this._viewportScrollSubscription.unsubscribe(),this._parentPositions.clear()},t.prototype._getSiblingOffsetPx=function(t,e,i){var r="horizontal"===this._orientation,n=e[t].clientRect,o=e[t+-1*i],s=n[r?"width":"height"]*i;if(o){var a=r?"left":"top",c=r?"right":"bottom";-1===i?s-=o.clientRect[a]-n[c]:s+=n[a]-o.clientRect[c]}return s},t.prototype._getItemOffsetPx=function(t,e,i){var r="horizontal"===this._orientation,n=r?e.left-t.left:e.top-t.top;return-1===i&&(n+=r?e.width-t.width:e.height-t.height),n},t.prototype._shouldEnterAsFirstChild=function(t,e){if(!this._activeDraggables.length)return!1;var i=this._itemPositions,r="horizontal"===this._orientation;if(i[0].drag!==this._activeDraggables[0]){var n=i[i.length-1].clientRect;return r?t>=n.right:e>=n.bottom}var o=i[0].clientRect;return r?t<=o.left:e<=o.top},t.prototype._getItemIndexFromPointerPosition=function(t,e,i,r){var n=this,o="horizontal"===this._orientation,s=N(this._itemPositions,(function(s,a,c){var l=s.drag,h=s.clientRect;return l===t?c.length<2:(!r||l!==n._previousSwap.drag||!n._previousSwap.overlaps||(o?r.x:r.y)!==n._previousSwap.delta)&&(o?e>=Math.floor(h.left)&&e<Math.floor(h.right):i>=Math.floor(h.top)&&i<Math.floor(h.bottom))}));return-1!==s&&this.sortPredicate(s,t,this)?s:-1},t.prototype._cacheItems=function(){this._activeDraggables=this._draggables.slice(),this._cacheItemPositions(),this._cacheParentPositions()},t.prototype._isOverContainer=function(t,e){return null!=this._clientRect&&_(this._clientRect,t,e)},t.prototype._getSiblingContainerFromPosition=function(t,e,i){return this._siblings.find((function(r){return r._canReceive(t,e,i)}))},t.prototype._canReceive=function(t,e,i){if(!this._clientRect||!_(this._clientRect,e,i)||!this.enterPredicate(t,this))return!1;var r=this._getShadowRoot().elementFromPoint(e,i);if(!r)return!1;var n=o.coerceElement(this.element);return r===n||n.contains(r)},t.prototype._startReceiving=function(t,e){var i=this,r=this._activeSiblings;!r.has(t)&&e.every((function(t){return i.enterPredicate(t,i)||i._draggables.indexOf(t)>-1}))&&(r.add(t),this._cacheParentPositions(),this._listenToScrollEvents())},t.prototype._stopReceiving=function(t){this._activeSiblings.delete(t),this._viewportScrollSubscription.unsubscribe()},t.prototype._listenToScrollEvents=function(){var t=this;this._viewportScrollSubscription=this._dragDropRegistry.scroll.subscribe((function(e){if(t.isDragging()){var i=t._parentPositions.handleScroll(e);i&&(t._itemPositions.forEach((function(t){f(t.clientRect,i.top,i.left)})),t._itemPositions.forEach((function(e){var i=e.drag;t._dragDropRegistry.isDragging(i)&&i._sortFromLastPointerPosition()})))}else t.isReceiving()&&t._cacheParentPositions()}))},t.prototype._getShadowRoot=function(){if(!this._cachedShadowRoot){var t=n._getShadowRoot(o.coerceElement(this.element));this._cachedShadowRoot=t||this._document}return this._cachedShadowRoot},t.prototype._notifyReceivingSiblings=function(){var t=this,e=this._activeDraggables.filter((function(t){return t.isDragging()}));this._siblings.forEach((function(i){return i._startReceiving(t,e)}))},t}();function N(t,e){for(var i=0;i<t.length;i++)if(e(t[i],i,t))return i;return-1}function F(t,e){t===window?t.scrollBy(0,e):t.scrollTop+=e}function H(t,e){t===window?t.scrollBy(e,0):t.scrollLeft+=e}function V(t,e){var i=t.top,r=t.bottom,n=.05*t.height;return e>=i-n&&e<=i+n?1:e>=r-n&&e<=r+n?2:0}function G(t,e){var i=t.left,r=t.right,n=.05*t.width;return e>=i-n&&e<=i+n?1:e>=r-n&&e<=r+n?2:0}var B=n.normalizePassiveListenerOptions({passive:!1,capture:!0}),U=function(){function t(t,e){var i=this;this._ngZone=t,this._dropInstances=new Set,this._dragInstances=new Set,this._activeDragInstances=[],this._globalListeners=new Map,this._draggingPredicate=function(t){return t.isDragging()},this.pointerMove=new s.Subject,this.pointerUp=new s.Subject,this.scroll=new s.Subject,this._preventDefaultWhileDragging=function(t){i._activeDragInstances.length>0&&t.preventDefault()},this._persistentTouchmoveListener=function(t){i._activeDragInstances.length>0&&(i._activeDragInstances.some(i._draggingPredicate)&&t.preventDefault(),i.pointerMove.next(t))},this._document=e}return t.prototype.registerDropContainer=function(t){this._dropInstances.has(t)||this._dropInstances.add(t)},t.prototype.registerDragItem=function(t){var e=this;this._dragInstances.add(t),1===this._dragInstances.size&&this._ngZone.runOutsideAngular((function(){e._document.addEventListener("touchmove",e._persistentTouchmoveListener,B)}))},t.prototype.removeDropContainer=function(t){this._dropInstances.delete(t)},t.prototype.removeDragItem=function(t){this._dragInstances.delete(t),this.stopDragging(t),0===this._dragInstances.size&&this._document.removeEventListener("touchmove",this._persistentTouchmoveListener,B)},t.prototype.startDragging=function(t,e){var i=this;if(!(this._activeDragInstances.indexOf(t)>-1)&&(this._activeDragInstances.push(t),1===this._activeDragInstances.length)){var r=e.type.startsWith("touch");this._globalListeners.set(r?"touchend":"mouseup",{handler:function(t){return i.pointerUp.next(t)},options:!0}).set("scroll",{handler:function(t){return i.scroll.next(t)},options:!0}).set("selectstart",{handler:this._preventDefaultWhileDragging,options:B}),r||this._globalListeners.set("mousemove",{handler:function(t){return i.pointerMove.next(t)},options:B}),this._ngZone.runOutsideAngular((function(){i._globalListeners.forEach((function(t,e){i._document.addEventListener(e,t.handler,t.options)}))}))}},t.prototype.stopDragging=function(t){var e=this._activeDragInstances.indexOf(t);e>-1&&(this._activeDragInstances.splice(e,1),0===this._activeDragInstances.length&&this._clearGlobalListeners())},t.prototype.isDragging=function(t){return this._activeDragInstances.indexOf(t)>-1},t.prototype.ngOnDestroy=function(){var t=this;this._dragInstances.forEach((function(e){return t.removeDragItem(e)})),this._dropInstances.forEach((function(e){return t.removeDropContainer(e)})),this._clearGlobalListeners(),this.pointerMove.complete(),this.pointerUp.complete()},t.prototype._clearGlobalListeners=function(){var t=this;this._globalListeners.forEach((function(e,i){t._document.removeEventListener(i,e.handler,e.options)})),this._globalListeners.clear()},t}();U.ɵprov=e.ɵɵdefineInjectable({factory:function t(){return new U(e.ɵɵinject(e.NgZone),e.ɵɵinject(i.DOCUMENT))},token:U,providedIn:"root"}),U.decorators=[{type:e.Injectable,args:[{providedIn:"root"}]}],U.ctorParameters=function(){return[{type:e.NgZone},{type:void 0,decorators:[{type:e.Inject,args:[i.DOCUMENT]}]}]};
/**
     * @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
     */
var Z={dragStartThreshold:5,pointerDirectionChangeThreshold:5},q=function(){function t(t,e,i,r){this._document=t,this._ngZone=e,this._viewportRuler=i,this._dragDropRegistry=r}return t.prototype.createDrag=function(t,e){return void 0===e&&(e=Z),new R(t,e,this._document,this._ngZone,this._viewportRuler,this._dragDropRegistry)},t.prototype.createDropList=function(t){return new z(t,this._dragDropRegistry,this._document,this._ngZone,this._viewportRuler)},t}();q.ɵprov=e.ɵɵdefineInjectable({factory:function t(){return new q(e.ɵɵinject(i.DOCUMENT),e.ɵɵinject(e.NgZone),e.ɵɵinject(r.ViewportRuler),e.ɵɵinject(U))},token:q,providedIn:"root"}),q.decorators=[{type:e.Injectable,args:[{providedIn:"root"}]}],q.ctorParameters=function(){return[{type:void 0,decorators:[{type:e.Inject,args:[i.DOCUMENT]}]},{type:e.NgZone},{type:r.ViewportRuler},{type:U}]};
/**
     * @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
     */
var W=new e.InjectionToken("CDK_DRAG_PARENT"),K=new e.InjectionToken("CdkDropListGroup"),Y=function(){function t(){this._items=new Set,this._disabled=!1}return Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled},set:function(t){this._disabled=o.coerceBooleanProperty(t)},enumerable:!1,configurable:!0}),t.prototype.ngOnDestroy=function(){this._items.clear()},t}();
/**
     * @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
     */Y.decorators=[{type:e.Directive,args:[{selector:"[cdkDropListGroup]",exportAs:"cdkDropListGroup",providers:[{provide:K,useExisting:Y}]}]}],Y.propDecorators={disabled:[{type:e.Input,args:["cdkDropListGroupDisabled"]}]};
/**
     * @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
     */
var X=new e.InjectionToken("CDK_DRAG_CONFIG"),J=0,Q=new e.InjectionToken("CdkDropList"),$=function(){function t(i,r,n,o,a,c,l){var h=this;this.element=i,this._changeDetectorRef=n,this._scrollDispatcher=o,this._dir=a,this._group=c,this._destroyed=new s.Subject,this.connectedTo=[],this.id="cdk-drop-list-"+J++,this.enterPredicate=function(){return!0},this.sortPredicate=function(){return!0},this.dropped=new e.EventEmitter,this.entered=new e.EventEmitter,this.exited=new e.EventEmitter,this.sorted=new e.EventEmitter,this._unsortedItems=new Set,this._dropListRef=r.createDropList(i),this._dropListRef.data=this,l&&this._assignDefaults(l),this._dropListRef.enterPredicate=function(t,e){return h.enterPredicate(t.data,e.data)},this._dropListRef.sortPredicate=function(t,e,i){return h.sortPredicate(t,e.data,i.data)},this._setupInputSyncSubscription(this._dropListRef),this._handleEvents(this._dropListRef),t._dropLists.push(this),c&&c._items.add(this)}return Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled||!!this._group&&this._group.disabled},set:function(t){this._dropListRef.disabled=this._disabled=o.coerceBooleanProperty(t)},enumerable:!1,configurable:!0}),t.prototype.addItem=function(t){this._unsortedItems.add(t),this._dropListRef.isDragging()&&this._syncItemsWithRef()},t.prototype.removeItem=function(t){this._unsortedItems.delete(t),this._dropListRef.isDragging()&&this._syncItemsWithRef()},t.prototype.getSortedItems=function(){return Array.from(this._unsortedItems).sort((function(t,e){return t._dragRef.getVisibleElement().compareDocumentPosition(e._dragRef.getVisibleElement())&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}))},t.prototype.ngOnDestroy=function(){var e=t._dropLists.indexOf(this);e>-1&&t._dropLists.splice(e,1),this._group&&this._group._items.delete(this),this._unsortedItems.clear(),this._dropListRef.dispose(),this._destroyed.next(),this._destroyed.complete()},t.prototype._setupInputSyncSubscription=function(e){var i=this;this._dir&&this._dir.change.pipe(a.startWith(this._dir.value),a.takeUntil(this._destroyed)).subscribe((function(t){return e.withDirection(t)})),e.beforeStarted.subscribe((function(){var r=o.coerceArray(i.connectedTo).map((function(e){return"string"==typeof e?t._dropLists.find((function(t){return t.id===e})):e}));if(i._group&&i._group._items.forEach((function(t){-1===r.indexOf(t)&&r.push(t)})),!i._scrollableParentsResolved){var n=i._scrollDispatcher.getAncestorScrollContainers(i.element).map((function(t){return t.getElementRef().nativeElement}));i._dropListRef.withScrollableParents(n),i._scrollableParentsResolved=!0}e.disabled=i.disabled,e.lockAxis=i.lockAxis,e.sortingDisabled=o.coerceBooleanProperty(i.sortingDisabled),e.autoScrollDisabled=o.coerceBooleanProperty(i.autoScrollDisabled),e.autoScrollStep=o.coerceNumberProperty(i.autoScrollStep,2),e.connectedTo(r.filter((function(t){return t&&t!==i})).map((function(t){return t._dropListRef}))).withOrientation(i.orientation)}))},t.prototype._handleEvents=function(t){var e=this;t.beforeStarted.subscribe((function(){e._syncItemsWithRef(),e._changeDetectorRef.markForCheck()})),t.entered.subscribe((function(t){e.entered.emit({container:e,item:t.item.data,currentIndex:t.currentIndex})})),t.exited.subscribe((function(t){e.exited.emit({container:e,item:t.item.data}),e._changeDetectorRef.markForCheck()})),t.sorted.subscribe((function(t){e.sorted.emit({previousIndex:t.previousIndex,currentIndex:t.currentIndex,container:e,item:t.item.data})})),t.dropped.subscribe((function(t){e.dropped.emit({previousIndex:t.previousIndex,currentIndex:t.currentIndex,previousContainer:t.previousContainer.data,container:t.container.data,item:t.item.data,isPointerOverContainer:t.isPointerOverContainer,distance:t.distance}),e._changeDetectorRef.markForCheck()}))},t.prototype._assignDefaults=function(t){var e=t.lockAxis,i=t.draggingDisabled,r=t.sortingDisabled,n=t.listAutoScrollDisabled,o=t.listOrientation;this.disabled=null!=i&&i,this.sortingDisabled=null!=r&&r,this.autoScrollDisabled=null!=n&&n,this.orientation=o||"vertical",e&&(this.lockAxis=e)},t.prototype._syncItemsWithRef=function(){this._dropListRef.withItems(this.getSortedItems().map((function(t){return t._dragRef})))},t}();
/**
     * @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
     */$._dropLists=[],$.decorators=[{type:e.Directive,args:[{selector:"[cdkDropList], cdk-drop-list",exportAs:"cdkDropList",providers:[{provide:K,useValue:void 0},{provide:Q,useExisting:$}],host:{class:"cdk-drop-list","[attr.id]":"id","[class.cdk-drop-list-disabled]":"disabled","[class.cdk-drop-list-dragging]":"_dropListRef.isDragging()","[class.cdk-drop-list-receiving]":"_dropListRef.isReceiving()"}}]}],$.ctorParameters=function(){return[{type:e.ElementRef},{type:q},{type:e.ChangeDetectorRef},{type:r.ScrollDispatcher},{type:c.Directionality,decorators:[{type:e.Optional}]},{type:Y,decorators:[{type:e.Optional},{type:e.Inject,args:[K]},{type:e.SkipSelf}]},{type:void 0,decorators:[{type:e.Optional},{type:e.Inject,args:[X]}]}]},$.propDecorators={connectedTo:[{type:e.Input,args:["cdkDropListConnectedTo"]}],data:[{type:e.Input,args:["cdkDropListData"]}],orientation:[{type:e.Input,args:["cdkDropListOrientation"]}],id:[{type:e.Input}],lockAxis:[{type:e.Input,args:["cdkDropListLockAxis"]}],disabled:[{type:e.Input,args:["cdkDropListDisabled"]}],sortingDisabled:[{type:e.Input,args:["cdkDropListSortingDisabled"]}],enterPredicate:[{type:e.Input,args:["cdkDropListEnterPredicate"]}],sortPredicate:[{type:e.Input,args:["cdkDropListSortPredicate"]}],autoScrollDisabled:[{type:e.Input,args:["cdkDropListAutoScrollDisabled"]}],autoScrollStep:[{type:e.Input,args:["cdkDropListAutoScrollStep"]}],dropped:[{type:e.Output,args:["cdkDropListDropped"]}],entered:[{type:e.Output,args:["cdkDropListEntered"]}],exited:[{type:e.Output,args:["cdkDropListExited"]}],sorted:[{type:e.Output,args:["cdkDropListSorted"]}]};
/**
     * @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
     */
var tt=new e.InjectionToken("CdkDragHandle"),et=function(){function t(t,e){this.element=t,this._stateChanges=new s.Subject,this._disabled=!1,this._parentDrag=e}return Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled},set:function(t){this._disabled=o.coerceBooleanProperty(t),this._stateChanges.next(this)},enumerable:!1,configurable:!0}),t.prototype.ngOnDestroy=function(){this._stateChanges.complete()},t}();et.decorators=[{type:e.Directive,args:[{selector:"[cdkDragHandle]",host:{class:"cdk-drag-handle"},providers:[{provide:tt,useExisting:et}]}]}],et.ctorParameters=function(){return[{type:e.ElementRef},{type:void 0,decorators:[{type:e.Inject,args:[W]},{type:e.Optional},{type:e.SkipSelf}]}]},et.propDecorators={disabled:[{type:e.Input,args:["cdkDragHandleDisabled"]}]};
/**
     * @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
     */
var it,rt=new e.InjectionToken("CdkDragPlaceholder");(it=function it(t){this.templateRef=t}).decorators=[{type:e.Directive,args:[{selector:"ng-template[cdkDragPlaceholder]",providers:[{provide:rt,useExisting:it}]}]}],it.ctorParameters=function(){return[{type:e.TemplateRef}]},it.propDecorators={data:[{type:e.Input}]};
/**
     * @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
     */
var nt=new e.InjectionToken("CdkDragPreview"),ot=function(){function t(t){this.templateRef=t,this._matchSize=!1}return Object.defineProperty(t.prototype,"matchSize",{get:function(){return this._matchSize},set:function(t){this._matchSize=o.coerceBooleanProperty(t)},enumerable:!1,configurable:!0}),t}();ot.decorators=[{type:e.Directive,args:[{selector:"ng-template[cdkDragPreview]",providers:[{provide:nt,useExisting:ot}]}]}],ot.ctorParameters=function(){return[{type:e.TemplateRef}]},ot.propDecorators={data:[{type:e.Input}],matchSize:[{type:e.Input}]};var st,at=function(){function t(i,r,n,o,c,l,h,p,d,u,g){var _=this;this.element=i,this.dropContainer=r,this._ngZone=o,this._viewContainerRef=c,this._dir=h,this._changeDetectorRef=d,this._selfHandle=u,this._parentDrag=g,this._destroyed=new s.Subject,this.started=new e.EventEmitter,this.released=new e.EventEmitter,this.ended=new e.EventEmitter,this.entered=new e.EventEmitter,this.exited=new e.EventEmitter,this.dropped=new e.EventEmitter,this.moved=new s.Observable((function(t){var e=_._dragRef.moved.pipe(a.map((function(t){return{source:_,pointerPosition:t.pointerPosition,event:t.event,delta:t.delta,distance:t.distance}}))).subscribe(t);return function(){e.unsubscribe()}})),this._dragRef=p.createDrag(i,{dragStartThreshold:l&&null!=l.dragStartThreshold?l.dragStartThreshold:5,pointerDirectionChangeThreshold:l&&null!=l.pointerDirectionChangeThreshold?l.pointerDirectionChangeThreshold:5,zIndex:null==l?void 0:l.zIndex}),this._dragRef.data=this,t._dragInstances.push(this),l&&this._assignDefaults(l),r&&(this._dragRef._withDropContainer(r._dropListRef),r.addItem(this)),this._syncInputs(this._dragRef),this._handleEvents(this._dragRef)}return Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled||this.dropContainer&&this.dropContainer.disabled},set:function(t){this._disabled=o.coerceBooleanProperty(t),this._dragRef.disabled=this._disabled},enumerable:!1,configurable:!0}),t.prototype.getPlaceholderElement=function(){return this._dragRef.getPlaceholderElement()},t.prototype.getRootElement=function(){return this._dragRef.getRootElement()},t.prototype.reset=function(){this._dragRef.reset()},t.prototype.getFreeDragPosition=function(){return this._dragRef.getFreeDragPosition()},t.prototype.ngAfterViewInit=function(){var t=this;this._ngZone.onStable.pipe(a.take(1),a.takeUntil(this._destroyed)).subscribe((function(){t._updateRootElement(),t._handles.changes.pipe(a.startWith(t._handles),a.tap((function(e){var i=e.filter((function(e){return e._parentDrag===t})).map((function(t){return t.element}));t._selfHandle&&t.rootElementSelector&&i.push(t.element),t._dragRef.withHandles(i)})),a.switchMap((function(t){return s.merge.apply(void 0,A(t.map((function(t){return t._stateChanges.pipe(a.startWith(t))}))))})),a.takeUntil(t._destroyed)).subscribe((function(e){var i=t._dragRef,r=e.element.nativeElement;e.disabled?i.disableHandle(r):i.enableHandle(r)})),t.freeDragPosition&&t._dragRef.setFreeDragPosition(t.freeDragPosition)}))},t.prototype.ngOnChanges=function(t){var e=t.rootElementSelector,i=t.freeDragPosition;e&&!e.firstChange&&this._updateRootElement(),i&&!i.firstChange&&this.freeDragPosition&&this._dragRef.setFreeDragPosition(this.freeDragPosition)},t.prototype.ngOnDestroy=function(){this.dropContainer&&this.dropContainer.removeItem(this);var e=t._dragInstances.indexOf(this);e>-1&&t._dragInstances.splice(e,1),this._destroyed.next(),this._destroyed.complete(),this._dragRef.dispose()},t.prototype._updateRootElement=function(){var t=this.element.nativeElement,e=this.rootElementSelector?ct(t,this.rootElementSelector):t;this._dragRef.withRootElement(e||t)},t.prototype._getBoundaryElement=function(){var t=this.boundaryElement;return t?"string"==typeof t?ct(this.element.nativeElement,t):o.coerceElement(t):null},t.prototype._syncInputs=function(e){var i=this;e.beforeStarted.subscribe((function(){if(!e.isDragging()){var t=i._dir,r=i.dragStartDelay,n=i._placeholderTemplate?{template:i._placeholderTemplate.templateRef,context:i._placeholderTemplate.data,viewContainer:i._viewContainerRef}:null,s=i._previewTemplate?{template:i._previewTemplate.templateRef,context:i._previewTemplate.data,matchSize:i._previewTemplate.matchSize,viewContainer:i._viewContainerRef}:null;e.disabled=i.disabled,e.lockAxis=i.lockAxis,e.dragStartDelay="object"==typeof r&&r?r:o.coerceNumberProperty(r),e.constrainPosition=i.constrainPosition,e.previewClass=i.previewClass,e.withBoundaryElement(i._getBoundaryElement()).withPlaceholderTemplate(n).withPreviewTemplate(s),t&&e.withDirection(t.value)}})),e.beforeStarted.pipe(a.take(1)).subscribe((function(){var r,n;if(i._parentDrag)e.withParent(i._parentDrag._dragRef);else for(var o=i.element.nativeElement.parentElement;o;){if(null===(r=o.classList)||void 0===r?void 0:r.contains("cdk-drag")){e.withParent((null===(n=t._dragInstances.find((function(t){return t.element.nativeElement===o})))||void 0===n?void 0:n._dragRef)||null);break}o=o.parentElement}}))},t.prototype._handleEvents=function(t){var e=this;t.started.subscribe((function(){e.started.emit({source:e}),e._changeDetectorRef.markForCheck()})),t.released.subscribe((function(){e.released.emit({source:e})})),t.ended.subscribe((function(t){e.ended.emit({source:e,distance:t.distance}),e._changeDetectorRef.markForCheck()})),t.entered.subscribe((function(t){e.entered.emit({container:t.container.data,item:e,currentIndex:t.currentIndex})})),t.exited.subscribe((function(t){e.exited.emit({container:t.container.data,item:e})})),t.dropped.subscribe((function(t){e.dropped.emit({previousIndex:t.previousIndex,currentIndex:t.currentIndex,previousContainer:t.previousContainer.data,container:t.container.data,isPointerOverContainer:t.isPointerOverContainer,item:e,distance:t.distance})}))},t.prototype._assignDefaults=function(t){var e=t.lockAxis,i=t.dragStartDelay,r=t.constrainPosition,n=t.previewClass,o=t.boundaryElement,s=t.draggingDisabled,a=t.rootElementSelector;this.disabled=null!=s&&s,this.dragStartDelay=i||0,e&&(this.lockAxis=e),r&&(this.constrainPosition=r),n&&(this.previewClass=n),o&&(this.boundaryElement=o),a&&(this.rootElementSelector=a)},t}();function ct(t,e){for(var i=t.parentElement;i;){if(i.matches?i.matches(e):i.msMatchesSelector(e))return i;i=i.parentElement}return null}
/**
     * @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
     */at._dragInstances=[],at.decorators=[{type:e.Directive,args:[{selector:"[cdkDrag]",exportAs:"cdkDrag",host:{class:"cdk-drag","[class.cdk-drag-disabled]":"disabled","[class.cdk-drag-dragging]":"_dragRef.isDragging()"},providers:[{provide:W,useExisting:at}]}]}],at.ctorParameters=function(){return[{type:e.ElementRef},{type:void 0,decorators:[{type:e.Inject,args:[Q]},{type:e.Optional},{type:e.SkipSelf}]},{type:void 0,decorators:[{type:e.Inject,args:[i.DOCUMENT]}]},{type:e.NgZone},{type:e.ViewContainerRef},{type:void 0,decorators:[{type:e.Optional},{type:e.Inject,args:[X]}]},{type:c.Directionality,decorators:[{type:e.Optional}]},{type:q},{type:e.ChangeDetectorRef},{type:et,decorators:[{type:e.Optional},{type:e.Self},{type:e.Inject,args:[tt]}]},{type:at,decorators:[{type:e.Optional},{type:e.SkipSelf},{type:e.Inject,args:[W]}]}]},at.propDecorators={_handles:[{type:e.ContentChildren,args:[tt,{descendants:!0}]}],_previewTemplate:[{type:e.ContentChild,args:[nt]}],_placeholderTemplate:[{type:e.ContentChild,args:[rt]}],data:[{type:e.Input,args:["cdkDragData"]}],lockAxis:[{type:e.Input,args:["cdkDragLockAxis"]}],rootElementSelector:[{type:e.Input,args:["cdkDragRootElement"]}],boundaryElement:[{type:e.Input,args:["cdkDragBoundary"]}],dragStartDelay:[{type:e.Input,args:["cdkDragStartDelay"]}],freeDragPosition:[{type:e.Input,args:["cdkDragFreeDragPosition"]}],disabled:[{type:e.Input,args:["cdkDragDisabled"]}],constrainPosition:[{type:e.Input,args:["cdkDragConstrainPosition"]}],previewClass:[{type:e.Input,args:["cdkDragPreviewClass"]}],started:[{type:e.Output,args:["cdkDragStarted"]}],released:[{type:e.Output,args:["cdkDragReleased"]}],ended:[{type:e.Output,args:["cdkDragEnded"]}],entered:[{type:e.Output,args:["cdkDragEntered"]}],exited:[{type:e.Output,args:["cdkDragExited"]}],dropped:[{type:e.Output,args:["cdkDragDropped"]}],moved:[{type:e.Output,args:["cdkDragMoved"]}]},(st=function st(){}).decorators=[{type:e.NgModule,args:[{declarations:[$,Y,at,et,ot,it],exports:[r.CdkScrollableModule,$,Y,at,et,ot,it],providers:[q]}]}],
/**
     * @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
     */
t.CDK_DRAG_CONFIG=X,t.CDK_DRAG_HANDLE=tt,t.CDK_DRAG_PARENT=W,t.CDK_DRAG_PLACEHOLDER=rt,t.CDK_DRAG_PREVIEW=nt,t.CDK_DROP_LIST=Q,t.CDK_DROP_LIST_GROUP=K,t.CdkDrag=at,t.CdkDragHandle=et,t.CdkDragPlaceholder=it,t.CdkDragPreview=ot,t.CdkDropList=$,t.CdkDropListGroup=Y,t.DragDrop=q,t.DragDropModule=st,t.DragDropRegistry=U,t.DragRef=R,t.DropListRef=z,t.copyArrayItem=function lt(t,e,i,r){var n=M(r,e.length);t.length&&e.splice(n,0,t[i])},t.moveItemInArray=j,t.transferArrayItem=function ht(t,e,i,r){var n=M(i,t.length-1),o=M(r,e.length);t.length&&e.splice(o,0,t.splice(n,1)[0])},Object.defineProperty(t,"__esModule",{value:!0})}));