@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
563 lines • 63 kB
JavaScript
/**
* Copyright (c) 2025 Visa, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { Directive, HostBinding, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class FlexDirective {
get hostClasses() {
return [
this.vFlex ? (this.vFlexCol ? 'v-flex' : 'v-flex v-flex-row') : null,
this.vFlexInline ? 'v-flex-inline' : null,
this.vFlexCol ? 'v-flex-col' : null,
this.vFlexColReverse ? 'v-flex-col-reverse' : null,
this.vFlexRow ? 'v-flex-row' : null,
this.vFlexRowReverse ? 'v-flex-row-reverse' : null,
this.vFlexWrap ? 'v-flex-wrap' : null,
this.vFlexWrapReverse ? 'v-flex-wrap-reverse' : null,
this.vFlexNoWrap ? 'v-flex-nowrap' : null,
this.vFlexGrow ? 'v-flex-grow' : null,
this.vFlexGrow0 ? 'v-flex-grow-0' : null,
this.vFlexShrink ? 'v-flex-shrink' : null,
this.vFlexShrink0 ? 'v-flex-shrink-0' : null,
this.vAlignContentCenter ? 'v-align-content-center' : null,
this.vAlignContentStart ? 'v-align-content-start' : null,
this.vAlignContentEnd ? 'v-align-content-end' : null,
this.vAlignContentBetween ? 'v-align-content-between' : null,
this.vAlignContentAround ? 'v-align-content-around' : null,
this.vAlignContentEvenly ? 'v-align-content-evenly' : null,
this.vAlignItemsStart ? 'v-align-items-start' : null,
this.vAlignItemsEnd ? 'v-align-items-end' : null,
this.vAlignItemsCenter ? 'v-align-items-center' : null,
this.vAlignItemsBaseline ? 'v-align-items-baseline' : null,
this.vAlignItemsStretch ? 'v-align-items-stretch' : null,
this.vAlignSelfStart ? 'v-align-self-start' : null,
this.vAlignSelfEnd ? 'v-align-self-end' : null,
this.vAlignSelfCenter ? 'v-align-self-center' : null,
this.vAlignSelfBaseline ? 'v-align-self-baseline' : null,
this.vAlignSelfStretch ? 'v-align-self-stretch' : null,
this.vAlignSelfAuto ? 'v-align-self-auto' : null,
this.vJustifyContentStart ? 'v-justify-content-start' : null,
this.vJustifyContentEnd ? 'v-justify-content-end' : null,
this.vJustifyContentCenter ? 'v-justify-content-center' : null,
this.vJustifyContentBetween ? 'v-justify-content-between' : null,
this.vJustifyContentAround ? 'v-justify-content-around' : null,
this.vJustifyContentEvenly ? 'v-justify-content-evenly' : null,
this.vGap ? `v-flex v-gap-${this.vGap}` : null, // vGap="4"
this.vColGap ? `v-col-gap-${this.vColGap}` : null, // vGap="4"
this.vRowGap ? `v-row-gap-${this.vRowGap}` : null // vGap="4"
].join(' ');
}
/**
* Sets property <code>display: flex</code>. <br>
* This property is also a selector and can be used by itself on a flex element.
*/
get vFlex() {
return this._vFlex;
}
set vFlex(value) {
this._vFlex = coerceBooleanProperty(value);
}
/**
* Sets property <code>display: inline-flex</code>. <br>
* This property is also a selector and can be used by itself on a flex element.
*/
get vFlexInline() {
return this._vFlexInline;
}
set vFlexInline(value) {
this._vFlexInline = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: column</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexCol() {
return this._vFlexCol;
}
set vFlexCol(value) {
this._vFlexCol = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: column-reverse</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexColReverse() {
return this._vFlexColReverse;
}
set vFlexColReverse(value) {
this._vFlexColReverse = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: row</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexRow() {
return this._vFlexRow;
}
set vFlexRow(value) {
this._vFlexRow = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: row-reverse</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexRowReverse() {
return this._vFlexRowReverse;
}
set vFlexRowReverse(value) {
this._vFlexRowReverse = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-wrap: wrap</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexWrap() {
return this._vFlexWrap;
}
set vFlexWrap(value) {
this._vFlexWrap = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-wrap: wrap-reverse</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexWrapReverse() {
return this._vFlexWrapReverse;
}
set vFlexWrapReverse(value) {
this._vFlexWrapReverse = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-wrap: no-wrap</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexNoWrap() {
return this._vFlexNoWrap;
}
set vFlexNoWrap(value) {
this._vFlexNoWrap = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-basis: <value></code>. <br>
* Accepts a string that should be in the form of a percentage or CSS unit. <br />
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexBasis() {
return this._vFlexBasis;
}
set vFlexBasis(value) {
this._vFlexBasis = value;
}
get hostFlexBasis() {
return this.vFlexBasis ? this.vFlexBasis : null;
}
/**
* Sets property <code>flex-grow: 1</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexGrow() {
return this._vFlexGrow;
}
set vFlexGrow(value) {
this._vFlexGrow = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-grow: 0</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexGrow0() {
return this._vFlexGrow0;
}
set vFlexGrow0(value) {
this._vFlexGrow0 = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-shrink: 1</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexShrink() {
return this._vFlexShrink;
}
set vFlexShrink(value) {
this._vFlexShrink = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-shrink: 0</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexShrink0() {
return this._vFlexShrink0;
}
set vFlexShrink0(value) {
this._vFlexShrink0 = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: center</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentCenter() {
return this._vAlignContentCenter;
}
set vAlignContentCenter(value) {
this._vAlignContentCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: start</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentStart() {
return this._vAlignContentStart;
}
set vAlignContentStart(value) {
this._vAlignContentStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: end</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentEnd() {
return this._vAlignContentEnd;
}
set vAlignContentEnd(value) {
this._vAlignContentEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: space-between</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentBetween() {
return this._vAlignContentBetween;
}
set vAlignContentBetween(value) {
this._vAlignContentBetween = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: space-around</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentAround() {
return this._vAlignContentAround;
}
set vAlignContentAround(value) {
this._vAlignContentAround = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: space-evenly</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentEvenly() {
return this._vAlignContentEvenly;
}
set vAlignContentEvenly(value) {
this._vAlignContentEvenly = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: center</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsCenter() {
return this._vAlignItemsCenter;
}
set vAlignItemsCenter(value) {
this._vAlignItemsCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: start</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsStart() {
return this._vAlignItemsStart;
}
set vAlignItemsStart(value) {
this._vAlignItemsStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: end</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsEnd() {
return this._vAlignItemsEnd;
}
set vAlignItemsEnd(value) {
this._vAlignItemsEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-items: baseline</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsBaseline() {
return this._vAlignItemsBaseline;
}
set vAlignItemsBaseline(value) {
this._vAlignItemsBaseline = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-items: stretch</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsStretch() {
return this._vAlignItemsStretch;
}
set vAlignItemsStretch(value) {
this._vAlignItemsStretch = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: center</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfCenter() {
return this._vAlignSelfCenter;
}
set vAlignSelfCenter(value) {
this._vAlignSelfCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: start</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfStart() {
return this._vAlignSelfStart;
}
set vAlignSelfStart(value) {
this._vAlignSelfStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: end</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfEnd() {
return this._vAlignSelfEnd;
}
set vAlignSelfEnd(value) {
this._vAlignSelfEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: baseline</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfBaseline() {
return this._vAlignSelfBaseline;
}
set vAlignSelfBaseline(value) {
this._vAlignSelfBaseline = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: stretch</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfStretch() {
return this._vAlignSelfStretch;
}
set vAlignSelfStretch(value) {
this._vAlignSelfStretch = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: auto</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfAuto() {
return this._vAlignSelfAuto;
}
set vAlignSelfAuto(value) {
this._vAlignSelfAuto = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: center</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentCenter() {
return this._vJustifyContentCenter;
}
set vJustifyContentCenter(value) {
this._vJustifyContentCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: start</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentStart() {
return this._vJustifyContentStart;
}
set vJustifyContentStart(value) {
this._vJustifyContentStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: end</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentEnd() {
return this._vJustifyContentEnd;
}
set vJustifyContentEnd(value) {
this._vJustifyContentEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: space-between</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentBetween() {
return this._vJustifyContentBetween;
}
set vJustifyContentBetween(value) {
this._vJustifyContentBetween = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: space-around</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentAround() {
return this._vJustifyContentAround;
}
set vJustifyContentAround(value) {
this._vJustifyContentAround = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: space-evenly</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentEvenly() {
return this._vJustifyContentEvenly;
}
set vJustifyContentEvenly(value) {
this._vJustifyContentEvenly = coerceBooleanProperty(value);
}
/**
* Sets property <code>gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties.
*/
get vGap() {
return this._vGap;
}
set vGap(value) {
this._vGap = value;
}
/**
* Sets property <code>column-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties.
*/
get vColGap() {
return this._vColGap;
}
set vColGap(value) {
this._vColGap = value;
}
/**
* Sets property <code>row-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties.
*/
get vRowGap() {
return this._vRowGap;
}
set vRowGap(value) {
this._vRowGap = value;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FlexDirective, isStandalone: true, selector: "[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0], \n [vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd], \n [vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],", inputs: { vFlex: "vFlex", vFlexInline: "vFlexInline", vFlexCol: "vFlexCol", vFlexColReverse: "vFlexColReverse", vFlexRow: "vFlexRow", vFlexRowReverse: "vFlexRowReverse", vFlexWrap: "vFlexWrap", vFlexWrapReverse: "vFlexWrapReverse", vFlexNoWrap: "vFlexNoWrap", vFlexBasis: "vFlexBasis", vFlexGrow: "vFlexGrow", vFlexGrow0: "vFlexGrow0", vFlexShrink: "vFlexShrink", vFlexShrink0: "vFlexShrink0", vAlignContentCenter: "vAlignContentCenter", vAlignContentStart: "vAlignContentStart", vAlignContentEnd: "vAlignContentEnd", vAlignContentBetween: "vAlignContentBetween", vAlignContentAround: "vAlignContentAround", vAlignContentEvenly: "vAlignContentEvenly", vAlignItemsCenter: "vAlignItemsCenter", vAlignItemsStart: "vAlignItemsStart", vAlignItemsEnd: "vAlignItemsEnd", vAlignItemsBaseline: "vAlignItemsBaseline", vAlignItemsStretch: "vAlignItemsStretch", vAlignSelfCenter: "vAlignSelfCenter", vAlignSelfStart: "vAlignSelfStart", vAlignSelfEnd: "vAlignSelfEnd", vAlignSelfBaseline: "vAlignSelfBaseline", vAlignSelfStretch: "vAlignSelfStretch", vAlignSelfAuto: "vAlignSelfAuto", vJustifyContentCenter: "vJustifyContentCenter", vJustifyContentStart: "vJustifyContentStart", vJustifyContentEnd: "vJustifyContentEnd", vJustifyContentBetween: "vJustifyContentBetween", vJustifyContentAround: "vJustifyContentAround", vJustifyContentEvenly: "vJustifyContentEvenly", vGap: "vGap", vColGap: "vColGap", vRowGap: "vRowGap" }, host: { properties: { "class": "this.hostClasses", "style.flex-basis": "this.hostFlexBasis" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: `[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0],
[vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd],
[vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],`
}]
}], propDecorators: { hostClasses: [{
type: HostBinding,
args: ['class']
}], vFlex: [{
type: Input
}], vFlexInline: [{
type: Input
}], vFlexCol: [{
type: Input
}], vFlexColReverse: [{
type: Input
}], vFlexRow: [{
type: Input
}], vFlexRowReverse: [{
type: Input
}], vFlexWrap: [{
type: Input
}], vFlexWrapReverse: [{
type: Input
}], vFlexNoWrap: [{
type: Input
}], vFlexBasis: [{
type: Input
}], hostFlexBasis: [{
type: HostBinding,
args: ['style.flex-basis']
}], vFlexGrow: [{
type: Input
}], vFlexGrow0: [{
type: Input
}], vFlexShrink: [{
type: Input
}], vFlexShrink0: [{
type: Input
}], vAlignContentCenter: [{
type: Input
}], vAlignContentStart: [{
type: Input
}], vAlignContentEnd: [{
type: Input
}], vAlignContentBetween: [{
type: Input
}], vAlignContentAround: [{
type: Input
}], vAlignContentEvenly: [{
type: Input
}], vAlignItemsCenter: [{
type: Input
}], vAlignItemsStart: [{
type: Input
}], vAlignItemsEnd: [{
type: Input
}], vAlignItemsBaseline: [{
type: Input
}], vAlignItemsStretch: [{
type: Input
}], vAlignSelfCenter: [{
type: Input
}], vAlignSelfStart: [{
type: Input
}], vAlignSelfEnd: [{
type: Input
}], vAlignSelfBaseline: [{
type: Input
}], vAlignSelfStretch: [{
type: Input
}], vAlignSelfAuto: [{
type: Input
}], vJustifyContentCenter: [{
type: Input
}], vJustifyContentStart: [{
type: Input
}], vJustifyContentEnd: [{
type: Input
}], vJustifyContentBetween: [{
type: Input
}], vJustifyContentAround: [{
type: Input
}], vJustifyContentEvenly: [{
type: Input
}], vGap: [{
type: Input
}], vColGap: [{
type: Input
}], vRowGap: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvZmxleC9mbGV4LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQUUscUJBQXFCLEVBQTZCLE1BQU0sdUJBQXVCLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVM5RCxNQUFNLE9BQU8sYUFBYTtJQUN4QixJQUNJLFdBQVc7UUFDYixPQUFPO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEQsSUFB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ZUYsVUFBVTtzQkFEYixLQUFLO2dCQVNGLGFBQWE7c0JBRGhCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQVUzQixTQUFTO3NCQURaLEtBQUs7Z0JBY0YsVUFBVTtzQkFEYixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFjRixZQUFZO3NCQURmLEtBQUs7Z0JBY0YsbUJBQW1CO3NCQUR0QixLQUFLO2dCQWNGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFjRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBY0Ysb0JBQW9CO3NCQUR2QixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFjRixjQUFjO3NCQURqQixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQWNGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBY0YsYUFBYTtzQkFEaEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBY0YscUJBQXFCO3NCQUR4QixLQUFLO2dCQWNGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0Ysc0JBQXNCO3NCQUR6QixLQUFLO2dCQWNGLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFjRixxQkFBcUI7c0JBRHhCLEtBQUs7Z0JBYUYsSUFBSTtzQkFEUCxLQUFLO2dCQWFGLE9BQU87c0JBRFYsS0FBSztnQkFhRixPQUFPO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBCb29sZWFuSW5wdXQsIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdEJpbmRpbmcsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTcGFjaW5nUHJvcGVydGllcyB9IGZyb20gJy4uL25vdmEtbGliLmNvbnN0YW50cyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogYFt2RmxleF0sIFt2RmxleElubGluZV0sIFt2R2FwXSwgW3ZGbGV4R3Jvd10sIFt2RmxleEdyb3cwXSwgXG4gIFt2RmxleFNocmlua10sIFt2RmxleFNocmluazBdLCBbdkZsZXhCYXNpc10sIFt2QWxpZ25TZWxmU3RhcnRdLCBbdkFsaWduU2VsZkVuZF0sIFxuICBbdkFsaWduU2VsZkNlbnRlcl0sIFt2QWxpZ25TZWxmU3RyZXRjaF0sIFt2QWxpZ25TZWxmQXV0b10sIFt2QWxpZ25TZWxmQmFzZWxpbmVdLGBcbn0pXG5leHBvcnQgY2xhc3MgRmxleERpcmVjdGl2ZSB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy52RmxleCA/ICh0aGlzLnZGbGV4Q29sID8gJ3YtZmxleCcgOiAndi1mbGV4IHYtZmxleC1yb3cnKSA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4SW5saW5lID8gJ3YtZmxleC1pbmxpbmUnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhDb2wgPyAndi1mbGV4LWNvbCcgOiBudWxsLFxuICAgICAgdGhpcy52RmxleENvbFJldmVyc2UgPyAndi1mbGV4LWNvbC1yZXZlcnNlJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Um93ID8gJ3YtZmxleC1yb3cnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhSb3dSZXZlcnNlID8gJ3YtZmxleC1yb3ctcmV2ZXJzZScgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFdyYXAgPyAndi1mbGV4LXdyYXAnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhXcmFwUmV2ZXJzZSA/ICd2LWZsZXgtd3JhcC1yZXZlcnNlJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Tm9XcmFwID8gJ3YtZmxleC1ub3dyYXAnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhHcm93ID8gJ3YtZmxleC1ncm93JyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4R3JvdzAgPyAndi1mbGV4LWdyb3ctMCcgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFNocmluayA/ICd2LWZsZXgtc2hyaW5rJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4U2hyaW5rMCA/ICd2LWZsZXgtc2hyaW5rLTAnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduQ29udGVudENlbnRlciA/ICd2LWFsaWduLWNvbnRlbnQtY2VudGVyJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRTdGFydCA/ICd2LWFsaWduLWNvbnRlbnQtc3RhcnQnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduQ29udGVudEVuZCA/ICd2LWFsaWduLWNvbnRlbnQtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRCZXR3ZWVuID8gJ3YtYWxpZ24tY29udGVudC1iZXR3ZWVuJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRBcm91bmQgPyAndi1hbGlnbi1jb250ZW50LWFyb3VuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50RXZlbmx5ID8gJ3YtYWxpZ24tY29udGVudC1ldmVubHknIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduSXRlbXNTdGFydCA/ICd2LWFsaWduLWl0ZW1zLXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zRW5kID8gJ3YtYWxpZ24taXRlbXMtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zQ2VudGVyID8gJ3YtYWxpZ24taXRlbXMtY2VudGVyJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zQmFzZWxpbmUgPyAndi1hbGlnbi1pdGVtcy1iYXNlbGluZScgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc1N0cmV0Y2ggPyAndi1hbGlnbi1pdGVtcy1zdHJldGNoJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZTdGFydCA/ICd2LWFsaWduLXNlbGYtc3RhcnQnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduU2VsZkVuZCA/ICd2LWFsaWduLXNlbGYtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZDZW50ZXIgPyAndi1hbGlnbi1zZWxmLWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmQmFzZWxpbmUgPyAndi1hbGlnbi1zZWxmLWJhc2VsaW5lJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZTdHJldGNoID8gJ3YtYWxpZ24tc2VsZi1zdHJldGNoJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZBdXRvID8gJ3YtYWxpZ24tc2VsZi1hdXRvJyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudFN0YXJ0ID8gJ3YtanVzdGlmeS1jb250ZW50LXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudEVuZCA/ICd2LWp1c3RpZnktY29udGVudC1lbmQnIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50Q2VudGVyID8gJ3YtanVzdGlmeS1jb250ZW50LWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRCZXR3ZWVuID8gJ3YtanVzdGlmeS1jb250ZW50LWJldHdlZW4nIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50QXJvdW5kID8gJ3YtanVzdGlmeS1jb250ZW50LWFyb3VuZCcgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRFdmVubHkgPyAndi1qdXN0aWZ5LWNvbnRlbnQtZXZlbmx5JyA6IG51bGwsXG4gICAgICB0aGlzLnZHYXAgPyBgdi1mbGV4IHYtZ2FwLSR7dGhpcy52R2FwfWAgOiBudWxsLCAvLyB2R2FwPVwiNFwiXG4gICAgICB0aGlzLnZDb2xHYXAgPyBgdi1jb2wtZ2FwLSR7dGhpcy52Q29sR2FwfWAgOiBudWxsLCAvLyB2R2FwPVwiNFwiXG4gICAgICB0aGlzLnZSb3dHYXAgPyBgdi1yb3ctZ2FwLSR7dGhpcy52Um93R2FwfWAgOiBudWxsIC8vIHZHYXA9XCI0XCJcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmRpc3BsYXk6IGZsZXg8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4O1xuICB9XG4gIHNldCB2RmxleCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXggPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5kaXNwbGF5OiBpbmxpbmUtZmxleDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiBhIGZsZXggZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleElubGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhJbmxpbmU7XG4gIH1cbiAgc2V0IHZGbGV4SW5saW5lKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleElubGluZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4SW5saW5lOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZGlyZWN0aW9uOiBjb2x1bW48L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhDb2woKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4Q29sO1xuICB9XG4gIHNldCB2RmxleENvbCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhDb2wgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleENvbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhDb2xSZXZlcnNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleENvbFJldmVyc2U7XG4gIH1cbiAgc2V0IHZGbGV4Q29sUmV2ZXJzZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhDb2xSZXZlcnNlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhDb2xSZXZlcnNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZGlyZWN0aW9uOiByb3c8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4Um93O1xuICB9XG4gIHNldCB2RmxleFJvdyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhSb3cgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFJvdzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhSb3dSZXZlcnNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFJvd1JldmVyc2U7XG4gIH1cbiAgc2V0IHZGbGV4Um93UmV2ZXJzZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhSb3dSZXZlcnNlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhSb3dSZXZlcnNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtd3JhcDogd3JhcDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBhbG9uZ3NpZGUgYSBGbGV4RGlyZWN0aXZlIHNlbGVjdG9yIChzZWUgc2VsZWN0b3JzIGFib3ZlKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleFdyYXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4V3JhcDtcbiAgfVxuICBzZXQgdkZsZXhXcmFwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleFdyYXAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFdyYXA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC13cmFwOiB3cmFwLXJldmVyc2U8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhXcmFwUmV2ZXJzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhXcmFwUmV2ZXJzZTtcbiAgfVxuICBzZXQgdkZsZXhXcmFwUmV2ZXJzZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhXcmFwUmV2ZXJzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4V3JhcFJldmVyc2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC13cmFwOiBuby13cmFwPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Tm9XcmFwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleE5vV3JhcDtcbiAgfVxuICBzZXQgdkZsZXhOb1dyYXAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Tm9XcmFwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhOb1dyYXA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1iYXNpczogJmx0O3ZhbHVlJmd0OzwvY29kZT4uIDxicj5cbiAgICogQWNjZXB0cyBhIHN0cmluZyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBhIHBlcmNlbnRhZ2Ugb3IgQ1NTIHVuaXQuIDxiciAvPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIHRoZSA8aT5jaGlsZDwvaT4gb2YgYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhCYXNpcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92RmxleEJhc2lzO1xuICB9XG4gIHNldCB2RmxleEJhc2lzKHZhbHVlKSB7XG4gICAgdGhpcy5fdkZsZXhCYXNpcyA9IHZhbHVlO1xuICB9XG4gIF92RmxleEJhc2lzOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnc3R5bGUuZmxleC1iYXNpcycpXG4gIGdldCBob3N0RmxleEJhc2lzKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnZGbGV4QmFzaXMgPyB0aGlzLnZGbGV4QmFzaXMgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1ncm93OiAxPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIHRoZSA8aT5jaGlsZDwvaT4gb2YgYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhHcm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleEdyb3c7XG4gIH1cbiAgc2V0IHZGbGV4R3Jvdyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhHcm93ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhHcm93OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZ3JvdzogMDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4R3JvdzAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4R3JvdzA7XG4gIH1cbiAgc2V0IHZGbGV4R3JvdzAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4R3JvdzAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleEdyb3cwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtc2hyaW5rOiAxPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIHRoZSA8aT5jaGlsZDwvaT4gb2YgYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhTaHJpbmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4U2hyaW5rO1xuICB9XG4gIHNldCB2RmxleFNocmluayh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhTaHJpbmsgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFNocmluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LXNocmluazogMDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4U2hyaW5rMCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhTaHJpbmswO1xuICB9XG4gIHNldCB2RmxleFNocmluazAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4U2hyaW5rMCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4U2hyaW5rMDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5hbGlnbi1jb250ZW50OiBjZW50ZXI8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkFsaWduQ29udGVudENlbnRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkFsaWduQ29udGVudENlbnRlcjtcbiAgfVxuICBzZXQgdkFsaWduQ29udGVudENlbnRlcih2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkFsaWduQ29udGVudENlbnRlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZBbGlnbkNvbnRlbnRDZW50ZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+YWxpZ24tY29udGVudDogc3RhcnQ8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkFsaWduQ29udGVudFN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92QWxpZ25Db250ZW50U3RhcnQ7XG4gIH1cbiAgc2V0IHZBbGlnbkNvbnRlbnRTdGFydCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkFsaWduQ29udGVudFN0YXJ0ID0gY29lcmNlQm9vbGVhbl