{"version":3,"file":"overlay.es5.js","sources":["../../../src/cdk/overlay/fullscreen-overlay-container.ts","../../../src/cdk/overlay/overlay-module.ts","../../../src/cdk/overlay/overlay-directives.ts","../../../src/cdk/overlay/overlay.ts","../../../src/cdk/overlay/position/overlay-position-builder.ts","../../../src/cdk/overlay/position/global-position-strategy.ts","../../../src/cdk/overlay/position/connected-position-strategy.ts","../../../src/cdk/overlay/position/flexible-connected-position-strategy.ts","../../../src/cdk/overlay/overlay-ref.ts","../../../src/cdk/overlay/overlay-container.ts","../../../src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts","../../../src/cdk/overlay/position/connected-position.ts","../../../src/cdk/overlay/overlay-config.ts","../../../src/cdk/overlay/scroll/scroll-strategy-options.ts","../../../src/cdk/overlay/scroll/reposition-scroll-strategy.ts","../../../src/cdk/overlay/position/scroll-clip.ts","../../../src/cdk/overlay/scroll/noop-scroll-strategy.ts","../../../src/cdk/overlay/scroll/close-scroll-strategy.ts","../../../src/cdk/overlay/scroll/scroll-strategy.ts","../../../src/cdk/overlay/scroll/block-scroll-strategy.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, Inject, OnDestroy} from '@angular/core';\nimport {OverlayContainer} from './overlay-container';\nimport {DOCUMENT} from '@angular/common';\n\n\n/**\n * Alternative to OverlayContainer that supports correct displaying of overlay elements in\n * Fullscreen mode\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen\n *\n * Should be provided in the root component.\n */\n@Injectable({providedIn: 'root'})\nexport class FullscreenOverlayContainer extends OverlayContainer implements OnDestroy {\n  private _fullScreenEventName: string | undefined;\n  private _fullScreenListener: () => void;\n\n  constructor(@Inject(DOCUMENT) _document: any) {\n    super(_document);\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n\n    if (this._fullScreenEventName && this._fullScreenListener) {\n      this._document.removeEventListener(this._fullScreenEventName, this._fullScreenListener);\n    }\n  }\n\n  protected _createContainer(): void {\n    super._createContainer();\n    this._adjustParentForFullscreenChange();\n    this._addFullscreenChangeListener(() => this._adjustParentForFullscreenChange());\n  }\n\n  private _adjustParentForFullscreenChange(): void {\n    if (!this._containerElement) {\n      return;\n    }\n\n    const fullscreenElement = this.getFullscreenElement();\n    const parent = fullscreenElement || this._document.body;\n    parent.appendChild(this._containerElement);\n  }\n\n  private _addFullscreenChangeListener(fn: () => void) {\n    const eventName = this._getEventName();\n\n    if (eventName) {\n      if (this._fullScreenListener) {\n        this._document.removeEventListener(eventName, this._fullScreenListener);\n      }\n\n      this._document.addEventListener(eventName, fn);\n      this._fullScreenListener = fn;\n    }\n  }\n\n  private _getEventName(): string | undefined {\n    if (!this._fullScreenEventName) {\n      if (this._document.fullscreenEnabled) {\n        this._fullScreenEventName = 'fullscreenchange';\n      } else if (this._document.webkitFullscreenEnabled) {\n        this._fullScreenEventName = 'webkitfullscreenchange';\n      } else if ((this._document as any).mozFullScreenEnabled) {\n        this._fullScreenEventName = 'mozfullscreenchange';\n      } else if ((this._document as any).msFullscreenEnabled) {\n        this._fullScreenEventName = 'MSFullscreenChange';\n      }\n    }\n\n    return this._fullScreenEventName;\n  }\n\n  /**\n   * When the page is put into fullscreen mode, a specific element is specified.\n   * Only that element and its children are visible when in fullscreen mode.\n   */\n  getFullscreenElement(): Element {\n    return this._document.fullscreenElement ||\n           this._document.webkitFullscreenElement ||\n           (this._document as any).mozFullScreenElement ||\n           (this._document as any).msFullscreenElement ||\n           null;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {BidiModule} from '@angular/cdk/bidi';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {ScrollingModule, VIEWPORT_RULER_PROVIDER} from '@angular/cdk/scrolling';\nimport {NgModule, Provider} from '@angular/core';\nimport {OVERLAY_KEYBOARD_DISPATCHER_PROVIDER} from './keyboard/overlay-keyboard-dispatcher';\nimport {Overlay} from './overlay';\nimport {OVERLAY_CONTAINER_PROVIDER} from './overlay-container';\nimport {\n  CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER,\n  CdkConnectedOverlay,\n  CdkOverlayOrigin,\n} from './overlay-directives';\nimport {OverlayPositionBuilder} from './position/overlay-position-builder';\n\n\n@NgModule({\n  imports: [BidiModule, PortalModule, ScrollingModule],\n  exports: [CdkConnectedOverlay, CdkOverlayOrigin, ScrollingModule],\n  declarations: [CdkConnectedOverlay, CdkOverlayOrigin],\n  providers: [\n    Overlay,\n    CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER,\n  ],\n})\nexport class OverlayModule {}\n\n\n/**\n * @deprecated Use `OverlayModule` instead.\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const OVERLAY_PROVIDERS: Provider[] = [\n  Overlay,\n  OverlayPositionBuilder,\n  OVERLAY_KEYBOARD_DISPATCHER_PROVIDER,\n  VIEWPORT_RULER_PROVIDER,\n  OVERLAY_CONTAINER_PROVIDER,\n  CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER,\n];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {\n  Directive,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  InjectionToken,\n  Input,\n  OnChanges,\n  OnDestroy,\n  Optional,\n  Output,\n  SimpleChanges,\n  TemplateRef,\n  ViewContainerRef,\n} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {Overlay} from './overlay';\nimport {OverlayConfig} from './overlay-config';\nimport {OverlayRef} from './overlay-ref';\nimport {ConnectedOverlayPositionChange} from './position/connected-position';\nimport {\n  ConnectedPosition,\n  FlexibleConnectedPositionStrategy,\n} from './position/flexible-connected-position-strategy';\nimport {\n  RepositionScrollStrategy,\n  RepositionScrollStrategyConfig,\n  ScrollStrategy,\n} from './scroll/index';\n\n\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nconst defaultPositionList: ConnectedPosition[] = [\n  {\n    originX: 'start',\n    originY: 'bottom',\n    overlayX: 'start',\n    overlayY: 'top'\n  },\n  {\n    originX: 'start',\n    originY: 'top',\n    overlayX: 'start',\n    overlayY: 'bottom'\n  },\n  {\n    originX: 'end',\n    originY: 'top',\n    overlayX: 'end',\n    overlayY: 'bottom'\n  },\n  {\n    originX: 'end',\n    originY: 'bottom',\n    overlayX: 'end',\n    overlayY: 'top'\n  }\n];\n\n/** Injection token that determines the scroll handling while the connected overlay is open. */\nexport const CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY =\n    new InjectionToken<() => ScrollStrategy>('cdk-connected-overlay-scroll-strategy');\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_FACTORY(overlay: Overlay):\n  () => ScrollStrategy {\n  return (config?: RepositionScrollStrategyConfig) => overlay.scrollStrategies.reposition(config);\n}\n\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\n@Directive({\n  selector: '[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]',\n  exportAs: 'cdkOverlayOrigin',\n})\nexport class CdkOverlayOrigin {\n  constructor(\n      /** Reference to the element on which the directive is applied. */\n      public elementRef: ElementRef) { }\n}\n\n\n/**\n * Directive to facilitate declarative creation of an\n * Overlay using a FlexibleConnectedPositionStrategy.\n */\n@Directive({\n  selector: '[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]',\n  exportAs: 'cdkConnectedOverlay'\n})\nexport class CdkConnectedOverlay implements OnDestroy, OnChanges {\n  private _overlayRef: OverlayRef;\n  private _templatePortal: TemplatePortal;\n  private _hasBackdrop = false;\n  private _lockPosition = false;\n  private _growAfterOpen = false;\n  private _flexibleDimensions = false;\n  private _push = false;\n  private _backdropSubscription = Subscription.EMPTY;\n  private _offsetX: number;\n  private _offsetY: number;\n  private _position: FlexibleConnectedPositionStrategy;\n  private _scrollStrategyFactory: () => ScrollStrategy;\n\n  /** Origin for the connected overlay. */\n  @Input('cdkConnectedOverlayOrigin') origin: CdkOverlayOrigin;\n\n  /** Registered connected position pairs. */\n  @Input('cdkConnectedOverlayPositions') positions: ConnectedPosition[];\n\n  /** The offset in pixels for the overlay connection point on the x-axis */\n  @Input('cdkConnectedOverlayOffsetX')\n  get offsetX(): number { return this._offsetX; }\n  set offsetX(offsetX: number) {\n    this._offsetX = offsetX;\n\n    if (this._position) {\n      this._updatePositionStrategy(this._position);\n    }\n  }\n\n  /** The offset in pixels for the overlay connection point on the y-axis */\n  @Input('cdkConnectedOverlayOffsetY')\n  get offsetY() { return this._offsetY; }\n  set offsetY(offsetY: number) {\n    this._offsetY = offsetY;\n\n    if (this._position) {\n      this._updatePositionStrategy(this._position);\n    }\n  }\n\n  /** The width of the overlay panel. */\n  @Input('cdkConnectedOverlayWidth') width: number | string;\n\n  /** The height of the overlay panel. */\n  @Input('cdkConnectedOverlayHeight') height: number | string;\n\n  /** The min width of the overlay panel. */\n  @Input('cdkConnectedOverlayMinWidth') minWidth: number | string;\n\n  /** The min height of the overlay panel. */\n  @Input('cdkConnectedOverlayMinHeight') minHeight: number | string;\n\n  /** The custom class to be set on the backdrop element. */\n  @Input('cdkConnectedOverlayBackdropClass') backdropClass: string;\n\n  /** The custom class to add to the overlay pane element. */\n  @Input('cdkConnectedOverlayPanelClass') panelClass: string | string[];\n\n  /** Margin between the overlay and the viewport edges. */\n  @Input('cdkConnectedOverlayViewportMargin') viewportMargin: number = 0;\n\n  /** Strategy to be used when handling scroll events while the overlay is open. */\n  @Input('cdkConnectedOverlayScrollStrategy') scrollStrategy: ScrollStrategy;\n\n  /** Whether the overlay is open. */\n  @Input('cdkConnectedOverlayOpen') open: boolean = false;\n\n  /** Whether or not the overlay should attach a backdrop. */\n  @Input('cdkConnectedOverlayHasBackdrop')\n  get hasBackdrop() { return this._hasBackdrop; }\n  set hasBackdrop(value: any) { this._hasBackdrop = coerceBooleanProperty(value); }\n\n  /** Whether or not the overlay should be locked when scrolling. */\n  @Input('cdkConnectedOverlayLockPosition')\n  get lockPosition() { return this._lockPosition; }\n  set lockPosition(value: any) { this._lockPosition = coerceBooleanProperty(value); }\n\n  /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n  @Input('cdkConnectedOverlayFlexibleDimensions')\n  get flexibleDimensions() { return this._flexibleDimensions; }\n  set flexibleDimensions(value: boolean) {\n    this._flexibleDimensions = coerceBooleanProperty(value);\n  }\n\n  /** Whether the overlay can grow after the initial open when flexible positioning is turned on. */\n  @Input('cdkConnectedOverlayGrowAfterOpen')\n  get growAfterOpen() { return this._growAfterOpen; }\n  set growAfterOpen(value: boolean) { this._growAfterOpen = coerceBooleanProperty(value); }\n\n  /** Whether the overlay can be pushed on-screen if none of the provided positions fit. */\n  @Input('cdkConnectedOverlayPush')\n  get push() { return this._push; }\n  set push(value: boolean) { this._push = coerceBooleanProperty(value); }\n\n  /** Event emitted when the backdrop is clicked. */\n  @Output() backdropClick = new EventEmitter<MouseEvent>();\n\n  /** Event emitted when the position has changed. */\n  @Output() positionChange = new EventEmitter<ConnectedOverlayPositionChange>();\n\n  /** Event emitted when the overlay has been attached. */\n  @Output() attach = new EventEmitter<void>();\n\n  /** Event emitted when the overlay has been detached. */\n  @Output() detach = new EventEmitter<void>();\n\n  /** Emits when there are keyboard events that are targeted at the overlay. */\n  @Output() overlayKeydown = new EventEmitter<KeyboardEvent>();\n\n  // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n\n  constructor(\n      private _overlay: Overlay,\n      templateRef: TemplateRef<any>,\n      viewContainerRef: ViewContainerRef,\n      @Inject(CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY) scrollStrategyFactory: any,\n      @Optional() private _dir: Directionality) {\n    this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n    this._scrollStrategyFactory = scrollStrategyFactory;\n    this.scrollStrategy = this._scrollStrategyFactory();\n  }\n\n  /** The associated overlay reference. */\n  get overlayRef(): OverlayRef {\n    return this._overlayRef;\n  }\n\n  /** The element's layout direction. */\n  get dir(): Direction {\n    return this._dir ? this._dir.value : 'ltr';\n  }\n\n  ngOnDestroy() {\n    if (this._overlayRef) {\n      this._overlayRef.dispose();\n    }\n\n    this._backdropSubscription.unsubscribe();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (this._position) {\n      this._updatePositionStrategy(this._position);\n      this._overlayRef.updateSize({\n        width: this.width,\n        minWidth: this.minWidth,\n        height: this.height,\n        minHeight: this.minHeight,\n      });\n\n      if (changes['origin'] && this.open) {\n        this._position.apply();\n      }\n    }\n\n    if (changes['open']) {\n      this.open ? this._attachOverlay() : this._detachOverlay();\n    }\n  }\n\n  /** Creates an overlay */\n  private _createOverlay() {\n    if (!this.positions || !this.positions.length) {\n      this.positions = defaultPositionList;\n    }\n\n    this._overlayRef = this._overlay.create(this._buildConfig());\n\n    this._overlayRef.keydownEvents().subscribe((event: KeyboardEvent) => {\n      this.overlayKeydown.next(event);\n\n      if (event.keyCode === ESCAPE && !hasModifierKey(event)) {\n        event.preventDefault();\n        this._detachOverlay();\n      }\n    });\n  }\n\n  /** Builds the overlay config based on the directive's inputs */\n  private _buildConfig(): OverlayConfig {\n    const positionStrategy = this._position = this._createPositionStrategy();\n    const overlayConfig = new OverlayConfig({\n      direction: this._dir,\n      positionStrategy,\n      scrollStrategy: this.scrollStrategy,\n      hasBackdrop: this.hasBackdrop\n    });\n\n    if (this.width || this.width === 0) {\n      overlayConfig.width = this.width;\n    }\n\n    if (this.height || this.height === 0) {\n      overlayConfig.height = this.height;\n    }\n\n    if (this.minWidth || this.minWidth === 0) {\n      overlayConfig.minWidth = this.minWidth;\n    }\n\n    if (this.minHeight || this.minHeight === 0) {\n      overlayConfig.minHeight = this.minHeight;\n    }\n\n    if (this.backdropClass) {\n      overlayConfig.backdropClass = this.backdropClass;\n    }\n\n    if (this.panelClass) {\n      overlayConfig.panelClass = this.panelClass;\n    }\n\n    return overlayConfig;\n  }\n\n  /** Updates the state of a position strategy, based on the values of the directive inputs. */\n  private _updatePositionStrategy(positionStrategy: FlexibleConnectedPositionStrategy) {\n    const positions: ConnectedPosition[] = this.positions.map(currentPosition => ({\n      originX: currentPosition.originX,\n      originY: currentPosition.originY,\n      overlayX: currentPosition.overlayX,\n      overlayY: currentPosition.overlayY,\n      offsetX: currentPosition.offsetX || this.offsetX,\n      offsetY: currentPosition.offsetY || this.offsetY,\n      panelClass: currentPosition.panelClass || undefined,\n    }));\n\n    return positionStrategy\n      .setOrigin(this.origin.elementRef)\n      .withPositions(positions)\n      .withFlexibleDimensions(this.flexibleDimensions)\n      .withPush(this.push)\n      .withGrowAfterOpen(this.growAfterOpen)\n      .withViewportMargin(this.viewportMargin)\n      .withLockedPosition(this.lockPosition);\n  }\n\n  /** Returns the position strategy of the overlay to be set on the overlay config */\n  private _createPositionStrategy(): FlexibleConnectedPositionStrategy {\n    const strategy = this._overlay.position().flexibleConnectedTo(this.origin.elementRef);\n\n    this._updatePositionStrategy(strategy);\n    strategy.positionChanges.subscribe(p => this.positionChange.emit(p));\n\n    return strategy;\n  }\n\n  /** Attaches the overlay and subscribes to backdrop clicks if backdrop exists */\n  private _attachOverlay() {\n    if (!this._overlayRef) {\n      this._createOverlay();\n    } else {\n      // Update the overlay size, in case the directive's inputs have changed\n      this._overlayRef.getConfig().hasBackdrop = this.hasBackdrop;\n    }\n\n    if (!this._overlayRef.hasAttached()) {\n      this._overlayRef.attach(this._templatePortal);\n      this.attach.emit();\n    }\n\n    if (this.hasBackdrop) {\n      this._backdropSubscription = this._overlayRef.backdropClick().subscribe(event => {\n        this.backdropClick.emit(event);\n      });\n    } else {\n      this._backdropSubscription.unsubscribe();\n    }\n  }\n\n  /** Detaches the overlay and unsubscribes to backdrop clicks if backdrop exists */\n  private _detachOverlay() {\n    if (this._overlayRef) {\n      this._overlayRef.detach();\n      this.detach.emit();\n    }\n\n    this._backdropSubscription.unsubscribe();\n  }\n}\n\n\n/** @docs-private */\nexport function CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay: Overlay):\n    () => RepositionScrollStrategy {\n  return () => overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER = {\n  provide: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY,\n  deps: [Overlay],\n  useFactory: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {DomPortalOutlet} from '@angular/cdk/portal';\nimport {DOCUMENT, Location} from '@angular/common';\nimport {\n  ApplicationRef,\n  ComponentFactoryResolver,\n  Inject,\n  Injectable,\n  Injector,\n  NgZone,\n  Optional,\n} from '@angular/core';\nimport {OverlayKeyboardDispatcher} from './keyboard/overlay-keyboard-dispatcher';\nimport {OverlayConfig} from './overlay-config';\nimport {OverlayContainer} from './overlay-container';\nimport {OverlayRef} from './overlay-ref';\nimport {OverlayPositionBuilder} from './position/overlay-position-builder';\nimport {ScrollStrategyOptions} from './scroll/index';\n\n\n/** Next overlay unique ID. */\nlet nextUniqueId = 0;\n\n// Note that Overlay is *not* scoped to the app root because the ComponentFactoryResolver\n// it needs is different based on where OverlayModule is imported.\n\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalOutlet, so any kind of Portal can be loaded into one.\n */\n@Injectable()\nexport class Overlay {\n  private _appRef: ApplicationRef;\n\n  constructor(\n              /** Scrolling strategies that can be used when creating an overlay. */\n              public scrollStrategies: ScrollStrategyOptions,\n              private _overlayContainer: OverlayContainer,\n              private _componentFactoryResolver: ComponentFactoryResolver,\n              private _positionBuilder: OverlayPositionBuilder,\n              private _keyboardDispatcher: OverlayKeyboardDispatcher,\n              private _injector: Injector,\n              private _ngZone: NgZone,\n              @Inject(DOCUMENT) private _document: any,\n              private _directionality: Directionality,\n              // @breaking-change 8.0.0 `_location` parameter to be made required.\n              @Optional() private _location?: Location) { }\n\n  /**\n   * Creates an overlay.\n   * @param config Configuration applied to the overlay.\n   * @returns Reference to the created overlay.\n   */\n  create(config?: OverlayConfig): OverlayRef {\n    const host = this._createHostElement();\n    const pane = this._createPaneElement(host);\n    const portalOutlet = this._createPortalOutlet(pane);\n    const overlayConfig = new OverlayConfig(config);\n\n    overlayConfig.direction = overlayConfig.direction || this._directionality.value;\n\n    return new OverlayRef(portalOutlet, host, pane, overlayConfig, this._ngZone,\n      this._keyboardDispatcher, this._document, this._location);\n  }\n\n  /**\n   * Gets a position builder that can be used, via fluent API,\n   * to construct and configure a position strategy.\n   * @returns An overlay position builder.\n   */\n  position(): OverlayPositionBuilder {\n    return this._positionBuilder;\n  }\n\n  /**\n   * Creates the DOM element for an overlay and appends it to the overlay container.\n   * @returns Newly-created pane element\n   */\n  private _createPaneElement(host: HTMLElement): HTMLElement {\n    const pane = this._document.createElement('div');\n\n    pane.id = `cdk-overlay-${nextUniqueId++}`;\n    pane.classList.add('cdk-overlay-pane');\n    host.appendChild(pane);\n\n    return pane;\n  }\n\n  /**\n   * Creates the host element that wraps around an overlay\n   * and can be used for advanced positioning.\n   * @returns Newly-create host element.\n   */\n  private _createHostElement(): HTMLElement {\n    const host = this._document.createElement('div');\n    this._overlayContainer.getContainerElement().appendChild(host);\n    return host;\n  }\n\n  /**\n   * Create a DomPortalOutlet into which the overlay content can be loaded.\n   * @param pane The DOM element to turn into a portal outlet.\n   * @returns A portal outlet for the given DOM element.\n   */\n  private _createPortalOutlet(pane: HTMLElement): DomPortalOutlet {\n    // We have to resolve the ApplicationRef later in order to allow people\n    // to use overlay-based providers during app initialization.\n    if (!this._appRef) {\n      this._appRef = this._injector.get<ApplicationRef>(ApplicationRef);\n    }\n\n    return new DomPortalOutlet(pane, this._componentFactoryResolver, this._appRef, this._injector);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Platform} from '@angular/cdk/platform';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {DOCUMENT} from '@angular/common';\nimport {ElementRef, Inject, Injectable} from '@angular/core';\n\nimport {OverlayContainer} from '../overlay-container';\n\nimport {OriginConnectionPosition, OverlayConnectionPosition} from './connected-position';\nimport {ConnectedPositionStrategy} from './connected-position-strategy';\nimport {\n  FlexibleConnectedPositionStrategy,\n  FlexibleConnectedPositionStrategyOrigin,\n} from './flexible-connected-position-strategy';\nimport {GlobalPositionStrategy} from './global-position-strategy';\n\n\n/** Builder for overlay position strategy. */\n@Injectable({providedIn: 'root'})\nexport class OverlayPositionBuilder {\n  constructor(\n      private _viewportRuler: ViewportRuler, @Inject(DOCUMENT) private _document: any,\n      private _platform: Platform, private _overlayContainer: OverlayContainer) {}\n\n  /**\n   * Creates a global position strategy.\n   */\n  global(): GlobalPositionStrategy {\n    return new GlobalPositionStrategy();\n  }\n\n  /**\n   * Creates a relative position strategy.\n   * @param elementRef\n   * @param originPos\n   * @param overlayPos\n   * @deprecated Use `flexibleConnectedTo` instead.\n   * @breaking-change 8.0.0\n   */\n  connectedTo(\n      elementRef: ElementRef,\n      originPos: OriginConnectionPosition,\n      overlayPos: OverlayConnectionPosition): ConnectedPositionStrategy {\n    return new ConnectedPositionStrategy(\n        originPos, overlayPos, elementRef, this._viewportRuler, this._document, this._platform,\n        this._overlayContainer);\n  }\n\n  /**\n   * Creates a flexible position strategy.\n   * @param origin Origin relative to which to position the overlay.\n   */\n  flexibleConnectedTo(origin: FlexibleConnectedPositionStrategyOrigin):\n    FlexibleConnectedPositionStrategy {\n    return new FlexibleConnectedPositionStrategy(origin, this._viewportRuler, this._document,\n        this._platform, this._overlayContainer);\n  }\n\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {PositionStrategy} from './position-strategy';\nimport {OverlayReference} from '../overlay-reference';\n\n/** Class to be added to the overlay pane wrapper. */\nconst wrapperClass = 'cdk-global-overlay-wrapper';\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport. We use flexbox, instead of\n * transforms, in order to avoid issues with subpixel rendering which can cause the\n * element to become blurry.\n */\nexport class GlobalPositionStrategy implements PositionStrategy {\n  /** The overlay to which this strategy is attached. */\n  private _overlayRef: OverlayReference;\n  private _cssPosition: string = 'static';\n  private _topOffset: string = '';\n  private _bottomOffset: string = '';\n  private _leftOffset: string = '';\n  private _rightOffset: string = '';\n  private _alignItems: string = '';\n  private _justifyContent: string = '';\n  private _width: string = '';\n  private _height: string = '';\n  private _isDisposed: boolean;\n\n  attach(overlayRef: OverlayReference): void {\n    const config = overlayRef.getConfig();\n\n    this._overlayRef = overlayRef;\n\n    if (this._width && !config.width) {\n      overlayRef.updateSize({width: this._width});\n    }\n\n    if (this._height && !config.height) {\n      overlayRef.updateSize({height: this._height});\n    }\n\n    overlayRef.hostElement.classList.add(wrapperClass);\n    this._isDisposed = false;\n  }\n\n  /**\n   * Sets the top position of the overlay. Clears any previously set vertical position.\n   * @param value New top offset.\n   */\n  top(value: string = ''): this {\n    this._bottomOffset = '';\n    this._topOffset = value;\n    this._alignItems = 'flex-start';\n    return this;\n  }\n\n  /**\n   * Sets the left position of the overlay. Clears any previously set horizontal position.\n   * @param value New left offset.\n   */\n  left(value: string = ''): this {\n    this._rightOffset = '';\n    this._leftOffset = value;\n    this._justifyContent = 'flex-start';\n    return this;\n  }\n\n  /**\n   * Sets the bottom position of the overlay. Clears any previously set vertical position.\n   * @param value New bottom offset.\n   */\n  bottom(value: string = ''): this {\n    this._topOffset = '';\n    this._bottomOffset = value;\n    this._alignItems = 'flex-end';\n    return this;\n  }\n\n  /**\n   * Sets the right position of the overlay. Clears any previously set horizontal position.\n   * @param value New right offset.\n   */\n  right(value: string = ''): this {\n    this._leftOffset = '';\n    this._rightOffset = value;\n    this._justifyContent = 'flex-end';\n    return this;\n  }\n\n  /**\n   * Sets the overlay width and clears any previously set width.\n   * @param value New width for the overlay\n   * @deprecated Pass the `width` through the `OverlayConfig`.\n   * @breaking-change 8.0.0\n   */\n  width(value: string = ''): this {\n    if (this._overlayRef) {\n      this._overlayRef.updateSize({width: value});\n    } else {\n      this._width = value;\n    }\n\n    return this;\n  }\n\n  /**\n   * Sets the overlay height and clears any previously set height.\n   * @param value New height for the overlay\n   * @deprecated Pass the `height` through the `OverlayConfig`.\n   * @breaking-change 8.0.0\n   */\n  height(value: string = ''): this {\n    if (this._overlayRef) {\n      this._overlayRef.updateSize({height: value});\n    } else {\n      this._height = value;\n    }\n\n    return this;\n  }\n\n  /**\n   * Centers the overlay horizontally with an optional offset.\n   * Clears any previously set horizontal position.\n   *\n   * @param offset Overlay offset from the horizontal center.\n   */\n  centerHorizontally(offset: string = ''): this {\n    this.left(offset);\n    this._justifyContent = 'center';\n    return this;\n  }\n\n  /**\n   * Centers the overlay vertically with an optional offset.\n   * Clears any previously set vertical position.\n   *\n   * @param offset Overlay offset from the vertical center.\n   */\n  centerVertically(offset: string = ''): this {\n    this.top(offset);\n    this._alignItems = 'center';\n    return this;\n  }\n\n  /**\n   * Apply the position to the element.\n   * @docs-private\n   */\n  apply(): void {\n    // Since the overlay ref applies the strategy asynchronously, it could\n    // have been disposed before it ends up being applied. If that is the\n    // case, we shouldn't do anything.\n    if (!this._overlayRef || !this._overlayRef.hasAttached()) {\n      return;\n    }\n\n    const styles = this._overlayRef.overlayElement.style;\n    const parentStyles = this._overlayRef.hostElement.style;\n    const config = this._overlayRef.getConfig();\n\n    styles.position = this._cssPosition;\n    styles.marginLeft = config.width === '100%' ? '0' : this._leftOffset;\n    styles.marginTop = config.height === '100%' ? '0' : this._topOffset;\n    styles.marginBottom = this._bottomOffset;\n    styles.marginRight = this._rightOffset;\n\n    if (config.width === '100%') {\n      parentStyles.justifyContent = 'flex-start';\n    } else if (this._justifyContent === 'center') {\n      parentStyles.justifyContent = 'center';\n    } else if (this._overlayRef.getConfig().direction === 'rtl') {\n      // In RTL the browser will invert `flex-start` and `flex-end` automatically, but we\n      // don't want that because our positioning is explicitly `left` and `right`, hence\n      // why we do another inversion to ensure that the overlay stays in the same position.\n      // TODO: reconsider this if we add `start` and `end` methods.\n      if (this._justifyContent === 'flex-start') {\n        parentStyles.justifyContent = 'flex-end';\n      } else if (this._justifyContent === 'flex-end') {\n        parentStyles.justifyContent = 'flex-start';\n      }\n    } else {\n      parentStyles.justifyContent = this._justifyContent;\n    }\n\n    parentStyles.alignItems = config.height === '100%' ? 'flex-start' : this._alignItems;\n  }\n\n  /**\n   * Cleans up the DOM changes from the position strategy.\n   * @docs-private\n   */\n  dispose(): void {\n    if (this._isDisposed || !this._overlayRef) {\n      return;\n    }\n\n    const styles = this._overlayRef.overlayElement.style;\n    const parent = this._overlayRef.hostElement;\n    const parentStyles = parent.style;\n\n    parent.classList.remove(wrapperClass);\n    parentStyles.justifyContent = parentStyles.alignItems = styles.marginTop =\n      styles.marginBottom = styles.marginLeft = styles.marginRight = styles.position = '';\n\n    this._overlayRef = null!;\n    this._isDisposed = true;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Direction} from '@angular/cdk/bidi';\nimport {Platform} from '@angular/cdk/platform';\nimport {CdkScrollable, ViewportRuler} from '@angular/cdk/scrolling';\nimport {ElementRef} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport {OverlayContainer} from '../overlay-container';\nimport {OverlayReference} from '../overlay-reference';\n\nimport {\n  ConnectedOverlayPositionChange,\n  ConnectionPositionPair,\n  OriginConnectionPosition,\n  OverlayConnectionPosition,\n} from './connected-position';\nimport {FlexibleConnectedPositionStrategy} from './flexible-connected-position-strategy';\nimport {PositionStrategy} from './position-strategy';\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative to some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n * @deprecated Use `FlexibleConnectedPositionStrategy` instead.\n * @breaking-change 8.0.0\n */\nexport class ConnectedPositionStrategy implements PositionStrategy {\n  /**\n   * Reference to the underlying position strategy to which all the API calls are proxied.\n   * @docs-private\n   */\n  _positionStrategy: FlexibleConnectedPositionStrategy;\n\n  /** The overlay to which this strategy is attached. */\n  private _overlayRef: OverlayReference;\n\n  private _direction: Direction | null;\n\n  /** Whether the we're dealing with an RTL context */\n  get _isRtl() {\n    return this._overlayRef.getDirection() === 'rtl';\n  }\n\n  /** Ordered list of preferred positions, from most to least desirable. */\n  _preferredPositions: ConnectionPositionPair[] = [];\n\n  /** Emits an event when the connection point changes. */\n  get onPositionChange(): Observable<ConnectedOverlayPositionChange> {\n    return this._positionStrategy.positionChanges;\n  }\n\n  constructor(\n      originPos: OriginConnectionPosition, overlayPos: OverlayConnectionPosition,\n      connectedTo: ElementRef<HTMLElement>, viewportRuler: ViewportRuler, document: Document,\n      platform: Platform, overlayContainer: OverlayContainer) {\n    // Since the `ConnectedPositionStrategy` is deprecated and we don't want to maintain\n    // the extra logic, we create an instance of the positioning strategy that has some\n    // defaults that make it behave as the old position strategy and to which we'll\n    // proxy all of the API calls.\n    this._positionStrategy = new FlexibleConnectedPositionStrategy(\n                                 connectedTo, viewportRuler, document, platform, overlayContainer)\n                                 .withFlexibleDimensions(false)\n                                 .withPush(false)\n                                 .withViewportMargin(0);\n\n    this.withFallbackPosition(originPos, overlayPos);\n  }\n\n  /** Ordered list of preferred positions, from most to least desirable. */\n  get positions(): ConnectionPositionPair[] {\n    return this._preferredPositions;\n  }\n\n  /** Attach this position strategy to an overlay. */\n  attach(overlayRef: OverlayReference): void {\n    this._overlayRef = overlayRef;\n    this._positionStrategy.attach(overlayRef);\n\n    if (this._direction) {\n      overlayRef.setDirection(this._direction);\n      this._direction = null;\n    }\n  }\n\n  /** Disposes all resources used by the position strategy. */\n  dispose() {\n    this._positionStrategy.dispose();\n  }\n\n  /** @docs-private */\n  detach() {\n    this._positionStrategy.detach();\n  }\n\n  /**\n   * Updates the position of the overlay element, using whichever preferred position relative\n   * to the origin fits on-screen.\n   * @docs-private\n   */\n  apply(): void {\n    this._positionStrategy.apply();\n  }\n\n  /**\n   * Re-positions the overlay element with the trigger in its last calculated position,\n   * even if a position higher in the \"preferred positions\" list would now fit. This\n   * allows one to re-align the panel without changing the orientation of the panel.\n   */\n  recalculateLastPosition(): void {\n    this._positionStrategy.reapplyLastPosition();\n  }\n\n  /**\n   * Sets the list of Scrollable containers that host the origin element so that\n   * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n   * Scrollable must be an ancestor element of the strategy's origin element.\n   */\n  withScrollableContainers(scrollables: CdkScrollable[]) {\n    this._positionStrategy.withScrollableContainers(scrollables);\n  }\n\n  /**\n   * Adds a new preferred fallback position.\n   * @param originPos\n   * @param overlayPos\n   */\n  withFallbackPosition(\n      originPos: OriginConnectionPosition,\n      overlayPos: OverlayConnectionPosition,\n      offsetX?: number,\n      offsetY?: number): this {\n\n    const position = new ConnectionPositionPair(originPos, overlayPos, offsetX, offsetY);\n    this._preferredPositions.push(position);\n    this._positionStrategy.withPositions(this._preferredPositions);\n    return this;\n  }\n\n  /**\n   * Sets the layout direction so the overlay's position can be adjusted to match.\n   * @param dir New layout direction.\n   */\n  withDirection(dir: 'ltr' | 'rtl'): this {\n    // Since the direction might be declared before the strategy is attached,\n    // we save the value in a temporary property and we'll transfer it to the\n    // overlay ref on attachment.\n    if (this._overlayRef) {\n      this._overlayRef.setDirection(dir);\n    } else {\n      this._direction = dir;\n    }\n\n    return this;\n  }\n\n  /**\n   * Sets an offset for the overlay's connection point on the x-axis\n   * @param offset New offset in the X axis.\n   */\n  withOffsetX(offset: number): this {\n    this._positionStrategy.withDefaultOffsetX(offset);\n    return this;\n  }\n\n  /**\n   * Sets an offset for the overlay's connection point on the y-axis\n   * @param  offset New offset in the Y axis.\n   */\n  withOffsetY(offset: number): this {\n    this._positionStrategy.withDefaultOffsetY(offset);\n    return this;\n  }\n\n  /**\n   * Sets whether the overlay's position should be locked in after it is positioned\n   * initially. When an overlay is locked in, it won't attempt to reposition itself\n   * when the position is re-applied (e.g. when the user scrolls away).\n   * @param isLocked Whether the overlay should locked in.\n   */\n  withLockedPosition(isLocked: boolean): this {\n    this._positionStrategy.withLockedPosition(isLocked);\n    return this;\n  }\n\n  /**\n   * Overwrites the current set of positions with an array of new ones.\n   * @param positions Position pairs to be set on the strategy.\n   */\n  withPositions(positions: ConnectionPositionPair[]): this {\n    this._preferredPositions = positions.slice();\n    this._positionStrategy.withPositions(this._preferredPositions);\n    return this;\n  }\n\n  /**\n   * Sets the origin element, relative to which to position the overlay.\n   * @param origin Reference to the new origin element.\n   */\n  setOrigin(origin: ElementRef): this {\n    this._positionStrategy.setOrigin(origin);\n    return this;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {PositionStrategy} from './position-strategy';\nimport {ElementRef} from '@angular/core';\nimport {ViewportRuler, CdkScrollable, ViewportScrollPosition} from '@angular/cdk/scrolling';\nimport {\n  ConnectedOverlayPositionChange,\n  ConnectionPositionPair,\n  ScrollingVisibility,\n  validateHorizontalPosition,\n  validateVerticalPosition,\n} from './connected-position';\nimport {Observable, Subscription, Subject} from 'rxjs';\nimport {OverlayReference} from '../overlay-reference';\nimport {isElementScrolledOutsideView, isElementClippedByScrolling} from './scroll-clip';\nimport {coerceCssPixelValue, coerceArray} from '@angular/cdk/coercion';\nimport {Platform} from '@angular/cdk/platform';\nimport {OverlayContainer} from '../overlay-container';\n\n// TODO: refactor clipping detection into a separate thing (part of scrolling module)\n// TODO: doesn't handle both flexible width and height when it has to scroll along both axis.\n\n/** Class to be added to the overlay bounding box. */\nconst boundingBoxClass = 'cdk-overlay-connected-position-bounding-box';\n\n/** Possible values that can be set as the origin of a FlexibleConnectedPositionStrategy. */\nexport type FlexibleConnectedPositionStrategyOrigin = ElementRef | HTMLElement | Point;\n\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nexport class FlexibleConnectedPositionStrategy implements PositionStrategy {\n  /** The overlay to which this strategy is attached. */\n  private _overlayRef: OverlayReference;\n\n  /** Whether we're performing the very first positioning of the overlay. */\n  private _isInitialRender: boolean;\n\n  /** Last size used for the bounding box. Used to avoid resizing the overlay after open. */\n  private _lastBoundingBoxSize = {width: 0, height: 0};\n\n  /** Whether the overlay was pushed in a previous positioning. */\n  private _isPushed = false;\n\n  /** Whether the overlay can be pushed on-screen on the initial open. */\n  private _canPush = true;\n\n  /** Whether the overlay can grow via flexible width/height after the initial open. */\n  private _growAfterOpen = false;\n\n  /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n  private _hasFlexibleDimensions = true;\n\n  /** Whether the overlay position is locked. */\n  private _positionLocked = false;\n\n  /** Cached origin dimensions */\n  private _originRect: ClientRect;\n\n  /** Cached overlay dimensions */\n  private _overlayRect: ClientRect;\n\n  /** Cached viewport dimensions */\n  private _viewportRect: ClientRect;\n\n  /** Amount of space that must be maintained between the overlay and the edge of the viewport. */\n  private _viewportMargin = 0;\n\n  /** The Scrollable containers used to check scrollable view properties on position change. */\n  private _scrollables: CdkScrollable[] = [];\n\n  /** Ordered list of preferred positions, from most to least desirable. */\n  _preferredPositions: ConnectionPositionPair[] = [];\n\n  /** The origin element against which the overlay will be positioned. */\n  private _origin: FlexibleConnectedPositionStrategyOrigin;\n\n  /** The overlay pane element. */\n  private _pane: HTMLElement;\n\n  /** Whether the strategy has been disposed of already. */\n  private _isDisposed: boolean;\n\n  /**\n   * Parent element for the overlay panel used to constrain the overlay panel's size to fit\n   * within the viewport.\n   */\n  private _boundingBox: HTMLElement | null;\n\n  /** The last position to have been calculated as the best fit position. */\n  private _lastPosition: ConnectedPosition | null;\n\n  /** Subject that emits whenever the position changes. */\n  private _positionChanges = new Subject<ConnectedOverlayPositionChange>();\n\n  /** Subscription to viewport size changes. */\n  private _resizeSubscription = Subscription.EMPTY;\n\n  /** Default offset for the overlay along the x axis. */\n  private _offsetX = 0;\n\n  /** Default offset for the overlay along the y axis. */\n  private _offsetY = 0;\n\n  /** Selector to be used when finding the elements on which to set the transform origin. */\n  private _transformOriginSelector: string;\n\n  /** Keeps track of the CSS classes that the position strategy has applied on the overlay panel. */\n  private _appliedPanelClasses: string[] = [];\n\n  /** Amount by which the overlay was pushed in each axis during the last time it was positioned. */\n  private _previousPushAmount: {x: number, y: number} | null;\n\n  /** Observable sequence of position changes. */\n  positionChanges: Observable<ConnectedOverlayPositionChange> =\n      this._positionChanges.asObservable();\n\n  /** Ordered list of preferred positions, from most to least desirable. */\n  get positions(): ConnectionPositionPair[] {\n    return this._preferredPositions;\n  }\n\n  constructor(\n      connectedTo: FlexibleConnectedPositionStrategyOrigin, private _viewportRuler: ViewportRuler,\n      private _document: Document, private _platform: Platform,\n      private _overlayContainer: OverlayContainer) {\n    this.setOrigin(connectedTo);\n  }\n\n  /** Attaches this position strategy to an overlay. */\n  attach(overlayRef: OverlayReference): void {\n    if (this._overlayRef && overlayRef !== this._overlayRef) {\n      throw Error('This position strategy is already attached to an overlay');\n    }\n\n    this._validatePositions();\n\n    overlayRef.hostElement.classList.add(boundingBoxClass);\n\n    this._overlayRef = overlayRef;\n    this._boundingBox = overlayRef.hostElement;\n    this._pane = overlayRef.overlayElement;\n    this._isDisposed = false;\n    this._isInitialRender = true;\n    this._lastPosition = null;\n    this._resizeSubscription.unsubscribe();\n    this._resizeSubscription = this._viewportRuler.change().subscribe(() => {\n      // When the window is resized, we want to trigger the next reposition as if it\n      // was an initial render, in order for the strategy to pick a new optimal position,\n      // otherwise position locking will cause it to stay at the old one.\n      this._isInitialRender = true;\n      this.apply();\n    });\n  }\n\n  /**\n   * Updates the position of the overlay element, using whichever preferred position relative\n   * to the origin best fits on-screen.\n   *\n   * The selection of a position goes as follows:\n   *  - If any positions fit completely within the viewport as-is,\n   *      choose the first position that does so.\n   *  - If flexible dimensions are enabled and at least one satifies the given minimum width/height,\n   *      choose the position with the greatest available size modified by the positions' weight.\n   *  - If pushing is enabled, take the position that went off-screen the least and push it\n   *      on-screen.\n   *  - If none of the previous criteria were met, use the position that goes off-screen the least.\n   * @docs-private\n   */\n  apply(): void {\n    // We shouldn't do anything if the strategy was disposed or we're on the server.\n    if (this._isDisposed || !this._platform.isBrowser) {\n      return;\n    }\n\n    // If the position has been applied already (e.g. when the overlay was opened) and the\n    // consumer opted into locking in the position, re-use the old position, in order to\n    // prevent the overlay from jumping around.\n    if (!this._isInitialRender && this._positionLocked && this._lastPosition) {\n      this.reapplyLastPosition();\n      return;\n    }\n\n    this._clearPanelClasses();\n    this._resetOverlayElementStyles();\n    this._resetBoundingBoxStyles();\n\n    // We need the bounding rects for the origin and the overlay to determine how to position\n    // the overlay relative to the origin.\n    // We use the viewport rect to determine whether a position would go off-screen.\n    this._viewportRect = this._getNarrowedViewportRect();\n    this._originRect = this._getOriginRect();\n    this._overlayRect = this._pane.getBoundingClientRect();\n\n    const originRect = this._originRect;\n    const overlayRect = this._overlayRect;\n    const viewportRect = this._viewportRect;\n\n    // Positions where the overlay will fit with flexible dimensions.\n    const flexibleFits: FlexibleFit[] = [];\n\n    // Fallback if none of the preferred positions fit within the viewport.\n    let fallback: FallbackPosition | undefined;\n\n    // Go through each of the preferred positions looking for a good fit.\n    // If a good fit is found, it will be applied immediately.\n    for (let pos of this._preferredPositions) {\n      // Get the exact (x, y) coordinate for the point-of-origin on the origin element.\n      let originPoint = this._getOriginPoint(originRect, pos);\n\n      // From that point-of-origin, get the exact (x, y) coordinate for the top-left corner of the\n      // overlay in this position. We use the top-left corner for calculations and later translate\n      // this into an appropriate (top, left, bottom, right) style.\n      let overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);\n\n      // Calculate how well the overlay would fit into the viewport with this point.\n      let overlayFit = this._getOverlayFit(overlayPoint, overlayRect, viewportRect, pos);\n\n      // If the overlay, without any further work, fits into the viewport, use this position.\n      if (overlayFit.isCompletelyWithinViewport) {\n        this._isPushed = false;\n        this._applyPosition(pos, originPoint);\n        return;\n      }\n\n      // If the overlay has flexible dimensions, we can use this position\n      // so long as there's enough space for the minimum dimensions.\n      if (this._canFitWithFlexibleDimensions(overlayFit, overlayPoint, viewportRect)) {\n        // Save positions where the overlay will fit with flexible dimensions. We will use these\n        // if none of the positions fit *without* flexible dimensions.\n        flexibleFits.push({\n          position: pos,\n          origin: originPoint,\n          overlayRect,\n          boundingBoxRect: this._calculateBoundingBoxRect(originPoint, pos)\n        });\n\n        continue;\n      }\n\n      // If the current preferred position does not fit on the screen, remember the position\n      // if it has more visible area on-screen than we've seen and move onto the next preferred\n      // position.\n      if (!fallback || fallback.overlayFit.visibleArea < overlayFit.visibleArea) {\n        fallback = {overlayFit, overlayPoint, originPoint, position: pos, overlayRect};\n      }\n    }\n\n    // If there are any positions where the overlay would fit with flexible dimensions, choose the\n    // one that has the greatest area available modified by the position's weight\n    if (flexibleFits.length) {\n      let bestFit: FlexibleFit | null = null;\n      let bestScore = -1;\n      for (const fit of flexibleFits) {\n        const score =\n            fit.boundingBoxRect.width * fit.boundingBoxRect.height * (fit.position.weight || 1);\n        if (score > bestScore) {\n          bestScore = score;\n          bestFit = fit;\n        }\n      }\n\n      this._isPushed = false;\n      this._applyPosition(bestFit!.position, bestFit!.origin);\n      return;\n    }\n\n    // When none of the preferred positions fit within the viewport, take the position\n    // that went off-screen the least and attempt to push it on-screen.\n    if (this._canPush) {\n      // TODO(jelbourn): after pushing, the opening \"direction\" of the overlay might not make sense.\n      this._isPushed = true;\n      this._applyPosition(fallback!.position, fallback!.originPoint);\n      return;\n    }\n\n    // All options for getting the overlay within the viewport have been exhausted, so go with the\n    // position that went off-screen the least.\n    this._applyPosition(fallback!.position, fallback!.originPoint);\n  }\n\n  detach(): void {\n    this._clearPanelClasses();\n    this._lastPosition = null;\n    this._previousPushAmount = null;\n    this._resizeSubscription.unsubscribe();\n  }\n\n  /** Cleanup after the element gets destroyed. */\n  dispose(): void {\n    if (this._isDisposed) {\n      return;\n    }\n\n    // We can't use `_resetBoundingBoxStyles` here, because it resets\n    // some properties to zero, rather than removing them.\n    if (this._boundingBox) {\n      extendStyles(this._boundingBox.style, {\n        top: '',\n        left: '',\n        right: '',\n        bottom: '',\n        height: '',\n        width: '',\n        alignItems: '',\n        justifyContent: '',\n      } as CSSStyleDeclaration);\n    }\n\n    if (this._pane) {\n      this._resetOverlayElementStyles();\n    }\n\n    if (this._overlayRef) {\n      this._overlayRef.hostElement.classList.remove(boundingBoxClass);\n    }\n\n    this.detach();\n    this._positionChanges.complete();\n    this._overlayRef = this._boundingBox = null!;\n    this._isDisposed = true;\n  }\n\n  /**\n   * This re-aligns the overlay element with the trigger in its last calculated position,\n   * even if a position higher in the \"preferred positions\" list would now fit. This\n   * allows one to re-align the panel without changing the orientation of the panel.\n   */\n  reapplyLastPosition(): void {\n    if (!this._isDisposed && (!this._platform || this._platform.isBrowser)) {\n      this._originRect = this._getOriginRect();\n      this._overlayRect = this._pane.getBoundingClientRect();\n      this._viewportRect = this._getNarrowedViewportRect();\n\n      const lastPosition = this._lastPosition || this._preferredPositions[0];\n      const originPoint = this._getOriginPoint(this._originRect, lastPosition);\n\n      this._applyPosition(lastPosition, originPoint);\n    }\n  }\n\n  /**\n   * Sets the list of Scrollable containers that host the origin element so that\n   * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n   * Scrollable must be an ancestor element of the strategy's origin element.\n   */\n  withScrollableContainers(scrollables: CdkScrollable[]): this {\n    this._scrollables = scrollables;\n    return this;\n  }\n\n  /**\n   * Adds new preferred positions.\n   * @param positions List of positions options for this overlay.\n   */\n  withPositions(positions: ConnectedPosition[]): this {\n    this._preferredPositions = positions;\n\n    // If the last calculated position object isn't part of the positions anymore, clear\n    // it in order to avoid it being picked up if the consumer tries to re-apply.\n    if (positions.indexOf(this._lastPosition!) === -1) {\n      this._lastPosition = null;\n    }\n\n    this._validatePositions();\n\n    return this;\n  }\n\n  /**\n   * Sets a minimum distance the overlay may be positioned to the edge of the viewport.\n   * @param margin Required margin between the overlay and the viewport edge in pixels.\n   */\n  withViewportMargin(margin: number): this {\n    this._viewportMargin = margin;\n    return this;\n  }\n\n  /** Sets whether the overlay's width and height can be constrained to fit within the viewport. */\n  withFlexibleDimensions(flexibleDimensions = true): this {\n    this._hasFlexibleDimensions = flexibleDimensions;\n    return this;\n  }\n\n  /** Sets whether the overlay can grow after the initial open via flexible width/height. */\n  withGrowAfterOpen(growAfterOpen = true): this {\n    this._growAfterOpen = growAfterOpen;\n    return this;\n  }\n\n  /** Sets whether the overlay can be pushed on-screen if none of the provided positions fit. */\n  withPush(canPush = true): this {\n    this._canPush = canPush;\n    return this;\n  }\n\n  /**\n   * Sets whether the overlay's position should be locked in after it is positioned\n   * initially. When an overlay is locked in, it won't attempt to reposition itself\n   * when the position is re-applied (e.g. when the user scrolls away).\n   * @param isLocked Whether the overlay should locked in.\n   */\n  withLockedPosition(isLocked = true): this {\n    this._positionLocked = isLocked;\n    return this;\n  }\n\n  /**\n   * Sets the origin, relative to which to position the overlay.\n   * Using an element origin is useful for building components that need to be positioned\n   * relatively to a trigger (e.g. dropdown menus or tooltips), whereas using a point can be\n   * used for cases like contextual menus which open relative to the user's pointer.\n   * @param origin Reference to the new origin.\n   */\n  setOrigin(origin: FlexibleConnectedPositionStrategyOrigin): this {\n    this._origin = origin;\n    return this;\n  }\n\n  /**\n   * Sets the default offset for the overlay's connection point on the x-axis.\n   * @param offset New offset in the X axis.\n   */\n  withDefaultOffsetX(offset: number): this {\n    this._offsetX = offset;\n    return this;\n  }\n\n  /**\n   * Sets the default offset for the overlay's connection point on the y-axis.\n   * @param offset New offset in the Y axis.\n   */\n  withDefaultOffsetY(offset: number): this {\n    this._offsetY = offset;\n    return this;\n  }\n\n  /**\n   * Configures that the position strategy should set a `transform-origin` on some elements\n   * inside the overlay, depending on the current position that is being applied. This is\n   * useful for the cases where the origin of an animation can change depending on the\n   * alignment of the overlay.\n   * @param selector CSS selector that will be used to find the target\n   *    elements onto which to set the transform origin.\n   */\n  withTransformOriginOn(selector: string): this {\n    this._transformOriginSelector = selector;\n    return this;\n  }\n\n  /**\n   * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n   */\n  private _getOriginPoint(originRect: ClientRect, pos: ConnectedPosition): Point {\n    let x: number;\n    if (pos.originX == 'center') {\n      // Note: when centering we should always use the `left`\n      // offset, otherwise the position will be wrong in RTL.\n      x = originRect.left + (originRect.width / 2);\n    } else {\n      const startX = this._isRtl() ? originRect.right : originRect.left;\n      const endX = this._isRtl() ? originRect.left : originRect.right;\n      x = pos.originX == 'start' ? startX : endX;\n    }\n\n    let y: number;\n    if (pos.originY == 'center') {\n      y = originRect.top + (originRect.height / 2);\n    } else {\n      y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n    }\n\n    return {x, y};\n  }\n\n\n  /**\n   * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n   * origin point to which the overlay should be connected.\n   */\n  private _getOverlayPoint(\n      originPoint: Point,\n      overlayRect: ClientRect,\n      pos: ConnectedPosition): Point {\n\n    // Calculate the (overlayStartX, overlayStartY), the start of the\n    // potential overlay position relative to the origin point.\n    let overlayStartX: number;\n    if (pos.overlayX == 'center') {\n      overlayStartX = -overlayRect.width / 2;\n    } else if (pos.overlayX === 'start') {\n      overlayStartX = this._isRtl() ? -overlayRect.width : 0;\n    } else {\n      overlayStartX = this._isRtl() ? 0 : -overlayRect.width;\n    }\n\n    let overlayStartY: number;\n    if (pos.overlayY == 'center') {\n      overlayStartY = -overlayRect.height / 2;\n    } else {\n      overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n    }\n\n    // The (x, y) coordinates of the overlay.\n    return {\n      x: originPoint.x + overlayStartX,\n      y: originPoint.y + overlayStartY,\n    };\n  }\n\n  /** Gets how well an overlay at the given point will fit within the viewport. */\n  private _getOverlayFit(point: Point, overlay: ClientRect, viewport: ClientRect,\n    position: ConnectedPosition): OverlayFit {\n\n    let {x, y} = point;\n    let offsetX = this._getOffset(position, 'x');\n    let offsetY = this._getOffset(position, 'y');\n\n    // Account for the offsets since they could push the overlay out of the viewport.\n    if (offsetX) {\n      x += offsetX;\n    }\n\n    if (offsetY) {\n      y += offsetY;\n    }\n\n    // How much the overlay would overflow at this position, on each side.\n    let leftOverflow = 0 - x;\n    let rightOverflow = (x + overlay.width) - viewport.width;\n    let topOverflow = 0 - y;\n    let bottomOverflow = (y + overlay.height) - viewport.height;\n\n    // Visible parts of the element on each axis.\n    let visibleWidth = this._subtractOverflows(overlay.width, leftOverflow, rightOverflow);\n    let visibleHeight = this._subtractOverflows(overlay.height, topOverflow, bottomOverflow);\n    let visibleArea = visibleWidth * visibleHeight;\n\n    return {\n      visibleArea,\n      isCompletelyWithinViewport: (overlay.width * overlay.height) === visibleArea,\n      fitsInViewportVertically: visibleHeight === overlay.height,\n      fitsInViewportHorizontally: visibleWidth == overlay.width,\n    };\n  }\n\n  /**\n   * Whether the overlay can fit within the viewport when it may resize either its width or height.\n   * @param fit How well the overlay fits in the viewport at some position.\n   * @param point The (x, y) coordinates of the overlat at some position.\n   * @param viewport The geometry of the viewport.\n   */\n  private _canFitWithFlexibleDimensions(fit: OverlayFit, point: Point, viewport: ClientRect) {\n    if (this._hasFlexibleDimensions) {\n      const availableHeight = viewport.bottom - point.y;\n      const availableWidth = viewport.right - point.x;\n      const minHeight = this._overlayRef.getConfig().minHeight;\n      const minWidth = this._overlayRef.getConfig().minWidth;\n\n      const verticalFit = fit.fitsInViewportVertically ||\n          (minHeight != null && minHeight <= availableHeight);\n      const horizontalFit = fit.fitsInViewportHorizontally ||\n          (minWidth != null && minWidth <= availableWidth);\n\n      return verticalFit && horizontalFit;\n    }\n  }\n\n  /**\n   * Gets the point at which the overlay can be \"pushed\" on-screen. If the overlay is larger than\n   * the viewport, the top-left corner will be pushed on-screen (with overflow occuring on the\n   * right and bottom).\n   *\n   * @param start Starting point from which the overlay is pushed.\n   * @param overlay Dimensions of the overlay.\n   * @param scrollPosition Current viewport scroll position.\n   * @returns The point at which to position the overlay after pushing. This is effectively a new\n   *     originPoint.\n   */\n  private _pushOverlayOnScreen(start: Point,\n                               overlay: ClientRect,\n                               scrollPosition: ViewportScrollPosition): Point {\n    // If the position is locked and we've pushed the overlay already, reuse the previous push\n    // amount, rather than pushing it again. If we were to continue pushing, the element would\n    // remain in the viewport, which goes against the expectations when position locking is enabled.\n    if (this._previousPushAmount && this._positionLocked) {\n      return {\n        x: start.x + this._previousPushAmount.x,\n        y: start.y + this._previousPushAmount.y\n      };\n    }\n\n    const viewport = this._viewportRect;\n\n    // Determine how much the overlay goes outside the viewport on each\n    // side, which we'll use to decide which direction to push it.\n    const overflowRight = Math.max(start.x + overlay.width - viewport.right, 0);\n    const overflowBottom = Math.max(start.y + overlay.height - viewport.bottom, 0);\n    const overflowTop = Math.max(viewport.top - scrollPosition.top - start.y, 0);\n    const overflowLeft = Math.max(viewport.left - scrollPosition.left - start.x, 0);\n\n    // Amount by which to push the overlay in each axis such that it remains on-screen.\n    let pushX = 0;\n    let pushY = 0;\n\n    // If the overlay fits completely within the bounds of the viewport, push it from whichever\n    // direction is goes off-screen. Otherwise, push the top-left corner such that its in the\n    // viewport and allow for the trailing end of the overlay to go out of bounds.\n    if (overlay.width <= viewport.width) {\n      pushX = overflowLeft || -overflowRight;\n    } else {\n      pushX = start.x < this._viewportMargin ? (viewport.left - scrollPosition.left) - start.x : 0;\n    }\n\n    if (overlay.height <= viewport.height) {\n      pushY = overflowTop || -overflowBottom;\n    } else {\n      pushY = start.y < this._viewportMargin ? (viewport.top - scrollPosition.top) - start.y : 0;\n    }\n\n    this._previousPushAmount = {x: pushX, y: pushY};\n\n    return {\n      x: start.x + pushX,\n      y: start.y + pushY,\n    };\n  }\n\n  /**\n   * Applies a computed position to the overlay and emits a position change.\n   * @param position The position preference\n   * @param originPoint The point on the origin element where the overlay is connected.\n   */\n  private _applyPosition(position: ConnectedPosition, originPoint: Point) {\n    this._setTransformOrigin(position);\n    this._setOverlayElementStyles(originPoint, position);\n    this._setBoundingBoxStyles(originPoint, position);\n\n    if (position.panelClass) {\n      this._addPanelClasses(position.panelClass);\n    }\n\n    // Save the last connected position in case the position needs to be re-calculated.\n    this._lastPosition = position;\n\n    // Notify that the position has been changed along with its change properties.\n    // We only emit if we've got any subscriptions, because the scroll visibility\n    // calculcations can be somewhat expensive.\n    if (this._positionChanges.observers.length) {\n      const scrollableViewProperties = this._getScrollVisibility();\n      const changeEvent = new ConnectedOverlayPositionChange(position, scrollableViewProperties);\n      this._positionChanges.next(changeEvent);\n    }\n\n    this._isInitialRender = false;\n  }\n\n  /** Sets the transform origin based on the configured selector and the passed-in position.  */\n  private _setTransformOrigin(position: ConnectedPosition) {\n    if (!this._transformOriginSelector) {\n      return;\n    }\n\n    const elements: NodeListOf<HTMLElement> =\n        this._boundingBox!.querySelectorAll(this._transformOriginSelector);\n    let xOrigin: 'left' | 'right' | 'center';\n    let yOrigin: 'top' | 'bottom' | 'center' = position.overlayY;\n\n    if (position.overlayX === 'center') {\n      xOrigin = 'center';\n    } else if (this._isRtl()) {\n      xOrigin = position.overlayX === 'start' ? 'right' : 'left';\n    } else {\n      xOrigin = position.overlayX === 'start' ? 'left' : 'right';\n    }\n\n    for (let i = 0; i < elements.length; i++) {\n      elements[i].style.transformOrigin = `${xOrigin} ${yOrigin}`;\n    }\n  }\n\n  /**\n   * Gets the position and size of the overlay's sizing container.\n   *\n   * This method does no measuring and applies no styles so that we can cheaply compute the\n   * bounds for all positions and choose the best fit based on these results.\n   */\n  private _calculateBoundingBoxRect(origin: Point, position: ConnectedPosition): BoundingBoxRect {\n    const viewport = this._viewportRect;\n    const isRtl = this._isRtl();\n    let height: number, top: number, bottom: number;\n\n    if (position.overlayY === 'top') {\n      // Overlay is opening \"downward\" and thus is bound by the bottom viewport edge.\n      top = origin.y;\n      height = viewport.height - top + this._viewportMargin;\n    } else if (position.overlayY === 'bottom') {\n      // Overlay is opening \"upward\" and thus is bound by the top viewport edge. We need to add\n      // the viewport margin back in, because the viewport rect is narrowed down to remove the\n      // margin, whereas the `origin` position is calculated based on its `ClientRect`.\n      bottom = viewport.height - origin.y + this._viewportMargin * 2;\n      height = viewport.height - bottom + this._viewportMargin;\n    } else {\n      // If neither top nor bottom, it means that the overlay is vertically centered on the\n      // origin point. Note that we want the position relative to the viewport, rather than\n      // the page, which is why we don't use something like `viewport.bottom - origin.y` and\n      // `origin.y - viewport.top`.\n      const smallestDistanceToViewportEdge =\n          Math.min(viewport.bottom - origin.y + viewport.top, origin.y);\n\n      const previousHeight = this._lastBoundingBoxSize.height;\n\n      height = smallestDistanceToViewportEdge * 2;\n      top = origin.y - smallestDistanceToViewportEdge;\n\n      if (height > previousHeight && !this._isInitialRender && !this._growAfterOpen) {\n        top = origin.y - (previousHeight / 2);\n      }\n    }\n\n    // The overlay is opening 'right-ward' (the content flows to the right).\n    const isBoundedByRightViewportEdge =\n        (position.overlayX === 'start' && !isRtl) ||\n        (position.overlayX === 'end' && isRtl);\n\n    // The overlay is opening 'left-ward' (the content flows to the left).\n    const isBoundedByLeftViewportEdge =\n        (position.overlayX === 'end' && !isRtl) ||\n        (position.overlayX === 'start' && isRtl);\n\n    let width: number, left: number, right: number;\n\n    if (isBoundedByLeftViewportEdge) {\n      right = viewport.width - origin.x + this._viewportMargin;\n      width = origin.x - this._viewportMargin;\n    } else if (isBoundedByRightViewportEdge) {\n      left = origin.x;\n      width = viewport.right - origin.x;\n    } else {\n      // If neither start nor end, it means that the overlay is horizontally centered on the\n      // origin point. Note that we want the position relative to the viewport, rather than\n      // the page, which is why we don't use something like `viewport.right - origin.x` and\n      // `origin.x - viewport.left`.\n      const smallestDistanceToViewportEdge =\n          Math.min(viewport.right - origin.x + viewport.left, origin.x);\n      const previousWidth = this._lastBoundingBoxSize.width;\n\n      width = smallestDistanceToViewportEdge * 2;\n      left = origin.x - smallestDistanceToViewportEdge;\n\n      if (width > previousWidth && !this._isInitialRender && !this._growAfterOpen) {\n        left = origin.x - (previousWidth / 2);\n      }\n    }\n\n    return {top: top!, left: left!, bottom: bottom!, right: right!, width, height};\n  }\n\n  /**\n   * Sets the position and size of the overlay's sizing wrapper. The wrapper is positioned on the\n   * origin's connection point and stetches to the bounds of the viewport.\n   *\n   * @param origin The point on the origin element where the overlay is connected.\n   * @param position The position preference\n   */\n  private _setBoundingBoxStyles(origin: Point, position: ConnectedPosition): void {\n    const boundingBoxRect = this._calculateBoundingBoxRect(origin, position);\n\n    // It's weird if the overlay *grows* while scrolling, so we take the last size into account\n    // when applying a new size.\n    if (!this._isInitialRender && !this._growAfterOpen) {\n      boundingBoxRect.height = Math.min(boundingBoxRect.height, this._lastBoundingBoxSize.height);\n      boundingBoxRect.width = Math.min(boundingBoxRect.width, this._lastBoundingBoxSize.width);\n    }\n\n    const styles = {} as CSSStyleDeclaration;\n\n    if (this._hasExactPosition()) {\n      styles.top = styles.left = '0';\n      styles.bottom = styles.right = '';\n      styles.width = styles.height = '100%';\n    } else {\n      const maxHeight = this._overlayRef.getConfig().maxHeight;\n      const maxWidth = this._overlayRef.getConfig().maxWidth;\n\n      styles.height = coerceCssPixelValue(boundingBoxRect.height);\n      styles.top = coerceCssPixelValue(boundingBoxRect.top);\n      styles.bottom = coerceCssPixelValue(boundingBoxRect.bottom);\n      styles.width = coerceCssPixelValue(boundingBoxRect.width);\n      styles.left = coerceCssPixelValue(boundingBoxRect.left);\n      styles.right = coerceCssPixelValue(boundingBoxRect.right);\n\n      // Push the pane content towards the proper direction.\n      if (position.overlayX === 'center') {\n        styles.alignItems = 'center';\n      } else {\n        styles.alignItems = position.overlayX === 'end' ? 'flex-end' : 'flex-start';\n      }\n\n      if (position.overlayY === 'center') {\n        styles.justifyContent = 'center';\n      } else {\n        styles.justifyContent = position.overlayY === 'bottom' ? 'flex-end' : 'flex-start';\n      }\n\n      if (maxHeight) {\n        styles.maxHeight = coerceCssPixelValue(maxHeight);\n      }\n\n      if (maxWidth) {\n        styles.maxWidth = coerceCssPixelValue(maxWidth);\n      }\n    }\n\n    this._lastBoundingBoxSize = boundingBoxRect;\n\n    extendStyles(this._boundingBox!.style, styles);\n  }\n\n  /** Resets the styles for the bounding box so that a new positioning can be computed. */\n  private _resetBoundingBoxStyles() {\n    extendStyles(this._boundingBox!.style, {\n      top: '0',\n      left: '0',\n      right: '0',\n      bottom: '0',\n      height: '',\n      width: '',\n      alignItems: '',\n      justifyContent: '',\n    } as CSSStyleDeclaration);\n  }\n\n  /** Resets the styles for the overlay pane so that a new positioning can be computed. */\n  private _resetOverlayElementStyles() {\n    extendStyles(this._pane.style, {\n      top: '',\n      left: '',\n      bottom: '',\n      right: '',\n      position: '',\n      transform: '',\n    } as CSSStyleDeclaration);\n  }\n\n  /** Sets positioning styles to the overlay element. */\n  private _setOverlayElementStyles(originPoint: Point, position: ConnectedPosition): void {\n    const styles = {} as CSSStyleDeclaration;\n\n    if (this._hasExactPosition()) {\n      const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n      extendStyles(styles, this._getExactOverlayY(position, originPoint, scrollPosition));\n      extendStyles(styles, this._getExactOverlayX(position, originPoint, scrollPosition));\n    } else {\n      styles.position = 'static';\n    }\n\n    // Use a transform to apply the offsets. We do this because the `center` positions rely on\n    // being in the normal flex flow and setting a `top` / `left` at all will completely throw\n    // off the position. We also can't use margins, because they won't have an effect in some\n    // cases where the element doesn't have anything to \"push off of\". Finally, this works\n    // better both with flexible and non-flexible positioning.\n    let transformString = '';\n    let offsetX = this._getOffset(position, 'x');\n    let offsetY = this._getOffset(position, 'y');\n\n    if (offsetX) {\n      transformString += `translateX(${offsetX}px) `;\n    }\n\n    if (offsetY) {\n      transformString += `translateY(${offsetY}px)`;\n    }\n\n    styles.transform = transformString.trim();\n\n    // If a maxWidth or maxHeight is specified on the overlay, we remove them. We do this because\n    // we need these values to both be set to \"100%\" for the automatic flexible sizing to work.\n    // The maxHeight and maxWidth are set on the boundingBox in order to enforce the constraint.\n    if (this._hasFlexibleDimensions && this._overlayRef.getConfig().maxHeight) {\n      styles.maxHeight = '';\n    }\n\n    if (this._hasFlexibleDimensions && this._overlayRef.getConfig().maxWidth) {\n      styles.maxWidth = '';\n    }\n\n    extendStyles(this._pane.style, styles);\n  }\n\n  /** Gets the exact top/bottom for the overlay when not using flexible sizing or when pushing. */\n  private _getExactOverlayY(position: ConnectedPosition,\n                            originPoint: Point,\n                            scrollPosition: ViewportScrollPosition) {\n    // Reset any existing styles. This is necessary in case the\n    // preferred position has changed since the last `apply`.\n    let styles = {top: null, bottom: null} as CSSStyleDeclaration;\n    let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n\n    if (this._isPushed) {\n      overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n    }\n\n    let virtualKeyboardOffset =\n        this._overlayContainer.getContainerElement().getBoundingClientRect().top;\n\n    // Normally this would be zero, however when the overlay is attached to an input (e.g. in an\n    // autocomplete), mobile browsers will shift everything in order to put the input in the middle\n    // of the screen and to make space for the virtual keyboard. We need to account for this offset,\n    // otherwise our positioning will be thrown off.\n    overlayPoint.y -= virtualKeyboardOffset;\n\n    // We want to set either `top` or `bottom` based on whether the overlay wants to appear\n    // above or below the origin and the direction in which the element will expand.\n    if (position.overlayY === 'bottom') {\n      // When using `bottom`, we adjust the y position such that it is the distance\n      // from the bottom of the viewport rather than the top.\n      const documentHeight = this._document.documentElement!.clientHeight;\n      styles.bottom = `${documentHeight - (overlayPoint.y + this._overlayRect.height)}px`;\n    } else {\n      styles.top = coerceCssPixelValue(overlayPoint.y);\n    }\n\n    return styles;\n  }\n\n  /** Gets the exact left/right for the overlay when not using flexible sizing or when pushing. */\n  private _getExactOverlayX(position: ConnectedPosition,\n                            originPoint: Point,\n                            scrollPosition: ViewportScrollPosition) {\n    // Reset any existing styles. This is necessary in case the preferred position has\n    // changed since the last `apply`.\n    let styles = {left: null, right: null} as CSSStyleDeclaration;\n    let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n\n    if (this._isPushed) {\n      overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n    }\n\n    // We want to set either `left` or `right` based on whether the overlay wants to appear \"before\"\n    // or \"after\" the origin, which determines the direction in which the element will expand.\n    // For the horizontal axis, the meaning of \"before\" and \"after\" change based on whether the\n    // page is in RTL or LTR.\n    let horizontalStyleProperty: 'left' | 'right';\n\n    if (this._isRtl()) {\n      horizontalStyleProperty = position.overlayX === 'end' ? 'left' : 'right';\n    } else {\n      horizontalStyleProperty = position.overlayX === 'end' ? 'right' : 'left';\n    }\n\n    // When we're setting `right`, we adjust the x position such that it is the distance\n    // from the right edge of the viewport rather than the left edge.\n    if (horizontalStyleProperty === 'right') {\n      const documentWidth = this._document.documentElement!.clientWidth;\n      styles.right = `${documentWidth - (overlayPoint.x + this._overlayRect.width)}px`;\n    } else {\n      styles.left = coerceCssPixelValue(overlayPoint.x);\n    }\n\n    return styles;\n  }\n\n  /**\n   * Gets the view properties of the trigger and overlay, including whether they are clipped\n   * or completely outside the view of any of the strategy's scrollables.\n   */\n  private _getScrollVisibility(): ScrollingVisibility {\n    // Note: needs fresh rects since the position could've changed.\n    const originBounds = this._getOriginRect();\n    const overlayBounds =  this._pane.getBoundingClientRect();\n\n    // TODO(jelbourn): instead of needing all of the client rects for these scrolling containers\n    // every time, we should be able to use the scrollTop of the containers if the size of those\n    // containers hasn't changed.\n    const scrollContainerBounds = this._scrollables.map(scrollable => {\n      return scrollable.getElementRef().nativeElement.getBoundingClientRect();\n    });\n\n    return {\n      isOriginClipped: isElementClippedByScrolling(originBounds, scrollContainerBounds),\n      isOriginOutsideView: isElementScrolledOutsideView(originBounds, scrollContainerBounds),\n      isOverlayClipped: isElementClippedByScrolling(overlayBounds, scrollContainerBounds),\n      isOverlayOutsideView: isElementScrolledOutsideView(overlayBounds, scrollContainerBounds),\n    };\n  }\n\n  /** Subtracts the amount that an element is overflowing on an axis from it's length. */\n  private _subtractOverflows(length: number, ...overflows: number[]): number {\n    return overflows.reduce((currentValue: number, currentOverflow: number) => {\n      return currentValue - Math.max(currentOverflow, 0);\n    }, length);\n  }\n\n  /** Narrows the given viewport rect by the current _viewportMargin. */\n  private _getNarrowedViewportRect(): ClientRect {\n    // We recalculate the viewport rect here ourselves, rather than using the ViewportRuler,\n    // because we want to use the `clientWidth` and `clientHeight` as the base. The difference\n    // being that the client properties don't include the scrollbar, as opposed to `innerWidth`\n    // and `innerHeight` that do. This is necessary, because the overlay container uses\n    // 100% `width` and `height` which don't include the scrollbar either.\n    const width = this._document.documentElement!.clientWidth;\n    const height = this._document.documentElement!.clientHeight;\n    const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n\n    return {\n      top:    scrollPosition.top + this._viewportMargin,\n      left:   scrollPosition.left + this._viewportMargin,\n      right:  scrollPosition.left + width - this._viewportMargin,\n      bottom: scrollPosition.top + height - this._viewportMargin,\n      width:  width  - (2 * this._viewportMargin),\n      height: height - (2 * this._viewportMargin),\n    };\n  }\n\n  /** Whether the we're dealing with an RTL context */\n  private _isRtl() {\n    return this._overlayRef.getDirection() === 'rtl';\n  }\n\n  /** Determines whether the overlay uses exact or flexible positioning. */\n  private _hasExactPosition() {\n    return !this._hasFlexibleDimensions || this._isPushed;\n  }\n\n  /** Retrieves the offset of a position along the x or y axis. */\n  private _getOffset(position: ConnectedPosition, axis: 'x' | 'y') {\n    if (axis === 'x') {\n      // We don't do something like `position['offset' + axis]` in\n      // order to avoid breking minifiers that rename properties.\n      return position.offsetX == null ? this._offsetX : position.offsetX;\n    }\n\n    return position.offsetY == null ? this._offsetY : position.offsetY;\n  }\n\n  /** Validates that the current position match the expected values. */\n  private _validatePositions(): void {\n    if (!this._preferredPositions.length) {\n      throw Error('FlexibleConnectedPositionStrategy: At least one position is required.');\n    }\n\n    // TODO(crisbeto): remove these once Angular's template type\n    // checking is advanced enough to catch these cases.\n    this._preferredPositions.forEach(pair => {\n      validateHorizontalPosition('originX', pair.originX);\n      validateVerticalPosition('originY', pair.originY);\n      validateHorizontalPosition('overlayX', pair.overlayX);\n      validateVerticalPosition('overlayY', pair.overlayY);\n    });\n  }\n\n  /** Adds a single CSS class or an array of classes on the overlay panel. */\n  private _addPanelClasses(cssClasses: string | string[]) {\n    if (this._pane) {\n      coerceArray(cssClasses).forEach(cssClass => {\n        if (cssClass !== '' && this._appliedPanelClasses.indexOf(cssClass) === -1) {\n          this._appliedPanelClasses.push(cssClass);\n          this._pane.classList.add(cssClass);\n        }\n      });\n    }\n  }\n\n  /** Clears the classes that the position strategy has applied from the overlay panel. */\n  private _clearPanelClasses() {\n    if (this._pane) {\n      this._appliedPanelClasses.forEach(cssClass => {\n        this._pane.classList.remove(cssClass);\n      });\n      this._appliedPanelClasses = [];\n    }\n  }\n\n  /** Returns the ClientRect of the current origin. */\n  private _getOriginRect(): ClientRect {\n    const origin = this._origin;\n\n    if (origin instanceof ElementRef) {\n      return origin.nativeElement.getBoundingClientRect();\n    }\n\n    if (origin instanceof HTMLElement) {\n      return origin.getBoundingClientRect();\n    }\n\n    // If the origin is a point, return a client rect as if it was a 0x0 element at the point.\n    return {\n      top: origin.y,\n      bottom: origin.y,\n      left: origin.x,\n      right: origin.x,\n      height: 0,\n      width: 0\n    };\n  }\n}\n\n/** A simple (x, y) coordinate. */\ninterface Point {\n  x: number;\n  y: number;\n}\n\n/** Record of measurements for how an overlay (at a given position) fits into the viewport. */\ninterface OverlayFit {\n  /** Whether the overlay fits completely in the viewport. */\n  isCompletelyWithinViewport: boolean;\n\n  /** Whether the overlay fits in the viewport on the y-axis. */\n  fitsInViewportVertically: boolean;\n\n  /** Whether the overlay fits in the viewport on the x-axis. */\n  fitsInViewportHorizontally: boolean;\n\n  /** The total visible area (in px^2) of the overlay inside the viewport. */\n  visibleArea: number;\n}\n\n/** Record of the measurments determining whether an overlay will fit in a specific position. */\ninterface FallbackPosition {\n  position: ConnectedPosition;\n  originPoint: Point;\n  overlayPoint: Point;\n  overlayFit: OverlayFit;\n  overlayRect: ClientRect;\n}\n\n/** Position and size of the overlay sizing wrapper for a specific position. */\ninterface BoundingBoxRect {\n  top: number;\n  left: number;\n  bottom: number;\n  right: number;\n  height: number;\n  width: number;\n}\n\n/** Record of measures determining how well a given position will fit with flexible dimensions. */\ninterface FlexibleFit {\n  position: ConnectedPosition;\n  origin: Point;\n  overlayRect: ClientRect;\n  boundingBoxRect: BoundingBoxRect;\n}\n\n/** A connected position as specified by the user. */\nexport interface ConnectedPosition {\n  originX: 'start' | 'center' | 'end';\n  originY: 'top' | 'center' | 'bottom';\n\n  overlayX: 'start' | 'center' | 'end';\n  overlayY: 'top' | 'center' | 'bottom';\n\n  weight?: number;\n  offsetX?: number;\n  offsetY?: number;\n  panelClass?: string | string[];\n}\n\n/** Shallow-extends a stylesheet object with another stylesheet object. */\nfunction extendStyles(dest: CSSStyleDeclaration, source: CSSStyleDeclaration): CSSStyleDeclaration {\n  for (let key in source) {\n    if (source.hasOwnProperty(key)) {\n      dest[key] = source[key];\n    }\n  }\n\n  return dest;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {ComponentPortal, Portal, PortalOutlet, TemplatePortal} from '@angular/cdk/portal';\nimport {ComponentRef, EmbeddedViewRef, NgZone} from '@angular/core';\nimport {Location} from '@angular/common';\nimport {Observable, Subject, merge, SubscriptionLike, Subscription, Observer} from 'rxjs';\nimport {take, takeUntil} from 'rxjs/operators';\nimport {OverlayKeyboardDispatcher} from './keyboard/overlay-keyboard-dispatcher';\nimport {OverlayConfig} from './overlay-config';\nimport {coerceCssPixelValue, coerceArray} from '@angular/cdk/coercion';\nimport {OverlayReference} from './overlay-reference';\nimport {PositionStrategy} from './position/position-strategy';\nimport {ScrollStrategy} from './scroll';\n\n\n/** An object where all of its properties cannot be written. */\nexport type ImmutableObject<T> = {\n  readonly [P in keyof T]: T[P];\n};\n\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nexport class OverlayRef implements PortalOutlet, OverlayReference {\n  private _backdropElement: HTMLElement | null = null;\n  private _backdropClick: Subject<MouseEvent> = new Subject();\n  private _attachments = new Subject<void>();\n  private _detachments = new Subject<void>();\n  private _positionStrategy: PositionStrategy | undefined;\n  private _scrollStrategy: ScrollStrategy | undefined;\n  private _locationChanges: SubscriptionLike = Subscription.EMPTY;\n  private _backdropClickHandler = (event: MouseEvent) => this._backdropClick.next(event);\n\n  /**\n   * Reference to the parent of the `_host` at the time it was detached. Used to restore\n   * the `_host` to its original position in the DOM when it gets re-attached.\n   */\n  private _previousHostParent: HTMLElement;\n\n  private _keydownEventsObservable: Observable<KeyboardEvent> =\n      new Observable((observer: Observer<KeyboardEvent>) => {\n        const subscription = this._keydownEvents.subscribe(observer);\n        this._keydownEventSubscriptions++;\n\n        return () => {\n          subscription.unsubscribe();\n          this._keydownEventSubscriptions--;\n        };\n      });\n\n  /** Stream of keydown events dispatched to this overlay. */\n  _keydownEvents = new Subject<KeyboardEvent>();\n\n  /** Amount of subscriptions to the keydown events. */\n  _keydownEventSubscriptions = 0;\n\n  constructor(\n      private _portalOutlet: PortalOutlet,\n      private _host: HTMLElement,\n      private _pane: HTMLElement,\n      private _config: ImmutableObject<OverlayConfig>,\n      private _ngZone: NgZone,\n      private _keyboardDispatcher: OverlayKeyboardDispatcher,\n      private _document: Document,\n      // @breaking-change 8.0.0 `_location` parameter to be made required.\n      private _location?: Location) {\n\n    if (_config.scrollStrategy) {\n      this._scrollStrategy = _config.scrollStrategy;\n      this._scrollStrategy.attach(this);\n    }\n\n    this._positionStrategy = _config.positionStrategy;\n  }\n\n  /** The overlay's HTML element */\n  get overlayElement(): HTMLElement {\n    return this._pane;\n  }\n\n  /** The overlay's backdrop HTML element. */\n  get backdropElement(): HTMLElement | null {\n    return this._backdropElement;\n  }\n\n  /**\n   * Wrapper around the panel element. Can be used for advanced\n   * positioning where a wrapper with specific styling is\n   * required around the overlay pane.\n   */\n  get hostElement(): HTMLElement {\n    return this._host;\n  }\n\n  attach<T>(portal: ComponentPortal<T>): ComponentRef<T>;\n  attach<T>(portal: TemplatePortal<T>): EmbeddedViewRef<T>;\n  attach(portal: any): any;\n\n  /**\n   * Attaches content, given via a Portal, to the overlay.\n   * If the overlay is configured to have a backdrop, it will be created.\n   *\n   * @param portal Portal instance to which to attach the overlay.\n   * @returns The portal attachment result.\n   */\n  attach(portal: Portal<any>): any {\n    let attachResult = this._portalOutlet.attach(portal);\n\n    if (this._positionStrategy) {\n      this._positionStrategy.attach(this);\n    }\n\n    // Update the pane element with the given configuration.\n    if (!this._host.parentElement && this._previousHostParent) {\n      this._previousHostParent.appendChild(this._host);\n    }\n\n    this._updateStackingOrder();\n    this._updateElementSize();\n    this._updateElementDirection();\n\n    if (this._scrollStrategy) {\n      this._scrollStrategy.enable();\n    }\n\n    // Update the position once the zone is stable so that the overlay will be fully rendered\n    // before attempting to position it, as the position may depend on the size of the rendered\n    // content.\n    this._ngZone.onStable\n      .asObservable()\n      .pipe(take(1))\n      .subscribe(() => {\n        // The overlay could've been detached before the zone has stabilized.\n        if (this.hasAttached()) {\n          this.updatePosition();\n        }\n      });\n\n    // Enable pointer events for the overlay pane element.\n    this._togglePointerEvents(true);\n\n    if (this._config.hasBackdrop) {\n      this._attachBackdrop();\n    }\n\n    if (this._config.panelClass) {\n      this._toggleClasses(this._pane, this._config.panelClass, true);\n    }\n\n    // Only emit the `attachments` event once all other setup is done.\n    this._attachments.next();\n\n    // Track this overlay by the keyboard dispatcher\n    this._keyboardDispatcher.add(this);\n\n    // @breaking-change 8.0.0 remove the null check for `_location`\n    // once the constructor parameter is made required.\n    if (this._config.disposeOnNavigation && this._location) {\n      this._locationChanges = this._location.subscribe(() => this.dispose());\n    }\n\n    return attachResult;\n  }\n\n  /**\n   * Detaches an overlay from a portal.\n   * @returns The portal detachment result.\n   */\n  detach(): any {\n    if (!this.hasAttached()) {\n      return;\n    }\n\n    this.detachBackdrop();\n\n    // When the overlay is detached, the pane element should disable pointer events.\n    // This is necessary because otherwise the pane element will cover the page and disable\n    // pointer events therefore. Depends on the position strategy and the applied pane boundaries.\n    this._togglePointerEvents(false);\n\n    if (this._positionStrategy && this._positionStrategy.detach) {\n      this._positionStrategy.detach();\n    }\n\n    if (this._scrollStrategy) {\n      this._scrollStrategy.disable();\n    }\n\n    const detachmentResult = this._portalOutlet.detach();\n\n    // Only emit after everything is detached.\n    this._detachments.next();\n\n    // Remove this overlay from keyboard dispatcher tracking.\n    this._keyboardDispatcher.remove(this);\n\n    // Keeping the host element in DOM the can cause scroll jank, because it still gets\n    // rendered, even though it's transparent and unclickable which is why we remove it.\n    this._detachContentWhenStable();\n\n    // Stop listening for location changes.\n    this._locationChanges.unsubscribe();\n\n    return detachmentResult;\n  }\n\n  /** Cleans up the overlay from the DOM. */\n  dispose(): void {\n    const isAttached = this.hasAttached();\n\n    if (this._positionStrategy) {\n      this._positionStrategy.dispose();\n    }\n\n    this._disposeScrollStrategy();\n    this.detachBackdrop();\n    this._locationChanges.unsubscribe();\n    this._keyboardDispatcher.remove(this);\n    this._portalOutlet.dispose();\n    this._attachments.complete();\n    this._backdropClick.complete();\n    this._keydownEvents.complete();\n\n    if (this._host && this._host.parentNode) {\n      this._host.parentNode.removeChild(this._host);\n      this._host = null!;\n    }\n\n    this._previousHostParent = this._pane = null!;\n\n    if (isAttached) {\n      this._detachments.next();\n    }\n\n    this._detachments.complete();\n  }\n\n  /** Whether the overlay has attached content. */\n  hasAttached(): boolean {\n    return this._portalOutlet.hasAttached();\n  }\n\n  /** Gets an observable that emits when the backdrop has been clicked. */\n  backdropClick(): Observable<MouseEvent> {\n    return this._backdropClick.asObservable();\n  }\n\n  /** Gets an observable that emits when the overlay has been attached. */\n  attachments(): Observable<void> {\n    return this._attachments.asObservable();\n  }\n\n  /** Gets an observable that emits when the overlay has been detached. */\n  detachments(): Observable<void> {\n    return this._detachments.asObservable();\n  }\n\n  /** Gets an observable of keydown events targeted to this overlay. */\n  keydownEvents(): Observable<KeyboardEvent> {\n    return this._keydownEventsObservable;\n  }\n\n  /** Gets the current overlay configuration, which is immutable. */\n  getConfig(): OverlayConfig {\n    return this._config;\n  }\n\n  /** Updates the position of the overlay based on the position strategy. */\n  updatePosition(): void {\n    if (this._positionStrategy) {\n      this._positionStrategy.apply();\n    }\n  }\n\n  /** Switches to a new position strategy and updates the overlay position. */\n  updatePositionStrategy(strategy: PositionStrategy): void {\n    if (strategy === this._positionStrategy) {\n      return;\n    }\n\n    if (this._positionStrategy) {\n      this._positionStrategy.dispose();\n    }\n\n    this._positionStrategy = strategy;\n\n    if (this.hasAttached()) {\n      strategy.attach(this);\n      this.updatePosition();\n    }\n  }\n\n  /** Update the size properties of the overlay. */\n  updateSize(sizeConfig: OverlaySizeConfig): void {\n    this._config = {...this._config, ...sizeConfig};\n    this._updateElementSize();\n  }\n\n  /** Sets the LTR/RTL direction for the overlay. */\n  setDirection(dir: Direction | Directionality): void {\n    this._config = {...this._config, direction: dir};\n    this._updateElementDirection();\n  }\n\n  /** Add a CSS class or an array of classes to the overlay pane. */\n  addPanelClass(classes: string | string[]): void {\n    if (this._pane) {\n      this._toggleClasses(this._pane, classes, true);\n    }\n  }\n\n  /** Remove a CSS class or an array of classes from the overlay pane. */\n  removePanelClass(classes: string | string[]): void {\n    if (this._pane) {\n      this._toggleClasses(this._pane, classes, false);\n    }\n  }\n\n  /**\n   * Returns the layout direction of the overlay panel.\n   */\n  getDirection(): Direction {\n    const direction = this._config.direction;\n\n    if (!direction) {\n      return 'ltr';\n    }\n\n    return typeof direction === 'string' ? direction : direction.value;\n  }\n\n  /** Switches to a new scroll strategy. */\n  updateScrollStrategy(strategy: ScrollStrategy): void {\n    if (strategy === this._scrollStrategy) {\n      return;\n    }\n\n    this._disposeScrollStrategy();\n    this._scrollStrategy = strategy;\n\n    if (this.hasAttached()) {\n      strategy.attach(this);\n      strategy.enable();\n    }\n  }\n\n  /** Updates the text direction of the overlay panel. */\n  private _updateElementDirection() {\n    this._host.setAttribute('dir', this.getDirection());\n  }\n\n  /** Updates the size of the overlay element based on the overlay config. */\n  private _updateElementSize() {\n    const style = this._pane.style;\n\n    style.width = coerceCssPixelValue(this._config.width);\n    style.height = coerceCssPixelValue(this._config.height);\n    style.minWidth = coerceCssPixelValue(this._config.minWidth);\n    style.minHeight = coerceCssPixelValue(this._config.minHeight);\n    style.maxWidth = coerceCssPixelValue(this._config.maxWidth);\n    style.maxHeight = coerceCssPixelValue(this._config.maxHeight);\n  }\n\n  /** Toggles the pointer events for the overlay pane element. */\n  private _togglePointerEvents(enablePointer: boolean) {\n    this._pane.style.pointerEvents = enablePointer ? 'auto' : 'none';\n  }\n\n  /** Attaches a backdrop for this overlay. */\n  private _attachBackdrop() {\n    const showingClass = 'cdk-overlay-backdrop-showing';\n\n    this._backdropElement = this._document.createElement('div');\n    this._backdropElement.classList.add('cdk-overlay-backdrop');\n\n    if (this._config.backdropClass) {\n      this._toggleClasses(this._backdropElement, this._config.backdropClass, true);\n    }\n\n    // Insert the backdrop before the pane in the DOM order,\n    // in order to handle stacked overlays properly.\n    this._host.parentElement!.insertBefore(this._backdropElement, this._host);\n\n    // Forward backdrop clicks such that the consumer of the overlay can perform whatever\n    // action desired when such a click occurs (usually closing the overlay).\n    this._backdropElement.addEventListener('click', this._backdropClickHandler);\n\n    // Add class to fade-in the backdrop after one frame.\n    if (typeof requestAnimationFrame !== 'undefined') {\n      this._ngZone.runOutsideAngular(() => {\n        requestAnimationFrame(() => {\n          if (this._backdropElement) {\n            this._backdropElement.classList.add(showingClass);\n          }\n        });\n      });\n    } else {\n      this._backdropElement.classList.add(showingClass);\n    }\n  }\n\n  /**\n   * Updates the stacking order of the element, moving it to the top if necessary.\n   * This is required in cases where one overlay was detached, while another one,\n   * that should be behind it, was destroyed. The next time both of them are opened,\n   * the stacking will be wrong, because the detached element's pane will still be\n   * in its original DOM position.\n   */\n  private _updateStackingOrder() {\n    if (this._host.nextSibling) {\n      this._host.parentNode!.appendChild(this._host);\n    }\n  }\n\n  /** Detaches the backdrop (if any) associated with the overlay. */\n  detachBackdrop(): void {\n    let backdropToDetach = this._backdropElement;\n\n    if (!backdropToDetach) {\n      return;\n    }\n\n    let timeoutId: number;\n    let finishDetach = () => {\n      // It may not be attached to anything in certain cases (e.g. unit tests).\n      if (backdropToDetach) {\n        backdropToDetach.removeEventListener('click', this._backdropClickHandler);\n        backdropToDetach.removeEventListener('transitionend', finishDetach);\n\n        if (backdropToDetach.parentNode) {\n          backdropToDetach.parentNode.removeChild(backdropToDetach);\n        }\n      }\n\n      // It is possible that a new portal has been attached to this overlay since we started\n      // removing the backdrop. If that is the case, only clear the backdrop reference if it\n      // is still the same instance that we started to remove.\n      if (this._backdropElement == backdropToDetach) {\n        this._backdropElement = null;\n      }\n\n      if (this._config.backdropClass) {\n        this._toggleClasses(backdropToDetach!, this._config.backdropClass, false);\n      }\n\n      clearTimeout(timeoutId);\n    };\n\n    backdropToDetach.classList.remove('cdk-overlay-backdrop-showing');\n\n    this._ngZone.runOutsideAngular(() => {\n      backdropToDetach!.addEventListener('transitionend', finishDetach);\n    });\n\n    // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n    // In this case we make it unclickable and we try to remove it after a delay.\n    backdropToDetach.style.pointerEvents = 'none';\n\n    // Run this outside the Angular zone because there's nothing that Angular cares about.\n    // If it were to run inside the Angular zone, every test that used Overlay would have to be\n    // either async or fakeAsync.\n    timeoutId = this._ngZone.runOutsideAngular(() => setTimeout(finishDetach, 500));\n  }\n\n  /** Toggles a single CSS class or an array of classes on an element. */\n  private _toggleClasses(element: HTMLElement, cssClasses: string | string[], isAdd: boolean) {\n    const classList = element.classList;\n\n    coerceArray(cssClasses).forEach(cssClass => {\n      // We can't do a spread here, because IE doesn't support setting multiple classes.\n      isAdd ? classList.add(cssClass) : classList.remove(cssClass);\n    });\n  }\n\n  /** Detaches the overlay content next time the zone stabilizes. */\n  private _detachContentWhenStable() {\n    // Normally we wouldn't have to explicitly run this outside the `NgZone`, however\n    // if the consumer is using `zone-patch-rxjs`, the `Subscription.unsubscribe` call will\n    // be patched to run inside the zone, which will throw us into an infinite loop.\n    this._ngZone.runOutsideAngular(() => {\n      // We can't remove the host here immediately, because the overlay pane's content\n      // might still be animating. This stream helps us avoid interrupting the animation\n      // by waiting for the pane to become empty.\n      const subscription = this._ngZone.onStable\n        .asObservable()\n        .pipe(takeUntil(merge(this._attachments, this._detachments)))\n        .subscribe(() => {\n          // Needs a couple of checks for the pane and host, because\n          // they may have been removed by the time the zone stabilizes.\n          if (!this._pane || !this._host || this._pane.children.length === 0) {\n            if (this._pane && this._config.panelClass) {\n              this._toggleClasses(this._pane, this._config.panelClass, false);\n            }\n\n            if (this._host && this._host.parentElement) {\n              this._previousHostParent = this._host.parentElement;\n              this._previousHostParent.removeChild(this._host);\n            }\n\n            subscription.unsubscribe();\n          }\n        });\n    });\n  }\n\n  /** Disposes of a scroll strategy. */\n  private _disposeScrollStrategy() {\n    const scrollStrategy = this._scrollStrategy;\n\n    if (scrollStrategy) {\n      scrollStrategy.disable();\n\n      if (scrollStrategy.detach) {\n        scrollStrategy.detach();\n      }\n    }\n  }\n}\n\n\n/** Size properties for an overlay. */\nexport interface OverlaySizeConfig {\n  width?: number | string;\n  height?: number | string;\n  minWidth?: number | string;\n  minHeight?: number | string;\n  maxWidth?: number | string;\n  maxHeight?: number | string;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {\n  Inject,\n  Injectable,\n  InjectionToken,\n  OnDestroy,\n  Optional,\n  SkipSelf,\n} from '@angular/core';\n\n\n/** Container inside which all overlays will render. */\n@Injectable({providedIn: 'root'})\nexport class OverlayContainer implements OnDestroy {\n  protected _containerElement: HTMLElement;\n\n  constructor(@Inject(DOCUMENT) protected _document: any) {}\n\n  ngOnDestroy() {\n    if (this._containerElement && this._containerElement.parentNode) {\n      this._containerElement.parentNode.removeChild(this._containerElement);\n    }\n  }\n\n  /**\n   * This method returns the overlay container element. It will lazily\n   * create the element the first time  it is called to facilitate using\n   * the container in non-browser environments.\n   * @returns the container element\n   */\n  getContainerElement(): HTMLElement {\n    if (!this._containerElement) { this._createContainer(); }\n    return this._containerElement;\n  }\n\n  /**\n   * Create the overlay container element, which is simply a div\n   * with the 'cdk-overlay-container' class on the document body.\n   */\n  protected _createContainer(): void {\n    const container = this._document.createElement('div');\n\n    container.classList.add('cdk-overlay-container');\n    this._document.body.appendChild(container);\n    this._containerElement = container;\n  }\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function OVERLAY_CONTAINER_PROVIDER_FACTORY(parentContainer: OverlayContainer,\n  _document: any) {\n  return parentContainer || new OverlayContainer(_document);\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const OVERLAY_CONTAINER_PROVIDER = {\n  // If there is already an OverlayContainer available, use that. Otherwise, provide a new one.\n  provide: OverlayContainer,\n  deps: [\n    [new Optional(), new SkipSelf(), OverlayContainer],\n    DOCUMENT as InjectionToken<any> // We need to use the InjectionToken somewhere to keep TS happy\n  ],\n  useFactory: OVERLAY_CONTAINER_PROVIDER_FACTORY\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {\n  Inject,\n  Injectable,\n  InjectionToken,\n  OnDestroy,\n  Optional,\n  SkipSelf,\n} from '@angular/core';\nimport {OverlayRef} from '../overlay-ref';\n\n\n/**\n * Service for dispatching keyboard events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\n@Injectable({providedIn: 'root'})\nexport class OverlayKeyboardDispatcher implements OnDestroy {\n\n  /** Currently attached overlays in the order they were attached. */\n  _attachedOverlays: OverlayRef[] = [];\n\n  private _document: Document;\n  private _isAttached: boolean;\n\n  constructor(@Inject(DOCUMENT) document: any) {\n    this._document = document;\n  }\n\n  ngOnDestroy() {\n    this._detach();\n  }\n\n  /** Add a new overlay to the list of attached overlay refs. */\n  add(overlayRef: OverlayRef): void {\n    // Ensure that we don't get the same overlay multiple times.\n    this.remove(overlayRef);\n\n    // Lazily start dispatcher once first overlay is added\n    if (!this._isAttached) {\n      this._document.body.addEventListener('keydown', this._keydownListener);\n      this._isAttached = true;\n    }\n\n    this._attachedOverlays.push(overlayRef);\n  }\n\n  /** Remove an overlay from the list of attached overlay refs. */\n  remove(overlayRef: OverlayRef): void {\n    const index = this._attachedOverlays.indexOf(overlayRef);\n\n    if (index > -1) {\n      this._attachedOverlays.splice(index, 1);\n    }\n\n    // Remove the global listener once there are no more overlays.\n    if (this._attachedOverlays.length === 0) {\n      this._detach();\n    }\n  }\n\n  /** Detaches the global keyboard event listener. */\n  private _detach() {\n    if (this._isAttached) {\n      this._document.body.removeEventListener('keydown', this._keydownListener);\n      this._isAttached = false;\n    }\n  }\n\n  /** Keyboard event listener that will be attached to the body. */\n  private _keydownListener = (event: KeyboardEvent) => {\n    const overlays = this._attachedOverlays;\n\n    for (let i = overlays.length - 1; i > -1; i--) {\n      // Dispatch the keydown event to the top overlay which has subscribers to its keydown events.\n      // We want to target the most recent overlay, rather than trying to match where the event came\n      // from, because some components might open an overlay, but keep focus on a trigger element\n      // (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions,\n      // because we don't want overlays that don't handle keyboard events to block the ones below\n      // them that do.\n      if (overlays[i]._keydownEventSubscriptions > 0) {\n        overlays[i]._keydownEvents.next(event);\n        break;\n      }\n    }\n  }\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function OVERLAY_KEYBOARD_DISPATCHER_PROVIDER_FACTORY(\n    dispatcher: OverlayKeyboardDispatcher, _document: any) {\n  return dispatcher || new OverlayKeyboardDispatcher(_document);\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const OVERLAY_KEYBOARD_DISPATCHER_PROVIDER = {\n  // If there is already an OverlayKeyboardDispatcher available, use that.\n  // Otherwise, provide a new one.\n  provide: OverlayKeyboardDispatcher,\n  deps: [\n    [new Optional(), new SkipSelf(), OverlayKeyboardDispatcher],\n\n    // Coerce to `InjectionToken` so that the `deps` match the \"shape\"\n    // of the type expected by Angular\n    DOCUMENT as InjectionToken<any>\n  ],\n  useFactory: OVERLAY_KEYBOARD_DISPATCHER_PROVIDER_FACTORY\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/** Horizontal dimension of a connection point on the perimeter of the origin or overlay element. */\nimport {Optional} from '@angular/core';\nexport type HorizontalConnectionPos = 'start' | 'center' | 'end';\n\n/** Vertical dimension of a connection point on the perimeter of the origin or overlay element. */\nexport type VerticalConnectionPos = 'top' | 'center' | 'bottom';\n\n\n/** A connection point on the origin element. */\nexport interface OriginConnectionPosition {\n  originX: HorizontalConnectionPos;\n  originY: VerticalConnectionPos;\n}\n\n/** A connection point on the overlay element. */\nexport interface OverlayConnectionPosition {\n  overlayX: HorizontalConnectionPos;\n  overlayY: VerticalConnectionPos;\n}\n\n/** The points of the origin element and the overlay element to connect. */\nexport class ConnectionPositionPair {\n  /** X-axis attachment point for connected overlay origin. Can be 'start', 'end', or 'center'. */\n  originX: HorizontalConnectionPos;\n  /** Y-axis attachment point for connected overlay origin. Can be 'top', 'bottom', or 'center'. */\n  originY: VerticalConnectionPos;\n  /** X-axis attachment point for connected overlay. Can be 'start', 'end', or 'center'. */\n  overlayX: HorizontalConnectionPos;\n  /** Y-axis attachment point for connected overlay. Can be 'top', 'bottom', or 'center'. */\n  overlayY: VerticalConnectionPos;\n\n  constructor(\n    origin: OriginConnectionPosition,\n    overlay: OverlayConnectionPosition,\n    /** Offset along the X axis. */\n    public offsetX?: number,\n    /** Offset along the Y axis. */\n    public offsetY?: number,\n    /** Class(es) to be applied to the panel while this position is active. */\n    public panelClass?: string | string[]) {\n\n    this.originX = origin.originX;\n    this.originY = origin.originY;\n    this.overlayX = overlay.overlayX;\n    this.overlayY = overlay.overlayY;\n  }\n}\n\n/**\n * Set of properties regarding the position of the origin and overlay relative to the viewport\n * with respect to the containing Scrollable elements.\n *\n * The overlay and origin are clipped if any part of their bounding client rectangle exceeds the\n * bounds of any one of the strategy's Scrollable's bounding client rectangle.\n *\n * The overlay and origin are outside view if there is no overlap between their bounding client\n * rectangle and any one of the strategy's Scrollable's bounding client rectangle.\n *\n *       -----------                    -----------\n *       | outside |                    | clipped |\n *       |  view   |              --------------------------\n *       |         |              |     |         |        |\n *       ----------               |     -----------        |\n *  --------------------------    |                        |\n *  |                        |    |      Scrollable        |\n *  |                        |    |                        |\n *  |                        |     --------------------------\n *  |      Scrollable        |\n *  |                        |\n *  --------------------------\n *\n *  @docs-private\n */\nexport class ScrollingVisibility {\n  isOriginClipped: boolean;\n  isOriginOutsideView: boolean;\n  isOverlayClipped: boolean;\n  isOverlayOutsideView: boolean;\n}\n\n/** The change event emitted by the strategy when a fallback position is used. */\nexport class ConnectedOverlayPositionChange {\n  constructor(\n      /** The position used as a result of this change. */\n      public connectionPair: ConnectionPositionPair,\n      /** @docs-private */\n      @Optional() public scrollableViewProperties: ScrollingVisibility) {}\n}\n\n/**\n * Validates whether a vertical position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nexport function validateVerticalPosition(property: string, value: VerticalConnectionPos) {\n  if (value !== 'top' && value !== 'bottom' && value !== 'center') {\n    throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` +\n                `Expected \"top\", \"bottom\" or \"center\".`);\n  }\n}\n\n/**\n * Validates whether a horizontal position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nexport function validateHorizontalPosition(property: string, value: HorizontalConnectionPos) {\n  if (value !== 'start' && value !== 'end' && value !== 'center') {\n    throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` +\n                `Expected \"start\", \"end\" or \"center\".`);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {PositionStrategy} from './position/position-strategy';\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {ScrollStrategy, NoopScrollStrategy} from './scroll/index';\n\n\n/** Initial configuration used when creating an overlay. */\nexport class OverlayConfig {\n  /** Strategy with which to position the overlay. */\n  positionStrategy?: PositionStrategy;\n\n  /** Strategy to be used when handling scroll events while the overlay is open. */\n  scrollStrategy?: ScrollStrategy = new NoopScrollStrategy();\n\n  /** Custom class to add to the overlay pane. */\n  panelClass?: string | string[] = '';\n\n  /** Whether the overlay has a backdrop. */\n  hasBackdrop?: boolean = false;\n\n  /** Custom class to add to the backdrop */\n  backdropClass?: string | string[] = 'cdk-overlay-dark-backdrop';\n\n  /** The width of the overlay panel. If a number is provided, pixel units are assumed. */\n  width?: number | string;\n\n  /** The height of the overlay panel. If a number is provided, pixel units are assumed. */\n  height?: number | string;\n\n  /** The min-width of the overlay panel. If a number is provided, pixel units are assumed. */\n  minWidth?: number | string;\n\n  /** The min-height of the overlay panel. If a number is provided, pixel units are assumed. */\n  minHeight?: number | string;\n\n  /** The max-width of the overlay panel. If a number is provided, pixel units are assumed. */\n  maxWidth?: number | string;\n\n  /** The max-height of the overlay panel. If a number is provided, pixel units are assumed. */\n  maxHeight?: number | string;\n\n  /**\n   * Direction of the text in the overlay panel. If a `Directionality` instance\n   * is passed in, the overlay will handle changes to its value automatically.\n   */\n  direction?: Direction | Directionality;\n\n  /**\n   * Whether the overlay should be disposed of when the user goes backwards/forwards in history.\n   * Note that this usually doesn't include clicking on links (unless the user is using\n   * the `HashLocationStrategy`).\n   */\n  disposeOnNavigation?: boolean = false;\n\n  constructor(config?: OverlayConfig) {\n    if (config) {\n      const configKeys = Object.keys(config) as Array<keyof OverlayConfig>;\n      for (const key of configKeys) {\n        if (config[key] !== undefined) {\n          // TypeScript, as of version 3.5, sees the left-hand-side of this expression\n          // as \"I don't know *which* key this is, so the only valid value is the intersection\n          // of all the posible values.\" In this case, that happens to be `undefined`. TypeScript\n          // is not smart enough to see that the right-hand-side is actually an access of the same\n          // exact type with the same exact key, meaning that the value type must be identical.\n          // So we use `any` to work around this.\n          this[key] = config[key] as any;\n        }\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling';\nimport {DOCUMENT} from '@angular/common';\nimport {Inject, Injectable, NgZone} from '@angular/core';\nimport {BlockScrollStrategy} from './block-scroll-strategy';\nimport {CloseScrollStrategy, CloseScrollStrategyConfig} from './close-scroll-strategy';\nimport {NoopScrollStrategy} from './noop-scroll-strategy';\nimport {\n  RepositionScrollStrategy,\n  RepositionScrollStrategyConfig,\n} from './reposition-scroll-strategy';\n\n\n/**\n * Options for how an overlay will handle scrolling.\n *\n * Users can provide a custom value for `ScrollStrategyOptions` to replace the default\n * behaviors. This class primarily acts as a factory for ScrollStrategy instances.\n */\n@Injectable({providedIn: 'root'})\nexport class ScrollStrategyOptions {\n  private _document: Document;\n\n  constructor(\n    private _scrollDispatcher: ScrollDispatcher,\n    private _viewportRuler: ViewportRuler,\n    private _ngZone: NgZone,\n    @Inject(DOCUMENT) document: any) {\n      this._document = document;\n    }\n\n  /** Do nothing on scroll. */\n  noop = () => new NoopScrollStrategy();\n\n  /**\n   * Close the overlay as soon as the user scrolls.\n   * @param config Configuration to be used inside the scroll strategy.\n   */\n  close = (config?: CloseScrollStrategyConfig) => new CloseScrollStrategy(this._scrollDispatcher,\n      this._ngZone, this._viewportRuler, config)\n\n  /** Block scrolling. */\n  block = () => new BlockScrollStrategy(this._viewportRuler, this._document);\n\n  /**\n   * Update the overlay's position on scroll.\n   * @param config Configuration to be used inside the scroll strategy.\n   * Allows debouncing the reposition calls.\n   */\n  reposition = (config?: RepositionScrollStrategyConfig) => new RepositionScrollStrategy(\n      this._scrollDispatcher, this._viewportRuler, this._ngZone, config)\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgZone} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {ScrollStrategy, getMatScrollStrategyAlreadyAttachedError} from './scroll-strategy';\nimport {OverlayReference} from '../overlay-reference';\nimport {ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling';\nimport {isElementScrolledOutsideView} from '../position/scroll-clip';\n\n/**\n * Config options for the RepositionScrollStrategy.\n */\nexport interface RepositionScrollStrategyConfig {\n  /** Time in milliseconds to throttle the scroll events. */\n  scrollThrottle?: number;\n\n  /** Whether to close the overlay once the user has scrolled away completely. */\n  autoClose?: boolean;\n}\n\n/**\n * Strategy that will update the element position as the user is scrolling.\n */\nexport class RepositionScrollStrategy implements ScrollStrategy {\n  private _scrollSubscription: Subscription|null = null;\n  private _overlayRef: OverlayReference;\n\n  constructor(\n    private _scrollDispatcher: ScrollDispatcher,\n    private _viewportRuler: ViewportRuler,\n    private _ngZone: NgZone,\n    private _config?: RepositionScrollStrategyConfig) { }\n\n  /** Attaches this scroll strategy to an overlay. */\n  attach(overlayRef: OverlayReference) {\n    if (this._overlayRef) {\n      throw getMatScrollStrategyAlreadyAttachedError();\n    }\n\n    this._overlayRef = overlayRef;\n  }\n\n  /** Enables repositioning of the attached overlay on scroll. */\n  enable() {\n    if (!this._scrollSubscription) {\n      const throttle = this._config ? this._config.scrollThrottle : 0;\n\n      this._scrollSubscription = this._scrollDispatcher.scrolled(throttle).subscribe(() => {\n        this._overlayRef.updatePosition();\n\n        // TODO(crisbeto): make `close` on by default once all components can handle it.\n        if (this._config && this._config.autoClose) {\n          const overlayRect = this._overlayRef.overlayElement.getBoundingClientRect();\n          const {width, height} = this._viewportRuler.getViewportSize();\n\n          // TODO(crisbeto): include all ancestor scroll containers here once\n          // we have a way of exposing the trigger element to the scroll strategy.\n          const parentRects = [{width, height, bottom: height, right: width, top: 0, left: 0}];\n\n          if (isElementScrolledOutsideView(overlayRect, parentRects)) {\n            this.disable();\n            this._ngZone.run(() => this._overlayRef.detach());\n          }\n        }\n      });\n    }\n  }\n\n  /** Disables repositioning of the attached overlay on scroll. */\n  disable() {\n    if (this._scrollSubscription) {\n      this._scrollSubscription.unsubscribe();\n      this._scrollSubscription = null;\n    }\n  }\n\n  detach() {\n    this.disable();\n    this._overlayRef = null!;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// TODO(jelbourn): move this to live with the rest of the scrolling code\n// TODO(jelbourn): someday replace this with IntersectionObservers\n\n/**\n * Gets whether an element is scrolled outside of view by any of its parent scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is scrolled out of view\n * @docs-private\n */\nexport function isElementScrolledOutsideView(element: ClientRect, scrollContainers: ClientRect[]) {\n  return scrollContainers.some(containerBounds => {\n    const outsideAbove = element.bottom < containerBounds.top;\n    const outsideBelow = element.top > containerBounds.bottom;\n    const outsideLeft = element.right < containerBounds.left;\n    const outsideRight = element.left > containerBounds.right;\n\n    return outsideAbove || outsideBelow || outsideLeft || outsideRight;\n  });\n}\n\n\n/**\n * Gets whether an element is clipped by any of its scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is clipped\n * @docs-private\n */\nexport function isElementClippedByScrolling(element: ClientRect, scrollContainers: ClientRect[]) {\n  return scrollContainers.some(scrollContainerRect => {\n    const clippedAbove = element.top < scrollContainerRect.top;\n    const clippedBelow = element.bottom > scrollContainerRect.bottom;\n    const clippedLeft = element.left < scrollContainerRect.left;\n    const clippedRight = element.right > scrollContainerRect.right;\n\n    return clippedAbove || clippedBelow || clippedLeft || clippedRight;\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ScrollStrategy} from './scroll-strategy';\n\n/** Scroll strategy that doesn't do anything. */\nexport class NoopScrollStrategy implements ScrollStrategy {\n  /** Does nothing, as this scroll strategy is a no-op. */\n  enable() { }\n  /** Does nothing, as this scroll strategy is a no-op. */\n  disable() { }\n  /** Does nothing, as this scroll strategy is a no-op. */\n  attach() { }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {NgZone} from '@angular/core';\nimport {ScrollStrategy, getMatScrollStrategyAlreadyAttachedError} from './scroll-strategy';\nimport {OverlayReference} from '../overlay-reference';\nimport {Subscription} from 'rxjs';\nimport {ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling';\n\n/**\n * Config options for the CloseScrollStrategy.\n */\nexport interface CloseScrollStrategyConfig {\n  /** Amount of pixels the user has to scroll before the overlay is closed. */\n  threshold?: number;\n}\n\n/**\n * Strategy that will close the overlay as soon as the user starts scrolling.\n */\nexport class CloseScrollStrategy implements ScrollStrategy {\n  private _scrollSubscription: Subscription|null = null;\n  private _overlayRef: OverlayReference;\n  private _initialScrollPosition: number;\n\n  constructor(\n    private _scrollDispatcher: ScrollDispatcher,\n    private _ngZone: NgZone,\n    private _viewportRuler: ViewportRuler,\n    private _config?: CloseScrollStrategyConfig) {}\n\n  /** Attaches this scroll strategy to an overlay. */\n  attach(overlayRef: OverlayReference) {\n    if (this._overlayRef) {\n      throw getMatScrollStrategyAlreadyAttachedError();\n    }\n\n    this._overlayRef = overlayRef;\n  }\n\n  /** Enables the closing of the attached overlay on scroll. */\n  enable() {\n    if (this._scrollSubscription) {\n      return;\n    }\n\n    const stream = this._scrollDispatcher.scrolled(0);\n\n    if (this._config && this._config.threshold && this._config.threshold > 1) {\n      this._initialScrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n\n      this._scrollSubscription = stream.subscribe(() => {\n        const scrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n\n        if (Math.abs(scrollPosition - this._initialScrollPosition) > this._config!.threshold!) {\n          this._detach();\n        } else {\n          this._overlayRef.updatePosition();\n        }\n      });\n    } else {\n      this._scrollSubscription = stream.subscribe(this._detach);\n    }\n  }\n\n  /** Disables the closing the attached overlay on scroll. */\n  disable() {\n    if (this._scrollSubscription) {\n      this._scrollSubscription.unsubscribe();\n      this._scrollSubscription = null;\n    }\n  }\n\n  detach() {\n    this.disable();\n    this._overlayRef = null!;\n  }\n\n  /** Detaches the overlay ref and disables the scroll strategy. */\n  private _detach = () => {\n    this.disable();\n\n    if (this._overlayRef.hasAttached()) {\n      this._ngZone.run(() => this._overlayRef.detach());\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {OverlayReference} from '../overlay-reference';\n\n/**\n * Describes a strategy that will be used by an overlay to handle scroll events while it is open.\n */\nexport interface ScrollStrategy {\n  /** Enable this scroll strategy (called when the attached overlay is attached to a portal). */\n  enable: () => void;\n\n  /** Disable this scroll strategy (called when the attached overlay is detached from a portal). */\n  disable: () => void;\n\n  /** Attaches this `ScrollStrategy` to an overlay. */\n  attach: (overlayRef: OverlayReference) => void;\n\n  /** Detaches the scroll strategy from the current overlay. */\n  detach?: () => void;\n}\n\n/**\n * Returns an error to be thrown when attempting to attach an already-attached scroll strategy.\n */\nexport function getMatScrollStrategyAlreadyAttachedError(): Error {\n  return Error(`Scroll strategy has already been attached.`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ScrollStrategy} from './scroll-strategy';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {coerceCssPixelValue} from '@angular/cdk/coercion';\n\n/**\n * Extended `CSSStyleDeclaration` that includes `scrollBehavior` which isn't part of the\n * built-in TS typings. Once it is, this declaration can be removed safely.\n * @docs-private\n */\ntype ScrollBehaviorCSSStyleDeclaration = CSSStyleDeclaration & {scrollBehavior: string};\n\n/**\n * Strategy that will prevent the user from scrolling while the overlay is visible.\n */\nexport class BlockScrollStrategy implements ScrollStrategy {\n  private _previousHTMLStyles = {top: '', left: ''};\n  private _previousScrollPosition: { top: number, left: number };\n  private _isEnabled = false;\n  private _document: Document;\n\n  constructor(private _viewportRuler: ViewportRuler, document: any) {\n    this._document = document;\n  }\n\n  /** Attaches this scroll strategy to an overlay. */\n  attach() { }\n\n  /** Blocks page-level scroll while the attached overlay is open. */\n  enable() {\n    if (this._canBeEnabled()) {\n      const root = this._document.documentElement!;\n\n      this._previousScrollPosition = this._viewportRuler.getViewportScrollPosition();\n\n      // Cache the previous inline styles in case the user had set them.\n      this._previousHTMLStyles.left = root.style.left || '';\n      this._previousHTMLStyles.top = root.style.top || '';\n\n      // Note: we're using the `html` node, instead of the `body`, because the `body` may\n      // have the user agent margin, whereas the `html` is guaranteed not to have one.\n      root.style.left = coerceCssPixelValue(-this._previousScrollPosition.left);\n      root.style.top = coerceCssPixelValue(-this._previousScrollPosition.top);\n      root.classList.add('cdk-global-scrollblock');\n      this._isEnabled = true;\n    }\n  }\n\n  /** Unblocks page-level scroll while the attached overlay is open. */\n  disable() {\n    if (this._isEnabled) {\n      const html = this._document.documentElement!;\n      const body = this._document.body!;\n      const htmlStyle = html.style as ScrollBehaviorCSSStyleDeclaration;\n      const bodyStyle = body.style as ScrollBehaviorCSSStyleDeclaration;\n      const previousHtmlScrollBehavior = htmlStyle.scrollBehavior || '';\n      const previousBodyScrollBehavior = bodyStyle.scrollBehavior || '';\n\n      this._isEnabled = false;\n\n      htmlStyle.left = this._previousHTMLStyles.left;\n      htmlStyle.top = this._previousHTMLStyles.top;\n      html.classList.remove('cdk-global-scrollblock');\n\n      // Disable user-defined smooth scrolling temporarily while we restore the scroll position.\n      // See https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n      htmlStyle.scrollBehavior = bodyStyle.scrollBehavior = 'auto';\n\n      window.scroll(this._previousScrollPosition.left, this._previousScrollPosition.top);\n\n      htmlStyle.scrollBehavior = previousHtmlScrollBehavior;\n      bodyStyle.scrollBehavior = previousBodyScrollBehavior;\n    }\n  }\n\n  private _canBeEnabled(): boolean {\n    // Since the scroll strategies can't be singletons, we have to use a global CSS class\n    // (`cdk-global-scrollblock`) to make sure that we don't try to disable global\n    // scrolling multiple times.\n    const html = this._document.documentElement!;\n\n    if (html.classList.contains('cdk-global-scrollblock') || this._isEnabled) {\n      return false;\n    }\n\n    const body = this._document.body;\n    const viewport = this._viewportRuler.getViewportSize();\n    return body.scrollHeight > viewport.height || body.scrollWidth > viewport.width;\n  }\n}\n"],"names":["tslib_1.__extends","tslib_1.__assign"],"mappings":"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"}