@blox/material
Version:
Material Components for Angular
250 lines • 24.6 kB
JavaScript
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==