@esfaenza/forms-and-validations 12.2.28 → 13.1.3
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/esfaenza-forms-and-validations.d.ts +1 -12
- package/esm2020/esfaenza-forms-and-validations.mjs +5 -0
- package/esm2020/lib/forms/base-form-control.mjs +482 -0
- package/esm2020/lib/forms/form-adaptive/form-adaptive.component.loc.mjs +28 -0
- package/esm2020/lib/forms/form-adaptive/form-adaptive.component.mjs +294 -0
- package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.loc.mjs +26 -0
- package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.mjs +200 -0
- package/esm2020/lib/forms/form-checkbox/form-checkbox.component.mjs +52 -0
- package/esm2020/lib/forms/form-date/form-date.component.mjs +59 -0
- package/esm2020/lib/forms/form-datetime/form-datetime.component.mjs +59 -0
- package/esm2020/lib/forms/form-empty/form-empty.component.mjs +36 -0
- package/esm2020/lib/forms/form-error/form-error.component.mjs +52 -0
- package/esm2020/lib/forms/form-file/form-file.component.loc.mjs +28 -0
- package/esm2020/lib/forms/form-file/form-file.component.mjs +119 -0
- package/esm2020/lib/forms/form-info/form-info.component.mjs +52 -0
- package/esm2020/lib/forms/form-input/form-input.component.mjs +93 -0
- package/esm2020/lib/forms/form-multiselect/form-multiselect.component.loc.mjs +29 -0
- package/esm2020/lib/forms/form-multiselect/form-multiselect.component.mjs +159 -0
- package/esm2020/lib/forms/form-select/form-select.component.loc.mjs +26 -0
- package/esm2020/lib/forms/form-select/form-select.component.mjs +129 -0
- package/esm2020/lib/forms/form-template/form-template.component.mjs +71 -0
- package/esm2020/lib/forms/form-textarea/form-textarea.component.mjs +54 -0
- package/esm2020/lib/forms/form-time/form-time.component.mjs +131 -0
- package/esm2020/lib/forms-and-validations.module.mjs +203 -0
- package/{esm2015/lib/models/AppFile.js → esm2020/lib/models/AppFile.mjs} +0 -0
- package/{esm2015/lib/models/FormsAndValidationsModuleConfig.js → esm2020/lib/models/FormsAndValidationsModuleConfig.mjs} +0 -0
- package/esm2020/lib/models/dayjs-adapter/dayjs-date-adapter.mjs +89 -0
- package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
- package/esm2020/lib/validations/base-validation.loc.mjs +28 -0
- package/esm2020/lib/validations/base-validation.mjs +232 -0
- package/esm2020/lib/validations/customValidators/CustomRequiredDirective.mjs +41 -0
- package/esm2020/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +168 -0
- package/esm2020/lib/validations/validation-currency/validation-currency.component.mjs +61 -0
- package/esm2020/lib/validations/validation-date/validation-date.component.mjs +177 -0
- package/esm2020/lib/validations/validation-datetime/validation-datetime.component.mjs +206 -0
- package/esm2020/lib/validations/validation-input/validation-input.component.mjs +207 -0
- package/esm2020/lib/validations/validation-select/validation-select.component.mjs +184 -0
- package/esm2020/lib/validations/validation-text-area/validation-text-area.component.mjs +64 -0
- package/esm2020/public-api.mjs +35 -0
- package/fesm2015/esfaenza-forms-and-validations.mjs +3620 -0
- package/fesm2015/esfaenza-forms-and-validations.mjs.map +1 -0
- package/fesm2020/esfaenza-forms-and-validations.mjs +3562 -0
- package/fesm2020/esfaenza-forms-and-validations.mjs.map +1 -0
- package/lib/forms/base-form-control.d.ts +3 -0
- package/lib/forms/form-adaptive/form-adaptive.component.d.ts +3 -0
- package/lib/forms/form-adaptive/form-adaptive.component.loc.d.ts +3 -0
- package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +3 -0
- package/lib/forms/form-autocomplete/form-autocomplete.component.loc.d.ts +3 -0
- package/lib/forms/form-checkbox/form-checkbox.component.d.ts +3 -0
- package/lib/forms/form-date/form-date.component.d.ts +3 -0
- package/lib/forms/form-datetime/form-datetime.component.d.ts +3 -0
- package/lib/forms/form-empty/form-empty.component.d.ts +3 -0
- package/lib/forms/form-error/form-error.component.d.ts +3 -0
- package/lib/forms/form-file/form-file.component.d.ts +3 -0
- package/lib/forms/form-file/form-file.component.loc.d.ts +3 -0
- package/lib/forms/form-info/form-info.component.d.ts +3 -0
- package/lib/forms/form-input/form-input.component.d.ts +3 -0
- package/lib/forms/form-multiselect/form-multiselect.component.d.ts +4 -0
- package/lib/forms/form-multiselect/form-multiselect.component.loc.d.ts +3 -0
- package/lib/forms/form-select/form-select.component.d.ts +3 -0
- package/lib/forms/form-select/form-select.component.loc.d.ts +3 -0
- package/lib/forms/form-template/form-template.component.d.ts +3 -0
- package/lib/forms/form-textarea/form-textarea.component.d.ts +3 -0
- package/lib/forms/form-time/form-time.component.d.ts +3 -0
- package/lib/forms-and-validations.module.d.ts +38 -0
- package/lib/models/dayjs-adapter/dayjs-date-adapter.d.ts +3 -0
- package/lib/validations/base-validation.d.ts +3 -0
- package/lib/validations/base-validation.loc.d.ts +3 -0
- package/lib/validations/customValidators/CustomRequiredDirective.d.ts +3 -0
- package/lib/validations/validation-autocomplete/validation-autocomplete.component.d.ts +3 -0
- package/lib/validations/validation-currency/validation-currency.component.d.ts +3 -0
- package/lib/validations/validation-date/validation-date.component.d.ts +3 -0
- package/lib/validations/validation-datetime/validation-datetime.component.d.ts +3 -0
- package/lib/validations/validation-input/validation-input.component.d.ts +3 -0
- package/lib/validations/validation-select/validation-select.component.d.ts +3 -0
- package/lib/validations/validation-text-area/validation-text-area.component.d.ts +3 -0
- package/package.json +31 -19
- package/public-api.d.ts +2 -0
- package/bundles/esfaenza-forms-and-validations.umd.js +0 -3753
- package/bundles/esfaenza-forms-and-validations.umd.js.map +0 -1
- package/esfaenza-forms-and-validations.metadata.json +0 -1
- package/esm2015/esfaenza-forms-and-validations.js +0 -17
- package/esm2015/lib/forms/base-form-control.js +0 -460
- package/esm2015/lib/forms/form-adaptive/form-adaptive.component.js +0 -277
- package/esm2015/lib/forms/form-adaptive/form-adaptive.component.loc.js +0 -23
- package/esm2015/lib/forms/form-autocomplete/form-autocomplete.component.js +0 -187
- package/esm2015/lib/forms/form-autocomplete/form-autocomplete.component.loc.js +0 -21
- package/esm2015/lib/forms/form-checkbox/form-checkbox.component.js +0 -41
- package/esm2015/lib/forms/form-date/form-date.component.js +0 -49
- package/esm2015/lib/forms/form-datetime/form-datetime.component.js +0 -49
- package/esm2015/lib/forms/form-empty/form-empty.component.js +0 -34
- package/esm2015/lib/forms/form-error/form-error.component.js +0 -49
- package/esm2015/lib/forms/form-file/form-file.component.js +0 -109
- package/esm2015/lib/forms/form-file/form-file.component.loc.js +0 -23
- package/esm2015/lib/forms/form-info/form-info.component.js +0 -49
- package/esm2015/lib/forms/form-input/form-input.component.js +0 -76
- package/esm2015/lib/forms/form-multiselect/form-multiselect.component.js +0 -153
- package/esm2015/lib/forms/form-multiselect/form-multiselect.component.loc.js +0 -24
- package/esm2015/lib/forms/form-select/form-select.component.js +0 -114
- package/esm2015/lib/forms/form-select/form-select.component.loc.js +0 -21
- package/esm2015/lib/forms/form-template/form-template.component.js +0 -64
- package/esm2015/lib/forms/form-textarea/form-textarea.component.js +0 -44
- package/esm2015/lib/forms/form-time/form-time.component.js +0 -117
- package/esm2015/lib/forms-and-validations.module.js +0 -144
- package/esm2015/lib/models/dayjs-adapter/dayjs-date-adapter.js +0 -86
- package/esm2015/lib/validations/base-validation.js +0 -208
- package/esm2015/lib/validations/base-validation.loc.js +0 -23
- package/esm2015/lib/validations/customValidators/CustomRequiredDirective.js +0 -35
- package/esm2015/lib/validations/validation-autocomplete/validation-autocomplete.component.js +0 -151
- package/esm2015/lib/validations/validation-currency/validation-currency.component.js +0 -48
- package/esm2015/lib/validations/validation-date/validation-date.component.js +0 -165
- package/esm2015/lib/validations/validation-datetime/validation-datetime.component.js +0 -193
- package/esm2015/lib/validations/validation-input/validation-input.component.js +0 -186
- package/esm2015/lib/validations/validation-select/validation-select.component.js +0 -166
- package/esm2015/lib/validations/validation-text-area/validation-text-area.component.js +0 -52
- package/esm2015/public-api.js +0 -32
- package/fesm2015/esfaenza-forms-and-validations.js +0 -3261
- package/fesm2015/esfaenza-forms-and-validations.js.map +0 -1
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generated bundle index. Do not edit.
|
|
3
3
|
*/
|
|
4
|
+
/// <amd-module name="@esfaenza/forms-and-validations" />
|
|
4
5
|
export * from './public-api';
|
|
5
|
-
export { BaseFormControl as ɵf } from './lib/forms/base-form-control';
|
|
6
|
-
export { FormAdaptiveComponentLoc as ɵh } from './lib/forms/form-adaptive/form-adaptive.component.loc';
|
|
7
|
-
export { FormAutocompleteComponentLoc as ɵl } from './lib/forms/form-autocomplete/form-autocomplete.component.loc';
|
|
8
|
-
export { FormFileComponentLoc as ɵk } from './lib/forms/form-file/form-file.component.loc';
|
|
9
|
-
export { FormMultiSelectComponent as ɵi } from './lib/forms/form-multiselect/form-multiselect.component';
|
|
10
|
-
export { FormMultiSelectComponentLoc as ɵj } from './lib/forms/form-multiselect/form-multiselect.component.loc';
|
|
11
|
-
export { FormSelectComponentLoc as ɵg } from './lib/forms/form-select/form-select.component.loc';
|
|
12
|
-
export { NgxExpandedDayJsDateAdapter as ɵm } from './lib/models/dayjs-adapter/dayjs-date-adapter';
|
|
13
|
-
export { ACO_CUSTOMKEY as ɵd, FAV_LOCALE as ɵc } from './lib/tokens';
|
|
14
|
-
export { BaseValidation as ɵa } from './lib/validations/base-validation';
|
|
15
|
-
export { BaseValidationLoc as ɵb } from './lib/validations/base-validation.loc';
|
|
16
|
-
export { CustomRequiredDirective as ɵe } from './lib/validations/customValidators/CustomRequiredDirective';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNmYWVuemEtZm9ybXMtYW5kLXZhbGlkYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9lc2ZhZW56YS1mb3Jtcy1hbmQtdmFsaWRhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
// Angular
|
|
2
|
+
import { RequiredValidator } from "@angular/forms";
|
|
3
|
+
import { EventEmitter, Input, Output, ViewChild, Optional, Inject, Directive } from "@angular/core";
|
|
4
|
+
import { ACO_CUSTOMKEY } from '../tokens';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "@esfaenza/access-control";
|
|
8
|
+
/**
|
|
9
|
+
* Componente base da cui tutti i componenti Form implementano
|
|
10
|
+
*/
|
|
11
|
+
export class BaseFormControl {
|
|
12
|
+
/**
|
|
13
|
+
* Costruttore
|
|
14
|
+
*
|
|
15
|
+
* @ignore
|
|
16
|
+
*/
|
|
17
|
+
constructor(cdr, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY, nativeInput = false) {
|
|
18
|
+
this.cdr = cdr;
|
|
19
|
+
this.ngControl = ngControl;
|
|
20
|
+
this._validators = _validators;
|
|
21
|
+
this.ac = ac;
|
|
22
|
+
this.AppContext = AppContext;
|
|
23
|
+
this.ACO_CUSTOMKEY = ACO_CUSTOMKEY;
|
|
24
|
+
this.nativeInput = nativeInput;
|
|
25
|
+
/**
|
|
26
|
+
* https://github.com/angular/angular/issues/14988
|
|
27
|
+
* TL:DR; Il primo valore passato al writeValue è nullo perché quando i cagnacci fanno new FormControl()
|
|
28
|
+
* scrivono un writeValue nullo... quindi al primo binding salto l'inizializzazione se ho la coppia null-firstBind
|
|
29
|
+
* poi mettendo firstBind a false di lì in poi funziono come devo. Vista la casistica evito essenzialmente metà detectChanges
|
|
30
|
+
*/
|
|
31
|
+
this.firstBind = true;
|
|
32
|
+
/**
|
|
33
|
+
* Indica se il campo è obbligatorio i opzionale
|
|
34
|
+
*/
|
|
35
|
+
this.Required = false;
|
|
36
|
+
/**
|
|
37
|
+
* Indica se il Form che contiene questo campo è già stato registrato
|
|
38
|
+
*/
|
|
39
|
+
this.formHasBennBound = false;
|
|
40
|
+
/**
|
|
41
|
+
* Indica se questo campo è staccato dal Form, ad esempio nel caso sia in un ng-template proiettato nel form.
|
|
42
|
+
*
|
|
43
|
+
* In quel caso la variabile **Form** del componente dev'essere valorizzata
|
|
44
|
+
*/
|
|
45
|
+
this.detatchedFromform = false;
|
|
46
|
+
/**
|
|
47
|
+
* @ignore
|
|
48
|
+
*/
|
|
49
|
+
this.propagateChange = (_) => { };
|
|
50
|
+
/**
|
|
51
|
+
* @ignore
|
|
52
|
+
*/
|
|
53
|
+
this.onTouched = () => { };
|
|
54
|
+
/**
|
|
55
|
+
* @ignore Vedi getter e setter
|
|
56
|
+
*/
|
|
57
|
+
this._readonly = false;
|
|
58
|
+
/**
|
|
59
|
+
* Qualora ci fosse un contesto collegato questa variabile identifica se Sono l'Owner o meno.
|
|
60
|
+
*
|
|
61
|
+
* Se non lo sono, il campo risulterà in sola lettura
|
|
62
|
+
*/
|
|
63
|
+
this.AppContextOwnership = true;
|
|
64
|
+
/**
|
|
65
|
+
* Utilizza o meno il Layout di un form (Label con input di fianco), se false mostra solo l'input
|
|
66
|
+
*/
|
|
67
|
+
this.FormLayout = true;
|
|
68
|
+
/**
|
|
69
|
+
* Attiva o disattiva la validazione per questo componente
|
|
70
|
+
*/
|
|
71
|
+
this.Validation = true;
|
|
72
|
+
/**
|
|
73
|
+
* Placeholder per quando l'input è vuoto
|
|
74
|
+
*/
|
|
75
|
+
this.Placeholder = "";
|
|
76
|
+
/**
|
|
77
|
+
* Classe extra per il form-group in cui viene wrappato l'input
|
|
78
|
+
*/
|
|
79
|
+
this.FormGroupClass = "";
|
|
80
|
+
/**
|
|
81
|
+
* Messaggio da mostrare quando la validazione fallisce per questo componente. Di default viene proposta dalla libreria
|
|
82
|
+
*/
|
|
83
|
+
this.FailedValidationMessage = "";
|
|
84
|
+
/**
|
|
85
|
+
* Input che forza l'invalidità del componente
|
|
86
|
+
*/
|
|
87
|
+
this.ForcedError = false;
|
|
88
|
+
/**
|
|
89
|
+
* Mostra un testo a sinistra dell'input (FormLayout permettendo)
|
|
90
|
+
*/
|
|
91
|
+
this.Label = "";
|
|
92
|
+
/**
|
|
93
|
+
* col-md-X per la label
|
|
94
|
+
*/
|
|
95
|
+
this.LabelColWidth = 4;
|
|
96
|
+
/**
|
|
97
|
+
* col-md-X per l'input
|
|
98
|
+
*/
|
|
99
|
+
this.InputColWidth = 8;
|
|
100
|
+
/**
|
|
101
|
+
* Indica se è l'ultimo componente di un form (serve per rimuovere il margine finale)
|
|
102
|
+
*/
|
|
103
|
+
this.Last = false;
|
|
104
|
+
/**
|
|
105
|
+
* Associa il componente Form a questo input
|
|
106
|
+
*/
|
|
107
|
+
this.Form = null;
|
|
108
|
+
/**
|
|
109
|
+
* Nome della proprietà che contiene l'Id degli oggetti bindati nella **Source**
|
|
110
|
+
*/
|
|
111
|
+
this.IdField = 'id';
|
|
112
|
+
/**
|
|
113
|
+
* Espressione simil-Angular per cambiare il testo dei componenti che scelgono il proprio modello da una **Source**
|
|
114
|
+
*
|
|
115
|
+
* Il funzionamento è identico al binder di angular, solo con una graffa invece che 2.
|
|
116
|
+
* È inoltre possibile aggiungere pezzi di descrizione in maniera condizionale con la sintassi **:prop?(Prop vale {prop})**
|
|
117
|
+
*/
|
|
118
|
+
this.Display = '{description}';
|
|
119
|
+
/**
|
|
120
|
+
* Risultato dell'unione fra le informazioni degli oggetti in **Source** e le impostazioni specificate nell'Input **Display**
|
|
121
|
+
*/
|
|
122
|
+
this.BoundSource = [];
|
|
123
|
+
/**
|
|
124
|
+
* Indica se è il primo Bind della Source
|
|
125
|
+
*/
|
|
126
|
+
this.SourceFirstBind = true;
|
|
127
|
+
/**
|
|
128
|
+
* Evento chiamato alla modifica del valore collegato a questo campo
|
|
129
|
+
*/
|
|
130
|
+
this.inputChange = new EventEmitter();
|
|
131
|
+
/**
|
|
132
|
+
* Cache delle condizioni scritte tipo :prop?(Roba con {prop})
|
|
133
|
+
*/
|
|
134
|
+
this.BindCheckingGroups = [];
|
|
135
|
+
/**
|
|
136
|
+
* Cache delle proprietà scritte tipo --> {prop}
|
|
137
|
+
*/
|
|
138
|
+
this.BindProperties = [];
|
|
139
|
+
if (ngControl == null) {
|
|
140
|
+
if (!this.handleNullNgControl())
|
|
141
|
+
console.error("ngControl nullo per qualche motivo! Il 90% delle funzionalità di questo input saranno disabilitate");
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
//Se mi arriva l'injectable del contesto posso capire se questo campo deve essere in readonly o no, solo se ho già inizializzato i controller custom dell'access control
|
|
145
|
+
if (this.AppContext && this.AppContext.name && this.ACO_CUSTOMKEY && this.ac && this.ac.InitializedCustom) {
|
|
146
|
+
this.AppContextOwnership = !this.ac.has(this.ACO_CUSTOMKEY + ":" + this.AppContext.name);
|
|
147
|
+
this._readonly = !this.AppContextOwnership;
|
|
148
|
+
}
|
|
149
|
+
ngControl.valueAccessor = this;
|
|
150
|
+
//Se ho già un parent impostato vuol dire che sotto al tag <form> ho direttamente un tag <form-*>..
|
|
151
|
+
//.. quindi posso impostare direttamente il riferimento del Form da usare in HTML per il submitted
|
|
152
|
+
//Se non c'è vuol dire che dentro al tag <form> c'è uno splendido <ng-container *ngTemplateOutlet="template; context: ....">..
|
|
153
|
+
//.. il quale a sua volta contiene il controllo <form-*> quindi avrò il form nell'input "Form"
|
|
154
|
+
if (ngControl._parent)
|
|
155
|
+
this.Form = ngControl._parent;
|
|
156
|
+
else
|
|
157
|
+
this.detatchedFromform = true;
|
|
158
|
+
//Questa serve per impostare me stesso come si deve, il validatore invece lo passo al validation-input quando viene settato il validationControl
|
|
159
|
+
if (this.ngControl) {
|
|
160
|
+
//Per tutti i validatori: rigenero la funzione di validazione. Per qualche motivo a volte ho validatori senza...
|
|
161
|
+
//... questo è un workaround per essere sicuro di averla sempre.
|
|
162
|
+
//Solo i validatori con parametri hanno bisogno della _createValidator (es. "maxlength" che ha 1 parametro), quindi no validatori tipo "required"
|
|
163
|
+
if (this._validators) {
|
|
164
|
+
this._validators.forEach(v => {
|
|
165
|
+
if (v._createValidator)
|
|
166
|
+
v._createValidator();
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
this.ngControl.control.setValidators(this._validators);
|
|
170
|
+
this.ngControl.control.updateValueAndValidity();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Ottiene il valore della variabile **_readonly**
|
|
175
|
+
*
|
|
176
|
+
* @returns {boolean} **true** se sola lettura, **false** altrimenti
|
|
177
|
+
*/
|
|
178
|
+
get Readonly() { return this._readonly; }
|
|
179
|
+
/**
|
|
180
|
+
* Imposta il valore della variabile **_readonly** gestendo anche il Contesto applicativo
|
|
181
|
+
*
|
|
182
|
+
* @param {boolean} value Valore da impostare
|
|
183
|
+
*/
|
|
184
|
+
set Readonly(value) {
|
|
185
|
+
if (this.AppContextOwnership)
|
|
186
|
+
this._readonly = value;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Permette di settare in una volta solo gli input LabelColWidth e InputColWidth, basta scriverlo con la sintassi "X Y"
|
|
190
|
+
*
|
|
191
|
+
* @param {string} input Input nel formato "X Y"
|
|
192
|
+
*/
|
|
193
|
+
set LabelInputRatio(input) {
|
|
194
|
+
var ratio = input.split(/\s/);
|
|
195
|
+
this.LabelColWidth = parseInt(ratio[0]);
|
|
196
|
+
this.InputColWidth = parseInt(ratio[1]);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Query sull'elemento 'validationControl' che funziona in ambiente statico
|
|
200
|
+
*
|
|
201
|
+
* @param {NgModel} comp Elemento HTML marcato con "#validationControl"
|
|
202
|
+
*/
|
|
203
|
+
set _validationControl(comp) { this.registerValComp(comp); }
|
|
204
|
+
/**
|
|
205
|
+
* Query sull'elemento 'validationControl' che funziona in ambiente dinamico
|
|
206
|
+
*
|
|
207
|
+
* @param {NgModel} comp Elemento HTML marcato con "#validationControl"
|
|
208
|
+
*/
|
|
209
|
+
set validationControl_static(comp) { this.registerValComp(comp); }
|
|
210
|
+
;
|
|
211
|
+
/**
|
|
212
|
+
* Effettua il Bind/Parse delle varie **Source** unendo le informazioni specificate in **Display**
|
|
213
|
+
*
|
|
214
|
+
* Eventualmente rieffettua un bind al modello in base al valore della variabile **RebindModelAfterSource**
|
|
215
|
+
*/
|
|
216
|
+
tryBindSourceDisplay() {
|
|
217
|
+
if (!this.Source)
|
|
218
|
+
return;
|
|
219
|
+
if (this.Source.length == 0 && !this.SourceFirstBind)
|
|
220
|
+
this.BoundSource = [];
|
|
221
|
+
this.SourceFirstBind = false;
|
|
222
|
+
// Cache locale per evitare di rifare dei regex.match ogni santa volta
|
|
223
|
+
if (this.Source.length > 0) {
|
|
224
|
+
this.BoundSource = [];
|
|
225
|
+
if (this.BindCheckingGroups.length == 0)
|
|
226
|
+
this.evaluateBindCheckingGroups();
|
|
227
|
+
if (this.BindProperties.length == 0)
|
|
228
|
+
this.evaluateBindProperties();
|
|
229
|
+
// Blocco per generare la descrizione finale di un elemento
|
|
230
|
+
this.Source.forEach(s => {
|
|
231
|
+
// Aggiungo alla BoundSource in formato standard KeyValue
|
|
232
|
+
this.BoundSource.push(this.transformSourceItem(s));
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Valuta il contenuto della variabile BindCheckingGroups
|
|
238
|
+
*/
|
|
239
|
+
evaluateBindCheckingGroups() {
|
|
240
|
+
// Blocco per tirare fuori le condizioni scritte tipo --> :prop?(Roba con {prop})
|
|
241
|
+
var iffedMatches = this.Display.match(/:([a-z]+)\?\(([^\(\)]+)\)/g);
|
|
242
|
+
if (iffedMatches) {
|
|
243
|
+
iffedMatches.forEach(m => {
|
|
244
|
+
// Stessa regex di sopra ma il tag "i" serve per tirare fuori i singoli capturing group e per qualche motivo
|
|
245
|
+
// new RegExp(baseRegex, "g") non funziona quindi non ho potuto razionalizzarlo
|
|
246
|
+
let groups = m.match(/:([a-z]+)\?\(([^\(\)]+)\)/i);
|
|
247
|
+
this.BindCheckingGroups.push({ global: m, prop: groups[1], whenexists: groups[2] });
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Valuta il contenuto della variabile BindProperties
|
|
253
|
+
*/
|
|
254
|
+
evaluateBindProperties() {
|
|
255
|
+
// Blocco per tirare fuori le proprietà scritte tipo --> {prop}
|
|
256
|
+
var matches = this.Display.match(/{[a-z]+}/gi);
|
|
257
|
+
if (matches)
|
|
258
|
+
matches.forEach(m => { this.BindProperties.push({ global: m, prop: m.substring(1, m.length - 1) }); });
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Trasforma un oggetto della Source alla sua versione "nuova" basandosi sulle informazioni su gruppi e proprietà
|
|
262
|
+
*
|
|
263
|
+
* @param {any} item Oggetto da trasformare
|
|
264
|
+
*
|
|
265
|
+
* @returns {{id: string, description: string}} Oggetto finale trasformato
|
|
266
|
+
*/
|
|
267
|
+
transformSourceItem(s) {
|
|
268
|
+
// Parto sempre dalla variabile di Display, poi sostituisco pezzo per pezzo
|
|
269
|
+
let desc = this.Display;
|
|
270
|
+
// Taglio o mantengo le condizioni in base alla proprietà su cui fare check
|
|
271
|
+
// Dopodiché scrivo tutte le proprietà
|
|
272
|
+
for (let i = 0; i < this.BindCheckingGroups.length; i++) {
|
|
273
|
+
let t = this.BindCheckingGroups[i];
|
|
274
|
+
desc = desc.replace(t.global, (s[t.prop] != null && s[t.prop] != undefined) ? t.whenexists : "");
|
|
275
|
+
}
|
|
276
|
+
for (let i = 0; i < this.BindProperties.length; i++) {
|
|
277
|
+
let t = this.BindProperties[i];
|
|
278
|
+
desc = desc.replace(t.global, s[t.prop]);
|
|
279
|
+
}
|
|
280
|
+
return { id: s[this.IdField], description: desc };
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Indica se il comopnente in questione è in grado di gestire ngControl nulli.
|
|
284
|
+
* Di default è **false**
|
|
285
|
+
*
|
|
286
|
+
* @returns {boolean} **true** se gestisco ngControl nulli, **false** altrimenti
|
|
287
|
+
*/
|
|
288
|
+
handleNullNgControl() {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* @ignore
|
|
293
|
+
*/
|
|
294
|
+
ngOnInit() {
|
|
295
|
+
// A volte nell'ngOnInit non ci passa quindi lo metto sia qui sia nell'afterviewinit, penso che valga per i componenti di terze parti
|
|
296
|
+
// che si collegano per i cazzi loro al form ecc, quindi la parte sopra non serve... BOH
|
|
297
|
+
this.checkRequiredValidator();
|
|
298
|
+
//Il nome non c'è se metto standalone : true
|
|
299
|
+
//Dato che anche il controllo esterno viene considerato come componente del form, non posso basarmi solo sul nome ma devo aggiungere un tag. In questo caso "_internal"
|
|
300
|
+
// ATTENZIONE: QUALSIASI SIA IL MOTIVO, SE STO COSO VIENE SPOSTATO DALL ngOnInit NON FUNZIONA PIU NULLA
|
|
301
|
+
if (this.ngControl.name)
|
|
302
|
+
this.GeneratedName = this.ngControl.name.toString() + "_internal";
|
|
303
|
+
// ATTENZIONE: QUALSIASI SIA IL MOTIVO, SE STO COSO VIENE SPOSTATO DALL ngOnInit NON FUNZIONA PIU NULLA
|
|
304
|
+
if (this.Form) {
|
|
305
|
+
if (!this.formHasBennBound && this.validationControl) {
|
|
306
|
+
this.Form.addControl(this.validationControl);
|
|
307
|
+
this.formHasBennBound = true;
|
|
308
|
+
}
|
|
309
|
+
// Quando un form viene submittato la variabile Form.submitted viene assegnata all'input [submitted] del val-control
|
|
310
|
+
// Essendo che però la CD è OnPush per dire ad Angular che l'Input è cambiato e permettere i sideffects di assegnare [submitted]
|
|
311
|
+
// devo attaccarmi al submit attuale del form e prima di eseguirlo devo marcare il componente per il check
|
|
312
|
+
let origFunc = this.Form.onSubmit;
|
|
313
|
+
var formOutsideRef = this.Form;
|
|
314
|
+
this.Form.onSubmit = (ev) => {
|
|
315
|
+
this.cdr.markForCheck();
|
|
316
|
+
return origFunc.apply(formOutsideRef);
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Elabora i validatori iniettati e capisce se il valore è obbligatorio o meno
|
|
322
|
+
*/
|
|
323
|
+
checkRequiredValidator() {
|
|
324
|
+
// controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
|
|
325
|
+
// Lo faccio qui e non in un eventuale ngOnInit o costruttore perché ngOnInit non sempre viene chiamato e da costruttore il validatore non ha ancora il valore giusto
|
|
326
|
+
if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && elem.required))
|
|
327
|
+
this.Required = true;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* @ignore
|
|
331
|
+
*/
|
|
332
|
+
ngAfterViewInit() {
|
|
333
|
+
if (!this.ngControl)
|
|
334
|
+
return;
|
|
335
|
+
this.checkRequiredValidator();
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Helper che collega la funzione di reset del controllo form al controllo di validazione sottostante
|
|
339
|
+
*/
|
|
340
|
+
bindResetFunction() {
|
|
341
|
+
//faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
|
|
342
|
+
const origFunc = this.ngControl.control.__original_reset__ || this.ngControl.control.reset;
|
|
343
|
+
var ngControl_outsideReference = this.ngControl.control;
|
|
344
|
+
var validationControl_outsideReference = this.validationControl.control;
|
|
345
|
+
this.ngControl.control.reset = () => {
|
|
346
|
+
origFunc.apply(ngControl_outsideReference);
|
|
347
|
+
validationControl_outsideReference.reset();
|
|
348
|
+
};
|
|
349
|
+
//Per consentire richiami multipli di questa funzione prendendo sempre la fiunzione di reset base
|
|
350
|
+
this.ngControl.control.__original_reset__ = origFunc;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* @ignore
|
|
354
|
+
*/
|
|
355
|
+
writeValue(obj) {
|
|
356
|
+
if (obj == null && this.firstBind) {
|
|
357
|
+
this.firstBind = false;
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
this.Model = obj;
|
|
361
|
+
//Per svegliare Angular. Il valore che entra potrebbe essere valido/non valido e questo lo binda a tutto, form compreso
|
|
362
|
+
if (this.ngControl)
|
|
363
|
+
this.ngControl.control.updateValueAndValidity();
|
|
364
|
+
if (this.Model)
|
|
365
|
+
this.onNotNullValueSet();
|
|
366
|
+
// markForCheck non va bene in quanto arrivano possibilmente 2 update su un solo ciclo di stack
|
|
367
|
+
// setTime*ut che wrappa tutto non va bene sennò spamma delle change detection a suon di interval che rallentano tantissimo l'app
|
|
368
|
+
this.cdr.detectChanges();
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* @ignore
|
|
372
|
+
*/
|
|
373
|
+
registerOnChange(fn) {
|
|
374
|
+
this.propagateChange = fn;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* @ignore
|
|
378
|
+
*/
|
|
379
|
+
registerOnTouched(fn) {
|
|
380
|
+
this.onTouched = fn;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Registra internamente il componente di validazione, ne imposta i validatori e collega il Form, se presente
|
|
384
|
+
*
|
|
385
|
+
* @param {NgModel} comp Elemento HTML marcato con "#validationControl"
|
|
386
|
+
*/
|
|
387
|
+
registerValComp(comp) {
|
|
388
|
+
if (comp) {
|
|
389
|
+
// È arrivato un nuovo validationContorl (succede solo nel form-select quando cambia la source da 0 elementi / null ad N elementi, quindi al massimo una volta)
|
|
390
|
+
if (this.validationControl && this.Form)
|
|
391
|
+
this.Form.removeControl(this.validationControl);
|
|
392
|
+
this.validationControl = comp;
|
|
393
|
+
//Questa serve per passare avanti i validatori
|
|
394
|
+
this.validationControl.control.setValidators(this._validators);
|
|
395
|
+
//Se sono staccato dal Form (vuol dire che sono ad esempio dentro un ng-template) aggiungo il controllo al Form passato come input (context del template)
|
|
396
|
+
if (this.detatchedFromform && this.Form && !this.formHasBennBound) {
|
|
397
|
+
this.Form.addControl(this.validationControl);
|
|
398
|
+
this.formHasBennBound = true;
|
|
399
|
+
}
|
|
400
|
+
if (this.ngControl)
|
|
401
|
+
this.bindResetFunction();
|
|
402
|
+
//I val-roba questo lo fanno automaticamente dentro... gli altri no (es. semplice input checkbox)
|
|
403
|
+
this.updateValidityForNativeInput();
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Aggiorna il valore e la validità dell'input sottostante. Non viene chiamato per input nativi come le checkbox
|
|
408
|
+
*
|
|
409
|
+
* @param {boolean} forcedValue Forza l'aggiornamento anche se non è un input nativo (input nativo = checkbox, ad esempio)
|
|
410
|
+
*/
|
|
411
|
+
updateValidityForNativeInput(forcedValue = false) {
|
|
412
|
+
if (forcedValue || this.nativeInput)
|
|
413
|
+
this.validationControl.control.updateValueAndValidity();
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* @ignore
|
|
417
|
+
* Classico "spara fuori". Mantengo lo stesso nome dell'evento dei <val-*> (inputChange) per retrocompatibilità.
|
|
418
|
+
*
|
|
419
|
+
* Non posso tenerlo protected altrimenti posso eseguirlo solo dal .ts e non dall' .html
|
|
420
|
+
*/
|
|
421
|
+
changed(forcedValue = null, markForCheck = false) {
|
|
422
|
+
this.propagateChange(forcedValue == null ? this.Model : forcedValue);
|
|
423
|
+
this.inputChange.emit(forcedValue == null ? this.Model : forcedValue);
|
|
424
|
+
if (markForCheck)
|
|
425
|
+
this.cdr.markForCheck();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
BaseFormControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseFormControl, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
|
|
429
|
+
BaseFormControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseFormControl, inputs: { FormLayout: "FormLayout", Validation: "Validation", Placeholder: "Placeholder", FormGroupClass: "FormGroupClass", FailedValidationMessage: "FailedValidationMessage", ForcedError: "ForcedError", Label: "Label", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", Last: "Last", Form: "Form", Source: "Source", IdField: "IdField", Display: "Display", Readonly: "Readonly", LabelInputRatio: "LabelInputRatio" }, outputs: { inputChange: "inputChange" }, viewQueries: [{ propertyName: "_validationControl", first: true, predicate: ["validationControl"], descendants: true }, { propertyName: "validationControl_static", first: true, predicate: ["validationControl"], descendants: true, static: true }], ngImport: i0 });
|
|
430
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseFormControl, decorators: [{
|
|
431
|
+
type: Directive
|
|
432
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl }, { type: Array }, { type: i2.AccessControlService, decorators: [{
|
|
433
|
+
type: Optional
|
|
434
|
+
}] }, { type: i2.ComponentContext, decorators: [{
|
|
435
|
+
type: Optional
|
|
436
|
+
}] }, { type: undefined, decorators: [{
|
|
437
|
+
type: Optional
|
|
438
|
+
}, {
|
|
439
|
+
type: Inject,
|
|
440
|
+
args: [ACO_CUSTOMKEY]
|
|
441
|
+
}] }, { type: undefined }]; }, propDecorators: { FormLayout: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], Validation: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], Placeholder: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], FormGroupClass: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], FailedValidationMessage: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], ForcedError: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], Label: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], LabelColWidth: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], InputColWidth: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], Last: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], Form: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], Source: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], IdField: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], Display: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], Readonly: [{
|
|
470
|
+
type: Input
|
|
471
|
+
}], LabelInputRatio: [{
|
|
472
|
+
type: Input
|
|
473
|
+
}], _validationControl: [{
|
|
474
|
+
type: ViewChild,
|
|
475
|
+
args: ["validationControl", { static: false }]
|
|
476
|
+
}], validationControl_static: [{
|
|
477
|
+
type: ViewChild,
|
|
478
|
+
args: ["validationControl", { static: true }]
|
|
479
|
+
}], inputChange: [{
|
|
480
|
+
type: Output
|
|
481
|
+
}] } });
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFvRCxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSXZILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFFMUM7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLGVBQWU7SUE0TWpDOzs7O09BSUc7SUFDSCxZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBVSxjQUF1QixLQUFLO1FBQTdSLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBL01uVDs7Ozs7V0FLRztRQUNLLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFbEM7O1dBRUc7UUFDSSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBWWpDOztXQUVHO1FBQ08scUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRTVDOzs7O1dBSUc7UUFDTyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFN0M7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLENBQUMsQ0FBTSxF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LEtBQUs7MEJBQVEsUUFBUTs7MEJBQXNDLFFBQVE7OzBCQUF5QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWE7aUVBbkpyTyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUtHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQVFHLE9BQU87c0JBQWYsS0FBSztnQkF3Qk8sUUFBUTtzQkFBcEIsS0FBSztnQkFVTyxlQUFlO3NCQUEzQixLQUFLO2dCQWdCaUQsa0JBQWtCO3NCQUF4RSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPSyx3QkFBd0I7c0JBQTdFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUt0QyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBOZ0Zvcm0sIE5nTW9kZWwsIFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBPcHRpb25hbCwgSW5qZWN0LCBEaXJlY3RpdmUsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIC8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBDb21wb25lbnRDb250ZXh0IH0gZnJvbSBcIkBlc2ZhZW56YS9hY2Nlc3MtY29udHJvbFwiO1xyXG5pbXBvcnQgeyBBQ09fQ1VTVE9NS0VZIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGJhc2UgZGEgY3VpIHR1dHRpIGkgY29tcG9uZW50aSBGb3JtIGltcGxlbWVudGFub1xyXG4gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRm9ybUNvbnRyb2wgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDk4OFxyXG4gICAgICogVEw6RFI7IElsIHByaW1vIHZhbG9yZSBwYXNzYXRvIGFsIHdyaXRlVmFsdWUgw6ggbnVsbG8gcGVyY2jDqSBxdWFuZG8gaSBjYWduYWNjaSBmYW5ubyBuZXcgRm9ybUNvbnRyb2woKVxyXG4gICAgICogc2NyaXZvbm8gdW4gd3JpdGVWYWx1ZSBudWxsby4uLiBxdWluZGkgYWwgcHJpbW8gYmluZGluZyBzYWx0byBsJ2luaXppYWxpenphemlvbmUgc2UgaG8gbGEgY29wcGlhIG51bGwtZmlyc3RCaW5kXHJcbiAgICAgKiBwb2kgbWV0dGVuZG8gZmlyc3RCaW5kIGEgZmFsc2UgZGkgbMOsIGluIHBvaSBmdW56aW9ubyBjb21lIGRldm8uIFZpc3RhIGxhIGNhc2lzdGljYSBldml0byBlc3NlbnppYWxtZW50ZSBtZXTDoCBkZXRlY3RDaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8gaSBvcHppb25hbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RlbGxvIHJhcHByZXNlbnRhdG8gZGEgcXVlc3RvIGNhbXBvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNb2RlbDogYW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm9tZSBnZW5lcmF0byBwZXIgaWwgY29udHJvbGxvIGludGVybm8uIERpIGRlZmF1bHQgw6ggaWwgbm9tZSBkZWwgY29udHJvbGxvIGVzdGVybm8gY29uIGwnYWdnaXVudGEgZGkgXCJfaW50ZXJuYWxcIi4gU2VydmUgcGVyIGV2aXRhcmUgY3Jvc3MtYmluZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhdGVkTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsIEZvcm0gY2hlIGNvbnRpZW5lIHF1ZXN0byBjYW1wbyDDqCBnacOgIHN0YXRvIHJlZ2lzdHJhdG9cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGZvcm1IYXNCZW5uQm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBxdWVzdG8gY2FtcG8gw6ggc3RhY2NhdG8gZGFsIEZvcm0sIGFkIGVzZW1waW8gbmVsIGNhc28gc2lhIGluIHVuIG5nLXRlbXBsYXRlIHByb2lldHRhdG8gbmVsIGZvcm0uXHJcbiAgICAgKiBcclxuICAgICAqIEluIHF1ZWwgY2FzbyBsYSB2YXJpYWJpbGUgKipGb3JtKiogZGVsIGNvbXBvbmVudGUgZGV2J2Vzc2VyZSB2YWxvcml6emF0YVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZGV0YXRjaGVkRnJvbWZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgVmVkaSBnZXR0ZXIgZSBzZXR0ZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1YWxvcmEgY2kgZm9zc2UgdW4gY29udGVzdG8gY29sbGVnYXRvIHF1ZXN0YSB2YXJpYWJpbGUgaWRlbnRpZmljYSBzZSBTb25vIGwnT3duZXIgbyBtZW5vLlxyXG4gICAgICogXHJcbiAgICAgKiBTZSBub24gbG8gc29ubywgaWwgY2FtcG8gcmlzdWx0ZXLDoCBpbiBzb2xhIGxldHR1cmEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgQXBwQ29udGV4dE93bmVyc2hpcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVdGlsaXp6YSBvIG1lbm8gaWwgTGF5b3V0IGRpIHVuIGZvcm0gKExhYmVsIGNvbiBpbnB1dCBkaSBmaWFuY28pLCBzZSBmYWxzZSBtb3N0cmEgc29sbyBsJ2lucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1MYXlvdXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0aXZhIG8gZGlzYXR0aXZhIGxhIHZhbGlkYXppb25lIHBlciBxdWVzdG8gY29tcG9uZW50ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBsYWNlaG9sZGVyIHBlciBxdWFuZG8gbCdpbnB1dCDDqCB2dW90b1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBQbGFjZWhvbGRlcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzZSBleHRyYSBwZXIgaWwgZm9ybS1ncm91cCBpbiBjdWkgdmllbmUgd3JhcHBhdG8gbCdpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGb3JtR3JvdXBDbGFzczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1lc3NhZ2dpbyBkYSBtb3N0cmFyZSBxdWFuZG8gbGEgdmFsaWRhemlvbmUgZmFsbGlzY2UgcGVyIHF1ZXN0byBjb21wb25lbnRlLiBEaSBkZWZhdWx0IHZpZW5lIHByb3Bvc3RhIGRhbGxhIGxpYnJlcmlhXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZhaWxlZFZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5wdXQgY2hlIGZvcnphIGwnaW52YWxpZGl0w6AgZGVsIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRm9yY2VkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vc3RyYSB1biB0ZXN0byBhIHNpbmlzdHJhIGRlbGwnaW5wdXQgKEZvcm1MYXlvdXQgcGVybWV0dGVuZG8pXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIExhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29sLW1kLVggcGVyIGxhIGxhYmVsXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIExhYmVsQ29sV2lkdGg6IG51bWJlciA9IDQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb2wtbWQtWCBwZXIgbCdpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBJbnB1dENvbFdpZHRoOiBudW1iZXIgPSA4O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIMOoIGwndWx0aW1vIGNvbXBvbmVudGUgZGkgdW4gZm9ybSAoc2VydmUgcGVyIHJpbXVvdmVyZSBpbCBtYXJnaW5lIGZpbmFsZSlcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgTGFzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzb2NpYSBpbCBjb21wb25lbnRlIEZvcm0gYSBxdWVzdG8gaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRm9ybTogTmdGb3JtID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvcmdlbnRlIGRhIGN1aSBzY2VnbGllcmUgdmFsb3JpIHBlciBpIGNvbXBvbmVudGkgRm9ybSBjaGUgbG8gY29uc2VudG9ub1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBTb3VyY2U6IGFueVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lkIGRlZ2xpIG9nZ2V0dGkgYmluZGF0aSBuZWxsYSAqKlNvdXJjZSoqXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIElkRmllbGQ6IHN0cmluZyA9ICdpZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3ByZXNzaW9uZSBzaW1pbC1Bbmd1bGFyIHBlciBjYW1iaWFyZSBpbCB0ZXN0byBkZWkgY29tcG9uZW50aSBjaGUgc2NlbGdvbm8gaWwgcHJvcHJpbyBtb2RlbGxvIGRhIHVuYSAqKlNvdXJjZSoqXHJcbiAgICAgKiBcclxuICAgICAqIElsIGZ1bnppb25hbWVudG8gw6ggaWRlbnRpY28gYWwgYmluZGVyIGRpIGFuZ3VsYXIsIHNvbG8gY29uIHVuYSBncmFmZmEgaW52ZWNlIGNoZSAyLlxyXG4gICAgICogw4ggaW5vbHRyZSBwb3NzaWJpbGUgYWdnaXVuZ2VyZSBwZXp6aSBkaSBkZXNjcml6aW9uZSBpbiBtYW5pZXJhIGNvbmRpemlvbmFsZSBjb24gbGEgc2ludGFzc2kgKio6cHJvcD8oUHJvcCB2YWxlIHtwcm9wfSkqKlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5OiBzdHJpbmcgPSAne2Rlc2NyaXB0aW9ufSc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaXN1bHRhdG8gZGVsbCd1bmlvbmUgZnJhIGxlIGluZm9ybWF6aW9uaSBkZWdsaSBvZ2dldHRpIGluICoqU291cmNlKiogZSBsZSBpbXBvc3Rhemlvbmkgc3BlY2lmaWNhdGUgbmVsbCdJbnB1dCAqKkRpc3BsYXkqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQm91bmRTb3VyY2U6IHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSDDqCBpbCBwcmltbyBCaW5kIGRlbGxhIFNvdXJjZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgU291cmNlRmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKl9yZWFkb25seSoqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBzb2xhIGxldHR1cmEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFkb25seSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBvc3RhIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKiBnZXN0ZW5kbyBhbmNoZSBpbCBDb250ZXN0byBhcHBsaWNhdGl2b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIFZhbG9yZSBkYSBpbXBvc3RhcmVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgc2V0IFJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQXBwQ29udGV4dE93bmVyc2hpcClcclxuICAgICAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcm1ldHRlIGRpIHNldHRhcmUgaW4gdW5hIHZvbHRhIHNvbG8gZ2xpIGlucHV0IExhYmVsQ29sV2lkdGggZSBJbnB1dENvbFdpZHRoLCBiYXN0YSBzY3JpdmVybG8gY29uIGxhIHNpbnRhc3NpIFwiWCBZXCJcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IElucHV0IG5lbCBmb3JtYXRvIFwiWCBZXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgc2V0IExhYmVsSW5wdXRSYXRpbyhpbnB1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvID0gaW5wdXQuc3BsaXQoL1xccy8pO1xyXG4gICAgICAgIHRoaXMuTGFiZWxDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzBdKTtcclxuICAgICAgICB0aGlzLklucHV0Q29sV2lkdGggPSBwYXJzZUludChyYXRpb1sxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB2YWwtcXVhbGNvc2EgY2hlIGZhIGVmZmV0dGl2YW1lbnRlIGRhIGlucHV0LCBvIGV2ZW50dWFsbWVudGUgaWwgc2luZ29sbyBpbnB1dCBpbiBjYXNpIHBhcnRpY29sYXJpIChlcyBjaGVja2JveClcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRpb25Db250cm9sOiBOZ01vZGVsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVlcnkgc3VsbCdlbGVtZW50byAndmFsaWRhdGlvbkNvbnRyb2wnIGNoZSBmdW56aW9uYSBpbiBhbWJpZW50ZSBzdGF0aWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBzZXQgX3ZhbGlkYXRpb25Db250cm9sKGNvbXA6IE5nTW9kZWwpIHsgdGhpcy5yZWdpc3RlclZhbENvbXAoY29tcCk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgZGluYW1pY29cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFwidmFsaWRhdGlvbkNvbnRyb2xcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2V0IHZhbGlkYXRpb25Db250cm9sX3N0YXRpYyhjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIGNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVsIHZhbG9yZSBjb2xsZWdhdG8gYSBxdWVzdG8gY2FtcG9cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FjaGUgZGVsbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gOnByb3A/KFJvYmEgY29uIHtwcm9wfSlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBCaW5kQ2hlY2tpbmdHcm91cHM6IHsgZ2xvYmFsOiBzdHJpbmcsIHByb3A6IHN0cmluZywgd2hlbmV4aXN0czogc3RyaW5nIH1bXSA9IFtdXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWNoZSBkZWxsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgQmluZFByb3BlcnRpZXM6IHsgZ2xvYmFsOiBzdHJpbmcsIHByb3A6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvc3RydXR0b3JlIFxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8YW55PiwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhYzogQWNjZXNzQ29udHJvbFNlcnZpY2UsIEBPcHRpb25hbCgpIHB1YmxpYyBBcHBDb250ZXh0OiBDb21wb25lbnRDb250ZXh0LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFDT19DVVNUT01LRVkpIHByaXZhdGUgQUNPX0NVU1RPTUtFWTogc3RyaW5nLCBwcml2YXRlIG5hdGl2ZUlucHV0OiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKG5nQ29udHJvbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYW5kbGVOdWxsTmdDb250cm9sKCkpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwibmdDb250cm9sIG51bGxvIHBlciBxdWFsY2hlIG1vdGl2byEgSWwgOTAlIGRlbGxlIGZ1bnppb25hbGl0w6AgZGkgcXVlc3RvIGlucHV0IHNhcmFubm8gZGlzYWJpbGl0YXRlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9TZSBtaSBhcnJpdmEgbCdpbmplY3RhYmxlIGRlbCBjb250ZXN0byBwb3NzbyBjYXBpcmUgc2UgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGluIHJlYWRvbmx5IG8gbm8sIHNvbG8gc2UgaG8gZ2nDoCBpbml6aWFsaXp6YXRvIGkgY29udHJvbGxlciBjdXN0b20gZGVsbCdhY2Nlc3MgY29udHJvbFxyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHQgJiYgdGhpcy5BcHBDb250ZXh0Lm5hbWUgJiYgdGhpcy5BQ09fQ1VTVE9NS0VZICYmIHRoaXMuYWMgJiYgdGhpcy5hYy5Jbml0aWFsaXplZEN1c3RvbSkge1xyXG4gICAgICAgICAgICB0aGlzLkFwcENvbnRleHRPd25lcnNoaXAgPSAhdGhpcy5hYy5oYXModGhpcy5BQ09fQ1VTVE9NS0VZICsgXCI6XCIgKyB0aGlzLkFwcENvbnRleHQubmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gIXRoaXMuQXBwQ29udGV4dE93bmVyc2hpcFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG5cclxuICAgICAgICAvL1NlIGhvIGdpw6AgdW4gcGFyZW50IGltcG9zdGF0byB2dW9sIGRpcmUgY2hlIHNvdHRvIGFsIHRhZyA8Zm9ybT4gaG8gZGlyZXR0YW1lbnRlIHVuIHRhZyA8Zm9ybS0qPi4uXHJcbiAgICAgICAgLy8uLiBxdWluZGkgcG9zc28gaW1wb3N0YXJlIGRpcmV0dGFtZW50ZSBpbCByaWZlcmltZW50byBkZWwgRm9ybSBkYSB1c2FyZSBpbiBIVE1MIHBlciBpbCBzdWJtaXR0ZWRcclxuXHJcbiAgICAgICAgLy9TZSBub24gYyfDqCB2dW9sIGRpcmUgY2hlIGRlbnRybyBhbCB0YWcgPGZvcm0+IGMnw6ggdW5vIHNwbGVuZGlkbyA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IC4uLi5cIj4uLlxyXG4gICAgICAgIC8vLi4gaWwgcXVhbGUgYSBzdWEgdm9sdGEgY29udGllbmUgaWwgY29udHJvbGxvIDxmb3JtLSo+IHF1aW5kaSBhdnLDsiBpbCBmb3JtIG5lbGwnaW5wdXQgXCJGb3JtXCJcclxuICAgICAgICBpZiAoKDxhbnk+bmdDb250cm9sKS5fcGFyZW50KVxyXG4gICAgICAgICAgICB0aGlzLkZvcm0gPSA8TmdGb3JtPig8YW55Pm5nQ29udHJvbCkuX3BhcmVudDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZGV0YXRjaGVkRnJvbWZvcm0gPSB0cnVlO1xyXG5cclxuICAgICAgICAvL1F1ZXN0YSBzZXJ2ZSBwZXIgaW1wb3N0YXJlIG1lIHN0ZXNzbyBjb21lIHNpIGRldmUsIGlsIHZhbGlkYXRvcmUgaW52ZWNlIGxvIHBhc3NvIGFsIHZhbGlkYXRpb24taW5wdXQgcXVhbmRvIHZpZW5lIHNldHRhdG8gaWwgdmFsaWRhdGlvbkNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgLy9QZXIgdHV0dGkgaSB2YWxpZGF0b3JpOiByaWdlbmVybyBsYSBmdW56aW9uZSBkaSB2YWxpZGF6aW9uZS4gUGVyIHF1YWxjaGUgbW90aXZvIGEgdm9sdGUgaG8gdmFsaWRhdG9yaSBzZW56YS4uLlxyXG4gICAgICAgICAgICAvLy4uLiBxdWVzdG8gw6ggdW4gd29ya2Fyb3VuZCBwZXIgZXNzZXJlIHNpY3VybyBkaSBhdmVybGEgc2VtcHJlLlxyXG4gICAgICAgICAgICAvL1NvbG8gaSB2YWxpZGF0b3JpIGNvbiBwYXJhbWV0cmkgaGFubm8gYmlzb2dubyBkZWxsYSBfY3JlYXRlVmFsaWRhdG9yIChlcy4gXCJtYXhsZW5ndGhcIiBjaGUgaGEgMSBwYXJhbWV0cm8pLCBxdWluZGkgbm8gdmFsaWRhdG9yaSB0aXBvIFwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdG9ycy5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2Ll9jcmVhdGVWYWxpZGF0b3IpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NyZWF0ZVZhbGlkYXRvcigpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCBCaW5kL1BhcnNlIGRlbGxlIHZhcmllICoqU291cmNlKiogdW5lbmRvIGxlIGluZm9ybWF6aW9uaSBzcGVjaWZpY2F0ZSBpbiAqKkRpc3BsYXkqKlxyXG4gICAgICogXHJcbiAgICAgKiBFdmVudHVhbG1lbnRlIHJpZWZmZXR0dWEgdW4gYmluZCBhbCBtb2RlbGxvIGluIGJhc2UgYWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKlJlYmluZE1vZGVsQWZ0ZXJTb3VyY2UqKlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdHJ5QmluZFNvdXJjZURpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Tb3VyY2UubGVuZ3RoID09IDAgJiYgIXRoaXMuU291cmNlRmlyc3RCaW5kKVxyXG4gICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuU291cmNlRmlyc3RCaW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIENhY2hlIGxvY2FsZSBwZXIgZXZpdGFyZSBkaSByaWZhcmUgZGVpIHJlZ2V4Lm1hdGNoIG9nbmkgc2FudGEgdm9sdGFcclxuICAgICAgICBpZiAodGhpcy5Tb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5CaW5kUHJvcGVydGllcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVCaW5kUHJvcGVydGllcygpO1xyXG5cclxuICAgICAgICAgICAgLy8gQmxvY2NvIHBlciBnZW5lcmFyZSBsYSBkZXNjcml6aW9uZSBmaW5hbGUgZGkgdW4gZWxlbWVudG9cclxuICAgICAgICAgICAgdGhpcy5Tb3VyY2UuZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGFsbGEgQm91bmRTb3VyY2UgaW4gZm9ybWF0byBzdGFuZGFyZCBLZXlWYWx1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZS5wdXNoKHRoaXMudHJhbnNmb3JtU291cmNlSXRlbShzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRDaGVja2luZ0dyb3Vwc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIC0tPiA6cHJvcD8oUm9iYSBjb24ge3Byb3B9KVxyXG4gICAgICAgIHZhciBpZmZlZE1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9nKTtcclxuICAgICAgICBpZiAoaWZmZWRNYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGlmZmVkTWF0Y2hlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU3Rlc3NhIHJlZ2V4IGRpIHNvcHJhIG1hIGlsIHRhZyBcImlcIiBzZXJ2ZSBwZXIgdGlyYXJlIGZ1b3JpIGkgc2luZ29saSBjYXB0dXJpbmcgZ3JvdXAgZSBwZXIgcXVhbGNoZSBtb3Rpdm8gXHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgUmVnRXhwKGJhc2VSZWdleCwgXCJnXCIpIG5vbiBmdW56aW9uYSBxdWluZGkgbm9uIGhvIHBvdHV0byByYXppb25hbGl6emFybG9cclxuICAgICAgICAgICAgICAgIGxldCBncm91cHMgPSBtLm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvaSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBncm91cHNbMV0sIHdoZW5leGlzdHM6IGdyb3Vwc1syXSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIGlsIGNvbnRlbnV0byBkZWxsYSB2YXJpYWJpbGUgQmluZFByb3BlcnRpZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIHByb3ByaWV0w6Agc2NyaXR0ZSB0aXBvIC0tPiB7cHJvcH1cclxuICAgICAgICB2YXIgbWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgve1thLXpdK30vZ2kpO1xyXG4gICAgICAgIGlmIChtYXRjaGVzKVxyXG4gICAgICAgICAgICBtYXRjaGVzLmZvckVhY2gobSA9PiB7IHRoaXMuQmluZFByb3BlcnRpZXMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogbS5zdWJzdHJpbmcoMSwgbS5sZW5ndGggLSAxKSB9KTsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWEgdW4gb2dnZXR0byBkZWxsYSBTb3VyY2UgYWxsYSBzdWEgdmVyc2lvbmUgXCJudW92YVwiIGJhc2FuZG9zaSBzdWxsZSBpbmZvcm1hemlvbmkgc3UgZ3J1cHBpIGUgcHJvcHJpZXTDoFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGRhIHRyYXNmb3JtYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHt7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ319IE9nZ2V0dG8gZmluYWxlIHRyYXNmb3JtYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhbnNmb3JtU291cmNlSXRlbShzOiBhbnkpOiB7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ30ge1xyXG4gICAgICAgIC8vIFBhcnRvIHNlbXByZSBkYWxsYSB2YXJpYWJpbGUgZGkgRGlzcGxheSwgcG9pIHNvc3RpdHVpc2NvIHBlenpvIHBlciBwZXp6b1xyXG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5EaXNwbGF5O1xyXG5cclxuICAgICAgICAvLyBUYWdsaW8gbyBtYW50ZW5nbyBsZSBjb25kaXppb25pIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgIHN1IGN1aSBmYXJlIGNoZWNrXHJcbiAgICAgICAgLy8gRG9wb2RpY2jDqSBzY3Jpdm8gdHV0dGUgbGUgcHJvcHJpZXTDoFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgKHNbdC5wcm9wXSAhPSBudWxsICYmIHNbdC5wcm9wXSAhPSB1bmRlZmluZWQpID8gdC53aGVuZXhpc3RzIDogXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRQcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCBzW3QucHJvcF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHNbdGhpcy5JZEZpZWxkXSwgZGVzY3JpcHRpb246IGRlc2MgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBjb21vcG5lbnRlIGluIHF1ZXN0aW9uZSDDqCBpbiBncmFkbyBkaSBnZXN0aXJlIG5nQ29udHJvbCBudWxsaS4gXHJcbiAgICAgKiBEaSBkZWZhdWx0IMOoICoqZmFsc2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgZ2VzdGlzY28gbmdDb250cm9sIG51bGxpLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBoYW5kbGVOdWxsTmdDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gQSB2b2x0ZSBuZWxsJ25nT25Jbml0IG5vbiBjaSBwYXNzYSBxdWluZGkgbG8gbWV0dG8gc2lhIHF1aSBzaWEgbmVsbCdhZnRlcnZpZXdpbml0LCBwZW5zbyBjaGUgdmFsZ2EgcGVyIGkgY29tcG9uZW50aSBkaSB0ZXJ6ZSBwYXJ0aVxyXG4gICAgICAgIC8vIGNoZSBzaSBjb2xsZWdhbm8gcGVyIGkgY2F6emkgbG9ybyBhbCBmb3JtIGVjYywgcXVpbmRpIGxhIHBhcnRlIHNvcHJhIG5vbiBzZXJ2ZS4uLiBCT0hcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKTtcclxuXHJcbiAgICAgICAgLy9JbCBub21lIG5vbiBjJ8OoIHNlIG1ldHRvIHN0YW5kYWxvbmUgOiB0cnVlXHJcbiAgICAgICAgLy9EYXRvIGNoZSBhbmNoZSBpbCBjb250cm9sbG8gZXN0ZXJubyB2aWVuZSBjb25zaWRlcmF0byBjb21lIGNvbXBvbmVudGUgZGVsIGZvcm0sIG5vbiBwb3NzbyBiYXNhcm1pIHNvbG8gc3VsIG5vbWUgbWEgZGV2byBhZ2dpdW5nZXJlIHVuIHRhZy4gSW4gcXVlc3RvIGNhc28gXCJfaW50ZXJuYWxcIlxyXG4gICAgICAgIC8vIEFUVEVOWklPTkU6IFFVQUxTSUFTSSBTSUEgSUwgTU9USVZPLCBTRSBTVE8gQ09TTyBWSUVORSBTUE9TVEFUTyBEQUxMIG5nT25Jbml0IE5PTiBGVU5aSU9OQSBQSVUgTlVMTEFcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgdGhpcy5HZW5lcmF0ZWROYW1lID0gdGhpcy5uZ0NvbnRyb2wubmFtZS50b1N0cmluZygpICsgXCJfaW50ZXJuYWxcIjtcclxuXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLkZvcm0pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1IYXNCZW5uQm91bmQgJiYgdGhpcy52YWxpZGF0aW9uQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1IYXNCZW5uQm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBRdWFuZG8gdW4gZm9ybSB2aWVuZSBzdWJtaXR0YXRvIGxhIHZhcmlhYmlsZSBGb3JtLnN1Ym1pdHRlZCB2aWVuZSBhc3NlZ25hdGEgYWxsJ2lucHV0IFtzdWJtaXR0ZWRdIGRlbCB2YWwtY29udHJvbFxyXG4gICAgICAgICAgICAvLyBFc3NlbmRvIGNoZSBwZXLDsiBsYSBDRCDDqCBPblB1c2ggcGVyIGRpcmUgYWQgQW5ndWxhciBjaGUgbCdJbnB1dCDDqCBjYW1iaWF0byBlIHBlcm1ldHRlcmUgaSBzaWRlZmZlY3RzIGRpIGFzc2VnbmFyZSBbc3VibWl0dGVkXVxyXG4gICAgICAgICAgICAvLyBkZXZvIGF0dGFjY2FybWkgYWwgc3VibWl0IGF0dHVhbGUgZGVsIGZvcm0gZSBwcmltYSBkaSBlc2VndWlybG8gZGV2byBtYXJjYXJlIGlsIGNvbXBvbmVudGUgcGVyIGlsIGNoZWNrXHJcbiAgICAgICAgICAgIGxldCBvcmlnRnVuYyA9IHRoaXMuRm9ybS5vblN1Ym1pdDtcclxuICAgICAgICAgICAgdmFyIGZvcm1PdXRzaWRlUmVmID0gdGhpcy5Gb3JtO1xyXG4gICAgICAgICAgICB0aGlzLkZvcm0ub25TdWJtaXQgPSAoZXYpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdGdW5jLmFwcGx5KGZvcm1PdXRzaWRlUmVmKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGFib3JhIGkgdmFsaWRhdG9yaSBpbmlldHRhdGkgZSBjYXBpc2NlIHNlIGlsIHZhbG9yZSDDqCBvYmJsaWdhdG9yaW8gbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIGNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgLy8gY29udHJvbGxvIHNlIMOoIHNldHRhdG8gdW4gcmVxdWlyZWQgcGVyIGRlY2lkZXJlIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIHNlIHV0aWxpenphcmUgaWwgdmFsaWRhdG9yZSByZXF1aXJlZCBuZWwgY29tcG9uZW50ZSBpbnRlcm5vXHJcbiAgICAgICAgLy8gTG8gZmFjY2lvIHF1aSBlIG5vbiBpbiB1biBldmVudHVhbGUgbmdPbkluaXQgbyBjb3N0cnV0dG9yZSBwZXJjaMOpIG5nT25Jbml0IG5vbiBzZW1wcmUgdmllbmUgY2hpYW1hdG8gZSBkYSBjb3N0cnV0dG9yZSBpbCB2YWxpZGF0b3JlIG5vbiBoYSBhbmNvcmEgaWwgdmFsb3JlIGdpdXN0b1xyXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzICYmIHRoaXMuX3ZhbGlkYXRvcnMuc29tZShlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiBlbGVtLnJlcXVpcmVkKSlcclxuICAgICAgICAgICAgdGhpcy5SZXF1aXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSBjb2xsZWdhIGxhIGZ1bnppb25lIGRpIHJlc2V0IGRlbCBjb250cm9sbG8gZm9ybSBhbCBjb250cm9sbG8gZGkgdmFsaWRhemlvbmUgc290dG9zdGFudGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBiaW5kUmVzZXRGdW5jdGlvbigpIHtcclxuICAgICAgICAvL2ZhY2NpbyBpbiBtb2RvIGNoZSBzZSBjaGlhbW8gaWwgcmVzZXQgZGVsIGNvbnRyb2xsbyAobyBkZWxsYSBmb3JtKSBkYWxsJ2VzdGVybm8gc2kgcmVzZXR0aSBhbmNoZSBpbCBjb250cm9sbG8gbmF0aXZvXHJcbiAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldDtcclxuICAgICAgICB2YXIgbmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sO1xyXG5cclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBvcmlnRnVuYy5hcHBseShuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UucmVzZXQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL1BlciBjb25zZW50aXJlIHJpY2hpYW1pIG11bHRpcGxpIGRpIHF1ZXN0YSBmdW56aW9uZSBwcmVuZGVuZG8gc2VtcHJlIGxhIGZpdW56aW9uZSBkaSByZXNldCBiYXNlXHJcbiAgICAgICAgKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fID0gb3JpZ0Z1bmNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCAmJiB0aGlzLmZpcnN0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0QmluZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLk1vZGVsID0gb2JqO1xyXG5cclxuICAgICAgICAvL1BlciBzdmVnbGlhcmUgQW5ndWxhci4gSWwgdmFsb3JlIGNoZSBlbnRyYSBwb3RyZWJiZSBlc3NlcmUgdmFsaWRvL25vbiB2YWxpZG8gZSBxdWVzdG8gbG8gYmluZGEgYSB0dXR0bywgZm9ybSBjb21wcmVzb1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICB0aGlzLm9uTm90TnVsbFZhbHVlU2V0KCk7XHJcblxyXG4gICAgICAgIC8vIG1hcmtGb3JDaGVjayBub24gdmEgYmVuZSBpbiBxdWFudG8gYXJyaXZhbm8gcG9zc2liaWxtZW50ZSAyIHVwZGF0ZSBzdSB1biBzb2xvIGNpY2xvIGRpIHN0YWNrXHJcbiAgICAgICAgLy8gc2V0VGltZSp1dCBjaGUgd3JhcHBhIHR1dHRvIG5vbiB2YSBiZW5lIHNlbm7DsiBzcGFtbWEgZGVsbGUgY2hhbmdlIGRldGVjdGlvbiBhIHN1b24gZGkgaW50ZXJ2YWwgY2hlIHJhbGxlbnRhbm8gdGFudGlzc2ltbyBsJ2FwcFxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RyYSBpbnRlcm5hbWVudGUgaWwgY29tcG9uZW50ZSBkaSB2YWxpZGF6aW9uZSwgbmUgaW1wb3N0YSBpIHZhbGlkYXRvcmkgZSBjb2xsZWdhIGlsIEZvcm0sIHNlIHByZXNlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJWYWxDb21wKGNvbXA6IE5nTW9kZWwpIHtcclxuICAgICAgICBpZiAoY29tcCkge1xyXG4gICAgICAgICAgICAvLyDDiCBhcnJpdmF0byB1biBudW92byB2YWxpZGF0aW9uQ29udG9ybCAoc3VjY2VkZSBzb2xvIG5lbCBmb3JtLXNlbGVjdCBxdWFuZG8gY2FtYmlhIGxhIHNvdXJjZSBkYSAwIGVsZW1lbnRpIC8gbnVsbCBhZCBOIGVsZW1lbnRpLCBxdWluZGkgYWwgbWFzc2ltbyB1bmEgdm9sdGEpIFxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uQ29udHJvbCAmJiB0aGlzLkZvcm0pXHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgPSBjb21wO1xyXG5cclxuICAgICAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIHBhc3NhcmUgYXZhbnRpIGkgdmFsaWRhdG9yaVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2Ugc29ubyBzdGFjY2F0byBkYWwgRm9ybSAodnVvbCBkaXJlIGNoZSBzb25vIGFkIGVzZW1waW8gZGVudHJvIHVuIG5nLXRlbXBsYXRlKSBhZ2dpdW5nbyBpbCBjb250cm9sbG8gYWwgRm9ybSBwYXNzYXRvIGNvbWUgaW5wdXQgKGNvbnRleHQgZGVsIHRlbXBsYXRlKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5kZXRhdGNoZWRGcm9tZm9ybSAmJiB0aGlzLkZvcm0gJiYgIXRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZFJlc2V0RnVuY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaW9ybmEgaWwgdmFsb3JlIGUgbGEgdmFsaWRpdMOgIGRlbGwnaW5wdXQgc290dG9zdGFudGUuIE5vbiB2aWVuZSBjaGlhbWF0byBwZXIgaW5wdXQgbmF0aXZpIGNvbWUgbGUgY2hlY2tib3hcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWx1ZSBGb3J6YSBsJ2FnZ2lvcm5hbWVudG8gYW5jaGUgc2Ugbm9uIMOoIHVuIGlucHV0IG5hdGl2byAoaW5wdXQgbmF0aXZvID0gY2hlY2tib3gsIGFkIGVzZW1waW8pXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JjZWRWYWx1ZSB8fCB0aGlzLm5hdGl2ZUlucHV0KVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoZm9yY2VkVmFsdWU6IGFueSA9IG51bGwsIG1hcmtGb3JDaGVjazogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoZm9yY2VkVmFsdWUgPT0gbnVsbCA/IHRoaXMuTW9kZWwgOiBmb3JjZWRWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KGZvcmNlZFZhbHVlID09IG51bGwgPyB0aGlzLk1vZGVsIDogZm9yY2VkVmFsdWUpO1xyXG4gICAgICAgIGlmIChtYXJrRm9yQ2hlY2spXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG59Il19
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Injectable, Inject, Optional } from "@angular/core";
|
|
2
|
+
import { LocalizationService } from "@esfaenza/localizations";
|
|
3
|
+
import { FAV_LOCALE } from '../../tokens';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Classe di localizzazione per il componente **FormAdaptiveComponent**
|
|
7
|
+
*/
|
|
8
|
+
export class FormAdaptiveComponentLoc extends LocalizationService {
|
|
9
|
+
/**
|
|
10
|
+
* @ignore
|
|
11
|
+
*/
|
|
12
|
+
constructor(LOC_LOCALE) {
|
|
13
|
+
super(LOC_LOCALE ?? 'it-IT');
|
|
14
|
+
super.set("en->it", "Select a file", ["Seleziona un file"]);
|
|
15
|
+
super.set("en->it", "Files Selected", ["File Selezionati"]);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
FormAdaptiveComponentLoc.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAdaptiveComponentLoc, deps: [{ token: FAV_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
19
|
+
FormAdaptiveComponentLoc.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAdaptiveComponentLoc });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAdaptiveComponentLoc, decorators: [{
|
|
21
|
+
type: Injectable
|
|
22
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
23
|
+
type: Optional
|
|
24
|
+
}, {
|
|
25
|
+
type: Inject,
|
|
26
|
+
args: [FAV_LOCALE]
|
|
27
|
+
}] }]; } });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQubG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvZm9ybXMvZm9ybS1hZGFwdGl2ZS9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5sb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTFDOztHQUVHO0FBRUgsTUFBTSxPQUFPLHdCQUF5QixTQUFRLG1CQUFtQjtJQUU3RDs7T0FFRztJQUNILFlBQTRDLFVBQWtCO1FBQzFELEtBQUssQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLENBQUM7UUFFN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQzVELEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7O3FIQVZRLHdCQUF3QixrQkFLRCxVQUFVO3lIQUxqQyx3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVTs7MEJBTU0sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgRkFWX0xPQ0FMRSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGRpIGxvY2FsaXp6YXppb25lIHBlciBpbCBjb21wb25lbnRlICoqRm9ybUFkYXB0aXZlQ29tcG9uZW50KipcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZvcm1BZGFwdGl2ZUNvbXBvbmVudExvYyBleHRlbmRzIExvY2FsaXphdGlvblNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KEZBVl9MT0NBTEUpIExPQ19MT0NBTEU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKExPQ19MT0NBTEUgPz8gJ2l0LUlUJyk7XHJcblxyXG4gICAgICAgIHN1cGVyLnNldChcImVuLT5pdFwiLCBcIlNlbGVjdCBhIGZpbGVcIiwgW1wiU2VsZXppb25hIHVuIGZpbGVcIl0pO1xyXG4gICAgICAgIHN1cGVyLnNldChcImVuLT5pdFwiLCBcIkZpbGVzIFNlbGVjdGVkXCIsIFtcIkZpbGUgU2VsZXppb25hdGlcIl0pO1xyXG4gICAgfVxyXG59Il19
|