@fivethree/core
Version:
Fivethree Core Components
385 lines • 34.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/spinner/spinner.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { DomSanitizer } from '@angular/platform-browser';
import { AnimationBuilder, style, animate } from '@angular/animations';
import { takeUntil } from 'rxjs/operators';
import { Component, Input, Optional, Inject, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, ChangeDetectorRef, EventEmitter, Output, ViewChild, HostBinding } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { timer, interval } from 'rxjs';
/** @type {?} */
var BASE_SIZE = 100;
var FivSpinner = /** @class */ (function () {
function FivSpinner(_document, _elementRef, change, builder, sanitizer) {
this._document = _document;
this._elementRef = _elementRef;
this.change = change;
this.builder = builder;
this.sanitizer = sanitizer;
this._diameter = BASE_SIZE;
this._strokeWidth = 10;
this._value = 0;
this.fivProgress = new EventEmitter();
this.fivComplete = new EventEmitter();
this.mode = 'indeterminate';
this.circleRadius = 45;
this._color = 'var(--fiv-spin-color)';
}
Object.defineProperty(FivSpinner.prototype, "class", {
get: /**
* @return {?}
*/
function () {
return (this.mode +
' fiv-spinner fiv-progress-spinner fiv-progress-spinner-indeterminate-animation');
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FivSpinner.prototype.ngOnInit = /**
* @return {?}
*/
function () { };
Object.defineProperty(FivSpinner.prototype, "viewBox", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var viewBox = this.circleRadius * 2 + this.strokeWidth;
return "0 0 " + viewBox + " " + viewBox;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FivSpinner.prototype, "strokeCircumference", {
/** The stroke circumference of the svg circle. */
get: /**
* The stroke circumference of the svg circle.
* @return {?}
*/
function () {
return 2 * Math.PI * this.circleRadius;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FivSpinner.prototype, "strokeDashOffset", {
/** The dash offset of the svg circle. */
get: /**
* The dash offset of the svg circle.
* @return {?}
*/
function () {
if (this.mode === 'determinate') {
return (this.strokeCircumference * (100 - this._value)) / 100;
}
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FivSpinner.prototype, "circleStrokeWidth", {
/** Stroke width of the circle in percent. */
get: /**
* Stroke width of the circle in percent.
* @return {?}
*/
function () {
return (this.strokeWidth / this.diameter) * 100;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FivSpinner.prototype, "value", {
/** Value of the progress circle. */
get: /**
* Value of the progress circle.
* @return {?}
*/
function () {
return this.mode === 'determinate' ? this._value : 0;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._value = Math.max(0, Math.min(100, newValue));
},
enumerable: true,
configurable: true
});
Object.defineProperty(FivSpinner.prototype, "diameter", {
get: /**
* @return {?}
*/
function () {
return this._diameter;
},
set: /**
* @param {?} size
* @return {?}
*/
function (size) {
this._diameter = size;
if (!FivSpinner.diameters.has(this._diameter)) {
this._attachStyleNode();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(FivSpinner.prototype, "strokeWidth", {
/** Stroke width of the progress spinner. */
get: /**
* Stroke width of the progress spinner.
* @return {?}
*/
function () {
return this._strokeWidth || this.diameter / 10;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._strokeWidth = value;
},
enumerable: true,
configurable: true
});
/** Dynamically generates a style tag containing the correct animation for this diameter. */
/**
* Dynamically generates a style tag containing the correct animation for this diameter.
* @private
* @return {?}
*/
FivSpinner.prototype._attachStyleNode = /**
* Dynamically generates a style tag containing the correct animation for this diameter.
* @private
* @return {?}
*/
function () {
/** @type {?} */
var styleTag = FivSpinner.styleTag;
if (!styleTag) {
styleTag = this._document.createElement('style');
this._document.head.appendChild(styleTag);
FivSpinner.styleTag = styleTag;
}
if (styleTag && styleTag.sheet) {
((/** @type {?} */ (styleTag.sheet))).insertRule(this._getAnimationText(), 0);
}
FivSpinner.diameters.add(this.diameter);
};
/** Generates animation styles adjusted for the spinner's diameter. */
/**
* Generates animation styles adjusted for the spinner's diameter.
* @private
* @return {?}
*/
FivSpinner.prototype._getAnimationText = /**
* Generates animation styles adjusted for the spinner's diameter.
* @private
* @return {?}
*/
function () {
/** @type {?} */
var INDETERMINATE_ANIMATION_TEMPLATE = "\n @keyframes fiv-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n ";
return (INDETERMINATE_ANIMATION_TEMPLATE
// Animation should begin at 5% and end at 80%
.replace(/START_VALUE/g, "" + 0.95 * this.strokeCircumference)
.replace(/END_VALUE/g, "" + 0.2 * this.strokeCircumference)
.replace(/DIAMETER/g, "" + this.diameter));
};
/**
* @param {?} duration
* @return {?}
*/
FivSpinner.prototype.completeIn = /**
* @param {?} duration
* @return {?}
*/
function (duration) {
var _this = this;
this.mode = 'determinate';
this.change.detectChanges();
/** @type {?} */
var animation = this.builder.build([
style({
'stroke-dasharray': 180,
'stroke-dashoffset': 90,
transformOrigin: 'center',
stroke: 'var(--fiv-spin-color)'
}),
animate(duration + "ms ease-out", style({
'stroke-dasharray': 315,
'stroke-dashoffset': 0,
transformOrigin: 'center',
stroke: 'var(--fiv-spin-color)',
opacity: 0
}))
]);
/** @type {?} */
var player = animation.create(this.determinateCircle.nativeElement);
player.play();
player.onDone((/**
* @return {?}
*/
function () {
_this.fivComplete.emit(_this);
_this._value = 0;
}));
/** @type {?} */
var i = interval(duration / 100);
/** @type {?} */
var t = timer(duration + duration / 50);
/** @type {?} */
var progress = i.pipe(takeUntil(t));
progress.subscribe((/**
* @param {?} p
* @return {?}
*/
function (p) {
_this.fivProgress.emit(p);
}));
};
/**
* @param {?} progress
* @return {?}
*/
FivSpinner.prototype.setValue = /**
* @param {?} progress
* @return {?}
*/
function (progress) {
this.mode = 'determinate';
this._value = progress;
this.change.detectChanges();
};
/**
* @return {?}
*/
FivSpinner.prototype.spin = /**
* @return {?}
*/
function () {
this.mode = 'indeterminate';
this.change.detectChanges();
};
/**
* @return {?}
*/
FivSpinner.prototype.stop = /**
* @return {?}
*/
function () {
this._value = 0;
this.change.detectChanges();
};
/**
* @param {?} mode
* @return {?}
*/
FivSpinner.prototype.setMode = /**
* @param {?} mode
* @return {?}
*/
function (mode) {
this.mode = mode;
this.change.detectChanges();
};
FivSpinner.diameters = new Set([BASE_SIZE]);
FivSpinner.styleTag = null;
FivSpinner.decorators = [
{ type: Component, args: [{
selector: 'fiv-spinner',
template: "<svg [style.width.px]=\"diameter\" [style.height.px]=\"diameter\" [attr.viewBox]=\"viewBox\"\n preserveAspectRatio=\"xMidYMid meet\" focusable=\"false\" [ngSwitch]=\"mode == 'indeterminate'\">\n <circle [attr.stroke]=\"_color\" *ngSwitchCase=\"true\" cx=\"50%\" cy=\"50%\" [attr.r]=\"circleRadius\"\n [style.animation-name]=\"'fiv-progress-spinner-stroke-rotate-' + diameter\"\n [style.stroke-dashoffset.px]=\"strokeDashOffset\" [style.stroke-dasharray.px]=\"strokeCircumference\"\n [style.stroke-width.%]=\"circleStrokeWidth\"></circle>\n\n <circle [attr.stroke]=\"_color\" class=\"determinate-circle\" #determinateCircle *ngSwitchCase=\"false\" cx=\"50%\" cy=\"50%\"\n [attr.r]=\"circleRadius\" [style.stroke-dashoffset.px]=\"strokeDashOffset\"\n [style.stroke-dasharray.px]=\"strokeCircumference\" [style.stroke-width.%]=\"circleStrokeWidth\"></circle>\n</svg>",
// tslint:disable-next-line:use-host-property-decorator
host: {
'[style.width.px]': 'diameter',
'[style.height.px]': 'diameter'
},
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
styles: ["fiv-spinner{display:block;position:relative}fiv-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}fiv-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}fiv-spinner.fiv-progress-spinner-indeterminate-animation.determinate circle{transition-property:stroke;-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}fiv-spinner.fiv-progress-spinner-indeterminate-animation.indeterminate{-webkit-animation:2s linear infinite fiv-progress-spinner-linear-rotate;animation:2s linear infinite fiv-progress-spinner-linear-rotate}fiv-spinner.fiv-progress-spinner-indeterminate-animation.indeterminate circle{transition-property:stroke;-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes fiv-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes fiv-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@-webkit-keyframes fiv-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.6061718819px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677646px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677646px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677646px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677646px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes fiv-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.6061718819px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677646px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677646px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677646px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.6061718819px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677646px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677646px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.6061718819px;transform:rotateX(180deg) rotate(341.5deg)}}"]
}] }
];
/** @nocollapse */
FivSpinner.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: AnimationBuilder },
{ type: DomSanitizer }
]; };
FivSpinner.propDecorators = {
fivProgress: [{ type: Output }],
fivComplete: [{ type: Output }],
determinateCircle: [{ type: ViewChild, args: ['determinateCircle', { static: false },] }],
mode: [{ type: Input }],
circleRadius: [{ type: Input }],
class: [{ type: HostBinding, args: ['class',] }],
value: [{ type: Input }],
diameter: [{ type: Input }],
strokeWidth: [{ type: Input }]
};
return FivSpinner;
}());
export { FivSpinner };
if (false) {
/**
* @type {?}
* @private
*/
FivSpinner.diameters;
/**
* @type {?}
* @private
*/
FivSpinner.styleTag;
/**
* @type {?}
* @private
*/
FivSpinner.prototype._diameter;
/** @type {?} */
FivSpinner.prototype._strokeWidth;
/** @type {?} */
FivSpinner.prototype._value;
/** @type {?} */
FivSpinner.prototype.fivProgress;
/** @type {?} */
FivSpinner.prototype.fivComplete;
/** @type {?} */
FivSpinner.prototype.determinateCircle;
/** @type {?} */
FivSpinner.prototype.mode;
/** @type {?} */
FivSpinner.prototype.circleRadius;
/** @type {?} */
FivSpinner.prototype._color;
/**
* @type {?}
* @private
*/
FivSpinner.prototype._document;
/** @type {?} */
FivSpinner.prototype._elementRef;
/** @type {?} */
FivSpinner.prototype.change;
/**
* @type {?}
* @private
*/
FivSpinner.prototype.builder;
/** @type {?} */
FivSpinner.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZml2ZXRocmVlL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOztJQUNqQyxTQUFTLEdBQUcsR0FBRztBQUVyQjtJQWtDRSxvQkFDd0MsU0FBYyxFQUM3QyxXQUF1QixFQUN2QixNQUF5QixFQUN4QixPQUF5QixFQUMxQixTQUF1QjtRQUpRLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDeEIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXhCeEIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM5QixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFD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RVgsaUNBQW1EOztJQUNuRCxpQ0FBdUQ7O0lBQ3ZELHVDQUM4Qjs7SUFDOUIsMEJBQWlFOztJQUNqRSxrQ0FBMkI7O0lBQzNCLDRCQUFpQzs7Ozs7SUFVL0IsK0JBQW9EOztJQUNwRCxpQ0FBOEI7O0lBQzlCLDRCQUFnQzs7Ozs7SUFDaEMsNkJBQWlDOztJQUNqQywrQkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFuaW1hdGlvbkJ1aWxkZXIsIHN0eWxlLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBJbmplY3QsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEhvc3RCaW5kaW5nLFxuICBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0aW1lciwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmNvbnN0IEJBU0VfU0laRSA9IDEwMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZml2LXNwaW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3Bpbm5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwaW5uZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVzZS1ob3N0LXByb3BlcnR5LWRlY29yYXRvclxuICBob3N0OiB7XG4gICAgJ1tzdHlsZS53aWR0aC5weF0nOiAnZGlhbWV0ZXInLFxuICAgICdbc3R5bGUuaGVpZ2h0LnB4XSc6ICdkaWFtZXRlcidcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRml2U3Bpbm5lciBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgc3RhdGljIGRpYW1ldGVycyA9IG5ldyBTZXQ8bnVtYmVyPihbQkFTRV9TSVpFXSk7XG4gIHByaXZhdGUgc3RhdGljIHN0eWxlVGFnOiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2RpYW1ldGVyID0gQkFTRV9TSVpFO1xuICBfc3Ryb2tlV2lkdGggPSAxMDtcbiAgX3ZhbHVlID0gMDtcblxuICBAT3V0cHV0KCkgZml2UHJvZ3Jlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGZpdkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxGaXZTcGlubmVyPigpO1xuICBAVmlld0NoaWxkKCdkZXRlcm1pbmF0ZUNpcmNsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBkZXRlcm1pbmF0ZUNpcmNsZTogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgbW9kZTogJ2luZGV0ZXJtaW5hdGUnIHwgJ2RldGVybWluYXRlJyA9ICdpbmRldGVybWluYXRlJztcbiAgQElucHV0KCkgY2lyY2xlUmFkaXVzID0gNDU7XG4gIF9jb2xvciA9ICd2YXIoLS1maXYtc3Bpbi1jb2xvciknO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBnZXQgY2xhc3MoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubW9kZSArXG4gICAgICAnIGZpdi1zcGlubmVyIGZpdi1wcm9ncmVzcy1zcGlubmVyIGZpdi1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uJ1xuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55LFxuICAgIHB1YmxpYyBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgY2hhbmdlOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgcHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICkge31cblxuICBuZ09uSW5pdCgpIHt9XG5cbiAgZ2V0IHZpZXdCb3goKSB7XG4gICAgY29uc3Qgdmlld0JveCA9IHRoaXMuY2lyY2xlUmFkaXVzICogMiArIHRoaXMuc3Ryb2tlV2lkdGg7XG4gICAgcmV0dXJuIGAwIDAgJHt2aWV3Qm94fSAke3ZpZXdCb3h9YDtcbiAgfVxuXG4gIC8qKiBUaGUgc3Ryb2tlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIHN2ZyBjaXJjbGUuICovXG4gIGdldCBzdHJva2VDaXJjdW1mZXJlbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDIgKiBNYXRoLlBJICogdGhpcy5jaXJjbGVSYWRpdXM7XG4gIH1cblxuICAvKiogVGhlIGRhc2ggb2Zmc2V0IG9mIHRoZSBzdmcgY2lyY2xlLiAqL1xuICBnZXQgc3Ryb2tlRGFzaE9mZnNldCgpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGV0ZXJtaW5hdGUnKSB7XG4gICAgICByZXR1cm4gKHRoaXMuc3Ryb2tlQ2lyY3VtZmVyZW5jZSAqICgxMDAgLSB0aGlzLl92YWx1ZSkpIC8gMTAwO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFN0cm9rZSB3aWR0aCBvZiB0aGUgY2lyY2xlIGluIHBlcmNlbnQuICovXG4gIGdldCBjaXJjbGVTdHJva2VXaWR0aCgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3Ryb2tlV2lkdGggLyB0aGlzLmRpYW1ldGVyKSAqIDEwMDtcbiAgfVxuXG4gIC8qKiBWYWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgY2lyY2xlLiAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZGV0ZXJtaW5hdGUnID8gdGhpcy5fdmFsdWUgOiAwO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG5ld1ZhbHVlKSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgZGlhbWV0ZXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGlhbWV0ZXI7XG4gIH1cbiAgc2V0IGRpYW1ldGVyKHNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX2RpYW1ldGVyID0gc2l6ZTtcblxuICAgIGlmICghRml2U3Bpbm5lci5kaWFtZXRlcnMuaGFzKHRoaXMuX2RpYW1ldGVyKSkge1xuICAgICAgdGhpcy5fYXR0YWNoU3R5bGVOb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0cm9rZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lci4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHN0cm9rZVdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cm9rZVdpZHRoIHx8IHRoaXMuZGlhbWV0ZXIgLyAxMDtcbiAgfVxuICBzZXQgc3Ryb2tlV2lkdGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0cm9rZVdpZHRoID0gdmFsdWU7XG4gIH1cblxuICAvKiogRHluYW1pY2FsbHkgZ2VuZXJhdGVzIGEgc3R5bGUgdGFnIGNvbnRhaW5pbmcgdGhlIGNvcnJlY3QgYW5pbWF0aW9uIGZvciB0aGlzIGRpYW1ldGVyLiAqL1xuICBwcml2YXRlIF9hdHRhY2hTdHlsZU5vZGUoKTogdm9pZCB7XG4gICAgbGV0IHN0eWxlVGFnID0gRml2U3Bpbm5lci5zdHlsZVRhZztcblxuICAgIGlmICghc3R5bGVUYWcpIHtcbiAgICAgIHN0eWxlVGFnID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgRml2U3Bpbm5lci5zdHlsZVRhZyA9IHN0eWxlVGFnO1xuICAgIH1cblxuICAgIGlmIChzdHlsZVRhZyAmJiBzdHlsZVRhZy5zaGVldCkge1xuICAgICAgKHN0eWxlVGFnLnNoZWV0IGFzIENTU1N0eWxlU2hlZXQpLmluc2VydFJ1bGUodGhpcy5fZ2V0QW5pbWF0aW9uVGV4dCgpLCAwKTtcbiAgICB9XG5cbiAgICBGaXZTcGlubmVyLmRpYW1ldGVycy5hZGQodGhpcy5kaWFtZXRlcik7XG4gIH1cblxuICAvKiogR2VuZXJhdGVzIGFuaW1hdGlvbiBzdHlsZXMgYWRqdXN0ZWQgZm9yIHRoZSBzcGlubmVyJ3MgZGlhbWV0ZXIuICovXG4gIHByaXZhdGUgX2dldEFuaW1hdGlvblRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBJTkRFVEVSTUlOQVRFX0FOSU1BVElPTl9URU1QTEFURSA9IGBcbiAgICBAa2V5ZnJhbWVzIGZpdi1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtRElBTUVURVIge1xuICAgICAgIDAlICAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgICAgIDEyLjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgICAgIDEyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKTsgfVxuICAgICAgIDI1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH1cbiAgICAgICAyNS4wMDAxJSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfVxuICAgICAgIDM3LjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4gICAgICAgMzcuNTAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKTsgfVxuICAgICAgIDUwJSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9XG4gICAgICAgNTAuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxuICAgICAgIDYyLjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9XG4gICAgICAgNjIuNTAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKTsgfVxuICAgICAgIDc1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpOyB9XG4gICAgICAgNzUuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyB9XG4gICAgICAgODcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfVxuICAgICAgIDg3LjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyk7IH1cbiAgICAgICAxMDAlICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDM0MS41ZGVnKTsgfVxuICAgICB9XG4gICBgO1xuICAgIHJldHVybiAoXG4gICAgICBJTkRFVEVSTUlOQVRFX0FOSU1BVElPTl9URU1QTEFURVxuICAgICAgICAvLyBBbmltYXRpb24gc2hvdWxkIGJlZ2luIGF0IDUlIGFuZCBlbmQgYXQgODAlXG4gICAgICAgIC5yZXBsYWNlKC9TVEFSVF9WQUxVRS9nLCBgJHswLjk1ICogdGhpcy5zdHJva2VDaXJjdW1mZXJlbmNlfWApXG4gICAgICAgIC5yZXBsYWNlKC9FTkRfVkFMVUUvZywgYCR7MC4yICogdGhpcy5zdHJva2VDaXJjdW1mZXJlbmNlfWApXG4gICAgICAgIC5yZXBsYWNlKC9ESUFNRVRFUi9nLCBgJHt0aGlzLmRpYW1ldGVyfWApXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBsZXRlSW4oZHVyYXRpb246IG51bWJlcikge1xuICAgIHRoaXMubW9kZSA9ICdkZXRlcm1pbmF0ZSc7XG4gICAgdGhpcy5jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy5idWlsZGVyLmJ1aWxkKFtcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgJ3N0cm9rZS1kYXNoYXJyYXknOiAxODAsXG4gICAgICAgICdzdHJva2UtZGFzaG9mZnNldCc6IDkwLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICdjZW50ZXInLFxuICAgICAgICBzdHJva2U6ICd2YXIoLS1maXYtc3Bpbi1jb2xvciknXG4gICAgICB9KSxcbiAgICAgIGFuaW1hdGUoXG4gICAgICAgIGAke2R1cmF0aW9ufW1zIGVhc2Utb3V0YCxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICdzdHJva2UtZGFzaGFycmF5JzogMzE1LFxuICAgICAgICAgICdzdHJva2UtZGFzaG9mZnNldCc6IDAsXG4gICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnY2VudGVyJyxcbiAgICAgICAgICBzdHJva2U6ICd2YXIoLS1maXYtc3Bpbi1jb2xvciknLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKTtcblxuICAgIGNvbnN0IHBsYXllciA9IGFuaW1hdGlvbi5jcmVhdGUodGhpcy5kZXRlcm1pbmF0ZUNpcmNsZS5uYXRpdmVFbGVtZW50KTtcbiAgICBwbGF5ZXIucGxheSgpO1xuICAgIHBsYXllci5vbkRvbmUoKCkgPT4ge1xuICAgICAgdGhpcy5maXZDb21wbGV0ZS5lbWl0KHRoaXMpO1xuICAgICAgdGhpcy5fdmFsdWUgPSAwO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaSA9IGludGVydmFsKGR1cmF0aW9uIC8gMTAwKTtcbiAgICBjb25zdCB0ID0gdGltZXIoZHVyYXRpb24gKyBkdXJhdGlvbiAvIDUwKTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGkucGlwZSh0YWtlVW50aWwodCkpO1xuXG4gICAgcHJvZ3Jlc3Muc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgdGhpcy5maXZQcm9ncmVzcy5lbWl0KHApO1xuICAgIH0pO1xuICB9XG4gIHNldFZhbHVlKHByb2dyZXNzOiBudW1iZXIpOiBhbnkge1xuICAgIHRoaXMubW9kZSA9ICdkZXRlcm1pbmF0ZSc7XG4gICAgdGhpcy5fdmFsdWUgPSBwcm9ncmVzcztcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzcGluKCkge1xuICAgIHRoaXMubW9kZSA9ICdpbmRldGVybWluYXRlJztcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMuX3ZhbHVlID0gMDtcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzZXRNb2RlKG1vZGUpIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxufVxuIl19