UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

403 lines (402 loc) 31.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, EventEmitter, Output, Input } from '@angular/core'; import { AbstractDataView } from './AbstractDataView'; import { PhloxDataChartModel } from '.././model/models'; import { Option } from '../../decorator/decorators'; import { BEFORE_CHART_SELECT_EVENT, CHART_SELECT_EVENT, CHART_ERROR, CHART_READY } from '../../share/CustomEventType'; import { EventUtils } from '../../share/shares'; const /** @type {?} */ TYPE_NAME = "phxChart"; export class PhloxChart extends AbstractDataView { /** * @param {?} elementRef */ constructor(elementRef) { super(elementRef); this.chartReadyEvent = new EventEmitter(); // before event is not require this.chartErrorEvent = new EventEmitter(); // before event is not require this.beforeChartSelectEvent = new EventEmitter(); this.chartSelectEvent = new EventEmitter(); this.beforeChartMouseOverEvent = new EventEmitter(); this.chartMouseOverEvent = new EventEmitter(); this.beforeChartMouseOutEvent = new EventEmitter(); this.chartMouseOutEvent = new EventEmitter(); } /** * @return {?} */ ngOnInit() { super.ngOnInit(); if (this.chartType !== undefined && this.chartType !== null && this.dataTable !== undefined && this.dataTable !== null && this.cols !== undefined && this.cols !== null && this.rows !== undefined && this.rows !== null) { this.model = new PhloxDataChartModel(this.chartType, this.dataTable, this.formatters, this.options, this.title, this.subtitle, this.width, this.height, this.cols, this.rows); } } /** * @return {?} */ isSelfDataDirty() { return false; } /** * @param {?} data * @return {?} */ selfSaveData(data) { } /** * @return {?} */ selfResetData() { } /** * @return {?} */ doPreload() { return new Promise((resolve, reject) => { resolve(null); }); } /** * @return {?} */ doLoaded() { } /** * @param {?} dataTable * @return {?} */ reloadData(dataTable) { this.model.dataTable = dataTable; this.model = JSON.parse(JSON.stringify(this.model)); } /** * @param {?} event * @param {?=} fireEvent * @return {?} */ onChartSelectEvent(event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeChartSelectEvent', event, fireEvent, ($event) => { // doEvent }, ($event) => { // emitBeforeEvent this.emitBeforeChartSelectEvent($event); }, ($event, result) => { // emitAfterEvent this.emitChartSelectEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?} $event * @return {?} */ emitBeforeChartSelectEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CHART_SELECT_EVENT, this, data, $event); if (this.beforeChartSelectEvent !== null && this.beforeChartSelectEvent !== undefined) { this.beforeChartSelectEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitChartSelectEvent($event) { let /** @type {?} */ eventData = $event; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_SELECT_EVENT, this, data, $event); if (this.chartSelectEvent !== null && this.chartSelectEvent !== undefined) { this.chartSelectEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitChartReadyEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_READY, this, data, event); if (this.chartReadyEvent !== null && this.chartReadyEvent !== undefined) { this.chartReadyEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitChartErrorEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_ERROR, this, data, event); if (this.chartErrorEvent !== null && this.chartErrorEvent !== undefined) { this.chartErrorEvent.emit(ev); } } /** * @param {?} event * @param {?=} fireEvent * @return {?} */ onChartReadyEvent(event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } this.emitChartReadyEvent(event); } /** * @param {?} event * @param {?=} fireEvent * @return {?} */ onChartErrorEvent(event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } this.emitChartErrorEvent(event); } /** * @return {?} */ getchartReadyEvent() { return this.chartReadyEvent; } /** * @return {?} */ getchartErrorEvent() { return this.chartErrorEvent; } /** * @return {?} */ getchartSelectEvent() { return this.chartSelectEvent; } /** * @return {?} */ getchartMouseOverEvent() { return this.chartMouseOverEvent; } /** * @return {?} */ getchartMouseOutEvent() { return this.chartMouseOutEvent; } /** * @param {?} options * @return {?} */ setOptions(options) { this.model.options = options; this.reloadData(this.model.dataTable); } /** * @param {?} chartType * @return {?} */ setChartType(chartType) { this.model.chartType = chartType; this.reloadData(this.model.dataTable); } /** * @param {?} title * @return {?} */ setTitle(title) { this.model.title = title; this.reloadData(this.model.dataTable); } /** * @param {?} subtitle * @return {?} */ setSubtitle(subtitle) { this.model.subtitle = subtitle; this.reloadData(this.model.dataTable); } /** * @return {?} */ getModel() { return this.model; } /** * @param {?} model * @return {?} */ setModel(model) { this.model = model; } } PhloxChart.TYPE_NAME = TYPE_NAME; PhloxChart.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phxChart"> <google-chart [data]="getModel()" (chartReady)="onChartReadyEvent($event)" (chartError)="onChartErrorEvent($event)" (chartSelect)="onChartSelectEvent($event)"></google-chart> </div> ` },] }, ]; /** @nocollapse */ PhloxChart.ctorParameters = () => [ { type: ElementRef, }, ]; PhloxChart.propDecorators = { "chartReadyEvent": [{ type: Output, args: ['phxChartReady',] },], "chartErrorEvent": [{ type: Output, args: ['phxChartError',] },], "beforeChartSelectEvent": [{ type: Output, args: ['phxBeforeChartSelect',] },], "chartSelectEvent": [{ type: Output, args: ['phxChartSelect',] },], "beforeChartMouseOverEvent": [{ type: Output, args: ['phxBeforeChartMouseOver',] },], "chartMouseOverEvent": [{ type: Output, args: ['phxChartMouseOver',] },], "beforeChartMouseOutEvent": [{ type: Output, args: ['phxBeforeChartMouseOut',] },], "chartMouseOutEvent": [{ type: Output, args: ['phxChartMouseOut',] },], "dataTable": [{ type: Input },], "chartType": [{ type: Input },], "formatters": [{ type: Input },], "title": [{ type: Input },], "subtitle": [{ type: Input },], "options": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "cols": [{ type: Input },], "rows": [{ type: Input },], }; tslib_1.__decorate([ Option('chartReady'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartReadyEvent", void 0); tslib_1.__decorate([ Option('chartError'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartErrorEvent", void 0); tslib_1.__decorate([ Option('beforeChartSelect'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "beforeChartSelectEvent", void 0); tslib_1.__decorate([ Option('chartSelect'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartSelectEvent", void 0); tslib_1.__decorate([ Option('beforeChartMouseOver'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "beforeChartMouseOverEvent", void 0); tslib_1.__decorate([ Option('chartMouseOver'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartMouseOverEvent", void 0); tslib_1.__decorate([ Option('beforeChartMouseOut'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "beforeChartMouseOutEvent", void 0); tslib_1.__decorate([ Option('chartMouseOut'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartMouseOutEvent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "dataTable", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "chartType", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "formatters", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "title", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "subtitle", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], PhloxChart.prototype, "options", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "height", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "cols", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "rows", void 0); function PhloxChart_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ PhloxChart.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ PhloxChart.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ PhloxChart.propDecorators; /** @type {?} */ PhloxChart.TYPE_NAME; /** @type {?} */ PhloxChart.prototype.chartReadyEvent; /** @type {?} */ PhloxChart.prototype.chartErrorEvent; /** @type {?} */ PhloxChart.prototype.beforeChartSelectEvent; /** @type {?} */ PhloxChart.prototype.chartSelectEvent; /** @type {?} */ PhloxChart.prototype.beforeChartMouseOverEvent; /** @type {?} */ PhloxChart.prototype.chartMouseOverEvent; /** @type {?} */ PhloxChart.prototype.beforeChartMouseOutEvent; /** @type {?} */ PhloxChart.prototype.chartMouseOutEvent; /** @type {?} */ PhloxChart.prototype.dataTable; /** @type {?} */ PhloxChart.prototype.chartType; /** @type {?} */ PhloxChart.prototype.formatters; /** @type {?} */ PhloxChart.prototype.title; /** @type {?} */ PhloxChart.prototype.subtitle; /** @type {?} */ PhloxChart.prototype.options; /** @type {?} */ PhloxChart.prototype.width; /** @type {?} */ PhloxChart.prototype.height; /** @type {?} */ PhloxChart.prototype.cols; /** @type {?} */ PhloxChart.prototype.rows; /** @type {?} */ PhloxChart.prototype.model; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhsb3hDaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvUGhsb3hDaGFydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFhLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEQsT0FBTyxFQUE4Ryx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbE8sT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELHVCQUFNLFNBQVMsR0FBVyxVQUFVLENBQUM7QUFVckMsTUFBTSxpQkFBa0IsU0FBUSxnQkFBZ0I7Ozs7SUFnRTlDLFlBQVksVUFBc0I7UUFDaEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7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R0wsS0FBSztzQkFHTCxLQUFLO3VCQUdMLEtBQUs7cUJBR0wsS0FBSztxQkFHTCxLQUFLOzs7SUFwREwsTUFBTSxDQUFDLFlBQVksQ0FBQztzQ0FFTSxZQUFZOzs7SUFDdEMsTUFBTSxDQUFDLFlBQVksQ0FBQztzQ0FFTSxZQUFZOzs7SUFDdEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO3NDQUVNLFlBQVk7OztJQUM3QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUVNLFlBQVk7OztJQUN2QyxNQUFNLENBQUMsc0JBQXNCLENBQUM7c0NBRU0sWUFBWTs7O0lBQ2hELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztzQ0FFTSxZQUFZOzs7SUFDMUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO3NDQUVNLFlBQVk7OztJQUMvQyxNQUFNLENBQUMsZUFBZSxDQUFDO3NDQUVNLFlBQVk7OztJQUd6QyxNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3REYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3REYXRhVmlldyc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XHJcbmltcG9ydCB7IFBobG94RGF0YUNoYXJ0TW9kZWwgfSBmcm9tICcuLi8uL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgR29vZ2xlQ2hhcnRDb21wb25lbnQgfSBmcm9tICduZzItZ29vZ2xlLWNoYXJ0cyc7XHJcbmltcG9ydCB7IEJFRk9SRV9DSEFSVF9NT1VTRV9PVkVSX0VWRU5ULCBDSEFSVF9NT1VTRV9PVkVSX0VWRU5ULCBCRUZPUkVfQ0hBUlRfTU9VU0VfT1VUX0VWRU5ULCBDSEFSVF9NT1VTRV9PVVRfRVZFTlQsIEJFRk9SRV9DSEFSVF9TRUxFQ1RfRVZFTlQsIENIQVJUX1NFTEVDVF9FVkVOVCwgQ0hBUlRfRVJST1IsIENIQVJUX1JFQURZIH0gZnJvbSAnLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3NoYXJlcyc7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4Q2hhcnRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHhDaGFydFwiPlxyXG4gICAgPGdvb2dsZS1jaGFydCBbZGF0YV09XCJnZXRNb2RlbCgpXCIgKGNoYXJ0UmVhZHkpPVwib25DaGFydFJlYWR5RXZlbnQoJGV2ZW50KVwiIChjaGFydEVycm9yKT1cIm9uQ2hhcnRFcnJvckV2ZW50KCRldmVudClcIiAoY2hhcnRTZWxlY3QpPVwib25DaGFydFNlbGVjdEV2ZW50KCRldmVudClcIj48L2dvb2dsZS1jaGFydD5cclxuPC9kaXY+IGBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBQaGxveENoYXJ0IGV4dGVuZHMgQWJzdHJhY3REYXRhVmlldyBpbXBsZW1lbnRzIElIYXNNb2RlbCwgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgQE9wdGlvbignY2hhcnRSZWFkeScpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRSZWFkeScpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0UmVhZHlFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRFcnJvcicpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRFcnJvcicpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0RXJyb3JFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRTZWxlY3QnKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYXJ0U2VsZWN0JylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhcnRTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRTZWxlY3QnKVxyXG4gIEBPdXRwdXQoJ3BoeENoYXJ0U2VsZWN0JylcclxuICBwcm90ZWN0ZWQgY2hhcnRTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRNb3VzZU92ZXInKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYXJ0TW91c2VPdmVyJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhcnRNb3VzZU92ZXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRNb3VzZU92ZXInKVxyXG4gIEBPdXRwdXQoJ3BoeENoYXJ0TW91c2VPdmVyJylcclxuICBwcm90ZWN0ZWQgY2hhcnRNb3VzZU92ZXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRNb3VzZU91dCcpXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhcnRNb3VzZU91dCcpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYXJ0TW91c2VPdXRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRNb3VzZU91dCcpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRNb3VzZU91dCcpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0TW91c2VPdXRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFUYWJsZTogYW55W107XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgY2hhcnRUeXBlOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyczogYW55W107XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdGl0bGUgOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgc3VidGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBjb2xzOiBhbnlbXTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByb3dzOiBhbnlbXTtcclxuXHJcbiAgLy8gICBwcm90ZWN0ZWQgY2hhcnRXcmFwcGVyOiBDaGFydFdyYXBwZXI7XHJcbiAgcHJvdGVjdGVkIG1vZGVsOiBQaGxveERhdGFDaGFydE1vZGVsO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZik7XHJcblxyXG4gICAgdGhpcy5jaGFydFJlYWR5RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGJlZm9yZSBldmVudCBpcyBub3QgcmVxdWlyZVxyXG4gICAgdGhpcy5jaGFydEVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGJlZm9yZSBldmVudCBpcyBub3QgcmVxdWlyZVxyXG4gICAgdGhpcy5iZWZvcmVDaGFydFNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFydFNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVDaGFydE1vdXNlT3ZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFydE1vdXNlT3ZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVDaGFydE1vdXNlT3V0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmNoYXJ0TW91c2VPdXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIGlmKHRoaXMuY2hhcnRUeXBlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jaGFydFR5cGUgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5kYXRhVGFibGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGFUYWJsZSAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmNvbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbHMgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5yb3dzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3dzICE9PSBudWxsICApIHtcclxuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IFBobG94RGF0YUNoYXJ0TW9kZWwoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZSxcclxuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLFxyXG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZXJzLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLFxyXG4gICAgICAgICAgdGhpcy50aXRsZSxcclxuICAgICAgICAgIHRoaXMuc3VidGl0bGUsXHJcbiAgICAgICAgICB0aGlzLndpZHRoLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQsXHJcbiAgICAgICAgICB0aGlzLmNvbHMsXHJcbiAgICAgICAgICB0aGlzLnJvd3NcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxmRGF0YURpcnR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG9QcmVsb2FkKCk6IFByb21pc2U8YW55PiB7ICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAgICAgICByZXNvbHZlKG51bGwpOyAgICAgfSk7ICAgfSAgcHVibGljIGRvTG9hZGVkKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWREYXRhKGRhdGFUYWJsZTogYW55W10pOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwuZGF0YVRhYmxlID0gZGF0YVRhYmxlO1xyXG4gICAgdGhpcy5tb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRTZWxlY3RFdmVudChldmVudDogYW55LCBmaXJlRXZlbnQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNoYXJ0U2VsZWN0RXZlbnQnLCBldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2hhcnRTZWxlY3RFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdENoYXJ0U2VsZWN0RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2hhcnRTZWxlY3RFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsXHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NIQVJUX1NFTEVDVF9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVDaGFydFNlbGVjdEV2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlQ2hhcnRTZWxlY3RFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuYmVmb3JlQ2hhcnRTZWxlY3RFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhcnRTZWxlY3RFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSAkZXZlbnRcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFSVF9TRUxFQ1RfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRTZWxlY3RFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQuZW1pdChldik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdENoYXJ0UmVhZHlFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsXHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQ0hBUlRfUkVBRFksIHRoaXMsIGRhdGEsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydFJlYWR5RXZlbnQgIT09IG51bGwgJiYgdGhpcy5jaGFydFJlYWR5RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0UmVhZHlFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhcnRFcnJvckV2ZW50KCRldmVudDogRXZlbnQpIHtcclxuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGxcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFSVF9FUlJPUiwgdGhpcywgZGF0YSwgZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0RXJyb3JFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNoYXJ0RXJyb3JFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRFcnJvckV2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRSZWFkeUV2ZW50KGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFydFJlYWR5RXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRFcnJvckV2ZW50KGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFydEVycm9yRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldGNoYXJ0UmVhZHlFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydFJlYWR5RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Y2hhcnRFcnJvckV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0RXJyb3JFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRjaGFydFNlbGVjdEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Y2hhcnRNb3VzZU92ZXJFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydE1vdXNlT3ZlckV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldGNoYXJ0TW91c2VPdXRFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydE1vdXNlT3V0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5tb2RlbC5kYXRhVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENoYXJ0VHlwZShjaGFydFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5jaGFydFR5cGUgPSBjaGFydFR5cGU7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5tb2RlbC5kYXRhVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMucmVsb2FkRGF0YSh0aGlzLm1vZGVsLmRhdGFUYWJsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U3VidGl0bGUoc3VidGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5zdWJ0aXRsZSA9IHN1YnRpdGxlO1xyXG4gICAgdGhpcy5yZWxvYWREYXRhKHRoaXMubW9kZWwuZGF0YVRhYmxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBQaGxveERhdGFDaGFydE1vZGVsIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBQaGxveERhdGFDaGFydE1vZGVsKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XHJcbiAgfVxyXG59XHJcbiJdfQ==