UNPKG

@ajsf-extended/core

Version:

Angular JSON Schema Form builder core - fork from https://github.com/hamzahamidi/ajsf

226 lines 31.6 kB
import { AddReferenceComponent } from './add-reference.component'; import { ButtonComponent } from './button.component'; import { CheckboxComponent } from './checkbox.component'; import { CheckboxesComponent } from './checkboxes.component'; import { FileComponent } from './file.component'; import { hasOwn } from '../shared/utility.functions'; import { Injectable } from '@angular/core'; import { InputComponent } from './input.component'; import { MessageComponent } from './message.component'; import { NoneComponent } from './none.component'; import { NumberComponent } from './number.component'; import { OneOfComponent } from './one-of.component'; import { RadiosComponent } from './radios.component'; import { RootComponent } from './root.component'; import { SectionComponent } from './section.component'; import { SelectComponent } from './select.component'; import { SelectFrameworkComponent } from './select-framework.component'; import { SelectWidgetComponent } from './select-widget.component'; import { SubmitComponent } from './submit.component'; import { TabsComponent } from './tabs.component'; import { TemplateComponent } from './template.component'; import { TextareaComponent } from './textarea.component'; import * as i0 from "@angular/core"; export class WidgetLibraryService { constructor() { this.defaultWidget = 'text'; this.widgetLibrary = { // Angular JSON Schema Form administrative widgets 'none': NoneComponent, 'root': RootComponent, 'select-framework': SelectFrameworkComponent, 'select-widget': SelectWidgetComponent, '$ref': AddReferenceComponent, // Free-form text HTML 'input' form control widgets <input type="..."> 'email': 'text', 'integer': 'number', 'number': NumberComponent, 'password': 'text', 'search': 'text', 'tel': 'text', 'text': InputComponent, 'url': 'text', // Controlled text HTML 'input' form control widgets <input type="..."> 'color': 'text', 'date': 'text', 'datetime': 'text', 'datetime-local': 'text', 'month': 'text', 'range': 'number', 'time': 'text', 'week': 'text', // Non-text HTML 'input' form control widgets <input type="..."> // 'button': <input type="button"> not used, use <button> instead 'checkbox': CheckboxComponent, 'file': FileComponent, 'hidden': 'text', 'image': 'text', 'radio': 'radios', 'reset': 'submit', 'submit': SubmitComponent, // Other (non-'input') HTML form control widgets 'button': ButtonComponent, 'select': SelectComponent, // 'option': automatically generated by select widgets // 'optgroup': automatically generated by select widgets 'textarea': TextareaComponent, // HTML form control widget sets 'checkboxes': CheckboxesComponent, 'checkboxes-inline': 'checkboxes', 'checkboxbuttons': 'checkboxes', 'radios': RadiosComponent, 'radios-inline': 'radios', 'radiobuttons': 'radios', // HTML Layout widgets // 'label': automatically added to data widgets // 'legend': automatically added to fieldsets 'section': SectionComponent, 'div': 'section', 'fieldset': 'section', 'flex': 'section', // Non-HTML layout widgets 'one-of': OneOfComponent, // TODO: Finish 'one-of' widget 'array': 'section', 'tabarray': 'tabs', 'tab': 'section', 'tabs': TabsComponent, 'message': MessageComponent, 'help': 'message', 'msg': 'message', 'html': 'message', 'template': TemplateComponent, // Widgets included for compatibility with JSON Form API 'advancedfieldset': 'section', 'authfieldset': 'section', 'optionfieldset': 'one-of', 'selectfieldset': 'one-of', 'conditional': 'section', 'actions': 'section', 'tagsinput': 'section', // See: http://ulion.github.io/jsonform/playground/?example=fields-checkboxbuttons // Widgets included for compatibility with React JSON Schema Form API 'updown': 'number', 'date-time': 'datetime-local', 'alt-datetime': 'datetime-local', 'alt-date': 'date', // Widgets included for compatibility with Angular Schema Form API 'wizard': 'section', // Widgets included for compatibility with other libraries 'textline': 'text', // Recommended 3rd-party add-on widgets (TODO: create wrappers for these...) // 'ng2-select': Select control replacement - http://valor-software.com/ng2-select/ // 'flatpickr': Flatpickr date picker - https://github.com/chmln/flatpickr // 'pikaday': Pikaday date picker - https://github.com/dbushell/Pikaday // 'spectrum': Spectrum color picker - http://bgrins.github.io/spectrum // 'bootstrap-slider': Bootstrap Slider range control - https://github.com/seiyria/bootstrap-slider // 'ace': ACE code editor - https://ace.c9.io // 'ckeditor': CKEditor HTML / rich text editor - http://ckeditor.com // 'tinymce': TinyMCE HTML / rich text editor - https://www.tinymce.com // 'imageselect': Bootstrap drop-down image selector - http://silviomoreto.github.io/bootstrap-select // 'wysihtml5': HTML editor - http://jhollingworth.github.io/bootstrap-wysihtml5 // 'quill': Quill HTML / rich text editor (?) - https://quilljs.com }; this.registeredWidgets = {}; this.frameworkWidgets = {}; this.activeWidgets = {}; this.setActiveWidgets(); } setActiveWidgets() { this.activeWidgets = Object.assign({}, this.widgetLibrary, this.frameworkWidgets, this.registeredWidgets); for (const widgetName of Object.keys(this.activeWidgets)) { let widget = this.activeWidgets[widgetName]; // Resolve aliases if (typeof widget === 'string') { const usedAliases = []; while (typeof widget === 'string' && !usedAliases.includes(widget)) { usedAliases.push(widget); widget = this.activeWidgets[widget]; } if (typeof widget !== 'string') { this.activeWidgets[widgetName] = widget; } } } return true; } setDefaultWidget(type) { if (!this.hasWidget(type)) { return false; } this.defaultWidget = type; return true; } hasWidget(type, widgetSet = 'activeWidgets') { if (!type || typeof type !== 'string') { return false; } return hasOwn(this[widgetSet], type); } hasDefaultWidget(type) { return this.hasWidget(type, 'widgetLibrary'); } registerWidget(type, widget) { if (!type || !widget || typeof type !== 'string') { return false; } this.registeredWidgets[type] = widget; return this.setActiveWidgets(); } unRegisterWidget(type) { if (!hasOwn(this.registeredWidgets, type)) { return false; } delete this.registeredWidgets[type]; return this.setActiveWidgets(); } unRegisterAllWidgets(unRegisterFrameworkWidgets = true) { this.registeredWidgets = {}; if (unRegisterFrameworkWidgets) { this.frameworkWidgets = {}; } return this.setActiveWidgets(); } registerFrameworkWidgets(widgets) { if (widgets === null || typeof widgets !== 'object') { widgets = {}; } this.frameworkWidgets = widgets; return this.setActiveWidgets(); } unRegisterFrameworkWidgets() { if (Object.keys(this.frameworkWidgets).length) { this.frameworkWidgets = {}; return this.setActiveWidgets(); } return false; } getWidget(type, widgetSet = 'activeWidgets') { if (this.hasWidget(type, widgetSet)) { return this[widgetSet][type]; } else if (this.hasWidget(this.defaultWidget, widgetSet)) { return this[widgetSet][this.defaultWidget]; } else { return null; } } getAllWidgets() { return { widgetLibrary: this.widgetLibrary, registeredWidgets: this.registeredWidgets, frameworkWidgets: this.frameworkWidgets, activeWidgets: this.activeWidgets, }; } } WidgetLibraryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: WidgetLibraryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); WidgetLibraryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: WidgetLibraryService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: WidgetLibraryService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWxpYnJhcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fqc2YtY29yZS9zcmMvbGliL3dpZGdldC1saWJyYXJ5L3dpZGdldC1saWJyYXJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLHdC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SUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQ3hELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTztZQUNMLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ2xDLENBQUM7SUFDSixDQUFDOztpSEE5TVUsb0JBQW9CO3FIQUFwQixvQkFBb0IsY0FGbkIsTUFBTTsyRkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWRkUmVmZXJlbmNlQ29tcG9uZW50IH0gZnJvbSAnLi9hZGQtcmVmZXJlbmNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vYnV0dG9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi9jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGVja2JveGVzQ29tcG9uZW50IH0gZnJvbSAnLi9jaGVja2JveGVzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZpbGVDb21wb25lbnQgfSBmcm9tICcuL2ZpbGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgaGFzT3duIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxpdHkuZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vaW5wdXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gJy4vbWVzc2FnZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOb25lQ29tcG9uZW50IH0gZnJvbSAnLi9ub25lLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vbnVtYmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE9uZU9mQ29tcG9uZW50IH0gZnJvbSAnLi9vbmUtb2YuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmFkaW9zQ29tcG9uZW50IH0gZnJvbSAnLi9yYWRpb3MuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUm9vdENvbXBvbmVudCB9IGZyb20gJy4vcm9vdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlbGVjdEZyYW1ld29ya0NvbXBvbmVudCB9IGZyb20gJy4vc2VsZWN0LWZyYW1ld29yay5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZWxlY3RXaWRnZXRDb21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC13aWRnZXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU3VibWl0Q29tcG9uZW50IH0gZnJvbSAnLi9zdWJtaXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFic0NvbXBvbmVudCB9IGZyb20gJy4vdGFicy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICcuL3RleHRhcmVhLmNvbXBvbmVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgV2lkZ2V0TGlicmFyeVNlcnZpY2Uge1xyXG5cclxuICBkZWZhdWx0V2lkZ2V0ID0gJ3RleHQnO1xyXG4gIHdpZGdldExpYnJhcnk6IGFueSA9IHtcclxuXHJcbiAgLy8gQW5ndWxhciBKU09OIFNjaGVtYSBGb3JtIGFkbWluaXN0cmF0aXZlIHdpZGdldHNcclxuICAgICdub25lJzogTm9uZUNvbXBvbmVudCwgLy8gUGxhY2Vob2xkZXIsIGZvciBkZXZlbG9wbWVudCAtIGRpc3BsYXlzIG5vdGhpbmdcclxuICAgICdyb290JzogUm9vdENvbXBvbmVudCwgLy8gRm9ybSByb290LCByZW5kZXJzIGEgY29tcGxldGUgbGF5b3V0XHJcbiAgICAnc2VsZWN0LWZyYW1ld29yayc6IFNlbGVjdEZyYW1ld29ya0NvbXBvbmVudCwgLy8gQXBwbGllcyB0aGUgc2VsZWN0ZWQgZnJhbWV3b3JrIHRvIGEgc3BlY2lmaWVkIHdpZGdldFxyXG4gICAgJ3NlbGVjdC13aWRnZXQnOiBTZWxlY3RXaWRnZXRDb21wb25lbnQsIC8vIERpc3BsYXlzIGEgc3BlY2lmaWVkIHdpZGdldFxyXG4gICAgJyRyZWYnOiBBZGRSZWZlcmVuY2VDb21wb25lbnQsIC8vIEJ1dHRvbiB0byBhZGQgYSBuZXcgYXJyYXkgaXRlbSBvciAkcmVmIGVsZW1lbnRcclxuXHJcbiAgLy8gRnJlZS1mb3JtIHRleHQgSFRNTCAnaW5wdXQnIGZvcm0gY29udHJvbCB3aWRnZXRzIDxpbnB1dCB0eXBlPVwiLi4uXCI+XHJcbiAgICAnZW1haWwnOiAndGV4dCcsXHJcbiAgICAnaW50ZWdlcic6ICdudW1iZXInLCAvLyBOb3RlOiAnaW50ZWdlcicgaXMgbm90IGEgcmVjb2duaXplZCBIVE1MIGlucHV0IHR5cGVcclxuICAgICdudW1iZXInOiBOdW1iZXJDb21wb25lbnQsXHJcbiAgICAncGFzc3dvcmQnOiAndGV4dCcsXHJcbiAgICAnc2VhcmNoJzogJ3RleHQnLFxyXG4gICAgJ3RlbCc6ICd0ZXh0JyxcclxuICAgICd0ZXh0JzogSW5wdXRDb21wb25lbnQsXHJcbiAgICAndXJsJzogJ3RleHQnLFxyXG5cclxuICAvLyBDb250cm9sbGVkIHRleHQgSFRNTCAnaW5wdXQnIGZvcm0gY29udHJvbCB3aWRnZXRzIDxpbnB1dCB0eXBlPVwiLi4uXCI+XHJcbiAgICAnY29sb3InOiAndGV4dCcsXHJcbiAgICAnZGF0ZSc6ICd0ZXh0JyxcclxuICAgICdkYXRldGltZSc6ICd0ZXh0JyxcclxuICAgICdkYXRldGltZS1sb2NhbCc6ICd0ZXh0JyxcclxuICAgICdtb250aCc6ICd0ZXh0JyxcclxuICAgICdyYW5nZSc6ICdudW1iZXInLFxyXG4gICAgJ3RpbWUnOiAndGV4dCcsXHJcbiAgICAnd2Vlayc6ICd0ZXh0JyxcclxuXHJcbiAgLy8gTm9uLXRleHQgSFRNTCAnaW5wdXQnIGZvcm0gY29udHJvbCB3aWRnZXRzIDxpbnB1dCB0eXBlPVwiLi4uXCI+XHJcbiAgICAvLyAnYnV0dG9uJzogPGlucHV0IHR5cGU9XCJidXR0b25cIj4gbm90IHVzZWQsIHVzZSA8YnV0dG9uPiBpbnN0ZWFkXHJcbiAgICAnY2hlY2tib3gnOiBDaGVja2JveENvbXBvbmVudCwgLy8gVE9ETzogU2V0IHRlcm5hcnkgPSB0cnVlIGZvciAzLXN0YXRlID8/XHJcbiAgICAnZmlsZSc6IEZpbGVDb21wb25lbnQsIC8vIFRPRE86IEZpbmlzaCAnZmlsZScgd2lkZ2V0XHJcbiAgICAnaGlkZGVuJzogJ3RleHQnLFxyXG4gICAgJ2ltYWdlJzogJ3RleHQnLCAvLyBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgdGhlc2VcclxuICAgICdyYWRpbyc6ICdyYWRpb3MnLFxyXG4gICAgJ3Jlc2V0JzogJ3N1Ym1pdCcsIC8vIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSB0aGVzZVxyXG4gICAgJ3N1Ym1pdCc6IFN1Ym1pdENvbXBvbmVudCxcclxuXHJcbiAgLy8gT3RoZXIgKG5vbi0naW5wdXQnKSBIVE1MIGZvcm0gY29udHJvbCB3aWRnZXRzXHJcbiAgICAnYnV0dG9uJzogQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgJ3NlbGVjdCc6IFNlbGVjdENvbXBvbmVudCxcclxuICAgIC8vICdvcHRpb24nOiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBzZWxlY3Qgd2lkZ2V0c1xyXG4gICAgLy8gJ29wdGdyb3VwJzogYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgc2VsZWN0IHdpZGdldHNcclxuICAgICd0ZXh0YXJlYSc6IFRleHRhcmVhQ29tcG9uZW50LFxyXG5cclxuICAvLyBIVE1MIGZvcm0gY29udHJvbCB3aWRnZXQgc2V0c1xyXG4gICAgJ2NoZWNrYm94ZXMnOiBDaGVja2JveGVzQ29tcG9uZW50LCAvLyBHcm91cGVkIGxpc3Qgb2YgY2hlY2tib3hlc1xyXG4gICAgJ2NoZWNrYm94ZXMtaW5saW5lJzogJ2NoZWNrYm94ZXMnLCAvLyBDaGVja2JveGVzIGluIG9uZSBsaW5lXHJcbiAgICAnY2hlY2tib3hidXR0b25zJzogJ2NoZWNrYm94ZXMnLCAvLyBDaGVja2JveGVzIGFzIGh0bWwgYnV0dG9uc1xyXG4gICAgJ3JhZGlvcyc6IFJhZGlvc0NvbXBvbmVudCwgLy8gR3JvdXBlZCBsaXN0IG9mIHJhZGlvIGJ1dHRvbnNcclxuICAgICdyYWRpb3MtaW5saW5lJzogJ3JhZGlvcycsIC8vIFJhZGlvIGNvbnRyb2xzIGluIG9uZSBsaW5lXHJcbiAgICAncmFkaW9idXR0b25zJzogJ3JhZGlvcycsIC8vIFJhZGlvIGNvbnRyb2xzIGFzIGh0bWwgYnV0dG9uc1xyXG5cclxuICAvLyBIVE1MIExheW91dCB3aWRnZXRzXHJcbiAgICAvLyAnbGFiZWwnOiBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGRhdGEgd2lkZ2V0c1xyXG4gICAgLy8gJ2xlZ2VuZCc6IGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gZmllbGRzZXRzXHJcbiAgICAnc2VjdGlvbic6IFNlY3Rpb25Db21wb25lbnQsIC8vIEp1c3QgYSBkaXYgPGRpdj5cclxuICAgICdkaXYnOiAnc2VjdGlvbicsIC8vIFN0aWxsIGp1c3QgYSBkaXYgPGRpdj5cclxuICAgICdmaWVsZHNldCc6ICdzZWN0aW9uJywgLy8gQSBmaWVsZHNldCwgd2l0aCBhbiBvcHRpb25hbCBsZWdlbmQgPGZpZWxkc2V0PlxyXG4gICAgJ2ZsZXgnOiAnc2VjdGlvbicsIC8vIEEgZmxleGJveCBjb250YWluZXIgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXhcIj5cclxuXHJcbiAgLy8gTm9uLUhUTUwgbGF5b3V0IHdpZGdldHNcclxuICAgICdvbmUtb2YnOiBPbmVPZkNvbXBvbmVudCwgLy8gQSBzZWxlY3QgYm94IHRoYXQgY2hhbmdlcyBhbm90aGVyIGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpbmlzaCAnb25lLW9mJyB3aWRnZXRcclxuICAgICdhcnJheSc6ICdzZWN0aW9uJywgLy8gQSBsaXN0IHlvdSBjYW4gYWRkLCByZW1vdmUgYW5kIHJlb3JkZXIgPGZpZWxkc2V0PlxyXG4gICAgJ3RhYmFycmF5JzogJ3RhYnMnLCAvLyBBIHRhYmJlZCB2ZXJzaW9uIG9mIGFycmF5XHJcbiAgICAndGFiJzogJ3NlY3Rpb24nLCAvLyBBIHRhYiBncm91cCwgc2ltaWxhciB0byBhIGZpZWxkc2V0IG9yIHNlY3Rpb24gPGZpZWxkc2V0PlxyXG4gICAgJ3RhYnMnOiBUYWJzQ29tcG9uZW50LCAvLyBBIHRhYmJlZCBzZXQgb2YgcGFuZWxzIHdpdGggZGlmZmVyZW50IGNvbnRyb2xzXHJcbiAgICAnbWVzc2FnZSc6IE1lc3NhZ2VDb21wb25lbnQsIC8vIEluc2VydCBhcmJpdHJhcnkgaHRtbFxyXG4gICAgJ2hlbHAnOiAnbWVzc2FnZScsIC8vIEluc2VydCBhcmJpdHJhcnkgaHRtbFxyXG4gICAgJ21zZyc6ICdtZXNzYWdlJywgLy8gSW5zZXJ0IGFyYml0cmFyeSBodG1sXHJcbiAgICAnaHRtbCc6ICdtZXNzYWdlJywgLy8gSW5zZXJ0IGFyYml0cmFyeSBodG1sXHJcbiAgICAndGVtcGxhdGUnOiBUZW1wbGF0ZUNvbXBvbmVudCwgLy8gSW5zZXJ0IGEgY3VzdG9tIEFuZ3VsYXIgY29tcG9uZW50XHJcblxyXG4gIC8vIFdpZGdldHMgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBKU09OIEZvcm0gQVBJXHJcbiAgICAnYWR2YW5jZWRmaWVsZHNldCc6ICdzZWN0aW9uJywgLy8gQWRkcyAnQWR2YW5jZWQgc2V0dGluZ3MnIHRpdGxlIDxmaWVsZHNldD5cclxuICAgICdhdXRoZmllbGRzZXQnOiAnc2VjdGlvbicsIC8vIEFkZHMgJ0F1dGhlbnRpY2F0aW9uIHNldHRpbmdzJyB0aXRsZSA8ZmllbGRzZXQ+XHJcbiAgICAnb3B0aW9uZmllbGRzZXQnOiAnb25lLW9mJywgLy8gT3B0aW9uIGNvbnRyb2wsIGRpc3BsYXlzIHNlbGVjdGVkIHN1Yi1pdGVtIDxmaWVsZHNldD5cclxuICAgICdzZWxlY3RmaWVsZHNldCc6ICdvbmUtb2YnLCAvLyBTZWxlY3QgY29udHJvbCwgZGlzcGxheXMgc2VsZWN0ZWQgc3ViLWl0ZW0gPGZpZWxkc2V0PlxyXG4gICAgJ2NvbmRpdGlvbmFsJzogJ3NlY3Rpb24nLCAvLyBJZGVudGljYWwgdG8gJ3NlY3Rpb24nIChkZXBlY2lhdGVkKSA8ZGl2PlxyXG4gICAgJ2FjdGlvbnMnOiAnc2VjdGlvbicsIC8vIEhvcml6b250YWwgYnV0dG9uIGxpc3QsIGNhbiBvbmx5IHN1Ym1pdCwgdXNlcyBidXR0b25zIGFzIGl0ZW1zIDxkaXY+XHJcbiAgICAndGFnc2lucHV0JzogJ3NlY3Rpb24nLCAvLyBGb3IgZW50ZXJpbmcgc2hvcnQgdGV4dCB0YWdzIDxkaXY+XHJcbiAgICAvLyBTZWU6IGh0dHA6Ly91bGlvbi5naXRodWIuaW8vanNvbmZvcm0vcGxheWdyb3VuZC8/ZXhhbXBsZT1maWVsZHMtY2hlY2tib3hidXR0b25zXHJcblxyXG4gIC8vIFdpZGdldHMgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBSZWFjdCBKU09OIFNjaGVtYSBGb3JtIEFQSVxyXG4gICAgJ3VwZG93bic6ICdudW1iZXInLFxyXG4gICAgJ2RhdGUtdGltZSc6ICdkYXRldGltZS1sb2NhbCcsXHJcbiAgICAnYWx0LWRhdGV0aW1lJzogJ2RhdGV0aW1lLWxvY2FsJyxcclxuICAgICdhbHQtZGF0ZSc6ICdkYXRlJyxcclxuXHJcbiAgLy8gV2lkZ2V0cyBpbmNsdWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEFuZ3VsYXIgU2NoZW1hIEZvcm0gQVBJXHJcbiAgICAnd2l6YXJkJzogJ3NlY3Rpb24nLCAvLyBUT0RPOiBTZXF1ZW50aWFsIHBhbmVscyB3aXRoIFwiTmV4dFwiIGFuZCBcIlByZXZpb3VzXCIgYnV0dG9uc1xyXG5cclxuICAvLyBXaWRnZXRzIGluY2x1ZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzXHJcbiAgICAndGV4dGxpbmUnOiAndGV4dCcsXHJcblxyXG4gIC8vIFJlY29tbWVuZGVkIDNyZC1wYXJ0eSBhZGQtb24gd2lkZ2V0cyAoVE9ETzogY3JlYXRlIHdyYXBwZXJzIGZvciB0aGVzZS4uLilcclxuICAgIC8vICduZzItc2VsZWN0JzogU2VsZWN0IGNvbnRyb2wgcmVwbGFjZW1lbnQgLSBodHRwOi8vdmFsb3Itc29mdHdhcmUuY29tL25nMi1zZWxlY3QvXHJcbiAgICAvLyAnZmxhdHBpY2tyJzogRmxhdHBpY2tyIGRhdGUgcGlja2VyIC0gaHR0cHM6Ly9naXRodWIuY29tL2NobWxuL2ZsYXRwaWNrclxyXG4gICAgLy8gJ3Bpa2FkYXknOiBQaWthZGF5IGRhdGUgcGlja2VyIC0gaHR0cHM6Ly9naXRodWIuY29tL2RidXNoZWxsL1Bpa2FkYXlcclxuICAgIC8vICdzcGVjdHJ1bSc6IFNwZWN0cnVtIGNvbG9yIHBpY2tlciAtIGh0dHA6Ly9iZ3JpbnMuZ2l0aHViLmlvL3NwZWN0cnVtXHJcbiAgICAvLyAnYm9vdHN0cmFwLXNsaWRlcic6IEJvb3RzdHJhcCBTbGlkZXIgcmFuZ2UgY29udHJvbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWl5cmlhL2Jvb3RzdHJhcC1zbGlkZXJcclxuICAgIC8vICdhY2UnOiBBQ0UgY29kZSBlZGl0b3IgLSBodHRwczovL2FjZS5jOS5pb1xyXG4gICAgLy8gJ2NrZWRpdG9yJzogQ0tFZGl0b3IgSFRNTCAvIHJpY2ggdGV4dCBlZGl0b3IgLSBodHRwOi8vY2tlZGl0b3IuY29tXHJcbiAgICAvLyAndGlueW1jZSc6IFRpbnlNQ0UgSFRNTCAvIHJpY2ggdGV4dCBlZGl0b3IgLSBodHRwczovL3d3dy50aW55bWNlLmNvbVxyXG4gICAgLy8gJ2ltYWdlc2VsZWN0JzogQm9vdHN0cmFwIGRyb3AtZG93biBpbWFnZSBzZWxlY3RvciAtIGh0dHA6Ly9zaWx2aW9tb3JldG8uZ2l0aHViLmlvL2Jvb3RzdHJhcC1zZWxlY3RcclxuICAgIC8vICd3eXNpaHRtbDUnOiBIVE1MIGVkaXRvciAtIGh0dHA6Ly9qaG9sbGluZ3dvcnRoLmdpdGh1Yi5pby9ib290c3RyYXAtd3lzaWh0bWw1XHJcbiAgICAvLyAncXVpbGwnOiBRdWlsbCBIVE1MIC8gcmljaCB0ZXh0IGVkaXRvciAoPykgLSBodHRwczovL3F1aWxsanMuY29tXHJcbiAgfTtcclxuICByZWdpc3RlcmVkV2lkZ2V0czogYW55ID0geyB9O1xyXG4gIGZyYW1ld29ya1dpZGdldHM6IGFueSA9IHsgfTtcclxuICBhY3RpdmVXaWRnZXRzOiBhbnkgPSB7IH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zZXRBY3RpdmVXaWRnZXRzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVXaWRnZXRzKCk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5hY3RpdmVXaWRnZXRzID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgeyB9LCB0aGlzLndpZGdldExpYnJhcnksIHRoaXMuZnJhbWV3b3JrV2lkZ2V0cywgdGhpcy5yZWdpc3RlcmVkV2lkZ2V0c1xyXG4gICAgKTtcclxuICAgIGZvciAoY29uc3Qgd2lkZ2V0TmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZVdpZGdldHMpKSB7XHJcbiAgICAgIGxldCB3aWRnZXQ6IGFueSA9IHRoaXMuYWN0aXZlV2lkZ2V0c1t3aWRnZXROYW1lXTtcclxuICAgICAgLy8gUmVzb2x2ZSBhbGlhc2VzXHJcbiAgICAgIGlmICh0eXBlb2Ygd2lkZ2V0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IHVzZWRBbGlhc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIHdoaWxlICh0eXBlb2Ygd2lkZ2V0ID09PSAnc3RyaW5nJyAmJiAhdXNlZEFsaWFzZXMuaW5jbHVkZXMod2lkZ2V0KSkge1xyXG4gICAgICAgICAgdXNlZEFsaWFzZXMucHVzaCh3aWRnZXQpO1xyXG4gICAgICAgICAgd2lkZ2V0ID0gdGhpcy5hY3RpdmVXaWRnZXRzW3dpZGdldF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygd2lkZ2V0ICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVXaWRnZXRzW3dpZGdldE5hbWVdID0gd2lkZ2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0V2lkZ2V0KHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmhhc1dpZGdldCh0eXBlKSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHRoaXMuZGVmYXVsdFdpZGdldCA9IHR5cGU7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGhhc1dpZGdldCh0eXBlOiBzdHJpbmcsIHdpZGdldFNldCA9ICdhY3RpdmVXaWRnZXRzJyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHJldHVybiBoYXNPd24odGhpc1t3aWRnZXRTZXRdLCB0eXBlKTtcclxuICB9XHJcblxyXG4gIGhhc0RlZmF1bHRXaWRnZXQodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNXaWRnZXQodHlwZSwgJ3dpZGdldExpYnJhcnknKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyV2lkZ2V0KHR5cGU6IHN0cmluZywgd2lkZ2V0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdHlwZSB8fCAhd2lkZ2V0IHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHRoaXMucmVnaXN0ZXJlZFdpZGdldHNbdHlwZV0gPSB3aWRnZXQ7XHJcbiAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVXaWRnZXRzKCk7XHJcbiAgfVxyXG5cclxuICB1blJlZ2lzdGVyV2lkZ2V0KHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFoYXNPd24odGhpcy5yZWdpc3RlcmVkV2lkZ2V0cywgdHlwZSkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICBkZWxldGUgdGhpcy5yZWdpc3RlcmVkV2lkZ2V0c1t0eXBlXTtcclxuICAgIHJldHVybiB0aGlzLnNldEFjdGl2ZVdpZGdldHMoKTtcclxuICB9XHJcblxyXG4gIHVuUmVnaXN0ZXJBbGxXaWRnZXRzKHVuUmVnaXN0ZXJGcmFtZXdvcmtXaWRnZXRzID0gdHJ1ZSk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWdpc3RlcmVkV2lkZ2V0cyA9IHsgfTtcclxuICAgIGlmICh1blJlZ2lzdGVyRnJhbWV3b3JrV2lkZ2V0cykgeyB0aGlzLmZyYW1ld29ya1dpZGdldHMgPSB7IH07IH1cclxuICAgIHJldHVybiB0aGlzLnNldEFjdGl2ZVdpZGdldHMoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyRnJhbWV3b3JrV2lkZ2V0cyh3aWRnZXRzOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh3aWRnZXRzID09PSBudWxsIHx8IHR5cGVvZiB3aWRnZXRzICE9PSAnb2JqZWN0JykgeyB3aWRnZXRzID0geyB9OyB9XHJcbiAgICB0aGlzLmZyYW1ld29ya1dpZGdldHMgPSB3aWRnZXRzO1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0QWN0aXZlV2lkZ2V0cygpO1xyXG4gIH1cclxuXHJcbiAgdW5SZWdpc3RlckZyYW1ld29ya1dpZGdldHMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5mcmFtZXdvcmtXaWRnZXRzKS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5mcmFtZXdvcmtXaWRnZXRzID0geyB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVXaWRnZXRzKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRXaWRnZXQodHlwZT86IHN0cmluZywgd2lkZ2V0U2V0ID0gJ2FjdGl2ZVdpZGdldHMnKTogYW55IHtcclxuICAgIGlmICh0aGlzLmhhc1dpZGdldCh0eXBlLCB3aWRnZXRTZXQpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzW3dpZGdldFNldF1bdHlwZV07XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzV2lkZ2V0KHRoaXMuZGVmYXVsdFdpZGdldCwgd2lkZ2V0U2V0KSkge1xyXG4gICAgICByZXR1cm4gdGhpc1t3aWRnZXRTZXRdW3RoaXMuZGVmYXVsdFdpZGdldF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFsbFdpZGdldHMoKTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldExpYnJhcnk6IHRoaXMud2lkZ2V0TGlicmFyeSxcclxuICAgICAgcmVnaXN0ZXJlZFdpZGdldHM6IHRoaXMucmVnaXN0ZXJlZFdpZGdldHMsXHJcbiAgICAgIGZyYW1ld29ya1dpZGdldHM6IHRoaXMuZnJhbWV3b3JrV2lkZ2V0cyxcclxuICAgICAgYWN0aXZlV2lkZ2V0czogdGhpcy5hY3RpdmVXaWRnZXRzLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19