@esfaenza/forms-and-validations 12.2.26 → 12.2.31

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.
@@ -127,6 +127,14 @@ export class BaseFormControl {
127
127
  * Evento chiamato alla modifica del valore collegato a questo campo
128
128
  */
129
129
  this.inputChange = new EventEmitter();
130
+ /**
131
+ * Cache delle condizioni scritte tipo :prop?(Roba con {prop})
132
+ */
133
+ this.BindCheckingGroups = [];
134
+ /**
135
+ * Cache delle proprietà scritte tipo --> {prop}
136
+ */
137
+ this.BindProperties = [];
130
138
  if (ngControl == null) {
131
139
  if (!this.handleNullNgControl())
132
140
  console.error("ngControl nullo per qualche motivo! Il 90% delle funzionalità di questo input saranno disabilitate");
@@ -213,35 +221,63 @@ export class BaseFormControl {
213
221
  // Cache locale per evitare di rifare dei regex.match ogni santa volta
214
222
  if (this.Source.length > 0) {
215
223
  this.BoundSource = [];
216
- // Blocco per tirare fuori le condizioni scritte tipo --> :prop?(Roba con {prop})
217
- var iffedMatches = this.Display.match(/:([a-z]+)\?\(([^\(\)]+)\)/g);
218
- var bindCheckingGroups = [];
219
- if (iffedMatches) {
220
- iffedMatches.forEach(m => {
221
- // Stessa regex di sopra ma il tag "i" serve per tirare fuori i singoli capturing group e per qualche motivo
222
- // new RegExp(baseRegex, "g") non funziona quindi non ho potuto razionalizzarlo
223
- let groups = m.match(/:([a-z]+)\?\(([^\(\)]+)\)/i);
224
- bindCheckingGroups.push({ global: m, prop: groups[1], whenexists: groups[2] });
225
- });
226
- }
227
- // Blocco per tirare fuori le proprietà scritte tipo --> {prop}
228
- var bindProperties = [];
229
- var matches = this.Display.match(/{[a-z]+}/gi);
230
- if (matches)
231
- matches.forEach(m => { bindProperties.push({ global: m, prop: m.substring(1, m.length - 1) }); });
224
+ if (this.BindCheckingGroups.length == 0)
225
+ this.evaluateBindCheckingGroups();
226
+ if (this.BindProperties.length == 0)
227
+ this.evaluateBindProperties();
232
228
  // Blocco per generare la descrizione finale di un elemento
233
229
  this.Source.forEach(s => {
234
- // Parto sempre dalla variabile di Display, poi sostituisco pezzo per pezzo
235
- let desc = this.Display;
236
- // Taglio o mantengo le condizioni in base alla proprietà su cui fare check
237
- // Dopodiché scrivo tutte le proprietà
238
- bindCheckingGroups.forEach(t => { desc = desc.replace(t.global, (s[t.prop] != null && s[t.prop] != undefined) ? t.whenexists : ""); });
239
- bindProperties.forEach(t => { desc = desc.replace(t.global, s[t.prop]); });
240
230
  // Aggiungo alla BoundSource in formato standard KeyValue
241
- this.BoundSource.push({ id: s[this.IdField], description: desc });
231
+ this.BoundSource.push(this.transformSourceItem(s));
232
+ });
233
+ }
234
+ }
235
+ /**
236
+ * Valuta il contenuto della variabile BindCheckingGroups
237
+ */
238
+ evaluateBindCheckingGroups() {
239
+ // Blocco per tirare fuori le condizioni scritte tipo --> :prop?(Roba con {prop})
240
+ var iffedMatches = this.Display.match(/:([a-z]+)\?\(([^\(\)]+)\)/g);
241
+ if (iffedMatches) {
242
+ iffedMatches.forEach(m => {
243
+ // Stessa regex di sopra ma il tag "i" serve per tirare fuori i singoli capturing group e per qualche motivo
244
+ // new RegExp(baseRegex, "g") non funziona quindi non ho potuto razionalizzarlo
245
+ let groups = m.match(/:([a-z]+)\?\(([^\(\)]+)\)/i);
246
+ this.BindCheckingGroups.push({ global: m, prop: groups[1], whenexists: groups[2] });
242
247
  });
243
248
  }
244
249
  }
250
+ /**
251
+ * Valuta il contenuto della variabile BindProperties
252
+ */
253
+ evaluateBindProperties() {
254
+ // Blocco per tirare fuori le proprietà scritte tipo --> {prop}
255
+ var matches = this.Display.match(/{[a-z]+}/gi);
256
+ if (matches)
257
+ matches.forEach(m => { this.BindProperties.push({ global: m, prop: m.substring(1, m.length - 1) }); });
258
+ }
259
+ /**
260
+ * Trasforma un oggetto della Source alla sua versione "nuova" basandosi sulle informazioni su gruppi e proprietà
261
+ *
262
+ * @param {any} item Oggetto da trasformare
263
+ *
264
+ * @returns {{id: string, description: string}} Oggetto finale trasformato
265
+ */
266
+ transformSourceItem(s) {
267
+ // Parto sempre dalla variabile di Display, poi sostituisco pezzo per pezzo
268
+ let desc = this.Display;
269
+ // Taglio o mantengo le condizioni in base alla proprietà su cui fare check
270
+ // Dopodiché scrivo tutte le proprietà
271
+ for (let i = 0; i < this.BindCheckingGroups.length; i++) {
272
+ let t = this.BindCheckingGroups[i];
273
+ desc = desc.replace(t.global, (s[t.prop] != null && s[t.prop] != undefined) ? t.whenexists : "");
274
+ }
275
+ for (let i = 0; i < this.BindProperties.length; i++) {
276
+ let t = this.BindProperties[i];
277
+ desc = desc.replace(t.global, s[t.prop]);
278
+ }
279
+ return { id: s[this.IdField], description: desc };
280
+ }
245
281
  /**
246
282
  * Indica se il comopnente in questione è in grado di gestire ngControl nulli.
247
283
  * Di default è **false**
@@ -421,4 +457,4 @@ BaseFormControl.propDecorators = {
421
457
  validationControl_static: [{ type: ViewChild, args: ["validationControl", { static: true },] }],
422
458
  inputChange: [{ type: Output }]
423
459
  };
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixTQUFTLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2SCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUxQzs7R0FFRztBQUVILE1BQU0sT0FBZ0IsZUFBZTtJQWtNakM7Ozs7T0FJRztJQUNILFlBQXNCLEdBQXNCLEVBQVMsU0FBb0IsRUFBWSxXQUF1QixFQUFzQixFQUF3QixFQUFxQixVQUE0QixFQUE2QyxhQUFxQixFQUFVLGNBQXVCLEtBQUs7UUFBN1IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBUyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVksZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBc0IsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUFBcUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFBNkMsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFyTW5UOzs7OztXQUtHO1FBQ0ssY0FBUyxHQUFZLElBQUksQ0FBQztRQUVsQzs7V0FFRztRQUNJLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFZakM7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBWSxL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LCBOZ0NvbnRyb2wsIE5nRm9ybSwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9wdGlvbmFsLCBJbmplY3QsIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXCI7XHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVkgfSBmcm9tICcuLi90b2tlbnMnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgYmFzZSBkYSBjdWkgdHV0dGkgaSBjb21wb25lbnRpIEZvcm0gaW1wbGVtZW50YW5vXHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VGb3JtQ29udHJvbCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XHJcbiAgICAgKiBUTDpEUjsgSWwgcHJpbW8gdmFsb3JlIHBhc3NhdG8gYWwgd3JpdGVWYWx1ZSDDqCBudWxsbyBwZXJjaMOpIHF1YW5kbyBpIGNhZ25hY2NpIGZhbm5vIG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgICAgKiBzY3Jpdm9ubyB1biB3cml0ZVZhbHVlIG51bGxvLi4uIHF1aW5kaSBhbCBwcmltbyBiaW5kaW5nIHNhbHRvIGwnaW5pemlhbGl6emF6aW9uZSBzZSBobyBsYSBjb3BwaWEgbnVsbC1maXJzdEJpbmRcclxuICAgICAqIHBvaSBtZXR0ZW5kbyBmaXJzdEJpbmQgYSBmYWxzZSBkaSBsw6wgaW4gcG9pIGZ1bnppb25vIGNvbWUgZGV2by4gVmlzdGEgbGEgY2FzaXN0aWNhIGV2aXRvIGVzc2VuemlhbG1lbnRlIG1ldMOgIGRldGVjdENoYW5nZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsIGNhbXBvIMOoIG9iYmxpZ2F0b3JpbyBpIG9wemlvbmFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGVsbG8gcmFwcHJlc2VudGF0byBkYSBxdWVzdG8gY2FtcG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIE1vZGVsOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb21lIGdlbmVyYXRvIHBlciBpbCBjb250cm9sbG8gaW50ZXJuby4gRGkgZGVmYXVsdCDDqCBpbCBub21lIGRlbCBjb250cm9sbG8gZXN0ZXJubyBjb24gbCdhZ2dpdW50YSBkaSBcIl9pbnRlcm5hbFwiLiBTZXJ2ZSBwZXIgZXZpdGFyZSBjcm9zcy1iaW5kXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmF0ZWROYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgRm9ybSBjaGUgY29udGllbmUgcXVlc3RvIGNhbXBvIMOoIGdpw6Agc3RhdG8gcmVnaXN0cmF0b1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZm9ybUhhc0Jlbm5Cb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIHF1ZXN0byBjYW1wbyDDqCBzdGFjY2F0byBkYWwgRm9ybSwgYWQgZXNlbXBpbyBuZWwgY2FzbyBzaWEgaW4gdW4gbmctdGVtcGxhdGUgcHJvaWV0dGF0byBuZWwgZm9ybS5cclxuICAgICAqIFxyXG4gICAgICogSW4gcXVlbCBjYXNvIGxhIHZhcmlhYmlsZSAqKkZvcm0qKiBkZWwgY29tcG9uZW50ZSBkZXYnZXNzZXJlIHZhbG9yaXp6YXRhXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBkZXRhdGNoZWRGcm9tZm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBWZWRpIGdldHRlciBlIHNldHRlclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVhbG9yYSBjaSBmb3NzZSB1biBjb250ZXN0byBjb2xsZWdhdG8gcXVlc3RhIHZhcmlhYmlsZSBpZGVudGlmaWNhIHNlIFNvbm8gbCdPd25lciBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNlIG5vbiBsbyBzb25vLCBpbCBjYW1wbyByaXN1bHRlcsOgIGluIHNvbGEgbGV0dHVyYSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBBcHBDb250ZXh0T3duZXJzaGlwOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpenphIG8gbWVubyBpbCBMYXlvdXQgZGkgdW4gZm9ybSAoTGFiZWwgY29uIGlucHV0IGRpIGZpYW5jbyksIHNlIGZhbHNlIG1vc3RyYSBzb2xvIGwnaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRm9ybUxheW91dDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRpdmEgbyBkaXNhdHRpdmEgbGEgdmFsaWRhemlvbmUgcGVyIHF1ZXN0byBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGxhY2Vob2xkZXIgcGVyIHF1YW5kbyBsJ2lucHV0IMOoIHZ1b3RvXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3NlIGV4dHJhIHBlciBpbCBmb3JtLWdyb3VwIGluIGN1aSB2aWVuZSB3cmFwcGF0byBsJ2lucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1Hcm91cENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVzc2FnZ2lvIGRhIG1vc3RyYXJlIHF1YW5kbyBsYSB2YWxpZGF6aW9uZSBmYWxsaXNjZSBwZXIgcXVlc3RvIGNvbXBvbmVudGUuIERpIGRlZmF1bHQgdmllbmUgcHJvcG9zdGEgZGFsbGEgbGlicmVyaWFcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRmFpbGVkVmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dCBjaGUgZm9yemEgbCdpbnZhbGlkaXTDoCBkZWwgY29tcG9uZW50ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGb3JjZWRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9zdHJhIHVuIHRlc3RvIGEgc2luaXN0cmEgZGVsbCdpbnB1dCAoRm9ybUxheW91dCBwZXJtZXR0ZW5kbylcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgTGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb2wtbWQtWCBwZXIgbGEgbGFiZWxcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbC1tZC1YIHBlciBsJ2lucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2Ugw6ggbCd1bHRpbW8gY29tcG9uZW50ZSBkaSB1biBmb3JtIChzZXJ2ZSBwZXIgcmltdW92ZXJlIGlsIG1hcmdpbmUgZmluYWxlKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3NvY2lhIGlsIGNvbXBvbmVudGUgRm9ybSBhIHF1ZXN0byBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGb3JtOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU29yZ2VudGUgZGEgY3VpIHNjZWdsaWVyZSB2YWxvcmkgcGVyIGkgY29tcG9uZW50aSBGb3JtIGNoZSBsbyBjb25zZW50b25vXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNvdXJjZTogYW55W107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSWQgZGVnbGkgb2dnZXR0aSBiaW5kYXRpIG5lbGxhICoqU291cmNlKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgSWRGaWVsZDogc3RyaW5nID0gJ2lkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzcHJlc3Npb25lIHNpbWlsLUFuZ3VsYXIgcGVyIGNhbWJpYXJlIGlsIHRlc3RvIGRlaSBjb21wb25lbnRpIGNoZSBzY2VsZ29ubyBpbCBwcm9wcmlvIG1vZGVsbG8gZGEgdW5hICoqU291cmNlKipcclxuICAgICAqIFxyXG4gICAgICogSWwgZnVuemlvbmFtZW50byDDqCBpZGVudGljbyBhbCBiaW5kZXIgZGkgYW5ndWxhciwgc29sbyBjb24gdW5hIGdyYWZmYSBpbnZlY2UgY2hlIDIuXHJcbiAgICAgKiDDiCBpbm9sdHJlIHBvc3NpYmlsZSBhZ2dpdW5nZXJlIHBlenppIGRpIGRlc2NyaXppb25lIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIGNvbiBsYSBzaW50YXNzaSAqKjpwcm9wPyhQcm9wIHZhbGUge3Byb3B9KSoqXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXk6IHN0cmluZyA9ICd7ZGVzY3JpcHRpb259JztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpc3VsdGF0byBkZWxsJ3VuaW9uZSBmcmEgbGUgaW5mb3JtYXppb25pIGRlZ2xpIG9nZ2V0dGkgaW4gKipTb3VyY2UqKiBlIGxlIGltcG9zdGF6aW9uaSBzcGVjaWZpY2F0ZSBuZWxsJ0lucHV0ICoqRGlzcGxheSoqXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCb3VuZFNvdXJjZTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIMOoIGlsIHByaW1vIEJpbmQgZGVsbGEgU291cmNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBTb3VyY2VGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIHNvbGEgbGV0dHVyYSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWRvbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKl9yZWFkb25seSoqIGdlc3RlbmRvIGFuY2hlIGlsIENvbnRlc3RvIGFwcGxpY2F0aXZvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgVmFsb3JlIGRhIGltcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgUmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0T3duZXJzaGlwKVxyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2V0dGFyZSBpbiB1bmEgdm9sdGEgc29sbyBnbGkgaW5wdXQgTGFiZWxDb2xXaWR0aCBlIElucHV0Q29sV2lkdGgsIGJhc3RhIHNjcml2ZXJsbyBjb24gbGEgc2ludGFzc2kgXCJYIFlcIlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgbmVsIGZvcm1hdG8gXCJYIFlcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgTGFiZWxJbnB1dFJhdGlvKGlucHV0OiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmF0aW8gPSBpbnB1dC5zcGxpdCgvXFxzLyk7XHJcbiAgICAgICAgdGhpcy5MYWJlbENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMF0pO1xyXG4gICAgICAgIHRoaXMuSW5wdXRDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbC1xdWFsY29zYSBjaGUgZmEgZWZmZXR0aXZhbWVudGUgZGEgaW5wdXQsIG8gZXZlbnR1YWxtZW50ZSBpbCBzaW5nb2xvIGlucHV0IGluIGNhc2kgcGFydGljb2xhcmkgKGVzIGNoZWNrYm94KVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbkNvbnRyb2w6IE5nTW9kZWw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIHN0YXRpY29cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFwidmFsaWRhdGlvbkNvbnRyb2xcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBfdmFsaWRhdGlvbkNvbnRyb2woY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVlcnkgc3VsbCdlbGVtZW50byAndmFsaWRhdGlvbkNvbnRyb2wnIGNoZSBmdW56aW9uYSBpbiBhbWJpZW50ZSBkaW5hbWljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZXQgdmFsaWRhdGlvbkNvbnRyb2xfc3RhdGljKGNvbXA6IE5nTW9kZWwpIHsgdGhpcy5yZWdpc3RlclZhbENvbXAoY29tcCk7IH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudG8gY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWwgdmFsb3JlIGNvbGxlZ2F0byBhIHF1ZXN0byBjYW1wb1xyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZSBcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmRldGF0Y2hlZEZyb21mb3JtID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIGltcG9zdGFyZSBtZSBzdGVzc28gY29tZSBzaSBkZXZlLCBpbCB2YWxpZGF0b3JlIGludmVjZSBsbyBwYXNzbyBhbCB2YWxpZGF0aW9uLWlucHV0IHF1YW5kbyB2aWVuZSBzZXR0YXRvIGlsIHZhbGlkYXRpb25Db250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgIC8vUGVyIHR1dHRpIGkgdmFsaWRhdG9yaTogcmlnZW5lcm8gbGEgZnVuemlvbmUgZGkgdmFsaWRhemlvbmUuIFBlciBxdWFsY2hlIG1vdGl2byBhIHZvbHRlIGhvIHZhbGlkYXRvcmkgc2VuemEuLi5cclxuICAgICAgICAgICAgLy8uLi4gcXVlc3RvIMOoIHVuIHdvcmthcm91bmQgcGVyIGVzc2VyZSBzaWN1cm8gZGkgYXZlcmxhIHNlbXByZS5cclxuICAgICAgICAgICAgLy9Tb2xvIGkgdmFsaWRhdG9yaSBjb24gcGFyYW1ldHJpIGhhbm5vIGJpc29nbm8gZGVsbGEgX2NyZWF0ZVZhbGlkYXRvciAoZXMuIFwibWF4bGVuZ3RoXCIgY2hlIGhhIDEgcGFyYW1ldHJvKSwgcXVpbmRpIG5vIHZhbGlkYXRvcmkgdGlwbyBcInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodi5fY3JlYXRlVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9jcmVhdGVWYWxpZGF0b3IoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgQmluZC9QYXJzZSBkZWxsZSB2YXJpZSAqKlNvdXJjZSoqIHVuZW5kbyBsZSBpbmZvcm1hemlvbmkgc3BlY2lmaWNhdGUgaW4gKipEaXNwbGF5KipcclxuICAgICAqIFxyXG4gICAgICogRXZlbnR1YWxtZW50ZSByaWVmZmV0dHVhIHVuIGJpbmQgYWwgbW9kZWxsbyBpbiBiYXNlIGFsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipSZWJpbmRNb2RlbEFmdGVyU291cmNlKipcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHRyeUJpbmRTb3VyY2VEaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5Tb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA9PSAwICYmICF0aGlzLlNvdXJjZUZpcnN0QmluZClcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlNvdXJjZUZpcnN0QmluZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBDYWNoZSBsb2NhbGUgcGVyIGV2aXRhcmUgZGkgcmlmYXJlIGRlaSByZWdleC5tYXRjaCBvZ25pIHNhbnRhIHZvbHRhXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gQmxvY2NvIHBlciB0aXJhcmUgZnVvcmkgbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gLS0+IDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pXHJcbiAgICAgICAgICAgIHZhciBpZmZlZE1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9nKTtcclxuICAgICAgICAgICAgdmFyIGJpbmRDaGVja2luZ0dyb3VwczogeyBnbG9iYWw6IHN0cmluZywgcHJvcDogc3RyaW5nLCB3aGVuZXhpc3RzOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgICAgICAgIGlmIChpZmZlZE1hdGNoZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmZmVkTWF0Y2hlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0ZXNzYSByZWdleCBkaSBzb3ByYSBtYSBpbCB0YWcgXCJpXCIgc2VydmUgcGVyIHRpcmFyZSBmdW9yaSBpIHNpbmdvbGkgY2FwdHVyaW5nIGdyb3VwIGUgcGVyIHF1YWxjaGUgbW90aXZvIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBSZWdFeHAoYmFzZVJlZ2V4LCBcImdcIikgbm9uIGZ1bnppb25hIHF1aW5kaSBub24gaG8gcG90dXRvIHJhemlvbmFsaXp6YXJsb1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cHMgPSBtLm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYmluZENoZWNraW5nR3JvdXBzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IGdyb3Vwc1sxXSwgd2hlbmV4aXN0czogZ3JvdXBzWzJdIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIHByb3ByaWV0w6Agc2NyaXR0ZSB0aXBvIC0tPiB7cHJvcH1cclxuICAgICAgICAgICAgdmFyIGJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC97W2Etel0rfS9naSk7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGVzKVxyXG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5mb3JFYWNoKG0gPT4geyBiaW5kUHJvcGVydGllcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBtLnN1YnN0cmluZygxLCBtLmxlbmd0aCAtIDEpIH0pOyB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJsb2NjbyBwZXIgZ2VuZXJhcmUgbGEgZGVzY3JpemlvbmUgZmluYWxlIGRpIHVuIGVsZW1lbnRvXHJcbiAgICAgICAgICAgIHRoaXMuU291cmNlLmZvckVhY2gocyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUGFydG8gc2VtcHJlIGRhbGxhIHZhcmlhYmlsZSBkaSBEaXNwbGF5LCBwb2kgc29zdGl0dWlzY28gcGV6em8gcGVyIHBlenpvXHJcbiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IHRoaXMuRGlzcGxheTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBUYWdsaW8gbyBtYW50ZW5nbyBsZSBjb25kaXppb25pIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgIHN1IGN1aSBmYXJlIGNoZWNrXHJcbiAgICAgICAgICAgICAgICAvLyBEb3BvZGljaMOpIHNjcml2byB0dXR0ZSBsZSBwcm9wcmlldMOgXHJcbiAgICAgICAgICAgICAgICBiaW5kQ2hlY2tpbmdHcm91cHMuZm9yRWFjaCh0ID0+IHsgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgKHNbdC5wcm9wXSAhPSBudWxsICYmIHNbdC5wcm9wXSAhPSB1bmRlZmluZWQpID8gdC53aGVuZXhpc3RzIDogXCJcIik7IH0pO1xyXG4gICAgICAgICAgICAgICAgYmluZFByb3BlcnRpZXMuZm9yRWFjaCh0ID0+IHsgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgc1t0LnByb3BdKTsgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQWdnaXVuZ28gYWxsYSBCb3VuZFNvdXJjZSBpbiBmb3JtYXRvIHN0YW5kYXJkIEtleVZhbHVlXHJcbiAgICAgICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlLnB1c2goeyBpZDogc1t0aGlzLklkRmllbGRdLCBkZXNjcmlwdGlvbjogZGVzYyB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGlsIGNvbW9wbmVudGUgaW4gcXVlc3Rpb25lIMOoIGluIGdyYWRvIGRpIGdlc3RpcmUgbmdDb250cm9sIG51bGxpLiBcclxuICAgICAqIERpIGRlZmF1bHQgw6ggKipmYWxzZSoqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBnZXN0aXNjbyBuZ0NvbnRyb2wgbnVsbGksICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZU51bGxOZ0NvbnRyb2woKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBBIHZvbHRlIG5lbGwnbmdPbkluaXQgbm9uIGNpIHBhc3NhIHF1aW5kaSBsbyBtZXR0byBzaWEgcXVpIHNpYSBuZWxsJ2FmdGVydmlld2luaXQsIHBlbnNvIGNoZSB2YWxnYSBwZXIgaSBjb21wb25lbnRpIGRpIHRlcnplIHBhcnRpXHJcbiAgICAgICAgLy8gY2hlIHNpIGNvbGxlZ2FubyBwZXIgaSBjYXp6aSBsb3JvIGFsIGZvcm0gZWNjLCBxdWluZGkgbGEgcGFydGUgc29wcmEgbm9uIHNlcnZlLi4uIEJPSFxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG5cclxuICAgICAgICAvL0lsIG5vbWUgbm9uIGMnw6ggc2UgbWV0dG8gc3RhbmRhbG9uZSA6IHRydWVcclxuICAgICAgICAvL0RhdG8gY2hlIGFuY2hlIGlsIGNvbnRyb2xsbyBlc3Rlcm5vIHZpZW5lIGNvbnNpZGVyYXRvIGNvbWUgY29tcG9uZW50ZSBkZWwgZm9ybSwgbm9uIHBvc3NvIGJhc2FybWkgc29sbyBzdWwgbm9tZSBtYSBkZXZvIGFnZ2l1bmdlcmUgdW4gdGFnLiBJbiBxdWVzdG8gY2FzbyBcIl9pbnRlcm5hbFwiXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICB0aGlzLkdlbmVyYXRlZE5hbWUgPSB0aGlzLm5nQ29udHJvbC5uYW1lLnRvU3RyaW5nKCkgKyBcIl9pbnRlcm5hbFwiO1xyXG5cclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0Jlbm5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFF1YW5kbyB1biBmb3JtIHZpZW5lIHN1Ym1pdHRhdG8gbGEgdmFyaWFiaWxlIEZvcm0uc3VibWl0dGVkIHZpZW5lIGFzc2VnbmF0YSBhbGwnaW5wdXQgW3N1Ym1pdHRlZF0gZGVsIHZhbC1jb250cm9sXHJcbiAgICAgICAgICAgIC8vIEVzc2VuZG8gY2hlIHBlcsOyIGxhIENEIMOoIE9uUHVzaCBwZXIgZGlyZSBhZCBBbmd1bGFyIGNoZSBsJ0lucHV0IMOoIGNhbWJpYXRvIGUgcGVybWV0dGVyZSBpIHNpZGVmZmVjdHMgZGkgYXNzZWduYXJlIFtzdWJtaXR0ZWRdXHJcbiAgICAgICAgICAgIC8vIGRldm8gYXR0YWNjYXJtaSBhbCBzdWJtaXQgYXR0dWFsZSBkZWwgZm9ybSBlIHByaW1hIGRpIGVzZWd1aXJsbyBkZXZvIG1hcmNhcmUgaWwgY29tcG9uZW50ZSBwZXIgaWwgY2hlY2tcclxuICAgICAgICAgICAgbGV0IG9yaWdGdW5jID0gdGhpcy5Gb3JtLm9uU3VibWl0O1xyXG4gICAgICAgICAgICB2YXIgZm9ybU91dHNpZGVSZWYgPSB0aGlzLkZvcm07XHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5vblN1Ym1pdCA9IChldik6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkoZm9ybU91dHNpZGVSZWYpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsYWJvcmEgaSB2YWxpZGF0b3JpIGluaWV0dGF0aSBlIGNhcGlzY2Ugc2UgaWwgdmFsb3JlIMOoIG9iYmxpZ2F0b3JpbyBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpIHtcclxuICAgICAgICAvLyBjb250cm9sbG8gc2Ugw6ggc2V0dGF0byB1biByZXF1aXJlZCBwZXIgZGVjaWRlcmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgc2UgdXRpbGl6emFyZSBpbCB2YWxpZGF0b3JlIHJlcXVpcmVkIG5lbCBjb21wb25lbnRlIGludGVybm9cclxuICAgICAgICAvLyBMbyBmYWNjaW8gcXVpIGUgbm9uIGluIHVuIGV2ZW50dWFsZSBuZ09uSW5pdCBvIGNvc3RydXR0b3JlIHBlcmNow6kgbmdPbkluaXQgbm9uIHNlbXByZSB2aWVuZSBjaGlhbWF0byBlIGRhIGNvc3RydXR0b3JlIGlsIHZhbGlkYXRvcmUgbm9uIGhhIGFuY29yYSBpbCB2YWxvcmUgZ2l1c3RvXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMgJiYgdGhpcy5fdmFsaWRhdG9ycy5zb21lKGVsZW0gPT4gZWxlbSBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yICYmIGVsZW0ucmVxdWlyZWQpKVxyXG4gICAgICAgICAgICB0aGlzLlJlcXVpcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgY2hlIGNvbGxlZ2EgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGVsIGNvbnRyb2xsbyBmb3JtIGFsIGNvbnRyb2xsbyBkaSB2YWxpZGF6aW9uZSBzb3R0b3N0YW50ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJpbmRSZXNldEZ1bmN0aW9uKCkge1xyXG4gICAgICAgIC8vZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICBjb25zdCBvcmlnRnVuYyA9ICg8YW55PnRoaXMubmdDb250cm9sLmNvbnRyb2wpLl9fb3JpZ2luYWxfcmVzZXRfXyB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0O1xyXG4gICAgICAgIHZhciBuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSA9IHRoaXMubmdDb250cm9sLmNvbnRyb2w7XHJcbiAgICAgICAgdmFyIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2w7XHJcblxyXG4gICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KG5nQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlKTtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZS5yZXNldCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vUGVyIGNvbnNlbnRpcmUgcmljaGlhbWkgbXVsdGlwbGkgZGkgcXVlc3RhIGZ1bnppb25lIHByZW5kZW5kbyBzZW1wcmUgbGEgZml1bnppb25lIGRpIHJlc2V0IGJhc2VcclxuICAgICAgICAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gPSBvcmlnRnVuY1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsICYmIHRoaXMuZmlyc3RCaW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RCaW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuTW9kZWwgPSBvYmo7XHJcblxyXG4gICAgICAgIC8vUGVyIHN2ZWdsaWFyZSBBbmd1bGFyLiBJbCB2YWxvcmUgY2hlIGVudHJhIHBvdHJlYmJlIGVzc2VyZSB2YWxpZG8vbm9uIHZhbGlkbyBlIHF1ZXN0byBsbyBiaW5kYSBhIHR1dHRvLCBmb3JtIGNvbXByZXNvXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgIHRoaXMub25Ob3ROdWxsVmFsdWVTZXQoKTtcclxuXHJcbiAgICAgICAgLy8gbWFya0ZvckNoZWNrIG5vbiB2YSBiZW5lIGluIHF1YW50byBhcnJpdmFubyBwb3NzaWJpbG1lbnRlIDIgdXBkYXRlIHN1IHVuIHNvbG8gY2ljbG8gZGkgc3RhY2tcclxuICAgICAgICAvLyBzZXRUaW1lKnV0IGNoZSB3cmFwcGEgdHV0dG8gbm9uIHZhIGJlbmUgc2VubsOyIHNwYW1tYSBkZWxsZSBjaGFuZ2UgZGV0ZWN0aW9uIGEgc3VvbiBkaSBpbnRlcnZhbCBjaGUgcmFsbGVudGFubyB0YW50aXNzaW1vIGwnYXBwXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdHJhIGludGVybmFtZW50ZSBpbCBjb21wb25lbnRlIGRpIHZhbGlkYXppb25lLCBuZSBpbXBvc3RhIGkgdmFsaWRhdG9yaSBlIGNvbGxlZ2EgaWwgRm9ybSwgc2UgcHJlc2VudGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlclZhbENvbXAoY29tcDogTmdNb2RlbCkge1xyXG4gICAgICAgIGlmIChjb21wKSB7XHJcbiAgICAgICAgICAgIC8vIMOIIGFycml2YXRvIHVuIG51b3ZvIHZhbGlkYXRpb25Db250b3JsIChzdWNjZWRlIHNvbG8gbmVsIGZvcm0tc2VsZWN0IHF1YW5kbyBjYW1iaWEgbGEgc291cmNlIGRhIDAgZWxlbWVudGkgLyBudWxsIGFkIE4gZWxlbWVudGksIHF1aW5kaSBhbCBtYXNzaW1vIHVuYSB2b2x0YSkgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25Db250cm9sICYmIHRoaXMuRm9ybSlcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5yZW1vdmVDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbCA9IGNvbXA7XHJcblxyXG4gICAgICAgICAgICAvL1F1ZXN0YSBzZXJ2ZSBwZXIgcGFzc2FyZSBhdmFudGkgaSB2YWxpZGF0b3JpXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBzb25vIHN0YWNjYXRvIGRhbCBGb3JtICh2dW9sIGRpcmUgY2hlIHNvbm8gYWQgZXNlbXBpbyBkZW50cm8gdW4gbmctdGVtcGxhdGUpIGFnZ2l1bmdvIGlsIGNvbnRyb2xsbyBhbCBGb3JtIHBhc3NhdG8gY29tZSBpbnB1dCAoY29udGV4dCBkZWwgdGVtcGxhdGUpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRldGF0Y2hlZEZyb21mb3JtICYmIHRoaXMuRm9ybSAmJiAhdGhpcy5mb3JtSGFzQmVubkJvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVubkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kUmVzZXRGdW5jdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgLy9JIHZhbC1yb2JhIHF1ZXN0byBsbyBmYW5ubyBhdXRvbWF0aWNhbWVudGUgZGVudHJvLi4uIGdsaSBhbHRyaSBubyAoZXMuIHNlbXBsaWNlIGlucHV0IGNoZWNrYm94KVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ2dpb3JuYSBpbCB2YWxvcmUgZSBsYSB2YWxpZGl0w6AgZGVsbCdpbnB1dCBzb3R0b3N0YW50ZS4gTm9uIHZpZW5lIGNoaWFtYXRvIHBlciBpbnB1dCBuYXRpdmkgY29tZSBsZSBjaGVja2JveFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlZFZhbHVlIEZvcnphIGwnYWdnaW9ybmFtZW50byBhbmNoZSBzZSBub24gw6ggdW4gaW5wdXQgbmF0aXZvIChpbnB1dCBuYXRpdm8gPSBjaGVja2JveCwgYWQgZXNlbXBpbylcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVmFsaWRpdHlGb3JOYXRpdmVJbnB1dChmb3JjZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGZvcmNlZFZhbHVlIHx8IHRoaXMubmF0aXZlSW5wdXQpXHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIuIE1hbnRlbmdvIGxvIHN0ZXNzbyBub21lIGRlbGwnZXZlbnRvIGRlaSA8dmFsLSo+IChpbnB1dENoYW5nZSkgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AuXHJcbiAgICAgKiBcclxuICAgICAqIE5vbiBwb3NzbyB0ZW5lcmxvIHByb3RlY3RlZCBhbHRyaW1lbnRpIHBvc3NvIGVzZWd1aXJsbyBzb2xvIGRhbCAudHMgZSBub24gZGFsbCcgLmh0bWxcclxuICAgICAqL1xyXG4gICAgY2hhbmdlZChmb3JjZWRWYWx1ZTogYW55ID0gbnVsbCwgbWFya0ZvckNoZWNrOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZShmb3JjZWRWYWx1ZSA9PSBudWxsID8gdGhpcy5Nb2RlbCA6IGZvcmNlZFZhbHVlKTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQoZm9yY2VkVmFsdWUgPT0gbnVsbCA/IHRoaXMuTW9kZWwgOiBmb3JjZWRWYWx1ZSk7XHJcbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaylcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IG9uTm90TnVsbFZhbHVlU2V0KCk6IHZvaWQ7XHJcbn0iXX0=
460
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixTQUFTLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2SCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUxQzs7R0FFRztBQUVILE1BQU0sT0FBZ0IsZUFBZTtJQTRNakM7Ozs7T0FJRztJQUNILFlBQXNCLEdBQXNCLEVBQVMsU0FBb0IsRUFBWSxXQUF1QixFQUFzQixFQUF3QixFQUFxQixVQUE0QixFQUE2QyxhQUFxQixFQUFVLGNBQXVCLEtBQUs7UUFBN1IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBUyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVksZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBc0IsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUFBcUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFBNkMsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUEvTW5UOzs7OztXQUtHO1FBQ0ssY0FBUyxHQUFZLElBQUksQ0FBQztRQUVsQzs7V0FFRztRQUNJLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFZakM7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBWSxL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QUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNoQyxDQUFDOzs7WUExZkosU0FBUzs7O1lBVG9FLGlCQUFpQjtZQURoRSxTQUFTO1lBNE44RCxLQUFLO1lBeE5sRyxvQkFBb0IsdUJBd05zRixRQUFRO1lBeE41RixnQkFBZ0IsdUJBd05rSCxRQUFRO3lDQUF5QyxRQUFRLFlBQUksTUFBTSxTQUFDLGFBQWE7Ozs7eUJBbko3TyxLQUFLO3lCQUtMLEtBQUs7MEJBS0wsS0FBSzs2QkFLTCxLQUFLO3NDQUtMLEtBQUs7MEJBS0wsS0FBSztvQkFLTCxLQUFLOzRCQUtMLEtBQUs7NEJBS0wsS0FBSzttQkFLTCxLQUFLO21CQUtMLEtBQUs7cUJBS0wsS0FBSztzQkFLTCxLQUFLO3NCQVFMLEtBQUs7dUJBd0JMLEtBQUs7OEJBVUwsS0FBSztpQ0FnQkwsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt1Q0FPaEQsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTswQkFLL0MsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCwgTmdGb3JtLCBOZ01vZGVsLCBSZXF1aXJlZFZhbGlkYXRvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgT3B0aW9uYWwsIEluamVjdCwgRGlyZWN0aXZlLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyAvLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sU2VydmljZSwgQ29tcG9uZW50Q29udGV4dCB9IGZyb20gXCJAZXNmYWVuemEvYWNjZXNzLWNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQUNPX0NVU1RPTUtFWSB9IGZyb20gJy4uL3Rva2Vucyc7XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBiYXNlIGRhIGN1aSB0dXR0aSBpIGNvbXBvbmVudGkgRm9ybSBpbXBsZW1lbnRhbm9cclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcclxuICAgICAqIFRMOkRSOyBJbCBwcmltbyB2YWxvcmUgcGFzc2F0byBhbCB3cml0ZVZhbHVlIMOoIG51bGxvIHBlcmNow6kgcXVhbmRvIGkgY2FnbmFjY2kgZmFubm8gbmV3IEZvcm1Db250cm9sKClcclxuICAgICAqIHNjcml2b25vIHVuIHdyaXRlVmFsdWUgbnVsbG8uLi4gcXVpbmRpIGFsIHByaW1vIGJpbmRpbmcgc2FsdG8gbCdpbml6aWFsaXp6YXppb25lIHNlIGhvIGxhIGNvcHBpYSBudWxsLWZpcnN0QmluZFxyXG4gICAgICogcG9pIG1ldHRlbmRvIGZpcnN0QmluZCBhIGZhbHNlIGRpIGzDrCBpbiBwb2kgZnVuemlvbm8gY29tZSBkZXZvLiBWaXN0YSBsYSBjYXNpc3RpY2EgZXZpdG8gZXNzZW56aWFsbWVudGUgbWV0w6AgZGV0ZWN0Q2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgY2FtcG8gw6ggb2JibGlnYXRvcmlvIGkgb3B6aW9uYWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9kZWxsbyByYXBwcmVzZW50YXRvIGRhIHF1ZXN0byBjYW1wb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTW9kZWw6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vbWUgZ2VuZXJhdG8gcGVyIGlsIGNvbnRyb2xsbyBpbnRlcm5vLiBEaSBkZWZhdWx0IMOoIGlsIG5vbWUgZGVsIGNvbnRyb2xsbyBlc3Rlcm5vIGNvbiBsJ2FnZ2l1bnRhIGRpIFwiX2ludGVybmFsXCIuIFNlcnZlIHBlciBldml0YXJlIGNyb3NzLWJpbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYXRlZE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBGb3JtIGNoZSBjb250aWVuZSBxdWVzdG8gY2FtcG8gw6ggZ2nDoCBzdGF0byByZWdpc3RyYXRvXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBmb3JtSGFzQmVubkJvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgcXVlc3RvIGNhbXBvIMOoIHN0YWNjYXRvIGRhbCBGb3JtLCBhZCBlc2VtcGlvIG5lbCBjYXNvIHNpYSBpbiB1biBuZy10ZW1wbGF0ZSBwcm9pZXR0YXRvIG5lbCBmb3JtLlxyXG4gICAgICogXHJcbiAgICAgKiBJbiBxdWVsIGNhc28gbGEgdmFyaWFiaWxlICoqRm9ybSoqIGRlbCBjb21wb25lbnRlIGRldidlc3NlcmUgdmFsb3JpenphdGFcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRldGF0Y2hlZEZyb21mb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblRvdWNoZWQgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFZlZGkgZ2V0dGVyIGUgc2V0dGVyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWFsb3JhIGNpIGZvc3NlIHVuIGNvbnRlc3RvIGNvbGxlZ2F0byBxdWVzdGEgdmFyaWFiaWxlIGlkZW50aWZpY2Egc2UgU29ubyBsJ093bmVyIG8gbWVuby5cclxuICAgICAqIFxyXG4gICAgICogU2Ugbm9uIGxvIHNvbm8sIGlsIGNhbXBvIHJpc3VsdGVyw6AgaW4gc29sYSBsZXR0dXJhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEFwcENvbnRleHRPd25lcnNoaXA6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXRpbGl6emEgbyBtZW5vIGlsIExheW91dCBkaSB1biBmb3JtIChMYWJlbCBjb24gaW5wdXQgZGkgZmlhbmNvKSwgc2UgZmFsc2UgbW9zdHJhIHNvbG8gbCdpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGb3JtTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGl2YSBvIGRpc2F0dGl2YSBsYSB2YWxpZGF6aW9uZSBwZXIgcXVlc3RvIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGFjZWhvbGRlciBwZXIgcXVhbmRvIGwnaW5wdXQgw6ggdnVvdG9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgUGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzc2UgZXh0cmEgcGVyIGlsIGZvcm0tZ3JvdXAgaW4gY3VpIHZpZW5lIHdyYXBwYXRvIGwnaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRm9ybUdyb3VwQ2xhc3M6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXNzYWdnaW8gZGEgbW9zdHJhcmUgcXVhbmRvIGxhIHZhbGlkYXppb25lIGZhbGxpc2NlIHBlciBxdWVzdG8gY29tcG9uZW50ZS4gRGkgZGVmYXVsdCB2aWVuZSBwcm9wb3N0YSBkYWxsYSBsaWJyZXJpYVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBGYWlsZWRWYWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElucHV0IGNoZSBmb3J6YSBsJ2ludmFsaWRpdMOgIGRlbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZvcmNlZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3N0cmEgdW4gdGVzdG8gYSBzaW5pc3RyYSBkZWxsJ2lucHV0IChGb3JtTGF5b3V0IHBlcm1ldHRlbmRvKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBMYWJlbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbC1tZC1YIHBlciBsYSBsYWJlbFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBMYWJlbENvbFdpZHRoOiBudW1iZXIgPSA0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29sLW1kLVggcGVyIGwnaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgSW5wdXRDb2xXaWR0aDogbnVtYmVyID0gODtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSDDqCBsJ3VsdGltbyBjb21wb25lbnRlIGRpIHVuIGZvcm0gKHNlcnZlIHBlciByaW11b3ZlcmUgaWwgbWFyZ2luZSBmaW5hbGUpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIExhc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc29jaWEgaWwgY29tcG9uZW50ZSBGb3JtIGEgcXVlc3RvIGlucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZvcm06IE5nRm9ybSA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb3JnZW50ZSBkYSBjdWkgc2NlZ2xpZXJlIHZhbG9yaSBwZXIgaSBjb21wb25lbnRpIEZvcm0gY2hlIGxvIGNvbnNlbnRvbm9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU291cmNlOiBhbnlbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJZCBkZWdsaSBvZ2dldHRpIGJpbmRhdGkgbmVsbGEgKipTb3VyY2UqKlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBJZEZpZWxkOiBzdHJpbmcgPSAnaWQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNwcmVzc2lvbmUgc2ltaWwtQW5ndWxhciBwZXIgY2FtYmlhcmUgaWwgdGVzdG8gZGVpIGNvbXBvbmVudGkgY2hlIHNjZWxnb25vIGlsIHByb3ByaW8gbW9kZWxsbyBkYSB1bmEgKipTb3VyY2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBJbCBmdW56aW9uYW1lbnRvIMOoIGlkZW50aWNvIGFsIGJpbmRlciBkaSBhbmd1bGFyLCBzb2xvIGNvbiB1bmEgZ3JhZmZhIGludmVjZSBjaGUgMi5cclxuICAgICAqIMOIIGlub2x0cmUgcG9zc2liaWxlIGFnZ2l1bmdlcmUgcGV6emkgZGkgZGVzY3JpemlvbmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgY29uIGxhIHNpbnRhc3NpICoqOnByb3A/KFByb3AgdmFsZSB7cHJvcH0pKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheTogc3RyaW5nID0gJ3tkZXNjcmlwdGlvbn0nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmlzdWx0YXRvIGRlbGwndW5pb25lIGZyYSBsZSBpbmZvcm1hemlvbmkgZGVnbGkgb2dnZXR0aSBpbiAqKlNvdXJjZSoqIGUgbGUgaW1wb3N0YXppb25pIHNwZWNpZmljYXRlIG5lbGwnSW5wdXQgKipEaXNwbGF5KipcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJvdW5kU291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2Ugw6ggaWwgcHJpbW8gQmluZCBkZWxsYSBTb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIFNvdXJjZUZpcnN0QmluZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipfcmVhZG9ubHkqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2Ugc29sYSBsZXR0dXJhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhZG9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KiogZ2VzdGVuZG8gYW5jaGUgaWwgQ29udGVzdG8gYXBwbGljYXRpdm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBSZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLkFwcENvbnRleHRPd25lcnNoaXApXHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCBMYWJlbENvbFdpZHRoIGUgSW5wdXRDb2xXaWR0aCwgYmFzdGEgc2NyaXZlcmxvIGNvbiBsYSBzaW50YXNzaSBcIlggWVwiXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBJbnB1dCBuZWwgZm9ybWF0byBcIlggWVwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdmFsLXF1YWxjb3NhIGNoZSBmYSBlZmZldHRpdmFtZW50ZSBkYSBpbnB1dCwgbyBldmVudHVhbG1lbnRlIGlsIHNpbmdvbG8gaW5wdXQgaW4gY2FzaSBwYXJ0aWNvbGFyaSAoZXMgY2hlY2tib3gpXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uQ29udHJvbDogTmdNb2RlbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ3ZhbGlkYXRpb25Db250cm9sJyBjaGUgZnVuemlvbmEgaW4gYW1iaWVudGUgc3RhdGljb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJ2YWxpZGF0aW9uQ29udHJvbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IF92YWxpZGF0aW9uQ29udHJvbChjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJWYWxDb21wKGNvbXApOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyeSBzdWxsJ2VsZW1lbnRvICd2YWxpZGF0aW9uQ29udHJvbCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIGRpbmFtaWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI3ZhbGlkYXRpb25Db250cm9sXCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25Db250cm9sXCIsIHsgc3RhdGljOiB0cnVlIH0pIHNldCB2YWxpZGF0aW9uQ29udHJvbF9zdGF0aWMoY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyVmFsQ29tcChjb21wKTsgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGlhbWF0byBhbGxhIG1vZGlmaWNhIGRlbCB2YWxvcmUgY29sbGVnYXRvIGEgcXVlc3RvIGNhbXBvXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGRlbGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIDpwcm9wPyhSb2JhIGNvbiB7cHJvcH0pXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgQmluZENoZWNraW5nR3JvdXBzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHdoZW5leGlzdHM6IHN0cmluZyB9W10gPSBbXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FjaGUgZGVsbGUgcHJvcHJpZXTDoCBzY3JpdHRlIHRpcG8gLS0+IHtwcm9wfVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZSBcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmRldGF0Y2hlZEZyb21mb3JtID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIGltcG9zdGFyZSBtZSBzdGVzc28gY29tZSBzaSBkZXZlLCBpbCB2YWxpZGF0b3JlIGludmVjZSBsbyBwYXNzbyBhbCB2YWxpZGF0aW9uLWlucHV0IHF1YW5kbyB2aWVuZSBzZXR0YXRvIGlsIHZhbGlkYXRpb25Db250cm9sXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgIC8vUGVyIHR1dHRpIGkgdmFsaWRhdG9yaTogcmlnZW5lcm8gbGEgZnVuemlvbmUgZGkgdmFsaWRhemlvbmUuIFBlciBxdWFsY2hlIG1vdGl2byBhIHZvbHRlIGhvIHZhbGlkYXRvcmkgc2VuemEuLi5cclxuICAgICAgICAgICAgLy8uLi4gcXVlc3RvIMOoIHVuIHdvcmthcm91bmQgcGVyIGVzc2VyZSBzaWN1cm8gZGkgYXZlcmxhIHNlbXByZS5cclxuICAgICAgICAgICAgLy9Tb2xvIGkgdmFsaWRhdG9yaSBjb24gcGFyYW1ldHJpIGhhbm5vIGJpc29nbm8gZGVsbGEgX2NyZWF0ZVZhbGlkYXRvciAoZXMuIFwibWF4bGVuZ3RoXCIgY2hlIGhhIDEgcGFyYW1ldHJvKSwgcXVpbmRpIG5vIHZhbGlkYXRvcmkgdGlwbyBcInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodi5fY3JlYXRlVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9jcmVhdGVWYWxpZGF0b3IoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgQmluZC9QYXJzZSBkZWxsZSB2YXJpZSAqKlNvdXJjZSoqIHVuZW5kbyBsZSBpbmZvcm1hemlvbmkgc3BlY2lmaWNhdGUgaW4gKipEaXNwbGF5KipcclxuICAgICAqIFxyXG4gICAgICogRXZlbnR1YWxtZW50ZSByaWVmZmV0dHVhIHVuIGJpbmQgYWwgbW9kZWxsbyBpbiBiYXNlIGFsIHZhbG9yZSBkZWxsYSB2YXJpYWJpbGUgKipSZWJpbmRNb2RlbEFmdGVyU291cmNlKipcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHRyeUJpbmRTb3VyY2VEaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5Tb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA9PSAwICYmICF0aGlzLlNvdXJjZUZpcnN0QmluZClcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlNvdXJjZUZpcnN0QmluZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBDYWNoZSBsb2NhbGUgcGVyIGV2aXRhcmUgZGkgcmlmYXJlIGRlaSByZWdleC5tYXRjaCBvZ25pIHNhbnRhIHZvbHRhXHJcbiAgICAgICAgaWYgKHRoaXMuU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZFByb3BlcnRpZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJsb2NjbyBwZXIgZ2VuZXJhcmUgbGEgZGVzY3JpemlvbmUgZmluYWxlIGRpIHVuIGVsZW1lbnRvXHJcbiAgICAgICAgICAgIHRoaXMuU291cmNlLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBBZ2dpdW5nbyBhbGxhIEJvdW5kU291cmNlIGluIGZvcm1hdG8gc3RhbmRhcmQgS2V5VmFsdWVcclxuICAgICAgICAgICAgICAgIHRoaXMuQm91bmRTb3VyY2UucHVzaCh0aGlzLnRyYW5zZm9ybVNvdXJjZUl0ZW0ocykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kQ2hlY2tpbmdHcm91cHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRDaGVja2luZ0dyb3VwcygpIHtcclxuICAgICAgICAvLyBCbG9jY28gcGVyIHRpcmFyZSBmdW9yaSBsZSBjb25kaXppb25pIHNjcml0dGUgdGlwbyAtLT4gOnByb3A/KFJvYmEgY29uIHtwcm9wfSlcclxuICAgICAgICB2YXIgaWZmZWRNYXRjaGVzID0gdGhpcy5EaXNwbGF5Lm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvZyk7XHJcbiAgICAgICAgaWYgKGlmZmVkTWF0Y2hlcykge1xyXG4gICAgICAgICAgICBpZmZlZE1hdGNoZXMuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFN0ZXNzYSByZWdleCBkaSBzb3ByYSBtYSBpbCB0YWcgXCJpXCIgc2VydmUgcGVyIHRpcmFyZSBmdW9yaSBpIHNpbmdvbGkgY2FwdHVyaW5nIGdyb3VwIGUgcGVyIHF1YWxjaGUgbW90aXZvIFxyXG4gICAgICAgICAgICAgICAgLy8gbmV3IFJlZ0V4cChiYXNlUmVnZXgsIFwiZ1wiKSBub24gZnVuemlvbmEgcXVpbmRpIG5vbiBobyBwb3R1dG8gcmF6aW9uYWxpenphcmxvXHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBzID0gbS5tYXRjaCgvOihbYS16XSspXFw/XFwoKFteXFwoXFwpXSspXFwpL2kpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogZ3JvdXBzWzFdLCB3aGVuZXhpc3RzOiBncm91cHNbMl0gfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbHV0YSBpbCBjb250ZW51dG8gZGVsbGEgdmFyaWFiaWxlIEJpbmRQcm9wZXJ0aWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVCaW5kUHJvcGVydGllcygpIHtcclxuICAgICAgICAvLyBCbG9jY28gcGVyIHRpcmFyZSBmdW9yaSBsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9XHJcbiAgICAgICAgdmFyIG1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goL3tbYS16XSt9L2dpKTtcclxuICAgICAgICBpZiAobWF0Y2hlcylcclxuICAgICAgICAgICAgbWF0Y2hlcy5mb3JFYWNoKG0gPT4geyB0aGlzLkJpbmRQcm9wZXJ0aWVzLnB1c2goeyBnbG9iYWw6IG0sIHByb3A6IG0uc3Vic3RyaW5nKDEsIG0ubGVuZ3RoIC0gMSkgfSk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hIHVuIG9nZ2V0dG8gZGVsbGEgU291cmNlIGFsbGEgc3VhIHZlcnNpb25lIFwibnVvdmFcIiBiYXNhbmRvc2kgc3VsbGUgaW5mb3JtYXppb25pIHN1IGdydXBwaSBlIHByb3ByaWV0w6BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBkYSB0cmFzZm9ybWFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7e2lkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmd9fSBPZ2dldHRvIGZpbmFsZSB0cmFzZm9ybWF0b1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYW5zZm9ybVNvdXJjZUl0ZW0oczogYW55KToge2lkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmd9IHtcclxuICAgICAgICAvLyBQYXJ0byBzZW1wcmUgZGFsbGEgdmFyaWFiaWxlIGRpIERpc3BsYXksIHBvaSBzb3N0aXR1aXNjbyBwZXp6byBwZXIgcGV6em9cclxuICAgICAgICBsZXQgZGVzYyA9IHRoaXMuRGlzcGxheTtcclxuXHJcbiAgICAgICAgLy8gVGFnbGlvIG8gbWFudGVuZ28gbGUgY29uZGl6aW9uaSBpbiBiYXNlIGFsbGEgcHJvcHJpZXTDoCBzdSBjdWkgZmFyZSBjaGVja1xyXG4gICAgICAgIC8vIERvcG9kaWNow6kgc2NyaXZvIHR1dHRlIGxlIHByb3ByaWV0w6BcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZENoZWNraW5nR3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHNbaV07XHJcbiAgICAgICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UodC5nbG9iYWwsIChzW3QucHJvcF0gIT0gbnVsbCAmJiBzW3QucHJvcF0gIT0gdW5kZWZpbmVkKSA/IHQud2hlbmV4aXN0cyA6IFwiXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkJpbmRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5CaW5kUHJvcGVydGllc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgc1t0LnByb3BdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGlkOiBzW3RoaXMuSWRGaWVsZF0sIGRlc2NyaXB0aW9uOiBkZXNjIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWwgY29tb3BuZW50ZSBpbiBxdWVzdGlvbmUgw6ggaW4gZ3JhZG8gZGkgZ2VzdGlyZSBuZ0NvbnRyb2wgbnVsbGkuIFxyXG4gICAgICogRGkgZGVmYXVsdCDDqCAqKmZhbHNlKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGdlc3Rpc2NvIG5nQ29udHJvbCBudWxsaSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgaGFuZGxlTnVsbE5nQ29udHJvbCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIEEgdm9sdGUgbmVsbCduZ09uSW5pdCBub24gY2kgcGFzc2EgcXVpbmRpIGxvIG1ldHRvIHNpYSBxdWkgc2lhIG5lbGwnYWZ0ZXJ2aWV3aW5pdCwgcGVuc28gY2hlIHZhbGdhIHBlciBpIGNvbXBvbmVudGkgZGkgdGVyemUgcGFydGlcclxuICAgICAgICAvLyBjaGUgc2kgY29sbGVnYW5vIHBlciBpIGNhenppIGxvcm8gYWwgZm9ybSBlY2MsIHF1aW5kaSBsYSBwYXJ0ZSBzb3ByYSBub24gc2VydmUuLi4gQk9IXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcblxyXG4gICAgICAgIC8vSWwgbm9tZSBub24gYyfDqCBzZSBtZXR0byBzdGFuZGFsb25lIDogdHJ1ZVxyXG4gICAgICAgIC8vRGF0byBjaGUgYW5jaGUgaWwgY29udHJvbGxvIGVzdGVybm8gdmllbmUgY29uc2lkZXJhdG8gY29tZSBjb21wb25lbnRlIGRlbCBmb3JtLCBub24gcG9zc28gYmFzYXJtaSBzb2xvIHN1bCBub21lIG1hIGRldm8gYWdnaXVuZ2VyZSB1biB0YWcuIEluIHF1ZXN0byBjYXNvIFwiX2ludGVybmFsXCJcclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgIHRoaXMuR2VuZXJhdGVkTmFtZSA9IHRoaXMubmdDb250cm9sLm5hbWUudG9TdHJpbmcoKSArIFwiX2ludGVybmFsXCI7XHJcblxyXG4gICAgICAgIC8vIEFUVEVOWklPTkU6IFFVQUxTSUFTSSBTSUEgSUwgTU9USVZPLCBTRSBTVE8gQ09TTyBWSUVORSBTUE9TVEFUTyBEQUxMIG5nT25Jbml0IE5PTiBGVU5aSU9OQSBQSVUgTlVMTEFcclxuICAgICAgICBpZiAodGhpcy5Gb3JtKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtSGFzQmVubkJvdW5kICYmIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5hZGRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVubkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUXVhbmRvIHVuIGZvcm0gdmllbmUgc3VibWl0dGF0byBsYSB2YXJpYWJpbGUgRm9ybS5zdWJtaXR0ZWQgdmllbmUgYXNzZWduYXRhIGFsbCdpbnB1dCBbc3VibWl0dGVkXSBkZWwgdmFsLWNvbnRyb2xcclxuICAgICAgICAgICAgLy8gRXNzZW5kbyBjaGUgcGVyw7IgbGEgQ0Qgw6ggT25QdXNoIHBlciBkaXJlIGFkIEFuZ3VsYXIgY2hlIGwnSW5wdXQgw6ggY2FtYmlhdG8gZSBwZXJtZXR0ZXJlIGkgc2lkZWZmZWN0cyBkaSBhc3NlZ25hcmUgW3N1Ym1pdHRlZF1cclxuICAgICAgICAgICAgLy8gZGV2byBhdHRhY2Nhcm1pIGFsIHN1Ym1pdCBhdHR1YWxlIGRlbCBmb3JtIGUgcHJpbWEgZGkgZXNlZ3VpcmxvIGRldm8gbWFyY2FyZSBpbCBjb21wb25lbnRlIHBlciBpbCBjaGVja1xyXG4gICAgICAgICAgICBsZXQgb3JpZ0Z1bmMgPSB0aGlzLkZvcm0ub25TdWJtaXQ7XHJcbiAgICAgICAgICAgIHZhciBmb3JtT3V0c2lkZVJlZiA9IHRoaXMuRm9ybTtcclxuICAgICAgICAgICAgdGhpcy5Gb3JtLm9uU3VibWl0ID0gKGV2KTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnRnVuYy5hcHBseShmb3JtT3V0c2lkZVJlZik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxhYm9yYSBpIHZhbGlkYXRvcmkgaW5pZXR0YXRpIGUgY2FwaXNjZSBzZSBpbCB2YWxvcmUgw6ggb2JibGlnYXRvcmlvIG8gbWVub1xyXG4gICAgICovXHJcbiAgICBjaGVja1JlcXVpcmVkVmFsaWRhdG9yKCkge1xyXG4gICAgICAgIC8vIGNvbnRyb2xsbyBzZSDDqCBzZXR0YXRvIHVuIHJlcXVpcmVkIHBlciBkZWNpZGVyZSBpbiBtYW5pZXJhIGNvbmRpemlvbmFsZSBzZSB1dGlsaXp6YXJlIGlsIHZhbGlkYXRvcmUgcmVxdWlyZWQgbmVsIGNvbXBvbmVudGUgaW50ZXJub1xyXG4gICAgICAgIC8vIExvIGZhY2NpbyBxdWkgZSBub24gaW4gdW4gZXZlbnR1YWxlIG5nT25Jbml0IG8gY29zdHJ1dHRvcmUgcGVyY2jDqSBuZ09uSW5pdCBub24gc2VtcHJlIHZpZW5lIGNoaWFtYXRvIGUgZGEgY29zdHJ1dHRvcmUgaWwgdmFsaWRhdG9yZSBub24gaGEgYW5jb3JhIGlsIHZhbG9yZSBnaXVzdG9cclxuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdG9ycyAmJiB0aGlzLl92YWxpZGF0b3JzLnNvbWUoZWxlbSA9PiBlbGVtIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3IgJiYgZWxlbS5yZXF1aXJlZCkpXHJcbiAgICAgICAgICAgIHRoaXMuUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBjaGUgY29sbGVnYSBsYSBmdW56aW9uZSBkaSByZXNldCBkZWwgY29udHJvbGxvIGZvcm0gYWwgY29udHJvbGxvIGRpIHZhbGlkYXppb25lIHNvdHRvc3RhbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZFJlc2V0RnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy9mYWNjaW8gaW4gbW9kbyBjaGUgc2UgY2hpYW1vIGlsIHJlc2V0IGRlbCBjb250cm9sbG8gKG8gZGVsbGEgZm9ybSkgZGFsbCdlc3Rlcm5vIHNpIHJlc2V0dGkgYW5jaGUgaWwgY29udHJvbGxvIG5hdGl2b1xyXG4gICAgICAgIGNvbnN0IG9yaWdGdW5jID0gKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgdmFyIG5nQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbDtcclxuICAgICAgICB2YXIgdmFsaWRhdGlvbkNvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSA9IHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbDtcclxuXHJcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldCA9ICgpID0+IHtcclxuICAgICAgICAgICAgb3JpZ0Z1bmMuYXBwbHkobmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UpO1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlLnJlc2V0KCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy9QZXIgY29uc2VudGlyZSByaWNoaWFtaSBtdWx0aXBsaSBkaSBxdWVzdGEgZnVuemlvbmUgcHJlbmRlbmRvIHNlbXByZSBsYSBmaXVuemlvbmUgZGkgcmVzZXQgYmFzZVxyXG4gICAgICAgICg8YW55PnRoaXMubmdDb250cm9sLmNvbnRyb2wpLl9fb3JpZ2luYWxfcmVzZXRfXyA9IG9yaWdGdW5jXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAob2JqID09IG51bGwgJiYgdGhpcy5maXJzdEJpbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJzdEJpbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5Nb2RlbCA9IG9iajtcclxuXHJcbiAgICAgICAgLy9QZXIgc3ZlZ2xpYXJlIEFuZ3VsYXIuIElsIHZhbG9yZSBjaGUgZW50cmEgcG90cmViYmUgZXNzZXJlIHZhbGlkby9ub24gdmFsaWRvIGUgcXVlc3RvIGxvIGJpbmRhIGEgdHV0dG8sIGZvcm0gY29tcHJlc29cclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Nb2RlbClcclxuICAgICAgICAgICAgdGhpcy5vbk5vdE51bGxWYWx1ZVNldCgpO1xyXG5cclxuICAgICAgICAvLyBtYXJrRm9yQ2hlY2sgbm9uIHZhIGJlbmUgaW4gcXVhbnRvIGFycml2YW5vIHBvc3NpYmlsbWVudGUgMiB1cGRhdGUgc3UgdW4gc29sbyBjaWNsbyBkaSBzdGFja1xyXG4gICAgICAgIC8vIHNldFRpbWUqdXQgY2hlIHdyYXBwYSB0dXR0byBub24gdmEgYmVuZSBzZW5uw7Igc3BhbW1hIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gYSBzdW9uIGRpIGludGVydmFsIGNoZSByYWxsZW50YW5vIHRhbnRpc3NpbW8gbCdhcHBcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cmEgaW50ZXJuYW1lbnRlIGlsIGNvbXBvbmVudGUgZGkgdmFsaWRhemlvbmUsIG5lIGltcG9zdGEgaSB2YWxpZGF0b3JpIGUgY29sbGVnYSBpbCBGb3JtLCBzZSBwcmVzZW50ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge05nTW9kZWx9IGNvbXAgRWxlbWVudG8gSFRNTCBtYXJjYXRvIGNvbiBcIiN2YWxpZGF0aW9uQ29udHJvbFwiXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyVmFsQ29tcChjb21wOiBOZ01vZGVsKSB7XHJcbiAgICAgICAgaWYgKGNvbXApIHtcclxuICAgICAgICAgICAgLy8gw4ggYXJyaXZhdG8gdW4gbnVvdm8gdmFsaWRhdGlvbkNvbnRvcmwgKHN1Y2NlZGUgc29sbyBuZWwgZm9ybS1zZWxlY3QgcXVhbmRvIGNhbWJpYSBsYSBzb3VyY2UgZGEgMCBlbGVtZW50aSAvIG51bGwgYWQgTiBlbGVtZW50aSwgcXVpbmRpIGFsIG1hc3NpbW8gdW5hIHZvbHRhKSBcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgJiYgdGhpcy5Gb3JtKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sID0gY29tcDtcclxuXHJcbiAgICAgICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBwYXNzYXJlIGF2YW50aSBpIHZhbGlkYXRvcmlcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICAgICAgICAvL1NlIHNvbm8gc3RhY2NhdG8gZGFsIEZvcm0gKHZ1b2wgZGlyZSBjaGUgc29ubyBhZCBlc2VtcGlvIGRlbnRybyB1biBuZy10ZW1wbGF0ZSkgYWdnaXVuZ28gaWwgY29udHJvbGxvIGFsIEZvcm0gcGFzc2F0byBjb21lIGlucHV0IChjb250ZXh0IGRlbCB0ZW1wbGF0ZSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGV0YXRjaGVkRnJvbWZvcm0gJiYgdGhpcy5Gb3JtICYmICF0aGlzLmZvcm1IYXNCZW5uQm91bmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRm9ybS5hZGRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1IYXNCZW5uQm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRSZXNldEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvL0kgdmFsLXJvYmEgcXVlc3RvIGxvIGZhbm5vIGF1dG9tYXRpY2FtZW50ZSBkZW50cm8uLi4gZ2xpIGFsdHJpIG5vIChlcy4gc2VtcGxpY2UgaW5wdXQgY2hlY2tib3gpXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlGb3JOYXRpdmVJbnB1dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFnZ2lvcm5hIGlsIHZhbG9yZSBlIGxhIHZhbGlkaXTDoCBkZWxsJ2lucHV0IHNvdHRvc3RhbnRlLiBOb24gdmllbmUgY2hpYW1hdG8gcGVyIGlucHV0IG5hdGl2aSBjb21lIGxlIGNoZWNrYm94XHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VkVmFsdWUgRm9yemEgbCdhZ2dpb3JuYW1lbnRvIGFuY2hlIHNlIG5vbiDDqCB1biBpbnB1dCBuYXRpdm8gKGlucHV0IG5hdGl2byA9IGNoZWNrYm94LCBhZCBlc2VtcGlvKVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KGZvcmNlZFZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoZm9yY2VkVmFsdWUgfHwgdGhpcy5uYXRpdmVJbnB1dClcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIi4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBjaGFuZ2VkKGZvcmNlZFZhbHVlOiBhbnkgPSBudWxsLCBtYXJrRm9yQ2hlY2s6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGZvcmNlZFZhbHVlID09IG51bGwgPyB0aGlzLk1vZGVsIDogZm9yY2VkVmFsdWUpO1xyXG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdChmb3JjZWRWYWx1ZSA9PSBudWxsID8gdGhpcy5Nb2RlbCA6IGZvcmNlZFZhbHVlKTtcclxuICAgICAgICBpZiAobWFya0ZvckNoZWNrKVxyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3Qgb25Ob3ROdWxsVmFsdWVTZXQoKTogdm9pZDtcclxufSJdfQ==
@@ -47,10 +47,23 @@ export class FormAdaptiveComponent extends BaseFormControl {
47
47
  * Numero minimo di caratteri con cui cercare
48
48
  */
49
49
  this.MinChars = 3;
50
+ /**
51
+ * Indica se i controlli devono essere effettuati tenendo conto del Case o meno. Vale solo qualora la **Source** fosse fornita
52
+ */
53
+ this.CaseSensitive = false;
50
54
  /**
51
55
  * Variabile interna che gestisce se effettuare il riallineamento dei dati o meno
52
56
  */
53
57
  this.alignValues = false;
58
+ /**
59
+ * Indica se ignorare il prossimo evento writeValue che normalmente dovrebbe richiedere la nuova source. Serve per quando l'utente seleziona un elemento:
60
+ * Subito dopo partirebbe un altro evento modelChange che ricaricherebbe nuovamente la source
61
+ */
62
+ this.ignoreNextWriteValue = false;
63
+ /**
64
+ * Cache della sorgente originale POST binding, in modo da poter fare filtri in locale qualora la **SearchFunction** non fosse definita e la **Source** fosse assegnata
65
+ */
66
+ this.FilteredBoundSource = [];
54
67
  //******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
55
68
  //TODO: spostarla in un metodo di utilità (esfaenza/extensions)
56
69
  /** @ignore */
@@ -61,11 +74,19 @@ export class FormAdaptiveComponent extends BaseFormControl {
61
74
  * @ignore
62
75
  */
63
76
  ngOnChanges(changes) {
77
+ var _a;
64
78
  return __awaiter(this, void 0, void 0, function* () {
65
79
  const newSource = changes["Source"];
66
80
  const newType = changes["Type"];
67
- if (newSource)
81
+ if (newSource) {
68
82
  this.tryBindSourceDisplay();
83
+ // Prima assegnazione se cambia la source sotto (quindi se viene bindata direttamente da HTML)
84
+ if (this.Type == "autocomplete" && (((_a = this.Model) === null || _a === void 0 ? void 0 : _a.length) || 0) >= this.MinChars && !this.SearchFunction)
85
+ this.FilteredBoundSource = this.BoundSource;
86
+ else
87
+ this.FilteredBoundSource = [];
88
+ this.cdr.markForCheck();
89
+ }
69
90
  if (newType && this.Model)
70
91
  this.writeValue(this.Model);
71
92
  });
@@ -91,14 +112,16 @@ export class FormAdaptiveComponent extends BaseFormControl {
91
112
  if (this.Type == "file")
92
113
  obj = this.ModelFile;
93
114
  if (this.Type == "autocomplete") {
94
- this.SearchFunction(obj, true).subscribe(t => {
95
- this.Source = t;
96
- setTimeout(() => {
97
- var val = this.Source.find(t => t.id == obj);
98
- this.propagateChange(val ? val.id : obj);
99
- this.Model = val ? val.description : obj;
115
+ if (this.SearchFunction) {
116
+ this.SearchFunction(obj, true).subscribe(t => {
117
+ this.Source = t;
118
+ this.tryBindSourceDisplay();
119
+ setTimeout(() => { this.finalizeValue(obj); });
100
120
  });
101
- });
121
+ return;
122
+ }
123
+ else
124
+ this.finalizeValue(obj);
102
125
  }
103
126
  super.writeValue(obj);
104
127
  if (this.alignValues) {
@@ -106,24 +129,56 @@ export class FormAdaptiveComponent extends BaseFormControl {
106
129
  this.cdr.markForCheck();
107
130
  }
108
131
  }
132
+ /**
133
+ * Dato un valore verifica se può restituire le informazioni trovate in **Source** con id uguale a **value** o se deve restituire il valore in se
134
+ *
135
+ * @param {any} value Valore scritto nell'input di testo
136
+ */
137
+ finalizeValue(value) {
138
+ var val = this.Source.find(t => t.id == value);
139
+ this.propagateChange(val ? val.id : value);
140
+ this.Model = val ? val.description : value;
141
+ }
109
142
  /**
110
143
  * Evento di filtro della sorgente dati in base all'input utente
111
144
  *
112
145
  * @param {string} event Input utente
113
146
  */
114
147
  filterSource(event) {
115
- if (event.length < this.MinChars) {
116
- this.Source = [];
148
+ if (this.ignoreNextWriteValue) {
149
+ this.ignoreNextWriteValue = false;
117
150
  return;
118
151
  }
119
- if (!this.SearchFunction)
152
+ // Quando filtro la source, se non devo ignorare l'evento devo comunque assicurarmi di impostare il valore selezionato a null
153
+ super.changed("");
154
+ if (!event && this.MinChars == 0 && !this.SearchFunction) {
155
+ this.FilteredBoundSource = this.BoundSource;
156
+ return;
157
+ }
158
+ if (!event || event.length < this.MinChars) {
159
+ this.FilteredBoundSource = [];
160
+ return;
161
+ }
162
+ if (!this.SearchFunction && (!this.Source || this.Source.length == 0))
120
163
  throw "Impossibile filtrare gli elementi senza una funzione di ricerca che restituisca una lista di { id: string, description: string }";
121
- this.throttla("filtersource", () => {
122
- this.SearchFunction(event, false).subscribe(t => {
123
- this.Source = t;
124
- this.tryBindSourceDisplay();
125
- });
126
- }, 400);
164
+ if (this.SearchFunction) {
165
+ this.throttla("filtersource", () => {
166
+ this.SearchFunction(event, false).subscribe(t => {
167
+ this.Source = t;
168
+ this.tryBindSourceDisplay();
169
+ // In questo caso è già filtrata dalla SearchFunction
170
+ this.FilteredBoundSource = this.BoundSource;
171
+ this.cdr.markForCheck();
172
+ });
173
+ }, 400);
174
+ }
175
+ else {
176
+ this.throttla("filtersource", () => {
177
+ // In questo caso devo filtrare io in memoria
178
+ this.FilteredBoundSource = this.BoundSource.filter(t => (this.CaseSensitive && t.description.includes(event)) || (!this.CaseSensitive && t.description.toLowerCase().includes(event.toLowerCase())));
179
+ this.cdr.markForCheck();
180
+ }, 100);
181
+ }
127
182
  }
128
183
  /**
129
184
  * Metodo richiamato quando viene modificato il modello del campo di input
@@ -138,6 +193,8 @@ export class FormAdaptiveComponent extends BaseFormControl {
138
193
  var toEmit = this.dateAdapter.clone(this.Model);
139
194
  toEmit = toEmit.format("HH:mm:ss");
140
195
  }
196
+ if (this.Type == "autocomplete")
197
+ this.ignoreNextWriteValue = true;
141
198
  super.changed(toEmit);
142
199
  }
143
200
  /**
@@ -189,7 +246,7 @@ FormAdaptiveComponent.decorators = [
189
246
  { type: Component, args: [{
190
247
  selector: "form-adaptive",
191
248
  providers: [{ provide: LocalizationService, useClass: FormAdaptiveComponentLoc }],
192
- template: "<ng-container *ngIf=\"!FormLayout\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n</ng-container>\r\n\r\n<div *ngIf=\"FormLayout\" class=\"form-group row {{FormGroupClass}}\" [class.app-margin-bottom-0]=\"Last\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">{{Label}}{{Required ? '*' : ''}}:</label>\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<ng-template #controlTemplate>\r\n <div *ngIf=\"!Type\" class=\"app-margin-top-5\">\r\n <em>{{TypeMissingMessage}}</em>\r\n </div>\r\n \r\n <!--Se currency-->\r\n <div *ngIf=\"Type == 'currency'\">\r\n <val-currency [forceInvalid]=\"ForcedError\"\r\n [CurrencyOptions]=\"{ prefix: '', thousands: '.', decimal: ',', precision: Precision, align: Alignment }\" [noValidate]=\"!Validation\"\r\n #validationControl=\"ngModel\" type=\"text\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-currency>\r\n </div>\r\n <!--Se data-->\r\n <div *ngIf=\"Type == 'date'\">\r\n <val-date #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div *ngIf=\"Type == 'string'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || ''}}\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero-->\r\n <div *ngIf=\"Type == 'float' || Type == 'number'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^([0-9]*[,])?[0-9]+$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero intero-->\r\n <div *ngIf=\"Type == 'int'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^[0-9]\\\\d*$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"m-t-5\" *ngIf=\"Type == 'boolean'\">\r\n <input #validationControl=\"ngModel\" [readonly]=\"Readonly\" type=\"checkbox\" class=\"app-pointer\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" (ngModelChange)=\"changed();\" />\r\n </div>\r\n <!--Se enum-->\r\n <div *ngIf=\"Type == 'enum'\">\r\n <val-select #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [placeHolderValue]=\"''\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [required]=\"Required\" [(ngModel)]=\"Model\" (inputChange)=\"changed();\" name=\"{{GeneratedName}}\">\r\n <option *ngFor=\"let val of BoundSource\" [value]=\"val.id\">{{val.description}}</option>\r\n </val-select>\r\n </div>\r\n <!--Se autocomplete-->\r\n <div *ngIf=\"Type == 'autocomplete'\">\r\n <val-autocomplete #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" [FilteredSource]=\"BoundSource\" (inputChange)=\"filterSource($event); changed();\"></val-autocomplete>\r\n </div>\r\n <!--Se date time-->\r\n <div *ngIf=\"Type == 'datetime'\">\r\n <val-datetime #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-datetime>\r\n </div>\r\n <!--Se time-->\r\n <div *ngIf=\"Type == 'time'\">\r\n <ngx-mat-timepicker name=\"val-time\" #elementRef #baseInput=\"ngModel\" [(ngModel)]=\"Model\" [disabled]=\"Readonly\"\r\n [showSpinners]=\"false\" [stepHour]=\"2\" [stepMinute]=\"5\" [stepSecond]=\"30\"\r\n [showSeconds]=\"true\" (ngModelChange)=\"changed()\" #validationControl=\"ngModel\">\r\n </ngx-mat-timepicker>\r\n </div>\r\n <!--Se file-->\r\n <div *ngIf=\"Type == 'file'\">\r\n <div class=\"input-group file-upload\">\r\n <input type=\"file\" (change)=\"fileChange()\" #fileInput class=\"file-upload-btn app-pointer\" [multiple]=\"null\"/>\r\n <input type=\"text\" [class.frm-padding-left-22]=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" class=\"form-control checking-field\" placeholder=\"{{'Select a file' | localize : lc}}...\" [(ngModel)]=\"ModelFile.filename\" name=\"dsfile\" #validationControl=\"ngModel\" [required]=\"Required\"/>\r\n \r\n <a class=\"fa fa-download app-pointer app-input-icon\" *ngIf=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" (click)=\"downloadAttachment()\"></a>\r\n <i class=\"fa fa-times delete-file\" (click)=\"fileChange(true)\" *ngIf=\"ModelFile.filename\"></i>\r\n <span class=\"input-group-btn\">\r\n <button class=\"btn btn-primary btn-file-upload\" type=\"button\"><i class=\"fa fa-upload\"></i></button>\r\n </span>\r\n </div>\r\n </div>\r\n</ng-template>",
249
+ template: "<ng-container *ngIf=\"!FormLayout\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n</ng-container>\r\n\r\n<div *ngIf=\"FormLayout\" class=\"form-group row {{FormGroupClass}}\" [class.app-margin-bottom-0]=\"Last\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">{{Label}}{{Required ? '*' : ''}}:</label>\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<ng-template #controlTemplate>\r\n <div *ngIf=\"!Type\" class=\"app-margin-top-5\">\r\n <em>{{TypeMissingMessage}}</em>\r\n </div>\r\n \r\n <!--Se currency-->\r\n <div *ngIf=\"Type == 'currency'\">\r\n <val-currency [forceInvalid]=\"ForcedError\"\r\n [CurrencyOptions]=\"{ prefix: '', thousands: '.', decimal: ',', precision: Precision, align: Alignment }\" [noValidate]=\"!Validation\"\r\n #validationControl=\"ngModel\" type=\"text\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-currency>\r\n </div>\r\n <!--Se data-->\r\n <div *ngIf=\"Type == 'date'\">\r\n <val-date #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div *ngIf=\"Type == 'string'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || ''}}\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero-->\r\n <div *ngIf=\"Type == 'float' || Type == 'number'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^([0-9]*[,])?[0-9]+$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero intero-->\r\n <div *ngIf=\"Type == 'int'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^[0-9]\\\\d*$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"m-t-5\" *ngIf=\"Type == 'boolean'\">\r\n <input #validationControl=\"ngModel\" [readonly]=\"Readonly\" type=\"checkbox\" class=\"app-pointer\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" (ngModelChange)=\"changed();\" />\r\n </div>\r\n <!--Se enum-->\r\n <div *ngIf=\"Type == 'enum'\">\r\n <val-select #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [placeHolderValue]=\"''\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [required]=\"Required\" [(ngModel)]=\"Model\" (inputChange)=\"changed();\" name=\"{{GeneratedName}}\">\r\n <option *ngFor=\"let val of BoundSource\" [value]=\"val.id\">{{val.description}}</option>\r\n </val-select>\r\n </div>\r\n <!--Se autocomplete-->\r\n <div *ngIf=\"Type == 'autocomplete'\">\r\n <val-autocomplete #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" [FilteredSource]=\"FilteredBoundSource\" (inputChange)=\"filterSource($event); changed();\"></val-autocomplete>\r\n </div>\r\n <!--Se date time-->\r\n <div *ngIf=\"Type == 'datetime'\">\r\n <val-datetime #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-datetime>\r\n </div>\r\n <!--Se time-->\r\n <div *ngIf=\"Type == 'time'\">\r\n <ngx-mat-timepicker name=\"val-time\" #elementRef #baseInput=\"ngModel\" [(ngModel)]=\"Model\" [disabled]=\"Readonly\"\r\n [showSpinners]=\"false\" [stepHour]=\"2\" [stepMinute]=\"5\" [stepSecond]=\"30\"\r\n [showSeconds]=\"true\" (ngModelChange)=\"changed()\" #validationControl=\"ngModel\">\r\n </ngx-mat-timepicker>\r\n </div>\r\n <!--Se file-->\r\n <div *ngIf=\"Type == 'file'\">\r\n <div class=\"input-group file-upload\">\r\n <input type=\"file\" (change)=\"fileChange()\" #fileInput class=\"file-upload-btn app-pointer\" [multiple]=\"null\"/>\r\n <input type=\"text\" [class.frm-padding-left-22]=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" class=\"form-control checking-field\" placeholder=\"{{'Select a file' | localize : lc}}...\" [(ngModel)]=\"ModelFile.filename\" name=\"dsfile\" #validationControl=\"ngModel\" [required]=\"Required\"/>\r\n \r\n <a class=\"fa fa-download app-pointer app-input-icon\" *ngIf=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" (click)=\"downloadAttachment()\"></a>\r\n <i class=\"fa fa-times delete-file\" (click)=\"fileChange(true)\" *ngIf=\"ModelFile.filename\"></i>\r\n <span class=\"input-group-btn\">\r\n <button class=\"btn btn-primary btn-file-upload\" type=\"button\"><i class=\"fa fa-upload\"></i></button>\r\n </span>\r\n </div>\r\n </div>\r\n</ng-template>",
193
250
  changeDetection: ChangeDetectionStrategy.OnPush,
194
251
  styles: [".frm-padding-left-22{padding-left:22px}\n"]
195
252
  },] }
@@ -214,6 +271,7 @@ FormAdaptiveComponent.propDecorators = {
214
271
  Precision: [{ type: Input }],
215
272
  Alignment: [{ type: Input }],
216
273
  SearchFunction: [{ type: Input }],
217
- MinChars: [{ type: Input }]
274
+ MinChars: [{ type: Input }],
275
+ CaseSensitive: [{ type: Input }]
218
276
  };
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9mb3JtLWFkYXB0aXZlL2Zvcm0tYWRhcHRpdmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSixPQUFPLEVBQXdCLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRixzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRWpGLGVBQWU7QUFDZixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFekUsVUFBVTtBQUNWLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVS9DOztHQUVHO0FBUUgsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGVBQWU7SUF5RHREOzs7O09BSUc7SUFDSCxZQUFZLEdBQXNCLEVBQVUsT0FBdUIsRUFBVSxXQUFtQyxFQUFTLEVBQXVCLEVBQXNCLFNBQW9C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QUFLOzZCQUtMLEtBQUs7dUJBS0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5wdXQsIE9wdGlvbmFsLCBTZWxmLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTmdDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBFUyAvIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tICdAZXNmYWVuemEvYWNjZXNzLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBOZ3hNYXREYXRlQWRhcHRlciB9IGZyb20gXCJAYW5ndWxhci1tYXRlcmlhbC1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlclwiO1xyXG5cclxuLy8gQXBwbGljYXppb25lXHJcbmltcG9ydCB7IEJhc2VGb3JtQ29udHJvbCB9IGZyb20gXCIuLi9iYXNlLWZvcm0tY29udHJvbFwiO1xyXG5pbXBvcnQgeyBGb3JtQWRhcHRpdmVDb21wb25lbnRMb2MgfSBmcm9tIFwiLi9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5sb2NcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQUNPX0NVU1RPTUtFWSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcbmltcG9ydCB7IEFwcEZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL0FwcEZpbGVcIjtcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLyoqXHJcbiAqIERpY2hpYXJhemlvbmUgZGVsbGEgdmFyaWFiaWxlIGdsb2JhbGUgZGF5anMuIEwnb25lcmUgZGkgXCJjcmVhcmxhXCIgw6ggYWZmaWRhdG8gYWxsJ2FwcGxpY2F6aW9uZSBjaGUgdXRpbGl6emEgcXVlc3RhIGxpYnJlcmlhLCBcclxuICogY2hlIGRvdnLDoCBpbXBvcnRhcmUgbG8gc2NyaXB0IGdsb2JhbGUgZGkgZGF5anMgbmVsbGEgQ0xJXHJcbiAqL1xyXG5kZWNsYXJlIHZhciBkYXlqczogYW55O1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgaW4gZ3JhZG8gZGkgYXNzdW1lcmUgbGEgZm9ybWEgZGkgdW4gcXVhbHNpYXNpIGFsdHJvIGNvbXBvbmVudGUgZm9ybSBpbiBiYXNlIGFsIHRpcG8gc3BlY2lmaWNhdG8uIFV0aWxlICBwZXIgbGEgY3JlYXppb25lIGRpIGZvcm0gZGluYW1pY2lcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiZm9ybS1hZGFwdGl2ZVwiLFxyXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogRm9ybUFkYXB0aXZlQ29tcG9uZW50TG9jIH1dLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuLi9mb3JtLWZpbGUvZm9ybS1maWxlLmNvbXBvbmVudC5jc3NcIl0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUFkYXB0aXZlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGlwb2xvZ2lhIGNoZSBkZWNpZGUgY2hlIGNvbXBvbmVudGUgbW9zdHJhcmVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVHlwZTogJ3N0cmluZycgfCAnZmxvYXQnIHwgJ2RhdGUnIHwgJ251bWJlcicgfCAnaW50JyB8ICdib29sZWFuJyB8ICdlbnVtJyB8ICdhdXRvY29tcGxldGUnIHwgJ2RhdGV0aW1lJyB8ICd0aW1lJyB8ICdmaWxlJyB8ICdjdXJyZW5jeSc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXNzYWdnaW8gcGVyIHF1YW5kbyBzaSBiaW5kYSB1biBmb3JtLWFkYXB0aXZlIHNlbnphIHRpcG9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVHlwZU1pc3NpbmdNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXR0ZXJuIGRpIHZhbGlkYXppb25lXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFBhdHRlcm46IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpZmVyaW1lbnRvIGFsbCdlbGVtZW50byBpbnB1dCBkaSB0aXBvIGZpbGUgcXVhbG9yYSBpbCAqKlR5cGUqKiBkaSBxdWVzdG8gY29tcG9uZW50ZSBmb3NzZSAqKmZpbGUqKlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFwiZmlsZUlucHV0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBpbnB1dEVsOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2NhcmljYXJlIGwnZXZlbnR1YWxlIGZpbGUgcHJlc2VudGUgcXVhbG9yYSBpbCAqKlR5cGUqKiBkaSBxdWVzdG8gY29tcG9uZW50ZSBmb3NzZSAqKmZpbGUqKlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBBbGxvd0Rvd25sb2FkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGVsbG8gdHlwZXNjcmlwdCBkaSBiaW5kIGRlaSBmaWxlXHJcbiAgICAgKi9cclxuICAgIE1vZGVsRmlsZTogQXBwRmlsZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpenphdGEgbmVsIGZvcm0tYWRhcHRlciBwZXIgc3BlY2lmaWNhcmUgbGEgcHJlY2lzaW9uZSBkZWdsaSBpbnB1dCBjdXJyZW5jeW1hcCAoVHlwZTogY3VycmVuY3kpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFByZWNpc2lvbjogbnVtYmVyID0gMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbGluZWFtZW50byBkZWxsYSBjdXJyZW5jeSBtYXNrXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEFsaWdubWVudDogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBkaSByaWNlcmNhIGNoZSB2ZXJyw6AgY2hpYW1hdGEgZGFsIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoRnVuY3Rpb246IChzZWFyY2g6IHN0cmluZywgYnlpZDogYm9vbGVhbikgPT4gT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOdW1lcm8gbWluaW1vIGRpIGNhcmF0dGVyaSBjb24gY3VpIGNlcmNhcmVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgTWluQ2hhcnM6IG51bWJlciA9IDM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJpbGUgaW50ZXJuYSBjaGUgZ2VzdGlzY2Ugc2UgZWZmZXR0dWFyZSBpbCByaWFsbGluZWFtZW50byBkZWkgZGF0aSBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhbGlnblZhbHVlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmUgXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB1dGlFeHRzOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTmd4TWF0RGF0ZUFkYXB0ZXI8YW55PiwgcHVibGljIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCBAT3B0aW9uYWwoKSBAU2VsZigpIG5nQ29udHJvbDogTmdDb250cm9sLCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBhYzogQWNjZXNzQ29udHJvbFNlcnZpY2UsIEBPcHRpb25hbCgpIEFwcENvbnRleHQ6IENvbXBvbmVudENvbnRleHQsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNPX0NVU1RPTUtFWSkgQUNPX0NVU1RPTUtFWSA6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGNkciwgbmdDb250cm9sLCBfdmFsaWRhdG9ycywgYWMsIEFwcENvbnRleHQsQUNPX0NVU1RPTUtFWSk7XHJcblxyXG4gICAgICAgIHRoaXMuTW9kZWxGaWxlID0gbmV3IEFwcEZpbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBjb25zdCBuZXdTb3VyY2UgPSBjaGFuZ2VzW1wiU291cmNlXCJdO1xyXG4gICAgICAgIGNvbnN0IG5ld1R5cGUgPSBjaGFuZ2VzW1wiVHlwZVwiXTtcclxuICAgICAgICBpZiAobmV3U291cmNlKVxyXG4gICAgICAgICAgICB0aGlzLnRyeUJpbmRTb3VyY2VEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdUeXBlICYmIHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLk1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWxpZ25WYWx1ZXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLlR5cGUpXHJcbiAgICAgICAgICAgIHRoaXMuVHlwZSA9IFwic3RyaW5nXCI7XHJcblxyXG4gICAgICAgIGlmICgodGhpcy5UeXBlID09IFwiZmxvYXRcIiB8fCB0aGlzLlR5cGUgPT0gXCJudW1iZXJcIikgJiYgb2JqKVxyXG4gICAgICAgICAgICBvYmogPSBvYmoudG9TdHJpbmcoKS5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcblxyXG4gICAgICAgIC8vIFBlciBzaWN1cmV6emEgcmlhbGxpbmVvIGkgdmFsb3JpXHJcbiAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcImJvb2xlYW5cIikge1xyXG4gICAgICAgICAgICBvYmogPSBvYmogPyAob2JqID09PSB0cnVlIHx8IG9iai50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSA6IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmFsaWduVmFsdWVzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlR5cGUgPT0gXCJ0aW1lXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzLCBzZWNvbmRzXSA9IChvYmogfHwgXCIwOjA6MFwiKS5zcGxpdChcIjpcIik7XHJcbiAgICAgICAgICAgIG9iaiA9IGRheWpzKCkuaG91cihob3VycyA/PyAwKS5taW51dGUobWludXRlcyA/PyAwKS5zZWNvbmQoc2Vjb25kcyA/PyAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlR5cGUgPT0gXCJmaWxlXCIpXHJcbiAgICAgICAgICAgIG9iaiA9IHRoaXMuTW9kZWxGaWxlO1xyXG5cclxuICAgICAgICBpZih0aGlzLlR5cGUgPT0gXCJhdXRvY29tcGxldGVcIilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VhcmNoRnVuY3Rpb24ob2JqLCB0cnVlKS5zdWJzY3JpYmUodCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNvdXJjZSA9IHQ7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5Tb3VyY2UuZmluZCh0ID0+IHQuaWQgPT0gb2JqKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWwgPyB2YWwuaWQgOiBvYmopO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTW9kZWwgPSB2YWwgPyB2YWwuZGVzY3JpcHRpb24gOiBvYmo7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci53cml0ZVZhbHVlKG9iaik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFsaWduVmFsdWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudG8gZGkgZmlsdHJvIGRlbGxhIHNvcmdlbnRlIGRhdGkgaW4gYmFzZSBhbGwnaW5wdXQgdXRlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBJbnB1dCB1dGVudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbHRlclNvdXJjZShldmVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50Lmxlbmd0aCA8IHRoaXMuTWluQ2hhcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5Tb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLlNlYXJjaEZ1bmN0aW9uKVxyXG4gICAgICAgICAgICB0aHJvdyBcIkltcG9zc2liaWxlIGZpbHRyYXJlIGdsaSBlbGVtZW50aSBzZW56YSB1bmEgZnVuemlvbmUgZGkgcmljZXJjYSBjaGUgcmVzdGl0dWlzY2EgdW5hIGxpc3RhIGRpIHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9XCI7XHJcblxyXG4gICAgICAgIHRoaXMudGhyb3R0bGEoXCJmaWx0ZXJzb3VyY2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLlNlYXJjaEZ1bmN0aW9uKGV2ZW50LCBmYWxzZSkuc3Vic2NyaWJlKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Tb3VyY2UgPSB0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlCaW5kU291cmNlRGlzcGxheSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCA0MDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIHJpY2hpYW1hdG8gcXVhbmRvIHZpZW5lIG1vZGlmaWNhdG8gaWwgbW9kZWxsbyBkZWwgY2FtcG8gZGkgaW5wdXRcclxuICAgICAqL1xyXG4gICAgY2hhbmdlZCgpIHtcclxuICAgICAgICB2YXIgdG9FbWl0ID0gdGhpcy5Nb2RlbCA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5Nb2RlbCkpIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCh0aGlzLlR5cGUgPT0gXCJmbG9hdFwiIHx8IHRoaXMuVHlwZSA9PSBcIm51bWJlclwiKSAmJiB0b0VtaXQpXHJcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdC5yZXBsYWNlKFwiLlwiLCBcIlwiKS5yZXBsYWNlKFwiLFwiLCBcIi5cIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlR5cGUgPT0gXCJib29sZWFuXCIpXHJcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdCA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5UeXBlID09IFwidGltZVwiKXtcclxuICAgICAgICAgICAgdmFyIHRvRW1pdCA9IHRoaXMuZGF0ZUFkYXB0ZXIuY2xvbmUodGhpcy5Nb2RlbCk7XHJcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdC5mb3JtYXQoXCJISDptbTpzc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmNoYW5nZWQodG9FbWl0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBwZXIgZ2VzdGlyZSBsYSBtb2RpZmljYSBkZWwgZmlsZSBhdHR1YWxtZW50ZSBiaW5kYXRvLiBPdnZpYW1lbnRlIGZ1bnppb25hIHNvbG8gcXVhbG9yYSBpbCAqKlR5cGUqKiBmb3NzZSAqKmZpbGUqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNsZWFyIEluZGljYSBzZSBiaXNvZ25hIHN2dW90YXJlIGwnaW5wdXQgbyBtZW5vIFxyXG4gICAgICovXHJcbiAgICBmaWxlQ2hhbmdlKGNsZWFyOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gICAgICAgIGxldCBtb2RlbCA9ICg8QXBwRmlsZT50aGlzLk1vZGVsKTtcclxuICAgICAgICBsZXQgbmU6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsZWFyKSB7XHJcbiAgICAgICAgICAgIG1vZGVsLmZpbGVuYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgbmUudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZS5maWxlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2gobmUuZmlsZXMuaXRlbShpKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobmUuZmlsZXMubGVuZ3RoID09IDEpXHJcbiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZSA9IG5lLmZpbGVzWzBdLm5hbWU7XHJcbiAgICAgICAgICAgIGlmIChuZS5maWxlcy5sZW5ndGggPiAxKVxyXG4gICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWUgPSBuZS5maWxlcy5sZW5ndGggKyBcIiBcIiArIHRoaXMubGMubG9jKFwiRmlsZXMgU2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIG1vZGVsLm5hdGl2ZWZpbGVzID0gZmlsZXM7XHJcbiAgICAgICAgICAgIG1vZGVsLmZpbGViNjQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcm1ldHRlIGRpIHNjYXJpY2FyZSBpbCBmaWxlIGNvbGxlZ2F0byBhbGwnZXZldG51YWxlIGZpbGUgaW5wdXQgcmFwcHJlc2VudGF0byBkYSBxdWVzdG8gY29tcG9uZW50ZVxyXG4gICAgICovXHJcbiAgICBkb3dubG9hZEF0dGFjaG1lbnQoKSB7XHJcbiAgICAgICAgbGV0IG1vZGVsID0gKDxBcHBGaWxlPnRoaXMuTW9kZWwpO1xyXG4gICAgICAgIHRoaXMudXRpRXh0cy5zYXZlRmlsZShtb2RlbC5maWxlYjY0LCBtb2RlbC5maWxlbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIG9uTm90TnVsbFZhbHVlU2V0KCk6IHZvaWQgeyB9XHJcblxyXG4gICAgLy8qKioqKioqKioqKioqKioqKioqKiBGdW56aW9uZSBkaSB0aHJvdHRsaW5nIHBlciBub24gc3BhbW1hcmUgcmljaGllc3RlIGluIGNhc28gZGkgYW5pbWF6aW9uaSBhdHRpdmF0ZVxyXG4gICAgLy9UT0RPOiBzcG9zdGFybGEgaW4gdW4gbWV0b2RvIGRpIHV0aWxpdMOgIChlc2ZhZW56YS9leHRlbnNpb25zKVxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZXhlY3V0aW9uVGltZXJzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIHRocm90dGxhKGlkOiBzdHJpbmcsIGZ1bmM6IEZ1bmN0aW9uLCB0aHJvdHRsZVRpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIC8vU2UgaG8gbGEgZnVuemlvbmUgY2hlIHZ1b2xlIGVzZWd1aXJlIHJpcHVsaXNjbyBxdWVsIHRpbWVvdXRcclxuICAgICAgICBpZiAodGhpcy5leGVjdXRpb25UaW1lcnNbaWRdKVxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5leGVjdXRpb25UaW1lcnNbaWRdKTtcclxuXHJcbiAgICAgICAgLy9SaWNyZW8gaWwgdGltZW91dCBwZXIgZXNlZ3VpcmUgcXVlbGxhIGZ1bnppb25lIGRvcG8gdGhyb3R0bGVUaW1lIG1pbGxpc2Vjb25kaVxyXG4gICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSA9IHNldFRpbWVvdXQoKCkgPT4geyBmdW5jKCk7IHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSA9IG51bGw7IH0sIHRocm90dGxlVGltZSk7XHJcbiAgICB9XHJcbiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKipcclxufSJdfQ==
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9mb3JtLWFkYXB0aXZlL2Zvcm0tYWRhcHRpdmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSixPQUFPLEVBQXdCLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRixzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRWpGLGVBQWU7QUFDZixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFekUsVUFBVTtBQUNWLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVS9DOztHQUVHO0FBUUgsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGVBQWU7SUF5RXREOzs7O09BSUc7SUFDSCxZQUFZLEdBQXNCLEVBQVUsT0FBdUIsRUFBVSxXQUFtQyxFQUFTLEVBQXVCLEVBQXNCLFNBQW9C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Q0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFM0MsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUcsQ0FBQzs7O1lBdlNKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLENBQUM7Z0JBQ2pGLGlwTUFBMkM7Z0JBRTNDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNsRDs7O1lBbENpQyxpQkFBaUI7WUFLMUMsY0FBYztZQUVkLGlCQUFpQjtZQUhqQixtQkFBbUI7WUFIa0IsU0FBUyx1QkFnSGdHLFFBQVEsWUFBSSxJQUFJO1lBQXlFLEtBQUssdUJBQXBELFFBQVEsWUFBSSxNQUFNLFNBQUMsYUFBYTtZQTNHeE4sb0JBQW9CO1lBQUUsZ0JBQWdCLHVCQTJHd08sUUFBUTt5Q0FBa0MsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhOzs7bUJBekU1VixLQUFLO2lDQUtMLEtBQUs7c0JBS0wsS0FBSztzQkFLTCxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs0QkFLeEMsS0FBSzt3QkFVTCxLQUFLO3dCQUtMLEtBQUs7NkJBS0wsS0FBSzt1QkFLTCxLQUFLOzRCQUtMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPcHRpb25hbCwgU2VsZiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5nQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLy8gRVMgLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBDb21wb25lbnRDb250ZXh0IH0gZnJvbSAnQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sJztcclxuaW1wb3J0IHsgTmd4TWF0RGF0ZUFkYXB0ZXIgfSBmcm9tIFwiQGFuZ3VsYXItbWF0ZXJpYWwtY29tcG9uZW50cy9kYXRldGltZS1waWNrZXJcIjtcclxuXHJcbi8vIEFwcGxpY2F6aW9uZVxyXG5pbXBvcnQgeyBCYXNlRm9ybUNvbnRyb2wgfSBmcm9tIFwiLi4vYmFzZS1mb3JtLWNvbnRyb2xcIjtcclxuaW1wb3J0IHsgRm9ybUFkYXB0aXZlQ29tcG9uZW50TG9jIH0gZnJvbSBcIi4vZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQubG9jXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVkgfSBmcm9tICcuLi8uLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBBcHBGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9BcHBGaWxlXCI7XHJcblxyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGluIGdyYWRvIGRpIGFzc3VtZXJlIGxhIGZvcm1hIGRpIHVuIHF1YWxzaWFzaSBhbHRybyBjb21wb25lbnRlIGZvcm0gaW4gYmFzZSBhbCB0aXBvIHNwZWNpZmljYXRvLiBVdGlsZSAgcGVyIGxhIGNyZWF6aW9uZSBkaSBmb3JtIGRpbmFtaWNpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcImZvcm0tYWRhcHRpdmVcIixcclxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTG9jYWxpemF0aW9uU2VydmljZSwgdXNlQ2xhc3M6IEZvcm1BZGFwdGl2ZUNvbXBvbmVudExvYyB9XSxcclxuICAgIHRlbXBsYXRlVXJsOiBcImZvcm0tYWRhcHRpdmUuY29tcG9uZW50Lmh0bWxcIixcclxuICAgIHN0eWxlVXJsczogW1wiLi4vZm9ybS1maWxlL2Zvcm0tZmlsZS5jb21wb25lbnQuY3NzXCJdLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1BZGFwdGl2ZUNvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtQ29udHJvbCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpcG9sb2dpYSBjaGUgZGVjaWRlIGNoZSBjb21wb25lbnRlIG1vc3RyYXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFR5cGU6ICdzdHJpbmcnIHwgJ2Zsb2F0JyB8ICdkYXRlJyB8ICdudW1iZXInIHwgJ2ludCcgfCAnYm9vbGVhbicgfCAnZW51bScgfCAnYXV0b2NvbXBsZXRlJyB8ICdkYXRldGltZScgfCAndGltZScgfCAnZmlsZScgfCAnY3VycmVuY3knO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVzc2FnZ2lvIHBlciBxdWFuZG8gc2kgYmluZGEgdW4gZm9ybS1hZGFwdGl2ZSBzZW56YSB0aXBvXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFR5cGVNaXNzaW5nTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF0dGVybiBkaSB2YWxpZGF6aW9uZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBQYXR0ZXJuOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaWZlcmltZW50byBhbGwnZWxlbWVudG8gaW5wdXQgZGkgdGlwbyBmaWxlIHF1YWxvcmEgaWwgKipUeXBlKiogZGkgcXVlc3RvIGNvbXBvbmVudGUgZm9zc2UgKipmaWxlKipcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcImZpbGVJbnB1dFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgaW5wdXRFbDogRWxlbWVudFJlZjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcm1ldHRlIGRpIHNjYXJpY2FyZSBsJ2V2ZW50dWFsZSBmaWxlIHByZXNlbnRlIHF1YWxvcmEgaWwgKipUeXBlKiogZGkgcXVlc3RvIGNvbXBvbmVudGUgZm9zc2UgKipmaWxlKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgQWxsb3dEb3dubG9hZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RlbGxvIHR5cGVzY3JpcHQgZGkgYmluZCBkZWkgZmlsZVxyXG4gICAgICovXHJcbiAgICBNb2RlbEZpbGU6IEFwcEZpbGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVdGlsaXp6YXRhIG5lbCBmb3JtLWFkYXB0ZXIgcGVyIHNwZWNpZmljYXJlIGxhIHByZWNpc2lvbmUgZGVnbGkgaW5wdXQgY3VycmVuY3ltYXAgKFR5cGU6IGN1cnJlbmN5KVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBQcmVjaXNpb246IG51bWJlciA9IDI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxpbmVhbWVudG8gZGVsbGEgY3VycmVuY3kgbWFza1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBBbGlnbm1lbnQ6ICdsZWZ0JyB8ICdyaWdodCcgPSAncmlnaHQnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuemlvbmUgZGkgcmljZXJjYSBjaGUgdmVycsOgIGNoaWFtYXRhIGRhbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNlYXJjaEZ1bmN0aW9uOiAoc2VhcmNoOiBzdHJpbmcsIGJ5aWQ6IGJvb2xlYW4pID0+IE9ic2VydmFibGU8eyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXT4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTnVtZXJvIG1pbmltbyBkaSBjYXJhdHRlcmkgY29uIGN1aSBjZXJjYXJlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIE1pbkNoYXJzOiBudW1iZXIgPSAzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGkgY29udHJvbGxpIGRldm9ubyBlc3NlcmUgZWZmZXR0dWF0aSB0ZW5lbmRvIGNvbnRvIGRlbCBDYXNlIG8gbWVuby4gVmFsZSBzb2xvIHF1YWxvcmEgbGEgKipTb3VyY2UqKiBmb3NzZSBmb3JuaXRhXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIENhc2VTZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBpbnRlcm5hIGNoZSBnZXN0aXNjZSBzZSBlZmZldHR1YXJlIGlsIHJpYWxsaW5lYW1lbnRvIGRlaSBkYXRpIG8gbWVub1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFsaWduVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaWdub3JhcmUgaWwgcHJvc3NpbW8gZXZlbnRvIHdyaXRlVmFsdWUgY2hlIG5vcm1hbG1lbnRlIGRvdnJlYmJlIHJpY2hpZWRlcmUgbGEgbnVvdmEgc291cmNlLiBTZXJ2ZSBwZXIgcXVhbmRvIGwndXRlbnRlIHNlbGV6aW9uYSB1biBlbGVtZW50bzpcclxuICAgICAqIFN1Yml0byBkb3BvIHBhcnRpcmViYmUgdW4gYWx0cm8gZXZlbnRvIG1vZGVsQ2hhbmdlIGNoZSByaWNhcmljaGVyZWJiZSBudW92YW1lbnRlIGxhIHNvdXJjZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlnbm9yZU5leHRXcml0ZVZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWNoZSBkZWxsYSBzb3JnZW50ZSBvcmlnaW5hbGUgUE9TVCBiaW5kaW5nLCBpbiBtb2RvIGRhIHBvdGVyIGZhcmUgZmlsdHJpIGluIGxvY2FsZSBxdWFsb3JhIGxhICoqU2VhcmNoRnVuY3Rpb24qKiBub24gZm9zc2UgZGVmaW5pdGEgZSBsYSAqKlNvdXJjZSoqIGZvc3NlIGFzc2VnbmF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRmlsdGVyZWRCb3VuZFNvdXJjZTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmUgXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB1dGlFeHRzOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTmd4TWF0RGF0ZUFkYXB0ZXI8YW55PiwgcHVibGljIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCBAT3B0aW9uYWwoKSBAU2VsZigpIG5nQ29udHJvbDogTmdDb250cm9sLCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBhYzogQWNjZXNzQ29udHJvbFNlcnZpY2UsIEBPcHRpb25hbCgpIEFwcENvbnRleHQ6IENvbXBvbmVudENvbnRleHQsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNPX0NVU1RPTUtFWSkgQUNPX0NVU1RPTUtFWSA6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGNkciwgbmdDb250cm9sLCBfdmFsaWRhdG9ycywgYWMsIEFwcENvbnRleHQsQUNPX0NVU1RPTUtFWSk7XHJcblxyXG4gICAgICAgIHRoaXMuTW9kZWxGaWxlID0gbmV3IEFwcEZpbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBjb25zdCBuZXdTb3VyY2UgPSBjaGFuZ2VzW1wiU291cmNlXCJdO1xyXG4gICAgICAgIGNvbnN0IG5ld1R5cGUgPSBjaGFuZ2VzW1wiVHlwZVwiXTtcclxuXHJcbiAgICAgICAgaWYgKG5ld1NvdXJjZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeUJpbmRTb3VyY2VEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICAvLyBQcmltYSBhc3NlZ25hemlvbmUgc2UgY2FtYmlhIGxhIHNvdXJjZSBzb3R0byAocXVpbmRpIHNlIHZpZW5lIGJpbmRhdGEgZGlyZXR0YW1lbnRlIGRhIEhUTUwpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlR5cGUgPT0gXCJhdXRvY29tcGxldGVcIiAmJiAodGhpcy5Nb2RlbD8ubGVuZ3RoIHx8IDApID49IHRoaXMuTWluQ2hhcnMgJiYgIXRoaXMuU2VhcmNoRnVuY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLkZpbHRlcmVkQm91bmRTb3VyY2UgPSB0aGlzLkJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLkZpbHRlcmVkQm91bmRTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG5ld1R5cGUgJiYgdGhpcy5Nb2RlbClcclxuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hbGlnblZhbHVlcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5UeXBlID0gXCJzdHJpbmdcIjtcclxuXHJcbiAgICAgICAgaWYgKCh0aGlzLlR5cGUgPT0gXCJmbG9hdFwiIHx8IHRoaXMuVHlwZSA9PSBcIm51bWJlclwiKSAmJiBvYmopXHJcbiAgICAgICAgICAgIG9iaiA9IG9iai50b1N0cmluZygpLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuXHJcbiAgICAgICAgLy8gUGVyIHNpY3VyZXp6YSByaWFsbGluZW8gaSB2YWxvcmlcclxuICAgICAgICBpZiAodGhpcy5UeXBlID09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgIG9iaiA9IG9iaiA/IChvYmogPT09IHRydWUgfHwgb2JqLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIDogZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuYWxpZ25WYWx1ZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcInRpbWVcIikge1xyXG4gICAgICAgICAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXMsIHNlY29uZHNdID0gKG9iaiB8fCBcIjA6MDowXCIpLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICAgICAgb2JqID0gZGF5anMoKS5ob3VyKGhvdXJzID8/IDApLm1pbnV0ZShtaW51dGVzID8/IDApLnNlY29uZChzZWNvbmRzID8/IDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcImZpbGVcIilcclxuICAgICAgICAgICAgb2JqID0gdGhpcy5Nb2RlbEZpbGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlR5cGUgPT0gXCJhdXRvY29tcGxldGVcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5TZWFyY2hGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZWFyY2hGdW5jdGlvbihvYmosIHRydWUpLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNvdXJjZSA9IHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlCaW5kU291cmNlRGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmZpbmFsaXplVmFsdWUob2JqKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplVmFsdWUob2JqKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLndyaXRlVmFsdWUob2JqKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WYWx1ZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdG8gdW4gdmFsb3JlIHZlcmlmaWNhIHNlIHB1w7IgcmVzdGl0dWlyZSBsZSBpbmZvcm1hemlvbmkgdHJvdmF0ZSBpbiAqKlNvdXJjZSoqIGNvbiBpZCB1Z3VhbGUgYSAqKnZhbHVlKiogbyBzZSBkZXZlIHJlc3RpdHVpcmUgaWwgdmFsb3JlIGluIHNlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWxvcmUgc2NyaXR0byBuZWxsJ2lucHV0IGRpIHRlc3RvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuU291cmNlLmZpbmQodCA9PiB0LmlkID09IHZhbHVlKTtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWwgPyB2YWwuaWQgOiB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5Nb2RlbCA9IHZhbCA/IHZhbC5kZXNjcmlwdGlvbiA6IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIGRpIGZpbHRybyBkZWxsYSBzb3JnZW50ZSBkYXRpIGluIGJhc2UgYWxsJ2lucHV0IHV0ZW50ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgSW5wdXQgdXRlbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaWx0ZXJTb3VyY2UoZXZlbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmlnbm9yZU5leHRXcml0ZVZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaWdub3JlTmV4dFdyaXRlVmFsdWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUXVhbmRvIGZpbHRybyBsYSBzb3VyY2UsIHNlIG5vbiBkZXZvIGlnbm9yYXJlIGwnZXZlbnRvIGRldm8gY29tdW5xdWUgYXNzaWN1cmFybWkgZGkgaW1wb3N0YXJlIGlsIHZhbG9yZSBzZWxlemlvbmF0byBhIG51bGxcclxuICAgICAgICBzdXBlci5jaGFuZ2VkKFwiXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWV2ZW50ICYmIHRoaXMuTWluQ2hhcnMgPT0gMCAmJiAhdGhpcy5TZWFyY2hGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLkZpbHRlcmVkQm91bmRTb3VyY2UgPSB0aGlzLkJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWV2ZW50IHx8IGV2ZW50Lmxlbmd0aCA8IHRoaXMuTWluQ2hhcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5GaWx0ZXJlZEJvdW5kU291cmNlID0gW107XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5TZWFyY2hGdW5jdGlvbiAmJiAoIXRoaXMuU291cmNlIHx8IHRoaXMuU291cmNlLmxlbmd0aCA9PSAwKSlcclxuICAgICAgICAgICAgdGhyb3cgXCJJbXBvc3NpYmlsZSBmaWx0cmFyZSBnbGkgZWxlbWVudGkgc2VuemEgdW5hIGZ1bnppb25lIGRpIHJpY2VyY2EgY2hlIHJlc3RpdHVpc2NhIHVuYSBsaXN0YSBkaSB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVwiO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5TZWFyY2hGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnRocm90dGxhKFwiZmlsdGVyc291cmNlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2VhcmNoRnVuY3Rpb24oZXZlbnQsIGZhbHNlKS5zdWJzY3JpYmUodCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Tb3VyY2UgPSB0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QmluZFNvdXJjZURpc3BsYXkoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBxdWVzdG8gY2FzbyDDqCBnacOgIGZpbHRyYXRhIGRhbGxhIFNlYXJjaEZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GaWx0ZXJlZEJvdW5kU291cmNlID0gdGhpcy5Cb3VuZFNvdXJjZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCA0MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50aHJvdHRsYShcImZpbHRlcnNvdXJjZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbiBxdWVzdG8gY2FzbyBkZXZvIGZpbHRyYXJlIGlvIGluIG1lbW9yaWFcclxuICAgICAgICAgICAgICAgIHRoaXMuRmlsdGVyZWRCb3VuZFNvdXJjZSA9IHRoaXMuQm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gKHRoaXMuQ2FzZVNlbnNpdGl2ZSAmJiB0LmRlc2NyaXB0aW9uLmluY2x1ZGVzKGV2ZW50KSkgfHwgKCF0aGlzLkNhc2VTZW5zaXRpdmUgJiYgdC5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGV2ZW50LnRvTG93ZXJDYXNlKCkpKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gcmljaGlhbWF0byBxdWFuZG8gdmllbmUgbW9kaWZpY2F0byBpbCBtb2RlbGxvIGRlbCBjYW1wbyBkaSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBjaGFuZ2VkKCkge1xyXG4gICAgICAgIHZhciB0b0VtaXQgPSB0aGlzLk1vZGVsID8gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLk1vZGVsKSkgOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAoKHRoaXMuVHlwZSA9PSBcImZsb2F0XCIgfHwgdGhpcy5UeXBlID09IFwibnVtYmVyXCIpICYmIHRvRW1pdClcclxuICAgICAgICAgICAgdG9FbWl0ID0gdG9FbWl0LnJlcGxhY2UoXCIuXCIsIFwiXCIpLnJlcGxhY2UoXCIsXCIsIFwiLlwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcImJvb2xlYW5cIilcclxuICAgICAgICAgICAgdG9FbWl0ID0gdG9FbWl0ID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgICBpZih0aGlzLlR5cGUgPT0gXCJ0aW1lXCIpe1xyXG4gICAgICAgICAgICB2YXIgdG9FbWl0ID0gdGhpcy5kYXRlQWRhcHRlci5jbG9uZSh0aGlzLk1vZGVsKTtcclxuICAgICAgICAgICAgdG9FbWl0ID0gdG9FbWl0LmZvcm1hdChcIkhIOm1tOnNzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcImF1dG9jb21wbGV0ZVwiKVxyXG4gICAgICAgICAgICB0aGlzLmlnbm9yZU5leHRXcml0ZVZhbHVlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgc3VwZXIuY2hhbmdlZCh0b0VtaXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBnZXN0aXJlIGxhIG1vZGlmaWNhIGRlbCBmaWxlIGF0dHVhbG1lbnRlIGJpbmRhdG8uIE92dmlhbWVudGUgZnVuemlvbmEgc29sbyBxdWFsb3JhIGlsICoqVHlwZSoqIGZvc3NlICoqZmlsZSoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xlYXIgSW5kaWNhIHNlIGJpc29nbmEgc3Z1b3RhcmUgbCdpbnB1dCBvIG1lbm8gXHJcbiAgICAgKi9cclxuICAgIGZpbGVDaGFuZ2UoY2xlYXI6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBmaWxlczogRmlsZVtdID0gW107XHJcbiAgICAgICAgbGV0IG1vZGVsID0gKDxBcHBGaWxlPnRoaXMuTW9kZWwpO1xyXG4gICAgICAgIGxldCBuZTogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgICBuZS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5lLmZpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChuZS5maWxlcy5pdGVtKGkpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChuZS5maWxlcy5sZW5ndGggPT0gMSlcclxuICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVuYW1lID0gbmUuZmlsZXNbMF0ubmFtZTtcclxuICAgICAgICAgICAgaWYgKG5lLmZpbGVzLmxlbmd0aCA+IDEpXHJcbiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZSA9IG5lLmZpbGVzLmxlbmd0aCArIFwiIFwiICsgdGhpcy5sYy5sb2MoXCJGaWxlcyBTZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgbW9kZWwubmF0aXZlZmlsZXMgPSBmaWxlcztcclxuICAgICAgICAgICAgbW9kZWwuZmlsZWI2NCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2NhcmljYXJlIGlsIGZpbGUgY29sbGVnYXRvIGFsbCdldmV0bnVhbGUgZmlsZSBpbnB1dCByYXBwcmVzZW50YXRvIGRhIHF1ZXN0byBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIGRvd25sb2FkQXR0YWNobWVudCgpIHtcclxuICAgICAgICBsZXQgbW9kZWwgPSAoPEFwcEZpbGU+dGhpcy5Nb2RlbCk7XHJcbiAgICAgICAgdGhpcy51dGlFeHRzLnNhdmVGaWxlKG1vZGVsLmZpbGViNjQsIG1vZGVsLmZpbGVuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgb25Ob3ROdWxsVmFsdWVTZXQoKTogdm9pZCB7IH1cclxuXHJcbiAgICAvLyoqKioqKioqKioqKioqKioqKioqIEZ1bnppb25lIGRpIHRocm90dGxpbmcgcGVyIG5vbiBzcGFtbWFyZSByaWNoaWVzdGUgaW4gY2FzbyBkaSBhbmltYXppb25pIGF0dGl2YXRlXHJcbiAgICAvL1RPRE86IHNwb3N0YXJsYSBpbiB1biBtZXRvZG8gZGkgdXRpbGl0w6AgKGVzZmFlbnphL2V4dGVuc2lvbnMpXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBleGVjdXRpb25UaW1lcnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgdGhyb3R0bGEoaWQ6IHN0cmluZywgZnVuYzogRnVuY3Rpb24sIHRocm90dGxlVGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9TZSBobyBsYSBmdW56aW9uZSBjaGUgdnVvbGUgZXNlZ3VpcmUgcmlwdWxpc2NvIHF1ZWwgdGltZW91dFxyXG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0pXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0pO1xyXG5cclxuICAgICAgICAvL1JpY3JlbyBpbCB0aW1lb3V0IHBlciBlc2VndWlyZSBxdWVsbGEgZnVuemlvbmUgZG9wbyB0aHJvdHRsZVRpbWUgbWlsbGlzZWNvbmRpXHJcbiAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7IGZ1bmMoKTsgdGhpcy5leGVjdXRpb25UaW1lcnNbaWRdID0gbnVsbDsgfSwgdGhyb3R0bGVUaW1lKTtcclxuICAgIH1cclxuICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG59Il19