UNPKG

@blox/material

Version:

Material Components for Angular

250 lines 24.6 kB
import { ContentChildren, Directive, ElementRef, HostBinding, Inject, Input, Renderer2 } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcIcon } from '../icon-button/abstract.mdc.icon'; import { MdcButtonDirective } from '../button/mdc.button.directive'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** * Directive for an area that displays a custom background-image. See the <code>size</code> * property for the sizing of the image. * If used, this directive should be put inside the card itself (<code>MdcCardDirective</code>). * Add an <code>mdcCardMediaContent</code> as sub-element for displaying a title, text, * or icon on top of the background image. */ export class MdcCardMediaDirective { constructor() { /** @internal */ this._cls = true; this._size = 'cover'; } /** @internal */ get _square() { return this._size === 'square'; } /** @internal */ get _size2() { return this._size === '16:9'; } /** * Directive to select size to which this element's background-image should * be scaled. Can be one of 'cover', '16:9', or 'square'. The default value * is 'cover'. */ get size() { return this._size; } set size(val) { this._size = val; } } MdcCardMediaDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCardMedia]', },] } ]; MdcCardMediaDirective.ctorParameters = () => []; MdcCardMediaDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card__media',] }], _square: [{ type: HostBinding, args: ['class.mdc-card__media--square',] }], _size2: [{ type: HostBinding, args: ['class.mdc-card__media--16-9',] }], size: [{ type: Input }] }; /** * Directive for displaying text on top of a <code>mdcCardMedia</code> element. * This directive should be used as child element of the <code>mdcCardMedia</code>, and * creates an absolutely positioned box the same size as the media area. */ export class MdcCardMediaContentDirective { constructor() { /** @internal */ this._cls = true; } } MdcCardMediaContentDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCardMediaContent]' },] } ]; MdcCardMediaContentDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card__media-content',] }] }; /** * Directive for displaying the button card actions. Composed of one or more * card actions, which must be buttons that have the <code>MdcButtonDirective</code>. * This directive should be placed inside an <code>MdcCardActionsDirective</code>. */ export class MdcCardActionButtonsDirective { constructor() { /** @internal */ this._cls = true; } } MdcCardActionButtonsDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCardActionButtons]' },] } ]; MdcCardActionButtonsDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card__action-buttons',] }] }; /** * Directive for displaying the icon card actions. Composed of one or more * card actions, which must be icons (for instance <code>mdcIconButton</code>. * This directive should be placed inside an <code>MdcCardActionsDirective</code>. */ export class MdcCardActionIconsDirective { constructor() { /** @internal */ this._cls = true; } } MdcCardActionIconsDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCardActionIcons]' },] } ]; MdcCardActionIconsDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card__action-icons',] }] }; /** * Directive for showing the different actions a user can take. Use * <code>mdcButton</code>, or <code>mdcIconButton</code> as child elements. * If you want to use both buttons and icons in the same row, wrap them in * <code>mdcCardActionButtons</code>, and <code>mdcCardActionIcons</code> directives. */ export class MdcCardActionsDirective { constructor(renderer) { this.renderer = renderer; /** @internal */ this._cls = true; this._initialized = false; this._fullBleed = false; } ngAfterContentInit() { this._initialized = true; this._initButtons(); this._initIcons(); this._buttons.changes.subscribe(() => { this._initButtons(); }); this._icons.changes.subscribe(() => { this._initIcons(); }); } _initButtons() { if (this._initialized) this._buttons.forEach(btn => { this.renderer.addClass(btn._elm.nativeElement, 'mdc-card__action'); this.renderer.addClass(btn._elm.nativeElement, 'mdc-card__action--button'); }); } _initIcons() { if (this._initialized) this._icons.forEach(icon => { this.renderer.addClass(icon._elm.nativeElement, 'mdc-card__action'); this.renderer.addClass(icon._elm.nativeElement, 'mdc-card__action--icon'); }); } /** * When this input is defined and does not have value false, the contained * button takes up the entire width of the action row. This should be used only when * there is a single button contained in the directive. */ get fullBleed() { return this._fullBleed; } set fullBleed(val) { this._fullBleed = asBoolean(val); } } MdcCardActionsDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCardActions]', },] } ]; MdcCardActionsDirective.ctorParameters = () => [ { type: Renderer2 } ]; MdcCardActionsDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card__actions',] }], _buttons: [{ type: ContentChildren, args: [MdcButtonDirective, { descendants: true },] }], _icons: [{ type: ContentChildren, args: [AbstractMdcIcon, { descendants: true },] }], fullBleed: [{ type: HostBinding, args: ['class.mdc-card__actions--full-bleed',] }, { type: Input }] }; /** * Directive for the main tappable area of the card (so should be a child of <code>mdcCard</code>). * Typically contains most (or all) card content except <code>mdcCardActions</code>. * Only applicable to cards that have a primary action that the main surface should trigger. */ export class MdcCardPrimaryActionDirective extends AbstractMdcRipple { constructor(elm, renderer, registry, doc) { super(elm, renderer, registry, doc); this.elm = elm; /** @internal */ this._cls = true; } ngAfterContentInit() { if (!this.elm.nativeElement.hasAttribute('tabindex')) // unless overridden, make the action tabbable: this.elm.nativeElement.tabIndex = 0; this.initRipple(); } ngOnDestroy() { this.destroyRipple(); } } MdcCardPrimaryActionDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCardPrimaryAction]', },] } ]; MdcCardPrimaryActionDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcCardPrimaryActionDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card__primary-action',] }] }; /** * Directive for a material designed card. The card can be composed with the following directives: * <code>MdcCardMediaDirective</code>, <code>MdcCardActionsDirective</code> */ export class MdcCardDirective { constructor() { /** @internal */ this._cls = true; this._outlined = false; } /** * When this input is set to a value other than false, the card will have a * hairline stroke instead of a shadow. */ get outlined() { return this._outlined; } set outlined(val) { this._outlined = asBoolean(val); } } MdcCardDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcCard]' },] } ]; MdcCardDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-card',] }], outlined: [{ type: HostBinding, args: ['class.mdc-card--outlined',] }, { type: Input }] }; export const CARD_DIRECTIVES = [ MdcCardMediaDirective, MdcCardMediaContentDirective, MdcCardActionButtonsDirective, MdcCardActionIconsDirective, MdcCardActionsDirective, MdcCardPrimaryActionDirective, MdcCardDirective ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLmNhcmQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2FyZC9tZGMuY2FyZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixlQUFlLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFDOUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFOzs7Ozs7R0FNRztBQUlILE1BQU0sT0FBTyxxQkFBcUI7SUFLOUI7UUFKQSxnQkFBZ0I7UUFDK0IsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNuRCxVQUFLLEdBQWdDLE9BQU8sQ0FBQztJQUV0QyxDQUFDO0lBRWhCLGdCQUFnQjtJQUNoQixJQUFrRCxPQUFPO1FBQ3JELE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFnRCxNQUFNO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLEdBQWdDO1FBQ3JD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S2tFLE1BQU0sU0FBQyxRQUFROzs7bUJBRnJHLFdBQVcsU0FBQyxnQ0FBZ0M7O0FBa0JqRDs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBSUksZ0JBQWdCO1FBQ3dCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDNUMsY0FBUyxHQUFHLEtBQUssQ0FBQztJQWdCOUIsQ0FBQztJQWRHOzs7T0FHRztJQUNILElBQ0ksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsR0FBWTtRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs7WUFuQkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxXQUFXO2FBQ3hCOzs7bUJBR0ksV0FBVyxTQUFDLGdCQUFnQjt1QkFPNUIsV0FBVyxTQUFDLDBCQUEwQixjQUFHLEtBQUs7O0FBWW5ELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUMzQixxQkFBcUI7SUFDckIsNEJBQTRCO0lBQzVCLDZCQUE2QjtJQUM3QiwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLDZCQUE2QjtJQUM3QixnQkFBZ0I7Q0FDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbnRlbnRDaGlsZHJlbiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LFxuICAgIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY0ljb24gfSBmcm9tICcuLi9pY29uLWJ1dHRvbi9hYnN0cmFjdC5tZGMuaWNvbic7XG5pbXBvcnQgeyBNZGNCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24vbWRjLmJ1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZGNSaXBwbGUgfSBmcm9tICcuLi9yaXBwbGUvYWJzdHJhY3QubWRjLnJpcHBsZSc7XG5pbXBvcnQgeyBNZGNFdmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvbWRjLmV2ZW50LnJlZ2lzdHJ5JztcblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGFuIGFyZWEgdGhhdCBkaXNwbGF5cyBhIGN1c3RvbSBiYWNrZ3JvdW5kLWltYWdlLiBTZWUgdGhlIDxjb2RlPnNpemU8L2NvZGU+XG4gKiBwcm9wZXJ0eSBmb3IgdGhlIHNpemluZyBvZiB0aGUgaW1hZ2UuXG4gKiBJZiB1c2VkLCB0aGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgcHV0IGluc2lkZSB0aGUgY2FyZCBpdHNlbGYgKDxjb2RlPk1kY0NhcmREaXJlY3RpdmU8L2NvZGU+KS5cbiAqIEFkZCBhbiA8Y29kZT5tZGNDYXJkTWVkaWFDb250ZW50PC9jb2RlPiBhcyBzdWItZWxlbWVudCBmb3IgZGlzcGxheWluZyBhIHRpdGxlLCB0ZXh0LFxuICogb3IgaWNvbiBvbiB0b3Agb2YgdGhlIGJhY2tncm91bmQgaW1hZ2UuIFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNDYXJkTWVkaWFdJyxcbn0pXG5leHBvcnQgY2xhc3MgTWRjQ2FyZE1lZGlhRGlyZWN0aXZlIHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtY2FyZF9fbWVkaWEnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9zaXplOiAnY292ZXInIHwgJzE2OjknIHwgJ3NxdWFyZScgPSAnY292ZXInO1xuICAgICAgICBcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtY2FyZF9fbWVkaWEtLXNxdWFyZScpIGdldCBfc3F1YXJlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gJ3NxdWFyZSc7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLWNhcmRfX21lZGlhLS0xNi05JykgZ2V0IF9zaXplMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPT09ICcxNjo5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXJlY3RpdmUgdG8gc2VsZWN0IHNpemUgdG8gd2hpY2ggdGhpcyBlbGVtZW50J3MgYmFja2dyb3VuZC1pbWFnZSBzaG91bGRcbiAgICAgKiBiZSBzY2FsZWQuIENhbiBiZSBvbmUgb2YgJ2NvdmVyJywgJzE2OjknLCBvciAnc3F1YXJlJy4gVGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgKiBpcyAnY292ZXInLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBzaXplKCk6ICdjb3ZlcicgfCAnMTY6OScgfCAnc3F1YXJlJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBcbiAgICBzZXQgc2l6ZSh2YWw6ICdjb3ZlcicgfCAnMTY6OScgfCAnc3F1YXJlJykge1xuICAgICAgICB0aGlzLl9zaXplID0gdmFsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGRpc3BsYXlpbmcgdGV4dCBvbiB0b3Agb2YgYSA8Y29kZT5tZGNDYXJkTWVkaWE8L2NvZGU+IGVsZW1lbnQuXG4gKiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCBhcyBjaGlsZCBlbGVtZW50IG9mIHRoZSA8Y29kZT5tZGNDYXJkTWVkaWE8L2NvZGU+LCBhbmRcbiAqIGNyZWF0ZXMgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveCB0aGUgc2FtZSBzaXplIGFzIHRoZSBtZWRpYSBhcmVhLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNDYXJkTWVkaWFDb250ZW50XSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjQ2FyZE1lZGlhQ29udGVudERpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLWNhcmRfX21lZGlhLWNvbnRlbnQnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGRpc3BsYXlpbmcgdGhlIGJ1dHRvbiBjYXJkIGFjdGlvbnMuIENvbXBvc2VkIG9mIG9uZSBvciBtb3JlXG4gKiBjYXJkIGFjdGlvbnMsIHdoaWNoIG11c3QgYmUgYnV0dG9ucyB0aGF0IGhhdmUgdGhlIDxjb2RlPk1kY0J1dHRvbkRpcmVjdGl2ZTwvY29kZT4uXG4gKiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSBhbiA8Y29kZT5NZGNDYXJkQWN0aW9uc0RpcmVjdGl2ZTwvY29kZT4uXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY0NhcmRBY3Rpb25CdXR0b25zXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjQ2FyZEFjdGlvbkJ1dHRvbnNEaXJlY3RpdmUge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1jYXJkX19hY3Rpb24tYnV0dG9ucycpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xufVxuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgZGlzcGxheWluZyB0aGUgaWNvbiBjYXJkIGFjdGlvbnMuIENvbXBvc2VkIG9mIG9uZSBvciBtb3JlXG4gKiBjYXJkIGFjdGlvbnMsIHdoaWNoIG11c3QgYmUgaWNvbnMgKGZvciBpbnN0YW5jZSA8Y29kZT5tZGNJY29uQnV0dG9uPC9jb2RlPi5cbiAqIFRoaXMgZGlyZWN0aXZlIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIGFuIDxjb2RlPk1kY0NhcmRBY3Rpb25zRGlyZWN0aXZlPC9jb2RlPi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbbWRjQ2FyZEFjdGlvbkljb25zXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjQ2FyZEFjdGlvbkljb25zRGlyZWN0aXZlIHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtY2FyZF9fYWN0aW9uLWljb25zJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBzaG93aW5nIHRoZSBkaWZmZXJlbnQgYWN0aW9ucyBhIHVzZXIgY2FuIHRha2UuIFVzZVxuICogPGNvZGU+bWRjQnV0dG9uPC9jb2RlPiwgb3IgPGNvZGU+bWRjSWNvbkJ1dHRvbjwvY29kZT4gYXMgY2hpbGQgZWxlbWVudHMuXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYm90aCBidXR0b25zIGFuZCBpY29ucyBpbiB0aGUgc2FtZSByb3csIHdyYXAgdGhlbSBpblxuICogPGNvZGU+bWRjQ2FyZEFjdGlvbkJ1dHRvbnM8L2NvZGU+LCBhbmQgPGNvZGU+bWRjQ2FyZEFjdGlvbkljb25zPC9jb2RlPiBkaXJlY3RpdmVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNDYXJkQWN0aW9uc10nLFxufSlcbmV4cG9ydCBjbGFzcyBNZGNDYXJkQWN0aW9uc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1jYXJkX19hY3Rpb25zJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTWRjQnV0dG9uRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfYnV0dG9ucz86IFF1ZXJ5TGlzdDxNZGNCdXR0b25EaXJlY3RpdmU+O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKEFic3RyYWN0TWRjSWNvbiwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX2ljb25zPzogUXVlcnlMaXN0PEFic3RyYWN0TWRjSWNvbj47XG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9mdWxsQmxlZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pbml0QnV0dG9ucygpO1xuICAgICAgICB0aGlzLl9pbml0SWNvbnMoKTtcbiAgICAgICAgdGhpcy5fYnV0dG9ucyEuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faW5pdEJ1dHRvbnMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ljb25zIS5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pbml0SWNvbnMoKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0QnV0dG9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKVxuICAgICAgICAgICAgdGhpcy5fYnV0dG9ucyEuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnRuLl9lbG0ubmF0aXZlRWxlbWVudCwgJ21kYy1jYXJkX19hY3Rpb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ0bi5fZWxtLm5hdGl2ZUVsZW1lbnQsICdtZGMtY2FyZF9fYWN0aW9uLS1idXR0b24nKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRJY29ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKVxuICAgICAgICAgICAgdGhpcy5faWNvbnMhLmZvckVhY2goaWNvbiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpY29uLl9lbG0ubmF0aXZlRWxlbWVudCwgJ21kYy1jYXJkX19hY3Rpb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGljb24uX2VsbS5uYXRpdmVFbGVtZW50LCAnbWRjLWNhcmRfX2FjdGlvbi0taWNvbicpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGlucHV0IGlzIGRlZmluZWQgYW5kIGRvZXMgbm90IGhhdmUgdmFsdWUgZmFsc2UsIHRoZSBjb250YWluZWRcbiAgICAgKiBidXR0b24gdGFrZXMgdXAgdGhlIGVudGlyZSB3aWR0aCBvZiB0aGUgYWN0aW9uIHJvdy4gVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW5cbiAgICAgKiB0aGVyZSBpcyBhIHNpbmdsZSBidXR0b24gY29udGFpbmVkIGluIHRoZSBkaXJlY3RpdmUuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtY2FyZF9fYWN0aW9ucy0tZnVsbC1ibGVlZCcpIEBJbnB1dCgpXG4gICAgZ2V0IGZ1bGxCbGVlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxCbGVlZDtcbiAgICB9XG5cbiAgICBzZXQgZnVsbEJsZWVkKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9mdWxsQmxlZWQgPSBhc0Jvb2xlYW4odmFsKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZnVsbEJsZWVkOiBib29sZWFuIHwgJyc7XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciB0aGUgbWFpbiB0YXBwYWJsZSBhcmVhIG9mIHRoZSBjYXJkIChzbyBzaG91bGQgYmUgYSBjaGlsZCBvZiA8Y29kZT5tZGNDYXJkPC9jb2RlPikuXG4gKiBUeXBpY2FsbHkgY29udGFpbnMgbW9zdCAob3IgYWxsKSBjYXJkIGNvbnRlbnQgZXhjZXB0IDxjb2RlPm1kY0NhcmRBY3Rpb25zPC9jb2RlPi5cbiAqIE9ubHkgYXBwbGljYWJsZSB0byBjYXJkcyB0aGF0IGhhdmUgYSBwcmltYXJ5IGFjdGlvbiB0aGF0IHRoZSBtYWluIHN1cmZhY2Ugc2hvdWxkIHRyaWdnZXIuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY0NhcmRQcmltYXJ5QWN0aW9uXScsXG59KVxuZXhwb3J0IGNsYXNzIE1kY0NhcmRQcmltYXJ5QWN0aW9uRGlyZWN0aXZlIGV4dGVuZHMgQWJzdHJhY3RNZGNSaXBwbGUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1jYXJkX19wcmltYXJ5LWFjdGlvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbG06IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHJlZ2lzdHJ5OiBNZGNFdmVudFJlZ2lzdHJ5LCBASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICBzdXBlcihlbG0sIHJlbmRlcmVyLCByZWdpc3RyeSwgZG9jIGFzIERvY3VtZW50KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbG0ubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4JykpXG4gICAgICAgICAgICAvLyB1bmxlc3Mgb3ZlcnJpZGRlbiwgbWFrZSB0aGUgYWN0aW9uIHRhYmJhYmxlOlxuICAgICAgICAgICAgdGhpcy5lbG0ubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuaW5pdFJpcHBsZSgpO1xuICAgIH1cbiAgXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVJpcHBsZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGEgbWF0ZXJpYWwgZGVzaWduZWQgY2FyZC4gVGhlIGNhcmQgY2FuIGJlIGNvbXBvc2VkIHdpdGggdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzOlxuICogPGNvZGU+TWRjQ2FyZE1lZGlhRGlyZWN0aXZlPC9jb2RlPiwgPGNvZGU+TWRjQ2FyZEFjdGlvbnNEaXJlY3RpdmU8L2NvZGU+XG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY0NhcmRdJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNDYXJkRGlyZWN0aXZlIHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtY2FyZCcpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIHByaXZhdGUgX291dGxpbmVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgaW5wdXQgaXMgc2V0IHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBmYWxzZSwgdGhlIGNhcmQgd2lsbCBoYXZlIGFcbiAgICAgKiBoYWlybGluZSBzdHJva2UgaW5zdGVhZCBvZiBhIHNoYWRvdy5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1jYXJkLS1vdXRsaW5lZCcpIEBJbnB1dCgpXG4gICAgZ2V0IG91dGxpbmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3V0bGluZWQ7XG4gICAgfVxuXG4gICAgc2V0IG91dGxpbmVkKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9vdXRsaW5lZCA9IGFzQm9vbGVhbih2YWwpO1xuICAgIH1cblxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9vdXRsaW5lZDogYm9vbGVhbiB8ICcnO1xufVxuXG5leHBvcnQgY29uc3QgQ0FSRF9ESVJFQ1RJVkVTID0gW1xuICAgIE1kY0NhcmRNZWRpYURpcmVjdGl2ZSxcbiAgICBNZGNDYXJkTWVkaWFDb250ZW50RGlyZWN0aXZlLFxuICAgIE1kY0NhcmRBY3Rpb25CdXR0b25zRGlyZWN0aXZlLFxuICAgIE1kY0NhcmRBY3Rpb25JY29uc0RpcmVjdGl2ZSxcbiAgICBNZGNDYXJkQWN0aW9uc0RpcmVjdGl2ZSxcbiAgICBNZGNDYXJkUHJpbWFyeUFjdGlvbkRpcmVjdGl2ZSxcbiAgICBNZGNDYXJkRGlyZWN0aXZlXG5dOyJdfQ==