@eqproject/eqp-dynamic-module 0.0.12 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/eqproject-eqp-dynamic-module.mjs +5 -0
- package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +249 -0
- package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +659 -0
- package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +585 -0
- package/esm2020/lib/components/private/dynamic-module-field/dynamic-module-field.component.mjs +130 -0
- package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +127 -0
- package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +163 -0
- package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +57 -0
- package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +67 -0
- package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +188 -0
- package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +117 -0
- package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +70 -0
- package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +65 -0
- package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +49 -0
- package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +126 -0
- package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +212 -0
- package/esm2020/lib/components/private/spinner/spinner.component.mjs +19 -0
- package/esm2020/lib/eqp-dynamic-module.module.mjs +110 -0
- package/esm2020/lib/interfaces/iBaseFieldComponent.interface.mjs +2 -0
- package/esm2020/lib/interfaces/iRootObject.interface.mjs +2 -0
- package/esm2020/lib/models/baseField.model.mjs +36 -0
- package/esm2020/lib/models/baseObj.model.mjs +9 -0
- package/esm2020/lib/models/context.model.mjs +8 -0
- package/esm2020/lib/models/endPointConfiguration.model.mjs +23 -0
- package/esm2020/lib/models/entity.model.mjs +7 -0
- package/esm2020/lib/models/fields/attachmentField.model.mjs +22 -0
- package/esm2020/lib/models/fields/booleanField.model.mjs +12 -0
- package/esm2020/lib/models/fields/dateField.model.mjs +11 -0
- package/esm2020/lib/models/fields/imageField.model.mjs +8 -0
- package/esm2020/lib/models/fields/listValueField.model.mjs +14 -0
- package/esm2020/lib/models/fields/lookupField.model.mjs +5 -0
- package/esm2020/lib/models/fields/numericField.model.mjs +5 -0
- package/esm2020/lib/models/fields/textField.model.mjs +14 -0
- package/esm2020/lib/models/fields/textareaField.model.mjs +4 -0
- package/esm2020/lib/models/form.model.mjs +24 -0
- package/esm2020/lib/models/record.model.mjs +8 -0
- package/esm2020/lib/modules/material.module.mjs +231 -0
- package/esm2020/lib/services/custom-form-validators.service.mjs +19 -0
- package/esm2020/lib/services/eqp-dynamic-module-dialog.service.mjs +112 -0
- package/esm2020/lib/services/spinner.service.mjs +43 -0
- package/esm2020/lib/services/utilityHelper.services.mjs +379 -0
- package/esm2020/public-api.mjs +41 -0
- package/fesm2015/eqproject-eqp-dynamic-module.mjs +3783 -0
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -0
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +3779 -0
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +3 -0
- package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +12 -4
- package/lib/components/private/add-form-field/add-form-field.component.d.ts +8 -3
- package/lib/components/private/dynamic-module-field/dynamic-module-field.component.d.ts +3 -0
- package/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.d.ts +58 -0
- package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +5 -2
- package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +3 -0
- package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +3 -0
- package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +5 -2
- package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +3 -0
- package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +3 -0
- package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +4 -1
- package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +3 -0
- package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +7 -4
- package/lib/components/private/form-records/list-form-record/list-form-record.component.d.ts +3 -0
- package/lib/components/private/spinner/spinner.component.d.ts +3 -0
- package/lib/eqp-dynamic-module.module.d.ts +30 -0
- package/lib/models/baseField.model.d.ts +2 -2
- package/lib/modules/material.module.d.ts +35 -0
- package/lib/services/eqp-dynamic-module-dialog.service.d.ts +3 -0
- package/lib/services/spinner.service.d.ts +3 -0
- package/lib/services/utilityHelper.services.d.ts +6 -3
- package/package.json +37 -26
- package/bundles/eqproject-eqp-dynamic-module.umd.js +0 -3997
- package/bundles/eqproject-eqp-dynamic-module.umd.js.map +0 -1
- package/bundles/eqproject-eqp-dynamic-module.umd.min.js +0 -17
- package/bundles/eqproject-eqp-dynamic-module.umd.min.js.map +0 -1
- package/eqproject-eqp-dynamic-module.d.ts +0 -6
- package/eqproject-eqp-dynamic-module.metadata.json +0 -1
- package/esm2015/eqproject-eqp-dynamic-module.js +0 -7
- package/esm2015/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +0 -265
- package/esm2015/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +0 -652
- package/esm2015/lib/components/private/add-form-field/add-form-field.component.js +0 -577
- package/esm2015/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +0 -127
- package/esm2015/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +0 -170
- package/esm2015/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +0 -56
- package/esm2015/lib/components/private/field-templates/date-field-template/date-field-template.component.js +0 -71
- package/esm2015/lib/components/private/field-templates/image-field-template/image-field-template.component.js +0 -196
- package/esm2015/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +0 -115
- package/esm2015/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +0 -71
- package/esm2015/lib/components/private/field-templates/text-field-template/text-field-template.component.js +0 -67
- package/esm2015/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +0 -51
- package/esm2015/lib/components/private/form-records/add-form-record/add-form-record.component.js +0 -130
- package/esm2015/lib/components/private/form-records/list-form-record/list-form-record.component.js +0 -216
- package/esm2015/lib/components/private/spinner/spinner.component.js +0 -23
- package/esm2015/lib/eqp-dynamic-module.module.js +0 -69
- package/esm2015/lib/interfaces/iBaseFieldComponent.interface.js +0 -1
- package/esm2015/lib/interfaces/iRootObject.interface.js +0 -1
- package/esm2015/lib/models/baseField.model.js +0 -36
- package/esm2015/lib/models/baseObj.model.js +0 -9
- package/esm2015/lib/models/context.model.js +0 -8
- package/esm2015/lib/models/endPointConfiguration.model.js +0 -23
- package/esm2015/lib/models/entity.model.js +0 -7
- package/esm2015/lib/models/fields/attachmentField.model.js +0 -22
- package/esm2015/lib/models/fields/booleanField.model.js +0 -12
- package/esm2015/lib/models/fields/dateField.model.js +0 -11
- package/esm2015/lib/models/fields/imageField.model.js +0 -8
- package/esm2015/lib/models/fields/listValueField.model.js +0 -14
- package/esm2015/lib/models/fields/lookupField.model.js +0 -5
- package/esm2015/lib/models/fields/numericField.model.js +0 -5
- package/esm2015/lib/models/fields/textField.model.js +0 -14
- package/esm2015/lib/models/fields/textareaField.model.js +0 -4
- package/esm2015/lib/models/form.model.js +0 -24
- package/esm2015/lib/models/record.model.js +0 -8
- package/esm2015/lib/modules/material.module.js +0 -108
- package/esm2015/lib/services/custom-form-validators.service.js +0 -19
- package/esm2015/lib/services/eqp-dynamic-module-dialog.service.js +0 -113
- package/esm2015/lib/services/spinner.service.js +0 -43
- package/esm2015/lib/services/utilityHelper.services.js +0 -387
- package/esm2015/public-api.js +0 -39
- package/esm5/eqproject-eqp-dynamic-module.js +0 -7
- package/esm5/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +0 -272
- package/esm5/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +0 -667
- package/esm5/lib/components/private/add-form-field/add-form-field.component.js +0 -588
- package/esm5/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +0 -128
- package/esm5/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +0 -173
- package/esm5/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +0 -57
- package/esm5/lib/components/private/field-templates/date-field-template/date-field-template.component.js +0 -72
- package/esm5/lib/components/private/field-templates/image-field-template/image-field-template.component.js +0 -206
- package/esm5/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +0 -119
- package/esm5/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +0 -72
- package/esm5/lib/components/private/field-templates/text-field-template/text-field-template.component.js +0 -68
- package/esm5/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +0 -52
- package/esm5/lib/components/private/form-records/add-form-record/add-form-record.component.js +0 -133
- package/esm5/lib/components/private/form-records/list-form-record/list-form-record.component.js +0 -220
- package/esm5/lib/components/private/spinner/spinner.component.js +0 -24
- package/esm5/lib/eqp-dynamic-module.module.js +0 -72
- package/esm5/lib/interfaces/iBaseFieldComponent.interface.js +0 -1
- package/esm5/lib/interfaces/iRootObject.interface.js +0 -1
- package/esm5/lib/models/baseField.model.js +0 -43
- package/esm5/lib/models/baseObj.model.js +0 -13
- package/esm5/lib/models/context.model.js +0 -14
- package/esm5/lib/models/endPointConfiguration.model.js +0 -33
- package/esm5/lib/models/entity.model.js +0 -14
- package/esm5/lib/models/fields/attachmentField.model.js +0 -29
- package/esm5/lib/models/fields/booleanField.model.js +0 -19
- package/esm5/lib/models/fields/dateField.model.js +0 -18
- package/esm5/lib/models/fields/imageField.model.js +0 -19
- package/esm5/lib/models/fields/listValueField.model.js +0 -25
- package/esm5/lib/models/fields/lookupField.model.js +0 -12
- package/esm5/lib/models/fields/numericField.model.js +0 -12
- package/esm5/lib/models/fields/textField.model.js +0 -21
- package/esm5/lib/models/fields/textareaField.model.js +0 -11
- package/esm5/lib/models/form.model.js +0 -39
- package/esm5/lib/models/record.model.js +0 -14
- package/esm5/lib/modules/material.module.js +0 -111
- package/esm5/lib/services/custom-form-validators.service.js +0 -23
- package/esm5/lib/services/eqp-dynamic-module-dialog.service.js +0 -123
- package/esm5/lib/services/spinner.service.js +0 -46
- package/esm5/lib/services/utilityHelper.services.js +0 -396
- package/esm5/public-api.js +0 -39
- package/fesm2015/eqproject-eqp-dynamic-module.js +0 -3586
- package/fesm2015/eqproject-eqp-dynamic-module.js.map +0 -1
- package/fesm5/eqproject-eqp-dynamic-module.js +0 -3772
- package/fesm5/eqproject-eqp-dynamic-module.js.map +0 -1
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { HttpClient } from "@angular/common/http";
|
|
3
|
-
import { Injectable } from "@angular/core";
|
|
4
|
-
import { AbstractControl, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from "@angular/forms";
|
|
5
|
-
import { ColSpanSizesEnum, FieldTypeEnum } from "../models/baseField.model";
|
|
6
|
-
import { Context } from "../models/context.model";
|
|
7
|
-
import { EndPointConfiguration, ParamTypeEnum, RequestMethodEnum } from "../models/endPointConfiguration.model";
|
|
8
|
-
import { TextMaskEnum, TextField, UrlRegex, TelRegex } from "../models/fields/textField.model";
|
|
9
|
-
import { ArrayValidators } from "./custom-form-validators.service";
|
|
10
|
-
import { EqpDynamicModuleDialogService } from "./eqp-dynamic-module-dialog.service";
|
|
11
|
-
import { SpinnerService } from "./spinner.service";
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/forms";
|
|
14
|
-
import * as i2 from "@angular/common/http";
|
|
15
|
-
import * as i3 from "./spinner.service";
|
|
16
|
-
var UtilityHelperService = /** @class */ (function () {
|
|
17
|
-
function UtilityHelperService(formBuilder, http, spinnerService) {
|
|
18
|
-
this.formBuilder = formBuilder;
|
|
19
|
-
this.http = http;
|
|
20
|
-
this.spinnerService = spinnerService;
|
|
21
|
-
}
|
|
22
|
-
UtilityHelperService_1 = UtilityHelperService;
|
|
23
|
-
UtilityHelperService.EvaluateFieldFormula = function (formula, rec, ctx) {
|
|
24
|
-
var evaluatedValue = eval(formula);
|
|
25
|
-
return (evaluatedValue ? evaluatedValue : null);
|
|
26
|
-
};
|
|
27
|
-
UtilityHelperService.SetContext = function (ctx) {
|
|
28
|
-
this.context = ctx;
|
|
29
|
-
};
|
|
30
|
-
UtilityHelperService.GetFieldType = function (field) {
|
|
31
|
-
switch (field.FieldType) {
|
|
32
|
-
case FieldTypeEnum["Campo di testo"]: {
|
|
33
|
-
var t = Object.assign(new TextField, field);
|
|
34
|
-
return t;
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
default: {
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Metodo per impostare i valori da suggerire nell'autocomplete per i campi in cui l'utente deve scrivere comandi javascript.
|
|
44
|
-
* In base all'ultimo carattere digitato viene impostato un elenco di oggetti o proprietà che l'utente ha a disposizione in quel momento.
|
|
45
|
-
* @param fields Array di BaseField aggiunti alla Form
|
|
46
|
-
* @param typedFormula Stringa digitata dall'utente
|
|
47
|
-
* @summary Il metodo imposta i suggerimenti basandosi su 3 casi:
|
|
48
|
-
* 1) l'utente non ha digitato nulla o la stringa digitata dall'utente finisce con uno spazio vuoto
|
|
49
|
-
* 2) la stringa digitata dall'utente finisce con un "."
|
|
50
|
-
* 3) la stringa digitata dall'utente non coincide con nessun altro caso sopra (finisce con un carattere qualunque)
|
|
51
|
-
*/
|
|
52
|
-
UtilityHelperService.GetAutocompleteOptions = function (fields, typedFormula) {
|
|
53
|
-
var autocompleteOptions = [];
|
|
54
|
-
// Recupero i nomi di tutti i campi creati fino ad ora nella form.
|
|
55
|
-
var availableRecProperties = fields.map(function (f) { return f.Label.split(' ').join('_'); });
|
|
56
|
-
// Nel casi in cui l'utente non ha inserito nulla oppure la stringa finisce con uno spazio vuoto o un simbolo diverso da "."
|
|
57
|
-
// (un carattere non alfanumerico) imposto come suggerimenti solo "rec" e "ctx", ovvero gli unici due oggetti a cui l'utente ha accesso.
|
|
58
|
-
if (!typedFormula ||
|
|
59
|
-
(!typedFormula.endsWith(".")
|
|
60
|
-
&& new RegExp("[^0-9a-zA-Z_]").test(typedFormula.substring(typedFormula.length - 1, typedFormula.length)))) {
|
|
61
|
-
autocompleteOptions = [
|
|
62
|
-
{ label: "rec", value: (typedFormula ? typedFormula : '') + "rec" },
|
|
63
|
-
{ label: "ctx", value: (typedFormula ? typedFormula : '') + "ctx" }
|
|
64
|
-
];
|
|
65
|
-
}
|
|
66
|
-
// Se la stringa finisce con un "." vuol dire che l'utente sta cercando di accedere ad una proprietà di un oggetto
|
|
67
|
-
// a sua disposizione. Recupero il nome dell'ultimo oggetto digitato dall'utente e se l'oggetto scelto è "rec" o "ctx"
|
|
68
|
-
// allora suggerisco le proprietà che esistono all'interno di questi oggetti altrimenti non mostro nulla.
|
|
69
|
-
else if (typedFormula.endsWith(".")) {
|
|
70
|
-
var formulaPieces = typedFormula.split(" ")[typedFormula.split(" ").length - 1].split('.');
|
|
71
|
-
if (formulaPieces[formulaPieces.length - 2] === "rec") {
|
|
72
|
-
autocompleteOptions = availableRecProperties.map(function (f) { return { label: f, value: typedFormula + f }; });
|
|
73
|
-
}
|
|
74
|
-
else if (formulaPieces[formulaPieces.length - 2] === "ctx") {
|
|
75
|
-
autocompleteOptions = Object.keys(UtilityHelperService_1.context).map(function (f) { return { label: f, value: typedFormula + f }; });
|
|
76
|
-
}
|
|
77
|
-
else if (formulaPieces.length > 2 && formulaPieces[formulaPieces.length - 3] === "ctx" && formulaPieces[formulaPieces.length - 2] === "User") {
|
|
78
|
-
autocompleteOptions = Object.keys(UtilityHelperService_1.context.User).map(function (f) { return { label: f, value: typedFormula + f }; });
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
autocompleteOptions = [];
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// In tutti gli altri casi, ovvero quando la stringa digitata finisce con un carattere diverso da quelli
|
|
85
|
-
// controllati finora, vuol dire che l'utente sta digitanto il nome di un oggetto, una proprietà o una
|
|
86
|
-
// funzione javascript. Controllo la parola che l'utente sta digitando e se fa parte di uno degli oggetti a disposizione
|
|
87
|
-
// o una proprietà di essi allora suggerisco i possibili match.
|
|
88
|
-
else {
|
|
89
|
-
var availableOptions_1 = [];
|
|
90
|
-
// Prendo tutti i blocchi di caratteri digitati dall'utente
|
|
91
|
-
var allFormulaWords = typedFormula.split(" ");
|
|
92
|
-
// Prendo l'ultimo blocco di caratteri digitato dall'utente
|
|
93
|
-
var lastTypedString = allFormulaWords[allFormulaWords.length - 1];
|
|
94
|
-
// Se la l'ultima stringa digitata non contiene caratteri speciali allora splitto la stringa
|
|
95
|
-
// sui "." e imposto i suggerimenti in base al path della prorpietà che si sta digitando.
|
|
96
|
-
if (!new RegExp("[^0-9a-zA-Z_.]").test(lastTypedString)) {
|
|
97
|
-
var propertyPath = lastTypedString.split(".");
|
|
98
|
-
var lastTypedWork_1 = propertyPath[propertyPath.length - 1];
|
|
99
|
-
var propertiesToCheck = [];
|
|
100
|
-
if (propertyPath.length == 1) {
|
|
101
|
-
propertiesToCheck = ["rec", "ctx"];
|
|
102
|
-
}
|
|
103
|
-
else if (propertyPath.length > 1 && propertyPath[propertyPath.length - 2] === "ctx") {
|
|
104
|
-
propertiesToCheck = Object.keys(UtilityHelperService_1.context);
|
|
105
|
-
}
|
|
106
|
-
else if (propertyPath.length > 2 && propertyPath[propertyPath.length - 3] === "ctx" && propertyPath[propertyPath.length - 2] === "User") {
|
|
107
|
-
propertiesToCheck = Object.keys(UtilityHelperService_1.context.User);
|
|
108
|
-
}
|
|
109
|
-
else if (propertyPath.length > 1 && propertyPath[propertyPath.length - 2] === "rec") {
|
|
110
|
-
propertiesToCheck = availableRecProperties;
|
|
111
|
-
}
|
|
112
|
-
// Eseguo il controllo sulle proprietà recuperate, aggiungo ai suggerimenti tutti i nomi che iniziano con
|
|
113
|
-
// quello che sta digitando l'utente.
|
|
114
|
-
propertiesToCheck.forEach(function (prop) {
|
|
115
|
-
if (prop.startsWith(lastTypedWork_1)) {
|
|
116
|
-
availableOptions_1.push({ label: prop, value: typedFormula + prop.substring(lastTypedWork_1.length, prop.length) });
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
autocompleteOptions = availableOptions_1;
|
|
121
|
-
}
|
|
122
|
-
return autocompleteOptions;
|
|
123
|
-
};
|
|
124
|
-
/**
|
|
125
|
-
* Metodo invocato dall'html per impostare le classi css per visualizzare il campo all'interno della form.
|
|
126
|
-
* Se per il field sono state specificate delle classi allora vengono applcate quelle, altrimenti vengono usate
|
|
127
|
-
* delle classi di default.
|
|
128
|
-
* @param field BaseField da visualizzare.
|
|
129
|
-
* @returns Restituisce una stringa contenente le classi css da applicare.
|
|
130
|
-
*/
|
|
131
|
-
UtilityHelperService.prototype.getFieldSyleClass = function (field) {
|
|
132
|
-
if (field.ColSpanSizes && field.ColSpanSizes.length > 0)
|
|
133
|
-
return field.ColSpanSizes.map(function (size) { return ColSpanSizesEnum[size].toString(); }).join(" ");
|
|
134
|
-
switch (field.FieldType) {
|
|
135
|
-
case FieldTypeEnum["Campo di testo"]:
|
|
136
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
137
|
-
case FieldTypeEnum["Area di testo"]:
|
|
138
|
-
return "col-sm-12 col-md-12 col-lg-12";
|
|
139
|
-
case FieldTypeEnum["Booleano"]:
|
|
140
|
-
return "col-sm-12 col-md-4 col-lg-4 d-flex align-items-center";
|
|
141
|
-
case FieldTypeEnum["Data e/o ora"]:
|
|
142
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
143
|
-
case FieldTypeEnum["Campo numerico"]:
|
|
144
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
145
|
-
case FieldTypeEnum["Allegato"]:
|
|
146
|
-
if (field.IsMultiAttach ||
|
|
147
|
-
(field.MetadataFields && field.MetadataFields.length > 0)) {
|
|
148
|
-
return "col-sm-12 col-md-12 col-lg-12";
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
152
|
-
}
|
|
153
|
-
case FieldTypeEnum["Immagine"]:
|
|
154
|
-
if (field.AttachDefinition.IsMultiAttach ||
|
|
155
|
-
(field.AttachDefinition.MetadataFields && field.AttachDefinition.MetadataFields.length > 0)) {
|
|
156
|
-
return "col-sm-12 col-md-12 col-lg-12";
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
160
|
-
}
|
|
161
|
-
case FieldTypeEnum["Elenco generico"]:
|
|
162
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
163
|
-
case FieldTypeEnum["Lookup"]:
|
|
164
|
-
return "col-sm-12 col-md-4 col-lg-4";
|
|
165
|
-
case FieldTypeEnum['Form di dettaglio']:
|
|
166
|
-
return "col-sm-12 col-md-12 col-lg-12";
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
/**
|
|
170
|
-
* Metodo per creare il FormGroup che rappresenta una Form a partire dai suoi BaseField.
|
|
171
|
-
* @param formFields Lista dei BaseField che compongono la form.
|
|
172
|
-
* @param record Oggetto di tipo Record che contiene i valori dei campi.
|
|
173
|
-
* @param onlyView Se TRUE disabilita la form per renderla in sola lettura.
|
|
174
|
-
* @param includeCurrentFormInField Se TRUE popola la proprietà FormFormGroup all'interno di ogni BaseField con il FormGroup corrente.
|
|
175
|
-
* @returns Restituisce un FormGroup rappresentate la Form a cui appartengono i BaseField ricevuti in input.
|
|
176
|
-
*/
|
|
177
|
-
UtilityHelperService.prototype.CreateFormFormGroup = function (formFields, record, onlyView, includeCurrentFormInField) {
|
|
178
|
-
var _this = this;
|
|
179
|
-
if (onlyView === void 0) { onlyView = false; }
|
|
180
|
-
if (includeCurrentFormInField === void 0) { includeCurrentFormInField = true; }
|
|
181
|
-
var formForm = this.formBuilder.group([]);
|
|
182
|
-
formFields.forEach(function (field) {
|
|
183
|
-
formForm.addControl(field.Name, _this.createFieldFormControl(field, record));
|
|
184
|
-
if (includeCurrentFormInField) {
|
|
185
|
-
field.FormFormGroup = formForm;
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
if (onlyView) {
|
|
189
|
-
formForm.disable();
|
|
190
|
-
}
|
|
191
|
-
return formForm;
|
|
192
|
-
};
|
|
193
|
-
/**
|
|
194
|
-
* Funzione per creare e aggiungere al FormGroup rappresentante la form un nuovo FormControl a partire da un Field.
|
|
195
|
-
* In nuovo FormControl avrà il nome del campo passato e verranno impostati i Validators in base al tipo del campo stesso.
|
|
196
|
-
* @param field BaseField per cui creare il FormControl da inserire nel FormGroup dela form.
|
|
197
|
-
*/
|
|
198
|
-
UtilityHelperService.prototype.createFieldFormControl = function (field, record) {
|
|
199
|
-
var validators = [];
|
|
200
|
-
if (field.Required)
|
|
201
|
-
validators.push(Validators.required);
|
|
202
|
-
switch (field.FieldType) {
|
|
203
|
-
case FieldTypeEnum["Campo di testo"]:
|
|
204
|
-
if (field.MaxLenght) {
|
|
205
|
-
validators.push(Validators.maxLength(field.MaxLenght));
|
|
206
|
-
}
|
|
207
|
-
if (field.MinLenght) {
|
|
208
|
-
validators.push(Validators.minLength(field.MinLenght));
|
|
209
|
-
}
|
|
210
|
-
switch (field.TextMask) {
|
|
211
|
-
case TextMaskEnum.Url:
|
|
212
|
-
validators.push(Validators.pattern(UrlRegex));
|
|
213
|
-
break;
|
|
214
|
-
case TextMaskEnum.Email:
|
|
215
|
-
validators.push(Validators.email);
|
|
216
|
-
break;
|
|
217
|
-
case TextMaskEnum.Telefono:
|
|
218
|
-
validators.push(Validators.pattern(TelRegex));
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
break;
|
|
222
|
-
case FieldTypeEnum["Area di testo"]:
|
|
223
|
-
if (field.MaxLenght) {
|
|
224
|
-
validators.push(Validators.maxLength(field.MaxLenght));
|
|
225
|
-
}
|
|
226
|
-
if (field.MinLenght) {
|
|
227
|
-
validators.push(Validators.minLength(field.MinLenght));
|
|
228
|
-
}
|
|
229
|
-
break;
|
|
230
|
-
case FieldTypeEnum.Allegato:
|
|
231
|
-
case FieldTypeEnum.Immagine:
|
|
232
|
-
if (field.Required)
|
|
233
|
-
validators.push(ArrayValidators.minLenght(1));
|
|
234
|
-
break;
|
|
235
|
-
case FieldTypeEnum['Elenco generico']:
|
|
236
|
-
if (field.IsMultiChoiche)
|
|
237
|
-
if (field.Required)
|
|
238
|
-
validators.push(ArrayValidators.minLenght(1));
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
return new FormControl(record[field.Name], validators);
|
|
242
|
-
};
|
|
243
|
-
/**
|
|
244
|
-
* Metodo per configurare gli endpoint da usare di default a partire dall'url base del server
|
|
245
|
-
* a cui si deve connettere e al token da passare per autenticarsi.
|
|
246
|
-
* @param baseServerUrl Stringa dell'url base del server (es: "http://localhost:5000").
|
|
247
|
-
* @param userToken Token dell'utente loggato da usare per autenticarsi se necessario.
|
|
248
|
-
* @returns Resituisce la configurazione completa degli endPoint da usare di default.
|
|
249
|
-
*/
|
|
250
|
-
UtilityHelperService.prototype.ConfigureDefaultEndPoints = function (baseServerUrl, userToken) {
|
|
251
|
-
var endPointConfiguration = new EndPointConfiguration();
|
|
252
|
-
endPointConfiguration = new EndPointConfiguration();
|
|
253
|
-
endPointConfiguration.Records = {
|
|
254
|
-
GetByFormIDEndPoint: {
|
|
255
|
-
Url: baseServerUrl + "/api/v1/getall",
|
|
256
|
-
Token: userToken,
|
|
257
|
-
RequestMethod: RequestMethodEnum.GET,
|
|
258
|
-
},
|
|
259
|
-
GetByIDEndPoint: {
|
|
260
|
-
Url: baseServerUrl + "/api/v1/getByID",
|
|
261
|
-
Token: userToken,
|
|
262
|
-
RequestMethod: RequestMethodEnum.GET,
|
|
263
|
-
},
|
|
264
|
-
SaveEndPoint: {
|
|
265
|
-
Url: baseServerUrl + "/api/v1/save",
|
|
266
|
-
Token: userToken,
|
|
267
|
-
RequestMethod: RequestMethodEnum.POST,
|
|
268
|
-
},
|
|
269
|
-
DuplicateEndPoint: {
|
|
270
|
-
Url: baseServerUrl + "/api/v1/duplicate",
|
|
271
|
-
Token: userToken,
|
|
272
|
-
RequestMethod: RequestMethodEnum.POST,
|
|
273
|
-
},
|
|
274
|
-
DeleteEndPoint: {
|
|
275
|
-
Url: baseServerUrl + "/api/v1/delete",
|
|
276
|
-
Token: userToken,
|
|
277
|
-
RequestMethod: RequestMethodEnum.DELETE,
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
endPointConfiguration.Forms = {
|
|
281
|
-
GetByIDEndPoint: {
|
|
282
|
-
Url: baseServerUrl + "/api/conf/form",
|
|
283
|
-
Token: userToken,
|
|
284
|
-
RequestMethod: RequestMethodEnum.GET,
|
|
285
|
-
},
|
|
286
|
-
SaveEndPoint: {
|
|
287
|
-
Url: baseServerUrl + "/api/conf/form",
|
|
288
|
-
Token: userToken,
|
|
289
|
-
RequestMethod: RequestMethodEnum.POST,
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
return endPointConfiguration;
|
|
293
|
-
};
|
|
294
|
-
/**
|
|
295
|
-
* Metodo che data la configurazione di un endpoint costruisce l'url da chiamare, gli eventuali parametri
|
|
296
|
-
* da passare (nel body o nella rotta) ed effettua la chiamata. Al termine della chiamata esegue le eventuali
|
|
297
|
-
* funzioni di callback (sia in caso di successo che in caso di errore) passate in input.
|
|
298
|
-
* @param endPointData Cofigurazione dell'endpoint da chiamare.
|
|
299
|
-
* @param dynamicModuleParams Array dei parametri aggiunti dal modulo dinamico a quelli già configurati
|
|
300
|
-
* (ad esempio il record o la form da salvare oppure l'ID per recuperare una particolare entità).
|
|
301
|
-
* @param callback Metodo da eseguire in caso di successo dopo la chiamata http.
|
|
302
|
-
* NOTA: in input viene passata la risposta della chiamata stessa.
|
|
303
|
-
* @param errorCallBack Metodo da eseguire in caso di errore dopo la chiamata http.
|
|
304
|
-
* NOTA: in input viene passato l'errore generato della chiamata stessa.
|
|
305
|
-
*/
|
|
306
|
-
UtilityHelperService.prototype.RunEndPointCall = function (endPointData, dynamicModuleParams, callback, errorCallBack) {
|
|
307
|
-
var _this = this;
|
|
308
|
-
if (dynamicModuleParams === void 0) { dynamicModuleParams = null; }
|
|
309
|
-
if (callback === void 0) { callback = null; }
|
|
310
|
-
if (errorCallBack === void 0) { errorCallBack = null; }
|
|
311
|
-
this.spinnerService.addRequestCounter();
|
|
312
|
-
var url = "" + endPointData.Url;
|
|
313
|
-
var queryParams = null;
|
|
314
|
-
var bodyParams = {
|
|
315
|
-
AdditionalParams: {}
|
|
316
|
-
};
|
|
317
|
-
// Se nella configurazione sono stati definiti parametri da aggiungere alla chiamata questi vengono ciclati
|
|
318
|
-
// e aggiunti nel punto in cui devono essere usati.
|
|
319
|
-
if (endPointData.Params) {
|
|
320
|
-
endPointData.Params.forEach(function (p) {
|
|
321
|
-
switch (p.ParamType) {
|
|
322
|
-
case ParamTypeEnum['Query param']: {
|
|
323
|
-
var stringParam = p.ParamName + "=" + p.ParamValue;
|
|
324
|
-
queryParams = (queryParams == null ? "" : queryParams + "&") + stringParam;
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
case ParamTypeEnum['In route']: {
|
|
328
|
-
url = url + (url.endsWith("/") ? "" : "/") + p.ParamValue;
|
|
329
|
-
break;
|
|
330
|
-
}
|
|
331
|
-
case ParamTypeEnum['In Body']: {
|
|
332
|
-
bodyParams.AdditionalParams[p.ParamName] = p.ParamValue;
|
|
333
|
-
break;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
// Se sono stati passati parametri da aggiungere alla chiamata definiti all'interno del modulo dinamico
|
|
339
|
-
// vengono ciclati e aggiunti nel punto in cui devono essere usati dopo quelli definiti nella configurazione.
|
|
340
|
-
if (dynamicModuleParams) {
|
|
341
|
-
dynamicModuleParams.forEach(function (p) {
|
|
342
|
-
switch (p.ParamType) {
|
|
343
|
-
case ParamTypeEnum['Query param']: {
|
|
344
|
-
var stringParam = p.ParamName + "=" + p.ParamValue;
|
|
345
|
-
queryParams = (queryParams == null ? "" : queryParams + "&") + stringParam;
|
|
346
|
-
break;
|
|
347
|
-
}
|
|
348
|
-
case ParamTypeEnum['In route']: {
|
|
349
|
-
url = url + (url.endsWith("/") ? "" : "/") + p.ParamValue;
|
|
350
|
-
break;
|
|
351
|
-
}
|
|
352
|
-
case ParamTypeEnum['In Body']: {
|
|
353
|
-
bodyParams[p.ParamName] = p.ParamValue;
|
|
354
|
-
break;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
if (queryParams != null) {
|
|
360
|
-
url = (url.endsWith("/") ? url.substring(0, url.length - 1) : url) + "?" + queryParams;
|
|
361
|
-
}
|
|
362
|
-
this.http.request(endPointData.RequestMethod, url, {
|
|
363
|
-
headers: endPointData.Token ? { Authorization: endPointData.Token } : null,
|
|
364
|
-
body: ![RequestMethodEnum.DELETE, RequestMethodEnum.GET].includes(endPointData.RequestMethod) ? bodyParams : null
|
|
365
|
-
})
|
|
366
|
-
.subscribe(function (res) {
|
|
367
|
-
_this.spinnerService.removeRequestCounter();
|
|
368
|
-
if (callback) {
|
|
369
|
-
callback(res);
|
|
370
|
-
}
|
|
371
|
-
}, function (error) {
|
|
372
|
-
_this.spinnerService.removeRequestCounter();
|
|
373
|
-
if (errorCallBack) {
|
|
374
|
-
errorCallBack(error);
|
|
375
|
-
}
|
|
376
|
-
EqpDynamicModuleDialogService.Error(error.message);
|
|
377
|
-
throw new Error(error.message);
|
|
378
|
-
});
|
|
379
|
-
};
|
|
380
|
-
var UtilityHelperService_1;
|
|
381
|
-
UtilityHelperService.context = new Context();
|
|
382
|
-
UtilityHelperService.ctorParameters = function () { return [
|
|
383
|
-
{ type: FormBuilder },
|
|
384
|
-
{ type: HttpClient },
|
|
385
|
-
{ type: SpinnerService }
|
|
386
|
-
]; };
|
|
387
|
-
UtilityHelperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UtilityHelperService_Factory() { return new UtilityHelperService(i0.ɵɵinject(i1.FormBuilder), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.SpinnerService)); }, token: UtilityHelperService, providedIn: "root" });
|
|
388
|
-
UtilityHelperService = UtilityHelperService_1 = __decorate([
|
|
389
|
-
Injectable({
|
|
390
|
-
providedIn: 'root'
|
|
391
|
-
})
|
|
392
|
-
], UtilityHelperService);
|
|
393
|
-
return UtilityHelperService;
|
|
394
|
-
}());
|
|
395
|
-
export { UtilityHelperService };
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWR5bmFtaWMtbW9kdWxlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9HLE9BQU8sRUFBYSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFvQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUtsSixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFLbkQ7SUFJSSw4QkFDWSxXQUF3QixFQUN4QixJQUFnQixFQUNoQixjQUE4QjtRQUY5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUUxQyxDQUFDOzZCQVRRLG9CQUFvQjtJQVdmLHlDQUFvQixHQUFsQyxVQUFt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Yzs7O0lBUGpDLG9CQUFvQjtRQUhoQyxVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csb0JBQW9CLENBd1loQzsrQkE1WkQ7Q0E0WkMsQUF4WUQsSUF3WUM7U0F4WVksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQmFzZUZpZWxkLCBDb2xTcGFuU2l6ZXNFbnVtLCBGaWVsZFR5cGVFbnVtIH0gZnJvbSBcIi4uL21vZGVscy9iYXNlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9tb2RlbHMvY29udGV4dC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24sIEVuZFBvaW50RGF0YSwgRW5kUG9pbnREYXRhUGFyYW1zLCBQYXJhbVR5cGVFbnVtLCBSZXF1ZXN0TWV0aG9kRW51bSB9IGZyb20gXCIuLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2F0dGFjaG1lbnRGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJbWFnZUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvaW1hZ2VGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRleHRhcmVhRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy90ZXh0YXJlYUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRleHRNYXNrRW51bSwgVGV4dEZpZWxkLCBVcmxSZWdleCwgVGVsUmVnZXggfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy90ZXh0RmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuLi9tb2RlbHMvZm9ybS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tIFwiLi4vbW9kZWxzL3JlY29yZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBcnJheVZhbGlkYXRvcnMgfSBmcm9tIFwiLi9jdXN0b20tZm9ybS12YWxpZGF0b3JzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRXFwRHluYW1pY01vZHVsZURpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi9lcXAtZHluYW1pYy1tb2R1bGUtZGlhbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwiLi9zcGlubmVyLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXRpbGl0eUhlbHBlclNlcnZpY2Uge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udGV4dDogQ29udGV4dCA9IG5ldyBDb250ZXh0KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IFNwaW5uZXJTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEV2YWx1YXRlRmllbGRGb3JtdWxhKGZvcm11bGE6IHN0cmluZywgcmVjOiBSZWNvcmQsIGN0eDogYW55KTogYW55IHtcclxuICAgICAgICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9IGV2YWwoZm9ybXVsYSk7XHJcbiAgICAgICAgcmV0dXJuIChldmFsdWF0ZWRWYWx1ZSA/IGV2YWx1YXRlZFZhbHVlIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTZXRDb250ZXh0KGN0eDogQ29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGN0eDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEZpZWxkVHlwZShmaWVsZDogQmFzZUZpZWxkKXtcclxuICAgICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBkaSB0ZXN0b1wiXToge1xyXG4gICAgICAgICAgY29uc3QgdDogVGV4dEZpZWxkID0gT2JqZWN0LmFzc2lnbihuZXcgVGV4dEZpZWxkLGZpZWxkKTtcclxuICAgICAgICAgIHJldHVybiB0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIHBlciBpbXBvc3RhcmUgaSB2YWxvcmkgZGEgc3VnZ2VyaXJlIG5lbGwnYXV0b2NvbXBsZXRlIHBlciBpIGNhbXBpIGluIGN1aSBsJ3V0ZW50ZSBkZXZlIHNjcml2ZXJlIGNvbWFuZGkgamF2YXNjcmlwdC5cclxuICAgICAqIEluIGJhc2UgYWxsJ3VsdGltbyBjYXJhdHRlcmUgZGlnaXRhdG8gdmllbmUgaW1wb3N0YXRvIHVuIGVsZW5jbyBkaSBvZ2dldHRpIG8gcHJvcHJpZXTDoCBjaGUgbCd1dGVudGUgaGEgYSBkaXNwb3NpemlvbmUgaW4gcXVlbCBtb21lbnRvLlxyXG4gICAgICogQHBhcmFtIGZpZWxkcyBBcnJheSBkaSBCYXNlRmllbGQgYWdnaXVudGkgYWxsYSBGb3JtXHJcbiAgICAgKiBAcGFyYW0gdHlwZWRGb3JtdWxhIFN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGVcclxuICAgICAqIEBzdW1tYXJ5IElsIG1ldG9kbyBpbXBvc3RhIGkgc3VnZ2VyaW1lbnRpIGJhc2FuZG9zaSBzdSAzIGNhc2k6XHJcbiAgICAgKiAgMSkgbCd1dGVudGUgbm9uIGhhIGRpZ2l0YXRvIG51bGxhIG8gbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1bm8gc3BhemlvIHZ1b3RvXHJcbiAgICAgKiAgMikgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1biBcIi5cIlxyXG4gICAgICogIDMpIGxhIHN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGUgbm9uIGNvaW5jaWRlIGNvbiBuZXNzdW4gYWx0cm8gY2FzbyBzb3ByYSAoZmluaXNjZSBjb24gdW4gY2FyYXR0ZXJlIHF1YWx1bnF1ZSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHZXRBdXRvY29tcGxldGVPcHRpb25zKGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPiwgdHlwZWRGb3JtdWxhOiBzdHJpbmcpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfT4ge1xyXG5cclxuICAgICAgICBsZXQgYXV0b2NvbXBsZXRlT3B0aW9uczogQXJyYXk8eyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH0+ID0gW107XHJcblxyXG4gICAgICAgIC8vIFJlY3VwZXJvIGkgbm9taSBkaSB0dXR0aSBpIGNhbXBpIGNyZWF0aSBmaW5vIGFkIG9yYSBuZWxsYSBmb3JtLlxyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBmaWVsZHMubWFwKGYgPT4gZi5MYWJlbC5zcGxpdCgnICcpLmpvaW4oJ18nKSk7XHJcblxyXG4gICAgICAgIC8vIE5lbCBjYXNpIGluIGN1aSBsJ3V0ZW50ZSBub24gaGEgaW5zZXJpdG8gbnVsbGEgb3BwdXJlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW5vIHNwYXppbyB2dW90byBvIHVuIHNpbWJvbG8gZGl2ZXJzbyBkYSBcIi5cIlxyXG4gICAgICAgIC8vICh1biBjYXJhdHRlcmUgbm9uIGFsZmFudW1lcmljbykgaW1wb3N0byBjb21lIHN1Z2dlcmltZW50aSBzb2xvIFwicmVjXCIgZSBcImN0eFwiLCBvdnZlcm8gZ2xpIHVuaWNpIGR1ZSBvZ2dldHRpIGEgY3VpIGwndXRlbnRlIGhhIGFjY2Vzc28uXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdHlwZWRGb3JtdWxhIHx8XHJcbiAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgICF0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpXHJcbiAgICAgICAgICAgICAgICAmJiBuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfXVwiKS50ZXN0KHR5cGVkRm9ybXVsYS5zdWJzdHJpbmcodHlwZWRGb3JtdWxhLmxlbmd0aCAtIDEsIHR5cGVkRm9ybXVsYS5sZW5ndGgpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXHJcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcInJlY1wiLCB2YWx1ZTogKHR5cGVkRm9ybXVsYSA/IHR5cGVkRm9ybXVsYSA6ICcnKSArIFwicmVjXCIgfSxcclxuICAgICAgICAgICAgICAgIHsgbGFiZWw6IFwiY3R4XCIsIHZhbHVlOiAodHlwZWRGb3JtdWxhID8gdHlwZWRGb3JtdWxhIDogJycpICsgXCJjdHhcIiB9XHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW4gXCIuXCIgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgY2VyY2FuZG8gZGkgYWNjZWRlcmUgYWQgdW5hIHByb3ByaWV0w6AgZGkgdW4gb2dnZXR0b1xyXG4gICAgICAgIC8vIGEgc3VhIGRpc3Bvc2l6aW9uZS4gUmVjdXBlcm8gaWwgbm9tZSBkZWxsJ3VsdGltbyBvZ2dldHRvIGRpZ2l0YXRvIGRhbGwndXRlbnRlIGUgc2UgbCdvZ2dldHRvIHNjZWx0byDDqCBcInJlY1wiIG8gXCJjdHhcIlxyXG4gICAgICAgIC8vIGFsbG9yYSBzdWdnZXJpc2NvIGxlIHByb3ByaWV0w6AgY2hlIGVzaXN0b25vIGFsbCdpbnRlcm5vIGRpIHF1ZXN0aSBvZ2dldHRpIGFsdHJpbWVudGkgbm9uIG1vc3RybyBudWxsYS5cclxuICAgICAgICBlbHNlIGlmICh0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm11bGFQaWVjZXM6IEFycmF5PHN0cmluZz4gPSB0eXBlZEZvcm11bGEuc3BsaXQoXCIgXCIpW3R5cGVkRm9ybXVsYS5zcGxpdChcIiBcIikubGVuZ3RoIC0gMV0uc3BsaXQoJy4nKTtcclxuICAgICAgICAgICAgaWYgKGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAyXSA9PT0gXCJyZWNcIikge1xyXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXMubWFwKGYgPT4geyByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTsgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDJdID09PSBcImN0eFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dCkubWFwKGYgPT4geyByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTsgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybXVsYVBpZWNlcy5sZW5ndGggPiAyICYmIGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAzXSA9PT0gXCJjdHhcIiAmJiBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dC5Vc2VyKS5tYXAoZiA9PiB7IHJldHVybiB7IGxhYmVsOiBmLCB2YWx1ZTogdHlwZWRGb3JtdWxhICsgZiB9OyB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJbiB0dXR0aSBnbGkgYWx0cmkgY2FzaSwgb3Z2ZXJvIHF1YW5kbyBsYSBzdHJpbmdhIGRpZ2l0YXRhIGZpbmlzY2UgY29uIHVuIGNhcmF0dGVyZSBkaXZlcnNvIGRhIHF1ZWxsaVxyXG4gICAgICAgIC8vIGNvbnRyb2xsYXRpIGZpbm9yYSwgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbnRvIGlsIG5vbWUgZGkgdW4gb2dnZXR0bywgdW5hIHByb3ByaWV0w6AgbyB1bmFcclxuICAgICAgICAvLyBmdW56aW9uZSBqYXZhc2NyaXB0LiBDb250cm9sbG8gbGEgcGFyb2xhIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbmRvIGUgc2UgZmEgcGFydGUgZGkgdW5vIGRlZ2xpIG9nZ2V0dGkgYSBkaXNwb3NpemlvbmVcclxuICAgICAgICAvLyBvIHVuYSBwcm9wcmlldMOgIGRpIGVzc2kgYWxsb3JhIHN1Z2dlcmlzY28gaSBwb3NzaWJpbGkgbWF0Y2guXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZU9wdGlvbnM6IEFycmF5PHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUHJlbmRvIHR1dHRpIGkgYmxvY2NoaSBkaSBjYXJhdHRlcmkgZGlnaXRhdGkgZGFsbCd1dGVudGVcclxuICAgICAgICAgICAgY29uc3QgYWxsRm9ybXVsYVdvcmRzOiBBcnJheTxzdHJpbmc+ID0gdHlwZWRGb3JtdWxhLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgLy8gUHJlbmRvIGwndWx0aW1vIGJsb2NjbyBkaSBjYXJhdHRlcmkgZGlnaXRhdG8gZGFsbCd1dGVudGVcclxuICAgICAgICAgICAgY29uc3QgbGFzdFR5cGVkU3RyaW5nOiBzdHJpbmcgPSBhbGxGb3JtdWxhV29yZHNbYWxsRm9ybXVsYVdvcmRzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgbGEgbCd1bHRpbWEgc3RyaW5nYSBkaWdpdGF0YSBub24gY29udGllbmUgY2FyYXR0ZXJpIHNwZWNpYWxpIGFsbG9yYSBzcGxpdHRvIGxhIHN0cmluZ2FcclxuICAgICAgICAgICAgLy8gc3VpIFwiLlwiIGUgaW1wb3N0byBpIHN1Z2dlcmltZW50aSBpbiBiYXNlIGFsIHBhdGggZGVsbGEgcHJvcnBpZXTDoCBjaGUgc2kgc3RhIGRpZ2l0YW5kby5cclxuICAgICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfLl1cIikudGVzdChsYXN0VHlwZWRTdHJpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBsYXN0VHlwZWRTdHJpbmcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFR5cGVkV29yayA9IHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXNUb0NoZWNrOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5UGF0aC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gW1wicmVjXCIsIFwiY3R4XCJdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMSAmJiBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcImN0eFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlQYXRoLmxlbmd0aCA+IDIgJiYgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAzXSA9PT0gXCJjdHhcIiAmJiBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcIlVzZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dC5Vc2VyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlQYXRoLmxlbmd0aCA+IDEgJiYgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAyXSA9PT0gXCJyZWNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gYXZhaWxhYmxlUmVjUHJvcGVydGllcztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBFc2VndW8gaWwgY29udHJvbGxvIHN1bGxlIHByb3ByaWV0w6AgcmVjdXBlcmF0ZSwgYWdnaXVuZ28gYWkgc3VnZ2VyaW1lbnRpIHR1dHRpIGkgbm9taSBjaGUgaW5pemlhbm8gY29uXHJcbiAgICAgICAgICAgICAgICAvLyBxdWVsbG8gY2hlIHN0YSBkaWdpdGFuZG8gbCd1dGVudGUuXHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjay5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgobGFzdFR5cGVkV29yaykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3B0aW9ucy5wdXNoKHsgbGFiZWw6IHByb3AsIHZhbHVlOiB0eXBlZEZvcm11bGEgKyBwcm9wLnN1YnN0cmluZyhsYXN0VHlwZWRXb3JrLmxlbmd0aCwgcHJvcC5sZW5ndGgpIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBhdmFpbGFibGVPcHRpb25zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gaW52b2NhdG8gZGFsbCdodG1sIHBlciBpbXBvc3RhcmUgbGUgY2xhc3NpIGNzcyBwZXIgdmlzdWFsaXp6YXJlIGlsIGNhbXBvIGFsbCdpbnRlcm5vIGRlbGxhIGZvcm0uXHJcbiAgICAgKiBTZSBwZXIgaWwgZmllbGQgc29ubyBzdGF0ZSBzcGVjaWZpY2F0ZSBkZWxsZSBjbGFzc2kgYWxsb3JhIHZlbmdvbm8gYXBwbGNhdGUgcXVlbGxlLCBhbHRyaW1lbnRpIHZlbmdvbm8gdXNhdGVcclxuICAgICAqIGRlbGxlIGNsYXNzaSBkaSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBkYSB2aXN1YWxpenphcmUuXHJcbiAgICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1bmEgc3RyaW5nYSBjb250ZW5lbnRlIGxlIGNsYXNzaSBjc3MgZGEgYXBwbGljYXJlLlxyXG4gICAgICovXHJcbiAgICBnZXRGaWVsZFN5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZmllbGQuQ29sU3BhblNpemVzICYmIGZpZWxkLkNvbFNwYW5TaXplcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICByZXR1cm4gZmllbGQuQ29sU3BhblNpemVzLm1hcChzaXplID0+IENvbFNwYW5TaXplc0VudW1bc2l6ZV0udG9TdHJpbmcoKSkuam9pbihcIiBcIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFyZWEgZGkgdGVzdG9cIl06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMlwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJCb29sZWFub1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkRhdGEgZS9vIG9yYVwiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBudW1lcmljb1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJBbGxlZ2F0b1wiXTpcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5Jc011bHRpQXR0YWNoIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLk1ldGFkYXRhRmllbGRzICYmIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLk1ldGFkYXRhRmllbGRzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMlwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiSW1tYWdpbmVcIl06XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uSXNNdWx0aUF0dGFjaCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICgoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5NZXRhZGF0YUZpZWxkcyAmJiAoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5NZXRhZGF0YUZpZWxkcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTJcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJMb29rdXBcIl06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcIjtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydGb3JtIGRpIGRldHRhZ2xpbyddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTJcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpbCBGb3JtR3JvdXAgY2hlIHJhcHByZXNlbnRhIHVuYSBGb3JtIGEgcGFydGlyZSBkYWkgc3VvaSBCYXNlRmllbGQuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUZpZWxkcyBMaXN0YSBkZWkgQmFzZUZpZWxkIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICAgKiBAcGFyYW0gcmVjb3JkIE9nZ2V0dG8gZGkgdGlwbyBSZWNvcmQgY2hlIGNvbnRpZW5lIGkgdmFsb3JpIGRlaSBjYW1waS5cclxuICAgICAqIEBwYXJhbSBvbmx5VmlldyBTZSBUUlVFIGRpc2FiaWxpdGEgbGEgZm9ybSBwZXIgcmVuZGVybGEgaW4gc29sYSBsZXR0dXJhLlxyXG4gICAgICogQHBhcmFtIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQgU2UgVFJVRSBwb3BvbGEgbGEgcHJvcHJpZXTDoCBGb3JtRm9ybUdyb3VwIGFsbCdpbnRlcm5vIGRpIG9nbmkgQmFzZUZpZWxkIGNvbiBpbCBGb3JtR3JvdXAgY29ycmVudGUuXHJcbiAgICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBGb3JtR3JvdXAgcmFwcHJlc2VudGF0ZSBsYSBGb3JtIGEgY3VpIGFwcGFydGVuZ29ubyBpIEJhc2VGaWVsZCByaWNldnV0aSBpbiBpbnB1dC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZUZvcm1Gb3JtR3JvdXAoZm9ybUZpZWxkczogQXJyYXk8QmFzZUZpZWxkPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZDogUmVjb3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVZpZXcgPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQgPSB0cnVlKTogRm9ybUdyb3VwIHtcclxuICAgICAgICBjb25zdCBmb3JtRm9ybTogRm9ybUdyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChbXSk7XHJcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgZm9ybUZvcm0uYWRkQ29udHJvbChmaWVsZC5OYW1lLCB0aGlzLmNyZWF0ZUZpZWxkRm9ybUNvbnRyb2woZmllbGQsIHJlY29yZCkpO1xyXG4gICAgICAgICAgICBpZiAoaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgZmllbGQuRm9ybUZvcm1Hcm91cCA9IGZvcm1Gb3JtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG9ubHlWaWV3KSB7XHJcbiAgICAgICAgICAgIGZvcm1Gb3JtLmRpc2FibGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtRm9ybTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIHBlciBjcmVhcmUgZSBhZ2dpdW5nZXJlIGFsIEZvcm1Hcm91cCByYXBwcmVzZW50YW50ZSBsYSBmb3JtIHVuIG51b3ZvIEZvcm1Db250cm9sIGEgcGFydGlyZSBkYSB1biBGaWVsZC5cclxuICAgICAqIEluIG51b3ZvIEZvcm1Db250cm9sIGF2csOgIGlsIG5vbWUgZGVsIGNhbXBvIHBhc3NhdG8gZSB2ZXJyYW5ubyBpbXBvc3RhdGkgaSBWYWxpZGF0b3JzIGluIGJhc2UgYWwgdGlwbyBkZWwgY2FtcG8gc3Rlc3NvLlxyXG4gICAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBwZXIgY3VpIGNyZWFyZSBpbCBGb3JtQ29udHJvbCBkYSBpbnNlcmlyZSBuZWwgRm9ybUdyb3VwIGRlbGEgZm9ybS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVGaWVsZEZvcm1Db250cm9sKGZpZWxkOiBCYXNlRmllbGQsIHJlY29yZDogUmVjb3JkKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLlJlcXVpcmVkKVxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgICAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0RmllbGQpLk1heExlbmdodCkgeyB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWF4TGVuZ2h0KSk7IH1cclxuICAgICAgICAgICAgICAgIGlmICgoZmllbGQgYXMgVGV4dEZpZWxkKS5NaW5MZW5naHQpIHsgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKChmaWVsZCBhcyBUZXh0RmllbGQpLk1pbkxlbmdodCkpOyB9XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKChmaWVsZCBhcyBUZXh0RmllbGQpLlRleHRNYXNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uVXJsOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKFVybFJlZ2V4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLkVtYWlsOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlRlbGVmb25vOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKFRlbFJlZ2V4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFyZWEgZGkgdGVzdG9cIl06XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1heExlbmdodCkgeyB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1heExlbmdodCkpOyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1pbkxlbmdodCkgeyB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1pbkxlbmdodCkpOyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtLkFsbGVnYXRvOlxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW0uSW1tYWdpbmU6XHJcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuUmVxdWlyZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFycmF5VmFsaWRhdG9ycy5taW5MZW5naHQoMSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRWxlbmNvIGdlbmVyaWNvJ106XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKS5Jc011bHRpQ2hvaWNoZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuUmVxdWlyZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChBcnJheVZhbGlkYXRvcnMubWluTGVuZ2h0KDEpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbChyZWNvcmRbZmllbGQuTmFtZV0sIHZhbGlkYXRvcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIHBlciBjb25maWd1cmFyZSBnbGkgZW5kcG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdCBhIHBhcnRpcmUgZGFsbCd1cmwgYmFzZSBkZWwgc2VydmVyXHJcbiAgICAgKiBhIGN1aSBzaSBkZXZlIGNvbm5ldHRlcmUgZSBhbCB0b2tlbiBkYSBwYXNzYXJlIHBlciBhdXRlbnRpY2Fyc2kuXHJcbiAgICAgKiBAcGFyYW0gYmFzZVNlcnZlclVybCBTdHJpbmdhIGRlbGwndXJsIGJhc2UgZGVsIHNlcnZlciAoZXM6IFwiaHR0cDovL2xvY2FsaG9zdDo1MDAwXCIpLlxyXG4gICAgICogQHBhcmFtIHVzZXJUb2tlbiBUb2tlbiBkZWxsJ3V0ZW50ZSBsb2dnYXRvIGRhIHVzYXJlIHBlciBhdXRlbnRpY2Fyc2kgc2UgbmVjZXNzYXJpby5cclxuICAgICAqIEByZXR1cm5zIFJlc2l0dWlzY2UgbGEgY29uZmlndXJhemlvbmUgY29tcGxldGEgZGVnbGkgZW5kUG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIENvbmZpZ3VyZURlZmF1bHRFbmRQb2ludHMoYmFzZVNlcnZlclVybDogc3RyaW5nLCB1c2VyVG9rZW46IHN0cmluZyk6IEVuZFBvaW50Q29uZmlndXJhdGlvbiB7XHJcbiAgICAgICAgbGV0IGVuZFBvaW50Q29uZmlndXJhdGlvbjogRW5kUG9pbnRDb25maWd1cmF0aW9uID0gbmV3IEVuZFBvaW50Q29uZmlndXJhdGlvbigpO1xyXG4gICAgICAgIGVuZFBvaW50Q29uZmlndXJhdGlvbiA9IG5ldyBFbmRQb2ludENvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgICBlbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3JkcyA9IHtcclxuICAgICAgICAgICAgR2V0QnlGb3JtSURFbmRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2dldGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgR2V0QnlJREVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZ2V0QnlJRFwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgU2F2ZUVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvc2F2ZVwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIER1cGxpY2F0ZUVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZHVwbGljYXRlXCIsXHJcbiAgICAgICAgICAgICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uUE9TVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRGVsZXRlRW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9kZWxldGVcIixcclxuICAgICAgICAgICAgICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5ERUxFVEUsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zID0ge1xyXG4gICAgICAgICAgICBHZXRCeUlERW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL2Zvcm1cIixcclxuICAgICAgICAgICAgICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFNhdmVFbmRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL2NvbmYvZm9ybVwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZGF0YSBsYSBjb25maWd1cmF6aW9uZSBkaSB1biBlbmRwb2ludCBjb3N0cnVpc2NlIGwndXJsIGRhIGNoaWFtYXJlLCBnbGkgZXZlbnR1YWxpIHBhcmFtZXRyaVxyXG4gICAgICogZGEgcGFzc2FyZSAobmVsIGJvZHkgbyBuZWxsYSByb3R0YSkgZWQgZWZmZXR0dWEgbGEgY2hpYW1hdGEuIEFsIHRlcm1pbmUgZGVsbGEgY2hpYW1hdGEgZXNlZ3VlIGxlIGV2ZW50dWFsaVxyXG4gICAgICogZnVuemlvbmkgZGkgY2FsbGJhY2sgKHNpYSBpbiBjYXNvIGRpIHN1Y2Nlc3NvIGNoZSBpbiBjYXNvIGRpIGVycm9yZSkgcGFzc2F0ZSBpbiBpbnB1dC5cclxuICAgICAqIEBwYXJhbSBlbmRQb2ludERhdGEgQ29maWd1cmF6aW9uZSBkZWxsJ2VuZHBvaW50IGRhIGNoaWFtYXJlLlxyXG4gICAgICogQHBhcmFtIGR5bmFtaWNNb2R1bGVQYXJhbXMgQXJyYXkgZGVpIHBhcmFtZXRyaSBhZ2dpdW50aSBkYWwgbW9kdWxvIGRpbmFtaWNvIGEgcXVlbGxpIGdpw6AgY29uZmlndXJhdGlcclxuICAgICAqIChhZCBlc2VtcGlvIGlsIHJlY29yZCBvIGxhIGZvcm0gZGEgc2FsdmFyZSBvcHB1cmUgbCdJRCBwZXIgcmVjdXBlcmFyZSB1bmEgcGFydGljb2xhcmUgZW50aXTDoCkuXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgTWV0b2RvIGRhIGVzZWd1aXJlIGluIGNhc28gZGkgc3VjY2Vzc28gZG9wbyBsYSBjaGlhbWF0YSBodHRwLlxyXG4gICAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0YSBsYSByaXNwb3N0YSBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICAgKiBAcGFyYW0gZXJyb3JDYWxsQmFjayBNZXRvZG8gZGEgZXNlZ3VpcmUgaW4gY2FzbyBkaSBlcnJvcmUgZG9wbyBsYSBjaGlhbWF0YSBodHRwLlxyXG4gICAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0byBsJ2Vycm9yZSBnZW5lcmF0byBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSdW5FbmRQb2ludENhbGwoXHJcbiAgICAgICAgZW5kUG9pbnREYXRhOiBFbmRQb2ludERhdGEsXHJcbiAgICAgICAgZHluYW1pY01vZHVsZVBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9IG51bGwsXHJcbiAgICAgICAgY2FsbGJhY2s6IChlOiBGb3JtIHwgUmVjb3JkIHwgQXJyYXk8UmVjb3JkPiApID0+IHZvaWQgID0gbnVsbCxcclxuICAgICAgICBlcnJvckNhbGxCYWNrOiAoZXJyOiB1bmtub3duKSA9PiB2b2lkID0gbnVsbFxyXG4gICAgICAgICk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuYWRkUmVxdWVzdENvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgbGV0IHVybCA9IGAke2VuZFBvaW50RGF0YS5Vcmx9YDtcclxuICAgICAgICBsZXQgcXVlcnlQYXJhbXM6IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgYm9keVBhcmFtcyA9IHtcclxuICAgICAgICAgICAgQWRkaXRpb25hbFBhcmFtczoge31cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTZSBuZWxsYSBjb25maWd1cmF6aW9uZSBzb25vIHN0YXRpIGRlZmluaXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgcXVlc3RpIHZlbmdvbm8gY2ljbGF0aVxyXG4gICAgICAgIC8vIGUgYWdnaXVudGkgbmVsIHB1bnRvIGluIGN1aSBkZXZvbm8gZXNzZXJlIHVzYXRpLlxyXG4gICAgICAgIGlmIChlbmRQb2ludERhdGEuUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGVuZFBvaW50RGF0YS5QYXJhbXMuZm9yRWFjaChwID0+IHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocC5QYXJhbVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ1F1ZXJ5IHBhcmFtJ106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9IHAuUGFyYW1OYW1lICsgXCI9XCIgKyBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gcm91dGUnXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIEJvZHknXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5UGFyYW1zLkFkZGl0aW9uYWxQYXJhbXNbcC5QYXJhbU5hbWVdID0gcC5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBzdGF0aSBwYXNzYXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgZGVmaW5pdGkgYWxsJ2ludGVybm8gZGVsIG1vZHVsbyBkaW5hbWljb1xyXG4gICAgICAgIC8vIHZlbmdvbm8gY2ljbGF0aSBlIGFnZ2l1bnRpIG5lbCBwdW50byBpbiBjdWkgZGV2b25vIGVzc2VyZSB1c2F0aSBkb3BvIHF1ZWxsaSBkZWZpbml0aSBuZWxsYSBjb25maWd1cmF6aW9uZS5cclxuICAgICAgICBpZiAoZHluYW1pY01vZHVsZVBhcmFtcykge1xyXG4gICAgICAgICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHAuUGFyYW1UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcmFtOiBzdHJpbmcgPSBwLlBhcmFtTmFtZSArIFwiPVwiICsgcC5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyA9PSBudWxsID8gXCJcIiA6IHF1ZXJ5UGFyYW1zICsgXCImXCIpICsgc3RyaW5nUGFyYW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIHJvdXRlJ106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgKHVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgcC5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiBCb2R5J106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVBhcmFtc1twLlBhcmFtTmFtZV0gPSBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChxdWVyeVBhcmFtcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHVybCA9ICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoIC0gMSkgOiB1cmwpICsgXCI/XCIgKyBxdWVyeVBhcmFtcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0KGVuZFBvaW50RGF0YS5SZXF1ZXN0TWV0aG9kLCB1cmwsIHtcclxuICAgICAgICAgICAgaGVhZGVyczogZW5kUG9pbnREYXRhLlRva2VuID8geyBBdXRob3JpemF0aW9uOiBlbmRQb2ludERhdGEuVG9rZW4gfSA6IG51bGwsXHJcbiAgICAgICAgICAgIGJvZHk6ICFbUmVxdWVzdE1ldGhvZEVudW0uREVMRVRFLCBSZXF1ZXN0TWV0aG9kRW51bS5HRVRdLmluY2x1ZGVzKGVuZFBvaW50RGF0YS5SZXF1ZXN0TWV0aG9kKSA/IGJvZHlQYXJhbXMgOiBudWxsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIChyZXM6IEZvcm0gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+ICkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UucmVtb3ZlUmVxdWVzdENvdW50ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5yZW1vdmVSZXF1ZXN0Q291bnRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxCYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbEJhY2soZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZS5FcnJvcihlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
package/esm5/public-api.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of eqp-dynamic-module
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/eqp-dynamic-module.module';
|
|
5
|
-
export * from './lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component';
|
|
6
|
-
export * from './lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component';
|
|
7
|
-
export * from './lib/components/private/add-form-field/add-form-field.component';
|
|
8
|
-
export * from './lib/components/private/dynamic-module-field/dynamic-module-field.component';
|
|
9
|
-
export * from './lib/components/private/field-templates/attachment-field-template/attachment-field-template.component';
|
|
10
|
-
export * from './lib/components/private/field-templates/boolean-field-template/boolean-field-template.component';
|
|
11
|
-
export * from './lib/components/private/field-templates/date-field-template/date-field-template.component';
|
|
12
|
-
export * from './lib/components/private/field-templates/image-field-template/image-field-template.component';
|
|
13
|
-
export * from './lib/components/private/field-templates/list-value-field-template/list-value-field-template.component';
|
|
14
|
-
export * from './lib/components/private/field-templates/numeric-field-template/numeric-field-template.component';
|
|
15
|
-
export * from './lib/components/private/field-templates/text-field-template/text-field-template.component';
|
|
16
|
-
export * from './lib/components/private/field-templates/textarea-field-template/textarea-field-template.component';
|
|
17
|
-
export * from './lib/components/private/form-records/add-form-record/add-form-record.component';
|
|
18
|
-
export * from './lib/components/private/form-records/list-form-record/list-form-record.component';
|
|
19
|
-
export * from './lib/models/baseField.model';
|
|
20
|
-
export * from './lib/models/baseObj.model';
|
|
21
|
-
export * from './lib/models/context.model';
|
|
22
|
-
export * from './lib/models/endPointConfiguration.model';
|
|
23
|
-
export * from './lib/models/entity.model';
|
|
24
|
-
export * from './lib/models/form.model';
|
|
25
|
-
export * from './lib/models/record.model';
|
|
26
|
-
export * from './lib/models/fields/attachmentField.model';
|
|
27
|
-
export * from './lib/models/fields/booleanField.model';
|
|
28
|
-
export * from './lib/models/fields/dateField.model';
|
|
29
|
-
export * from './lib/models/fields/imageField.model';
|
|
30
|
-
export * from './lib/models/fields/listValueField.model';
|
|
31
|
-
export * from './lib/models/fields/lookupField.model';
|
|
32
|
-
export * from './lib/models/fields/numericField.model';
|
|
33
|
-
export * from './lib/models/fields/textareaField.model';
|
|
34
|
-
export * from './lib/models/fields/textField.model';
|
|
35
|
-
export * from './lib/services/custom-form-validators.service';
|
|
36
|
-
export * from './lib/services/eqp-dynamic-module-dialog.service';
|
|
37
|
-
export * from './lib/services/spinner.service';
|
|
38
|
-
export * from './lib/services/utilityHelper.services';
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWR5bmFtaWMtbW9kdWxlLyIsInNvdXJjZXMiOlsicHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyRUFBMkUsQ0FBQztBQUMxRixjQUFjLHFHQUFxRyxDQUFDO0FBQ3BILGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyw4RUFBOEUsQ0FBQztBQUM3RixjQUFjLHdHQUF3RyxDQUFDO0FBQ3ZILGNBQWMsa0dBQWtHLENBQUM7QUFDakgsY0FBYyw0RkFBNEYsQ0FBQztBQUMzRyxjQUFjLDhGQUE4RixDQUFDO0FBQzdHLGNBQWMsd0dBQXdHLENBQUM7QUFDdkgsY0FBYyxrR0FBa0csQ0FBQztBQUNqSCxjQUFjLDRGQUE0RixDQUFDO0FBQzNHLGNBQWMsb0dBQW9HLENBQUM7QUFDbkgsY0FBYyxpRkFBaUYsQ0FBQztBQUNoRyxjQUFjLG1GQUFtRixDQUFDO0FBR2xHLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyx1Q0FBdUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBlcXAtZHluYW1pYy1tb2R1bGVcclxuICovXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2VxcC1keW5hbWljLW1vZHVsZS5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2V4cG9ydGVkL2VxcC1keW5hbWljLW1vZHVsZS9lcXAtZHluYW1pYy1tb2R1bGUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9leHBvcnRlZC9lcXAtZHluYW1pYy1tb2R1bGUtY29uZmlndXJhdG9yL2VxcC1keW5hbWljLW1vZHVsZS1jb25maWd1cmF0b3IuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9wcml2YXRlL2FkZC1mb3JtLWZpZWxkL2FkZC1mb3JtLWZpZWxkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9keW5hbWljLW1vZHVsZS1maWVsZC9keW5hbWljLW1vZHVsZS1maWVsZC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2F0dGFjaG1lbnQtZmllbGQtdGVtcGxhdGUvYXR0YWNobWVudC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2Jvb2xlYW4tZmllbGQtdGVtcGxhdGUvYm9vbGVhbi1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2RhdGUtZmllbGQtdGVtcGxhdGUvZGF0ZS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2ltYWdlLWZpZWxkLXRlbXBsYXRlL2ltYWdlLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC10ZW1wbGF0ZXMvbGlzdC12YWx1ZS1maWVsZC10ZW1wbGF0ZS9saXN0LXZhbHVlLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC10ZW1wbGF0ZXMvbnVtZXJpYy1maWVsZC10ZW1wbGF0ZS9udW1lcmljLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC10ZW1wbGF0ZXMvdGV4dC1maWVsZC10ZW1wbGF0ZS90ZXh0LWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC10ZW1wbGF0ZXMvdGV4dGFyZWEtZmllbGQtdGVtcGxhdGUvdGV4dGFyZWEtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9wcml2YXRlL2Zvcm0tcmVjb3Jkcy9hZGQtZm9ybS1yZWNvcmQvYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9mb3JtLXJlY29yZHMvbGlzdC1mb3JtLXJlY29yZC9saXN0LWZvcm0tcmVjb3JkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ludGVyZmFjZXMvaUJhc2VGaWVsZENvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL2lSb290T2JqZWN0LmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvYmFzZU9iai5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9jb250ZXh0Lm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9lbnRpdHkubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZm9ybS5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yZWNvcmQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZmllbGRzL2F0dGFjaG1lbnRGaWVsZC5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9maWVsZHMvYm9vbGVhbkZpZWxkLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2ZpZWxkcy9kYXRlRmllbGQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZmllbGRzL2ltYWdlRmllbGQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2ZpZWxkcy9sb29rdXBGaWVsZC5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9maWVsZHMvbnVtZXJpY0ZpZWxkLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2ZpZWxkcy90ZXh0YXJlYUZpZWxkLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2ZpZWxkcy90ZXh0RmllbGQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9jdXN0b20tZm9ybS12YWxpZGF0b3JzLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9lcXAtZHluYW1pYy1tb2R1bGUtZGlhbG9nLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9zcGlubmVyLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzJztcclxuIl19
|