com.phloxui
Version:
PhloxUI Ng2+ Framework
379 lines (378 loc) • 30.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { DialogService } from '../../service/DialogService.service';
import { PhloxAppInfo } from '../model/PhloxAppInfo';
import { AbstractComponentDataLangSelector } from './AbstractComponentDataLangSelector';
import { Option } from '../../decorator/Option.decorator';
import { I18N } from '../../decorator/I18N.decorator';
import { ComponentDataLangSelectorModel } from '../model/ComponentDataLangSelectorModel';
import { LanguageButtonModel } from '../model/LanguageButtonModel';
var /** @type {?} */ TYPE_NAME = "phx-component-lang-selector";
var ComponentDataLangSelector = /** @class */ (function (_super) {
tslib_1.__extends(ComponentDataLangSelector, _super);
function ComponentDataLangSelector(elementRef, dialogService) {
var _this = _super.call(this, elementRef, dialogService) || this;
_this.LANGUAGE_FIELD_NAME = PhloxAppInfo.DEFAULT_LANGUAGE_FIELD_NAME;
_this.OBJECT_ID_FIELD_NAME = PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME;
return _this;
}
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.ngOnInit = /**
* @return {?}
*/
function () {
// We've to resolve controller from model before calling super.ngOnInit().
if (this.model !== null && typeof this.model !== 'undefined') {
// Only controller is null or undefined in which that we'll use value from model.
if ((this.controller === null || typeof this.controller === 'undefined')) {
this.controller = this.model.controller;
}
}
_super.prototype.ngOnInit.call(this);
};
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.hasModel = /**
* @return {?}
*/
function () {
if (this.model !== null && typeof this.model !== 'undefined') {
return true;
}
return false;
};
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.getModel = /**
* @return {?}
*/
function () {
return this.model;
};
/**
* @param {?} model
* @return {?}
*/
ComponentDataLangSelector.prototype.setModel = /**
* @param {?} model
* @return {?}
*/
function (model) {
this.model = model;
if (this.model !== null && typeof this.model !== 'undefined') {
// replace controller
this.controller = this.model.controller;
}
};
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.getLanguageFieldName = /**
* @return {?}
*/
function () {
return this.LANGUAGE_FIELD_NAME;
};
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.getObjectIdFieldName = /**
* @return {?}
*/
function () {
return this.OBJECT_ID_FIELD_NAME;
};
/**
* @param {?} data
* @return {?}
*/
ComponentDataLangSelector.prototype.getInstanceDefaultData = /**
* @param {?} data
* @return {?}
*/
function (data) {
return data;
};
/**
* @param {?} data
* @return {?}
*/
ComponentDataLangSelector.prototype.getInstanceDataLanguage = /**
* @param {?} data
* @return {?}
*/
function (data) {
return data;
};
/**
* @param {?} data
* @return {?}
*/
ComponentDataLangSelector.prototype.isDataLanguageDirty = /**
* @param {?} data
* @return {?}
*/
function (data) {
return false;
};
/**
* @param {?} langCode
* @return {?}
*/
ComponentDataLangSelector.prototype.parseLanguageButtonModel = /**
* @param {?} langCode
* @return {?}
*/
function (langCode) {
var /** @type {?} */ upperCaseLang = (langCode !== null && typeof langCode !== 'undefined') ? langCode.toUpperCase() : 'N/A';
return new LanguageButtonModel('', langCode, upperCaseLang);
};
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.getWidth = /**
* @return {?}
*/
function () {
return this.width;
};
/**
* @param {?} width
* @return {?}
*/
ComponentDataLangSelector.prototype.setWidth = /**
* @param {?} width
* @return {?}
*/
function (width) {
this.width = width;
};
/**
* @return {?}
*/
ComponentDataLangSelector.prototype.getHeight = /**
* @return {?}
*/
function () {
return this.height;
};
/**
* @param {?} height
* @return {?}
*/
ComponentDataLangSelector.prototype.setHeight = /**
* @param {?} height
* @return {?}
*/
function (height) {
this.height = height;
};
ComponentDataLangSelector.TYPE_NAME = TYPE_NAME;
ComponentDataLangSelector.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: 'phx-component-lang-selector',
template: "<div class=\"phx-component-lang-selector disabled-overlay\" [style.width]=\"getWidth()\" [style.height]=\"getHeight()\">\n\t<div class=\"wrapper left\" [class.expand]=\"!hasLanguage()\">\n\t\t<div class=\"component-pane\">\n\t\t\t<!-- default -->\n\t\t\t<div class=\"component-wrapper\" [class.show]=\"_isSelectedLanguageByIndex(null)\">\n\t\t\t\t<phx-component-wrapper *ngIf=\"hasModel()\" [type]=\"getModel().componentType\" [model]=\"getModel().componentModel\"\n\t\t\t\t\t[handler]=\"getDefaultComponentHandler()\" [data]=\"getDefaultData()\" [dataParent]=\"this\"\n\t\t\t\t\t[options]=\"getModel().componentOptions\"></phx-component-wrapper>\n\t\t\t</div>\n\t\t\t<!-- by lang -->\n\t\t\t<ng-template ngFor let-item [ngForOf]=\"_getDataLangList()\" let-i=\"index\">\n\t\t\t\t<div class=\"component-wrapper\" [class.show]=\"_isSelectedLanguageByIndex(i)\">\n\t\t\t\t\t<phx-component-wrapper *ngIf=\"hasModel()\" [type]=\"getModel().componentType\" [model]=\"getModel().componentModel\"\n\t\t\t\t\t\t[handler]=\"getComponentHandler()\" [setting]=\"getComponentSetting(i)\" [data]=\"item\" [dataParent]=\"this\"\n\t\t\t\t\t\t[options]=\"getModel().componentOptions\"></phx-component-wrapper>\n\t\t\t\t</div>\n\t\t\t</ng-template>\n\t\t</div>\n\t</div>\n\t<div class=\"wrapper right\" [class.hide]=\"!hasLanguage()\">\n\t\t<div class=\"lang-pane\">\n\t\t\t<div class=\"language-btn default data\" [class.selected]=\"isSelectedLanguage(null)\" [class.dirty]=\"_isDataDirtyByIndex(null)\"\n\t\t\t\t(click)=\"onActionBtnClicked($event, null, null)\">\n\t\t\t\t<div class=\"table-wrapper fluid\">\n\t\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t\tDefault\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div *ngFor=\"let item of getMergedLanguageList(); let i = index\" class=\"language-btn\" [class.data]=\"_langHasDataByIndex(i)\"\n\t\t\t\t[class.dirty]=\"_isDataDirtyByIndex(i)\"\n\t\t\t\t[class.selected]=\"isSelectedLanguage(item)\" (click)=\"onActionBtnClicked($event, item, i)\">\n\t\t\t\t<div class=\"table-wrapper fluid\">\n\t\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t\t<div *ngIf=\"!_hasButtonIcon(item)\">{{item.label}}</div>\n\t\t\t\t\t\t<div *ngIf=\"_hasButtonIcon(item)\">\n\t\t\t\t\t\t\t<img src=\"{{item.iconURL}}\">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"mocking-btn\"></div>\n\t\t</div>\n\t</div>\n</div>\n"
},] },
];
/** @nocollapse */
ComponentDataLangSelector.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: DialogService, },
]; };
ComponentDataLangSelector.propDecorators = {
"model": [{ type: Input },],
"controller": [{ type: Input },],
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"help": [{ type: Input },],
"width": [{ type: Input },],
"height": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"langClickEvent": [{ type: Output, args: ['phxLangClick',] },],
"langAddEvent": [{ type: Output, args: ['phxLangAdd',] },],
"langRemoveEvent": [{ type: Output, args: ['phxLangRemove',] },],
"beforeLangClickEvent": [{ type: Output, args: ['phxBeforeLangClick',] },],
"beforeLangAddEvent": [{ type: Output, args: ['phxBeforeLangAdd',] },],
"beforeLangRemoveEvent": [{ type: Output, args: ['phxBeforeLangRemove',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", ComponentDataLangSelectorModel)
], ComponentDataLangSelector.prototype, "model", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ComponentDataLangSelector.prototype, "controller", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ComponentDataLangSelector.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ComponentDataLangSelector.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ComponentDataLangSelector.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ComponentDataLangSelector.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ComponentDataLangSelector.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ComponentDataLangSelector.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ComponentDataLangSelector.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ComponentDataLangSelector.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ComponentDataLangSelector.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ComponentDataLangSelector.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ComponentDataLangSelector.prototype, "disabled", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ComponentDataLangSelector.prototype, "help", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ComponentDataLangSelector.prototype, "width", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ComponentDataLangSelector.prototype, "height", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('langClick'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "langClickEvent", void 0);
tslib_1.__decorate([
Option('langAdd'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "langAddEvent", void 0);
tslib_1.__decorate([
Option('langRemove'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "langRemoveEvent", void 0);
tslib_1.__decorate([
Option('beforeLangClick'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "beforeLangClickEvent", void 0);
tslib_1.__decorate([
Option('beforeLangAdd'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "beforeLangAddEvent", void 0);
tslib_1.__decorate([
Option('beforeLangRemove'),
tslib_1.__metadata("design:type", EventEmitter)
], ComponentDataLangSelector.prototype, "beforeLangRemoveEvent", void 0);
return ComponentDataLangSelector;
}(AbstractComponentDataLangSelector));
export { ComponentDataLangSelector };
function ComponentDataLangSelector_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ComponentDataLangSelector.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ComponentDataLangSelector.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ComponentDataLangSelector.propDecorators;
/** @type {?} */
ComponentDataLangSelector.TYPE_NAME;
/** @type {?} */
ComponentDataLangSelector.prototype.LANGUAGE_FIELD_NAME;
/** @type {?} */
ComponentDataLangSelector.prototype.OBJECT_ID_FIELD_NAME;
/** @type {?} */
ComponentDataLangSelector.prototype.model;
/** @type {?} */
ComponentDataLangSelector.prototype.controller;
/** @type {?} */
ComponentDataLangSelector.prototype.dataParent;
/** @type {?} */
ComponentDataLangSelector.prototype.ignoreParentData;
/** @type {?} */
ComponentDataLangSelector.prototype.data;
/** @type {?} */
ComponentDataLangSelector.prototype.ignoreParentDisabled;
/** @type {?} */
ComponentDataLangSelector.prototype.delegateHistory;
/** @type {?} */
ComponentDataLangSelector.prototype.onDisabled;
/** @type {?} */
ComponentDataLangSelector.prototype.onEnabled;
/** @type {?} */
ComponentDataLangSelector.prototype.loadingEnabled;
/** @type {?} */
ComponentDataLangSelector.prototype.i18nKey;
/** @type {?} */
ComponentDataLangSelector.prototype.bypass;
/** @type {?} */
ComponentDataLangSelector.prototype.options;
/** @type {?} */
ComponentDataLangSelector.prototype.disabled;
/** @type {?} */
ComponentDataLangSelector.prototype.help;
/** @type {?} */
ComponentDataLangSelector.prototype.width;
/** @type {?} */
ComponentDataLangSelector.prototype.height;
/** @type {?} */
ComponentDataLangSelector.prototype.loadEvent;
/** @type {?} */
ComponentDataLangSelector.prototype.langClickEvent;
/** @type {?} */
ComponentDataLangSelector.prototype.langAddEvent;
/** @type {?} */
ComponentDataLangSelector.prototype.langRemoveEvent;
/** @type {?} */
ComponentDataLangSelector.prototype.beforeLangClickEvent;
/** @type {?} */
ComponentDataLangSelector.prototype.beforeLangAddEvent;
/** @type {?} */
ComponentDataLangSelector.prototype.beforeLangRemoveEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50RGF0YUxhbmdTZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvQ29tcG9uZW50RGF0YUxhbmdTZWxlY3Rvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUEyQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUd4RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXRELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSW5FLHFCQUFNLFNBQVMsR0FBVyw2QkFBNkIsQ0FBQzs7SUFvRFQscURBQWlDO0lBd0Y5RSxtQ0FBWSxVQUFzQixFQUFFLGFBQTRCO1FBQWhFLFlBQ0Usa0JBQU0sVUFBVSxFQUFFLGFBQWEsQ0FBQyxTQUNqQztvQ0F0RnFDLFlBQVksQ0FBQywyQkFBMkI7cUNBQ3ZDLFlBQVksQ0FBQyw0QkFBNEI7O0tBcUYvRTs7OztJQUVNLDRDQUFROzs7OztRQUViLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDOztZQUU3RCxFQUFFLENBQUMsQ0FBQyxD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TSxTQUFDLGVBQWU7eUNBR3RCLE1BQU0sU0FBQyxvQkFBb0I7dUNBRzNCLE1BQU0sU0FBQyxrQkFBa0I7MENBR3pCLE1BQU0sU0FBQyxxQkFBcUI7OztRQTFFNUIsTUFBTSxFQUFFOzBDQUNRLDhCQUE4Qjs7O1FBRTlDLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTswQ0FDYSxRQUFROzs7UUFFN0IsTUFBTSxFQUFFOzBDQUNZLFFBQVE7OztRQUU1QixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLENBQUMsWUFBWSxDQUFDOzs7O1FBS3BCLE1BQU0sRUFBRTs7OztRQUlSLElBQUksRUFBRTtRQUNOLE1BQU0sRUFBRTs7OztRQUlSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQU1SLE1BQU0sQ0FBQyxNQUFNLENBQUM7MENBQ00sWUFBWTs7O1FBR2hDLE1BQU0sQ0FBQyxXQUFXLENBQUM7MENBQ00sWUFBWTs7O1FBRXJDLE1BQU0sQ0FBQyxTQUFTLENBQUM7MENBQ00sWUFBWTs7O1FBRW5DLE1BQU0sQ0FBQyxZQUFZLENBQUM7MENBQ00sWUFBWTs7O1FBRXRDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFM0MsTUFBTSxDQUFDLGVBQWUsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFekMsTUFBTSxDQUFDLGtCQUFrQixDQUFDOzBDQUNNLFlBQVk7O29DQXhKL0M7RUFrRStDLGlDQUFpQztTQUFuRSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvRGlhbG9nU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBobG94QXBwSW5mbyB9IGZyb20gJy4uL21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3IgfSBmcm9tICcuL0Fic3RyYWN0Q29tcG9uZW50RGF0YUxhbmdTZWxlY3Rvcic7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi9JSGFzTW9kZWwnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IElEYXRhTGFuZ1NlbGVjdG9yQ29udHJvbGxlciB9IGZyb20gJy4uL0lEYXRhTGFuZ1NlbGVjdG9yQ29udHJvbGxlcic7XG5pbXBvcnQgeyBDb21wb25lbnREYXRhTGFuZ1NlbGVjdG9yTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9Db21wb25lbnREYXRhTGFuZ1NlbGVjdG9yTW9kZWwnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VCdXR0b25Nb2RlbCB9IGZyb20gJy4uL21vZGVsL0xhbmd1YWdlQnV0dG9uTW9kZWwnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtY29tcG9uZW50LWxhbmctc2VsZWN0b3JcIjtcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiAncGh4LWNvbXBvbmVudC1sYW5nLXNlbGVjdG9yJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWNvbXBvbmVudC1sYW5nLXNlbGVjdG9yIGRpc2FibGVkLW92ZXJsYXlcIiBbc3R5bGUud2lkdGhdPVwiZ2V0V2lkdGgoKVwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVpZ2h0KClcIj5cblx0PGRpdiBjbGFzcz1cIndyYXBwZXIgbGVmdFwiIFtjbGFzcy5leHBhbmRdPVwiIWhhc0xhbmd1YWdlKClcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXBhbmVcIj5cblx0XHRcdDwhLS0gZGVmYXVsdCAtLT5cblx0XHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cIl9pc1NlbGVjdGVkTGFuZ3VhZ2VCeUluZGV4KG51bGwpXCI+XG5cdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgKm5nSWY9XCJoYXNNb2RlbCgpXCIgW3R5cGVdPVwiZ2V0TW9kZWwoKS5jb21wb25lbnRUeXBlXCIgW21vZGVsXT1cImdldE1vZGVsKCkuY29tcG9uZW50TW9kZWxcIlxuXHRcdFx0XHRcdFtoYW5kbGVyXT1cImdldERlZmF1bHRDb21wb25lbnRIYW5kbGVyKClcIiBbZGF0YV09XCJnZXREZWZhdWx0RGF0YSgpXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiXG5cdFx0XHRcdFx0W29wdGlvbnNdPVwiZ2V0TW9kZWwoKS5jb21wb25lbnRPcHRpb25zXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDwhLS0gYnkgbGFuZyAtLT5cblx0XHRcdDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJfZ2V0RGF0YUxhbmdMaXN0KClcIiBsZXQtaT1cImluZGV4XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb21wb25lbnQtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cIl9pc1NlbGVjdGVkTGFuZ3VhZ2VCeUluZGV4KGkpXCI+XG5cdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciAqbmdJZj1cImhhc01vZGVsKClcIiBbdHlwZV09XCJnZXRNb2RlbCgpLmNvbXBvbmVudFR5cGVcIiBbbW9kZWxdPVwiZ2V0TW9kZWwoKS5jb21wb25lbnRNb2RlbFwiXG5cdFx0XHRcdFx0XHRbaGFuZGxlcl09XCJnZXRDb21wb25lbnRIYW5kbGVyKClcIiBbc2V0dGluZ109XCJnZXRDb21wb25lbnRTZXR0aW5nKGkpXCIgW2RhdGFdPVwiaXRlbVwiIFtkYXRhUGFyZW50XT1cInRoaXNcIlxuXHRcdFx0XHRcdFx0W29wdGlvbnNdPVwiZ2V0TW9kZWwoKS5jb21wb25lbnRPcHRpb25zXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJ3cmFwcGVyIHJpZ2h0XCIgW2NsYXNzLmhpZGVdPVwiIWhhc0xhbmd1YWdlKClcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibGFuZy1wYW5lXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UtYnRuIGRlZmF1bHQgZGF0YVwiIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkTGFuZ3VhZ2UobnVsbClcIiBbY2xhc3MuZGlydHldPVwiX2lzRGF0YURpcnR5QnlJbmRleChudWxsKVwiXG5cdFx0XHRcdChjbGljayk9XCJvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50LCBudWxsLCBudWxsKVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0XHREZWZhdWx0XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1lcmdlZExhbmd1YWdlTGlzdCgpOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJsYW5ndWFnZS1idG5cIiBbY2xhc3MuZGF0YV09XCJfbGFuZ0hhc0RhdGFCeUluZGV4KGkpXCJcblx0XHRcdFx0W2NsYXNzLmRpcnR5XT1cIl9pc0RhdGFEaXJ0eUJ5SW5kZXgoaSlcIlxuXHRcdFx0XHRbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZExhbmd1YWdlKGl0ZW0pXCIgKGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQsIGl0ZW0sIGkpXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGZsdWlkXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgKm5nSWY9XCIhX2hhc0J1dHRvbkljb24oaXRlbSlcIj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cIl9oYXNCdXR0b25JY29uKGl0ZW0pXCI+XG5cdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwie3tpdGVtLmljb25VUkx9fVwiPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibW9ja2luZy1idG5cIj48L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50RGF0YUxhbmdTZWxlY3RvciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50RGF0YUxhbmdTZWxlY3RvciBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgTEFOR1VBR0VfRklFTERfTkFNRTogc3RyaW5nID0gUGhsb3hBcHBJbmZvLkRFRkFVTFRfTEFOR1VBR0VfRklFTERfTkFNRTtcbiAgcHJpdmF0ZSBPQkpFQ1RfSURfRklFTERfTkFNRTogc3RyaW5nID0gUGhsb3hBcHBJbmZvLkRFRkFVTFRfT0JKRUNUX0lEX0ZJRUxEX05BTUU7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbW9kZWw6IENvbXBvbmVudERhdGFMYW5nU2VsZWN0b3JNb2RlbDtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBjb250cm9sbGVyOiBJRGF0YUxhbmdTZWxlY3RvckNvbnRyb2xsZXI7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhSGVscFxuICBASW5wdXQoKVxuICBASTE4TigpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaGVscDogYW55O1xuICAvLyAtLS0gc2VsZlxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHdpZHRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaGVpZ2h0OiBzdHJpbmc7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxuICBAT3V0cHV0KCdwaHhMb2FkJylcbiAgQE9wdGlvbignbG9hZCcpXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFMYW5nU2VsZWN0b3JcbiAgQE91dHB1dCgncGh4TGFuZ0NsaWNrJylcbiAgQE9wdGlvbignbGFuZ0NsaWNrJylcbiAgcHJvdGVjdGVkIGxhbmdDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4TGFuZ0FkZCcpXG4gIEBPcHRpb24oJ2xhbmdBZGQnKVxuICBwcm90ZWN0ZWQgbGFuZ0FkZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4TGFuZ1JlbW92ZScpXG4gIEBPcHRpb24oJ2xhbmdSZW1vdmUnKVxuICBwcm90ZWN0ZWQgbGFuZ1JlbW92ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlTGFuZ0NsaWNrJylcbiAgQE9wdGlvbignYmVmb3JlTGFuZ0NsaWNrJylcbiAgcHJvdGVjdGVkIGJlZm9yZUxhbmdDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlTGFuZ0FkZCcpXG4gIEBPcHRpb24oJ2JlZm9yZUxhbmdBZGQnKVxuICBwcm90ZWN0ZWQgYmVmb3JlTGFuZ0FkZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlTGFuZ1JlbW92ZScpXG4gIEBPcHRpb24oJ2JlZm9yZUxhbmdSZW1vdmUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlTGFuZ1JlbW92ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgZGlhbG9nU2VydmljZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gV2UndmUgdG8gcmVzb2x2ZSBjb250cm9sbGVyIGZyb20gbW9kZWwgYmVmb3JlIGNhbGxpbmcgc3VwZXIubmdPbkluaXQoKS5cbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIE9ubHkgY29udHJvbGxlciBpcyBudWxsIG9yIHVuZGVmaW5lZCBpbiB3aGljaCB0aGF0IHdlJ2xsIHVzZSB2YWx1ZSBmcm9tIG1vZGVsLlxuICAgICAgaWYgKCh0aGlzLmNvbnRyb2xsZXIgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuY29udHJvbGxlciA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IHRoaXMubW9kZWwuY29udHJvbGxlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgcHVibGljIGhhc01vZGVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG5cbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIHJlcGxhY2UgY29udHJvbGxlclxuICAgICAgdGhpcy5jb250cm9sbGVyID0gdGhpcy5tb2RlbC5jb250cm9sbGVyO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW5ndWFnZUZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLkxBTkdVQUdFX0ZJRUxEX05BTUU7XG4gIH1cblxuICBwdWJsaWMgZ2V0T2JqZWN0SWRGaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5PQkpFQ1RfSURfRklFTERfTkFNRTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnN0YW5jZURlZmF1bHREYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0SW5zdGFuY2VEYXRhTGFuZ3VhZ2UoZGF0YTogYW55KTogYW55IHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBpc0RhdGFMYW5ndWFnZURpcnR5KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUxhbmd1YWdlQnV0dG9uTW9kZWwobGFuZ0NvZGU6IHN0cmluZyk6IExhbmd1YWdlQnV0dG9uTW9kZWwge1xuICAgIGxldCB1cHBlckNhc2VMYW5nID0gKGxhbmdDb2RlICE9PSBudWxsICYmIHR5cGVvZiBsYW5nQ29kZSAhPT0gJ3VuZGVmaW5lZCcpID8gbGFuZ0NvZGUudG9VcHBlckNhc2UoKSA6ICdOL0EnO1xuICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VCdXR0b25Nb2RlbCgnJywgbGFuZ0NvZGUsIHVwcGVyQ2FzZUxhbmcpO1xuICB9XG5cbiAgcHVibGljIGdldFdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGg7XG4gIH1cblxuICBwdWJsaWMgc2V0V2lkdGgod2lkdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5oZWlnaHQ7XG4gIH1cblxuICBwdWJsaWMgc2V0SGVpZ2h0KGhlaWdodDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbn1cbiJdfQ==