io.parrots
Version:
Parrots.io App
313 lines (312 loc) • 29.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, ElementRef } from '@angular/core';
import { LanguageButtonModel, PhloxAppInfo, DialogService, AbstractComponentDataLangSelector } from 'com.phloxui';
const /** @type {?} */ TYPE_NAME = "parrots-data-lang-selector";
const /** @type {?} */ LANG_BTN_CLICK = 'languageBtnClicked';
export class DataLangSelectorPane extends AbstractComponentDataLangSelector {
/**
* @param {?} elementRef
* @param {?} dialogService
*/
constructor(elementRef, dialogService) {
super(elementRef, dialogService);
this.LANGUAGE_FIELD_NAME = PhloxAppInfo.DEFAULT_LANGUAGE_FIELD_NAME;
this.OBJECT_ID_FIELD_NAME = PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @return {?}
*/
getEditor() {
if (this.data !== null && typeof this.data !== 'undefined') {
if (this.data.editor !== null && typeof this.data.editor !== 'undefined') {
return this.data.editor;
}
}
return null;
}
/**
* @param {?} dataObject
* @return {?}
*/
getWrapDataObject(dataObject) {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ data = {
editor: editor,
objects: dataObject
};
return data;
}
/**
* @return {?} any as one object.
*/
getDefaultData() {
let /** @type {?} */ objects = null;
if (this.data !== null && typeof this.data !== 'undefined') {
objects = this.data.objects;
}
if (objects === null || typeof objects === 'undefined') {
return null;
}
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ langFieldName = null;
if (editor !== null) {
langFieldName = editor.getLanguageField();
}
let /** @type {?} */ oneObj = null;
if (Array.isArray(objects)) {
let /** @type {?} */ moreThanOneDef = false;
let /** @type {?} */ defObj = null;
for (let /** @type {?} */ obj of objects) {
let /** @type {?} */ lang = obj[langFieldName];
if (lang === null || typeof lang === 'undefined') {
if (defObj === null) {
defObj = obj;
}
else {
moreThanOneDef = true;
break;
}
}
}
if (!moreThanOneDef && defObj !== null && typeof defObj !== 'undefined') {
oneObj = defObj;
}
}
else {
if (objects[langFieldName] === null || typeof objects[langFieldName] === 'undefined') {
oneObj = objects;
}
}
return oneObj;
}
/**
* @return {?}
*/
getDataObjects() {
let /** @type {?} */ objects = null;
if (this.data !== null && typeof this.data !== 'undefined') {
objects = this.data.objects;
}
if (objects === null || typeof objects === 'undefined') {
return null;
}
return objects;
}
/**
* @return {?}
*/
hasModel() {
if (this.model !== null && typeof this.model !== 'undefined') {
return true;
}
return false;
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
}
/**
* @return {?}
*/
getLanguageFieldName() {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ langFieldName = (editor === null) ? null : editor.getLanguageField();
if (langFieldName !== null && typeof langFieldName !== 'undefined') {
return langFieldName;
}
return this.LANGUAGE_FIELD_NAME;
}
/**
* @return {?}
*/
getObjectIdFieldName() {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ objIdFieldName = (editor === null) ? null : editor.getObjectIdField();
if (objIdFieldName !== null && typeof objIdFieldName !== 'undefined') {
return objIdFieldName;
}
return this.OBJECT_ID_FIELD_NAME;
}
/**
* @param {?} data
* @return {?}
*/
getInstanceDefaultData(data) {
return this.getWrapDataObject([data]);
}
/**
* @param {?} data
* @return {?}
*/
getInstanceDataLanguage(data) {
return this.getWrapDataObject([data]);
}
/**
* @return {?} any as object in pattern {iconURL: string, code: string, label: string}
*/
getLanguageList() {
let /** @type {?} */ editor = this.getEditor();
let /** @type {?} */ languageList = [];
if (editor !== null) {
let /** @type {?} */ setting = editor.getAppSetting();
if (setting !== null && typeof setting !== 'undefined') {
let /** @type {?} */ defaultLangs = setting.DEFAULT_DATA_LANGUAGES;
if (defaultLangs !== null && typeof defaultLangs !== 'undefined' && Array.isArray(defaultLangs)) {
for (let /** @type {?} */ lang of defaultLangs) {
languageList.push(lang.code);
}
}
}
}
return languageList;
}
/**
* @param {?} defaultData
* @return {?}
*/
loadDataLanguageList(defaultData) {
return new Promise((resolve, reject) => {
let /** @type {?} */ editor = this.getEditor();
if (editor !== null) {
let /** @type {?} */ langProm = editor.getLanguageList(defaultData);
if (langProm !== null && typeof langProm !== 'undefined') {
langProm.then((result) => {
let /** @type {?} */ tempArray = [];
if (result !== null && typeof result !== 'undefined') {
if (Array.isArray(result)) {
tempArray = result;
}
else {
tempArray.push(result);
}
}
resolve(tempArray);
});
}
}
else {
resolve([]);
}
});
}
/**
* when new language was created this method will be called
* @param {?} newLangData as any
* @return {?}
*/
onLanguageAdded(newLangData) {
if (newLangData !== null && typeof newLangData !== 'undefined') {
// do sth here
}
// this.data.objects.push(newLangData);
}
/**
* when language was removed this method will be called
* @param {?} deletedData as any
* @return {?}
*/
onLanguageRemoved(deletedData) {
// do sth
}
/**
* @param {?} langCode
* @return {?}
*/
parseLanguageButtonModel(langCode) {
return new LanguageButtonModel('', langCode, 'label');
}
}
DataLangSelectorPane.TYPE_NAME = TYPE_NAME;
DataLangSelectorPane.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="parrots-data-lang-selector">
<div class="wrapper left" [class.expand]="!hasLanguage()">
<div class="component-pane">
<!-- default -->
<div class="component-wrapper" [class.show]="_isSelectedLanguageByIndex(null)">
<phx-component-wrapper *ngIf="hasModel()" [type]="getModel().tabComponentType" [model]="getModel().tabComponentModel"
[handler]="getDefaultComponentHandler()" [data]="getDefaultData()" [dataParent]="this"></phx-component-wrapper>
</div>
<!-- by lang -->
<ng-template ngFor let-item [ngForOf]="_getDataLangList()" let-i="index">
<div class="component-wrapper" [class.show]="_isSelectedLanguageByIndex(i)">
<ng-template [ngIf]="item !== null && item !== undefined">
<phx-component-wrapper *ngIf="hasModel()" [type]="getModel().tabComponentType" [model]="getModel().tabComponentModel"
[handler]="getComponentHandler()" [setting]="getComponentSetting(i)" [data]="item" [dataParent]="this"></phx-component-wrapper>
</ng-template>
</div>
</ng-template>
</div>
</div>
<div class="wrapper right" [class.hide]="!hasLanguage()">
<div class="lang-pane">
<div class="language-btn default data" [class.selected]="isSelectedLanguage(null)" [class.dirty]="_isDataDirtyByIndex(null)"
(click)="onActionBtnClicked($event, null, undefined)">
<div class="table-wrapper fluid">
<div class="table-cell-wrapper middle">
Default
</div>
</div>
</div>
<div *ngFor="let item of getMergedLanguageList(); let i = index" class="language-btn" [class.data]="_langHasDataByIndex(i)"
[class.dirty]="_isDataDirtyByIndex(i)"
[class.selected]="isSelectedLanguage(item)" (click)="onActionBtnClicked($event, item, i)">
<div class="table-wrapper fluid">
<div class="table-cell-wrapper middle">
<div *ngIf="!_hasButtonIcon(item)">{{item.code}}</div>
<div *ngIf="_hasButtonIcon(item)">
<img src="{{item.iconURL}}">
</div>
</div>
</div>
</div>
<div class="mocking-btn"></div>
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
DataLangSelectorPane.ctorParameters = () => [
{ type: ElementRef, },
{ type: DialogService, },
];
function DataLangSelectorPane_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
DataLangSelectorPane.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
DataLangSelectorPane.ctorParameters;
/** @type {?} */
DataLangSelectorPane.TYPE_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.LANGUAGE_FIELD_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.OBJECT_ID_FIELD_NAME;
/** @type {?} */
DataLangSelectorPane.prototype.model;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUxhbmdTZWxlY3RvclBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaW8ucGFycm90cy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZWRpdG9yL2VkaXRvci5pbnRlcm5hbC9EYXRhTGFuZ1NlbGVjdG9yUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RSxPQUFPLEVBQW9DLG1CQUFtQixFQUM3RCxZQUFZLEVBQUUsYUFBYSxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBTXJGLHVCQUFNLFNBQVMsR0FBVyw0QkFBNEIsQ0FBQztBQUV2RCx1QkFBTSxjQUFjLEdBQVcsb0JBQW9CLENBQUM7QUFzRHBELE1BQU0sMkJBQTRCLFNBQVEsaUNBQWlDOzs7OztJQVF6RSxZQUFZLFVBQXNCLEVBQUUsYUFBNEI7UUFDOUQsS0FBSyxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQzttQ0FMRyxZQUFZLENBQUMsMkJBQTJCO29DQUN2QyxZQUFZLENBQUMsNEJBQTRCO0tBSy9FOzs7O0lBRU0sUUFBUTtRQUNiLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Ozs7SUFHWCxTQUFTO1FBQ2YsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDekUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ3pCO1NBQ0Y7UUFDRCxNQUFNLENBQUMsSUFBSSxD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QUM7OztpQ0EvTWIsU0FBUzs7WUFwRHJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTZDWDthQUNBOzs7O1lBaEUwQyxVQUFVO1lBR3RDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJSGFzTW9kZWwsIERhdGFMYW5nU2VsZWN0b3JNb2RlbCwgTGFuZ3VhZ2VCdXR0b25Nb2RlbCxcbiBQaGxveEFwcEluZm8sIERpYWxvZ1NlcnZpY2UsIEFic3RyYWN0Q29tcG9uZW50RGF0YUxhbmdTZWxlY3RvciB9IGZyb20gJ2NvbS5waGxveHVpJztcbmltcG9ydCB7IEFic3RyYWN0UGFycm90c0RhdGFFZGl0b3IgfSBmcm9tICcuLi9BYnN0cmFjdFBhcnJvdHNEYXRhRWRpdG9yJztcblxuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwYXJyb3RzLWRhdGEtbGFuZy1zZWxlY3RvclwiO1xuXG5jb25zdCBMQU5HX0JUTl9DTElDSzogc3RyaW5nID0gJ2xhbmd1YWdlQnRuQ2xpY2tlZCc7XG5cbi8vIHVzZSBtYXRlcmlhbCBEYXRhTGFuZ1NlbGVjdG9yUGFuZSBpbnN0YWRlID8/IChTaG91bGQgd2UgZGVsZXRlIHRoaXMgY29tcG9uZW50KVxuLy8gdHJ5IHRvIGZpbmQgaWYgbm8gY29tcG9uZW50IHVzZVxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBhcnJvdHMtZGF0YS1sYW5nLXNlbGVjdG9yXCI+XG5cdDxkaXYgY2xhc3M9XCJ3cmFwcGVyIGxlZnRcIiBbY2xhc3MuZXhwYW5kXT1cIiFoYXNMYW5ndWFnZSgpXCI+XG5cdFx0PGRpdiBjbGFzcz1cImNvbXBvbmVudC1wYW5lXCI+XG5cdFx0XHQ8IS0tIGRlZmF1bHQgLS0+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJfaXNTZWxlY3RlZExhbmd1YWdlQnlJbmRleChudWxsKVwiPlxuXHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyICpuZ0lmPVwiaGFzTW9kZWwoKVwiIFt0eXBlXT1cImdldE1vZGVsKCkudGFiQ29tcG9uZW50VHlwZVwiIFttb2RlbF09XCJnZXRNb2RlbCgpLnRhYkNvbXBvbmVudE1vZGVsXCJcblx0XHRcdFx0XHRbaGFuZGxlcl09XCJnZXREZWZhdWx0Q29tcG9uZW50SGFuZGxlcigpXCIgW2RhdGFdPVwiZ2V0RGVmYXVsdERhdGEoKVwiIFtkYXRhUGFyZW50XT1cInRoaXNcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PCEtLSBieSBsYW5nIC0tPlxuXHRcdFx0PG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cIl9nZXREYXRhTGFuZ0xpc3QoKVwiIGxldC1pPVwiaW5kZXhcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbXBvbmVudC13cmFwcGVyXCIgW2NsYXNzLnNob3ddPVwiX2lzU2VsZWN0ZWRMYW5ndWFnZUJ5SW5kZXgoaSlcIj5cblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB1bmRlZmluZWRcIj5cblx0XHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgKm5nSWY9XCJoYXNNb2RlbCgpXCIgW3R5cGVdPVwiZ2V0TW9kZWwoKS50YWJDb21wb25lbnRUeXBlXCIgW21vZGVsXT1cImdldE1vZGVsKCkudGFiQ29tcG9uZW50TW9kZWxcIlxuXHRcdFx0XHRcdFx0XHRbaGFuZGxlcl09XCJnZXRDb21wb25lbnRIYW5kbGVyKClcIiBbc2V0dGluZ109XCJnZXRDb21wb25lbnRTZXR0aW5nKGkpXCIgW2RhdGFdPVwiaXRlbVwiIFtkYXRhUGFyZW50XT1cInRoaXNcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwid3JhcHBlciByaWdodFwiIFtjbGFzcy5oaWRlXT1cIiFoYXNMYW5ndWFnZSgpXCI+XG5cdFx0PGRpdiBjbGFzcz1cImxhbmctcGFuZVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImxhbmd1YWdlLWJ0biBkZWZhdWx0IGRhdGFcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZExhbmd1YWdlKG51bGwpXCIgW2NsYXNzLmRpcnR5XT1cIl9pc0RhdGFEaXJ0eUJ5SW5kZXgobnVsbClcIlxuXHRcdFx0XHQoY2xpY2spPVwib25BY3Rpb25CdG5DbGlja2VkKCRldmVudCwgbnVsbCwgdW5kZWZpbmVkKVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0XHREZWZhdWx0XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1lcmdlZExhbmd1YWdlTGlzdCgpOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJsYW5ndWFnZS1idG5cIiBbY2xhc3MuZGF0YV09XCJfbGFuZ0hhc0RhdGFCeUluZGV4KGkpXCJcblx0XHRcdFx0W2NsYXNzLmRpcnR5XT1cIl9pc0RhdGFEaXJ0eUJ5SW5kZXgoaSlcIlxuXHRcdFx0XHRbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZExhbmd1YWdlKGl0ZW0pXCIgKGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQsIGl0ZW0sIGkpXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGZsdWlkXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgKm5nSWY9XCIhX2hhc0J1dHRvbkljb24oaXRlbSlcIj57e2l0ZW0uY29kZX19PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiX2hhc0J1dHRvbkljb24oaXRlbSlcIj5cblx0XHRcdFx0XHRcdFx0PGltZyBzcmM9XCJ7e2l0ZW0uaWNvblVSTH19XCI+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJtb2NraW5nLWJ0blwiPjwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhTGFuZ1NlbGVjdG9yUGFuZSBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50RGF0YUxhbmdTZWxlY3RvciBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgTEFOR1VBR0VfRklFTERfTkFNRTogc3RyaW5nID0gUGhsb3hBcHBJbmZvLkRFRkFVTFRfTEFOR1VBR0VfRklFTERfTkFNRTtcbiAgcHJpdmF0ZSBPQkpFQ1RfSURfRklFTERfTkFNRTogc3RyaW5nID0gUGhsb3hBcHBJbmZvLkRFRkFVTFRfT0JKRUNUX0lEX0ZJRUxEX05BTUU7XG4gIHByaXZhdGUgbW9kZWw6IERhdGFMYW5nU2VsZWN0b3JNb2RlbDtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgZGlhbG9nU2VydmljZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWRpdG9yKCk6IEFic3RyYWN0UGFycm90c0RhdGFFZGl0b3Ige1xuICAgIGlmICh0aGlzLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLmRhdGEuZWRpdG9yICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEuZWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVkaXRvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFdyYXBEYXRhT2JqZWN0KGRhdGFPYmplY3Q6IGFueVtdKTogYW55IHtcbiAgICBsZXQgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3IoKTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgIGVkaXRvcjogZWRpdG9yLFxuICAgICAgb2JqZWN0czogZGF0YU9iamVjdFxuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGF0YSBhcyBhbnlcbiAgICogQHJldHVybiBhbnkgYXMgb25lIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0YSgpOiBhbnkge1xuICAgIGxldCBvYmplY3RzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9iamVjdHMgPSB0aGlzLmRhdGEub2JqZWN0cztcbiAgICB9XG5cbiAgICBpZiAob2JqZWN0cyA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCBsYW5nRmllbGROYW1lID0gbnVsbDtcbiAgICBpZiAoZWRpdG9yICE9PSBudWxsKSB7XG4gICAgICBsYW5nRmllbGROYW1lID0gZWRpdG9yLmdldExhbmd1YWdlRmllbGQoKTtcbiAgICB9XG4gICAgbGV0IG9uZU9iaiA9IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0cykpIHtcbiAgICAgIGxldCBtb3JlVGhhbk9uZURlZjogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgbGV0IGRlZk9iaiA9IG51bGw7XG4gICAgICBmb3IgKGxldCBvYmogb2Ygb2JqZWN0cykge1xuICAgICAgICBsZXQgbGFuZyA9IG9ialtsYW5nRmllbGROYW1lXTtcbiAgICAgICAgaWYgKGxhbmcgPT09IG51bGwgfHwgdHlwZW9mIGxhbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKGRlZk9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGVmT2JqID0gb2JqO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3JlVGhhbk9uZURlZiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFtb3JlVGhhbk9uZURlZiAmJiBkZWZPYmogIT09IG51bGwgJiYgdHlwZW9mIGRlZk9iaiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb25lT2JqID0gZGVmT2JqO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob2JqZWN0c1tsYW5nRmllbGROYW1lXSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0c1tsYW5nRmllbGROYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb25lT2JqID0gb2JqZWN0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb25lT2JqO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFPYmplY3RzKCk6IGFueVtdIHtcbiAgICBsZXQgb2JqZWN0cyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvYmplY3RzID0gdGhpcy5kYXRhLm9iamVjdHM7XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdHMgPT09IG51bGwgfHwgdHlwZW9mIG9iamVjdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfVxuXG4gIHB1YmxpYyBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNb2RlbChtb2RlbDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICB9XG5cbiAgcHVibGljIGdldExhbmd1YWdlRmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgbGV0IGxhbmdGaWVsZE5hbWUgPSAoZWRpdG9yID09PSBudWxsKSA/IG51bGwgOiBlZGl0b3IuZ2V0TGFuZ3VhZ2VGaWVsZCgpO1xuXG4gICAgaWYgKGxhbmdGaWVsZE5hbWUgIT09IG51bGwgJiYgdHlwZW9mIGxhbmdGaWVsZE5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbGFuZ0ZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5MQU5HVUFHRV9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHVibGljIGdldE9iamVjdElkRmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG4gICAgbGV0IG9iaklkRmllbGROYW1lID0gKGVkaXRvciA9PT0gbnVsbCkgPyBudWxsIDogZWRpdG9yLmdldE9iamVjdElkRmllbGQoKTtcbiAgICBpZiAob2JqSWRGaWVsZE5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG9iaklkRmllbGROYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG9iaklkRmllbGROYW1lO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLk9CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHVibGljIGdldEluc3RhbmNlRGVmYXVsdERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcmFwRGF0YU9iamVjdChbZGF0YV0pO1xuICB9XG5cbiAgcHVibGljIGdldEluc3RhbmNlRGF0YUxhbmd1YWdlKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JhcERhdGFPYmplY3QoW2RhdGFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGF0YSBhcyBhbnlcbiAgICogQHJldHVybiBhbnkgYXMgb2JqZWN0IGluIHBhdHRlcm4ge2ljb25VUkw6IHN0cmluZywgY29kZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nfVxuICAgKi9cbiAgcHVibGljIGdldExhbmd1YWdlTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG5cbiAgICBsZXQgbGFuZ3VhZ2VMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChlZGl0b3IgIT09IG51bGwpIHtcbiAgICAgIGxldCBzZXR0aW5nID0gZWRpdG9yLmdldEFwcFNldHRpbmcoKTtcblxuICAgICAgaWYgKHNldHRpbmcgIT09IG51bGwgJiYgdHlwZW9mIHNldHRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCBkZWZhdWx0TGFuZ3MgPSBzZXR0aW5nLkRFRkFVTFRfREFUQV9MQU5HVUFHRVM7XG4gICAgICAgIGlmIChkZWZhdWx0TGFuZ3MgIT09IG51bGwgJiYgdHlwZW9mIGRlZmF1bHRMYW5ncyAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShkZWZhdWx0TGFuZ3MpKSB7XG4gICAgICAgICAgZm9yIChsZXQgbGFuZyBvZiBkZWZhdWx0TGFuZ3MpIHtcbiAgICAgICAgICAgIGxhbmd1YWdlTGlzdC5wdXNoKGxhbmcuY29kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmd1YWdlTGlzdDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkRGF0YUxhbmd1YWdlTGlzdChkZWZhdWx0RGF0YTogYW55KTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3IoKTtcbiAgICAgIGlmIChlZGl0b3IgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IGxhbmdQcm9tID0gZWRpdG9yLmdldExhbmd1YWdlTGlzdChkZWZhdWx0RGF0YSk7XG4gICAgICAgIGlmIChsYW5nUHJvbSAhPT0gbnVsbCAmJiB0eXBlb2YgbGFuZ1Byb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbGFuZ1Byb20udGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBsZXQgdGVtcEFycmF5ID0gW107XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSByZXN1bHQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSh0ZW1wQXJyYXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB3aGVuIG5ldyBsYW5ndWFnZSB3YXMgY3JlYXRlZCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZFxuICAgKiBAcGFyYW0gbmV3TGFuZ0RhdGEgYXMgYW55XG4gICAqL1xuICBwdWJsaWMgb25MYW5ndWFnZUFkZGVkKG5ld0xhbmdEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAobmV3TGFuZ0RhdGEgIT09IG51bGwgJiYgdHlwZW9mIG5ld0xhbmdEYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZG8gc3RoIGhlcmVcbiAgICB9XG4gICAgLy8gICAgICAgIHRoaXMuZGF0YS5vYmplY3RzLnB1c2gobmV3TGFuZ0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICogd2hlbiBsYW5ndWFnZSB3YXMgcmVtb3ZlZCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZFxuICAqIEBwYXJhbSBkZWxldGVkRGF0YSBhcyBhbnlcbiAgKi9cbiAgcHVibGljIG9uTGFuZ3VhZ2VSZW1vdmVkKGRlbGV0ZWREYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBkbyBzdGhcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUxhbmd1YWdlQnV0dG9uTW9kZWwobGFuZ0NvZGU6IHN0cmluZyk6IExhbmd1YWdlQnV0dG9uTW9kZWwge1xuICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VCdXR0b25Nb2RlbCgnJywgbGFuZ0NvZGUsICdsYWJlbCcpO1xuICB9XG59XG4iXX0=