appproject-components 0.0.1 → 0.0.2

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.
@@ -0,0 +1,531 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { Subject, of } from 'rxjs';
4
+ import { BaseInputComponent } from '../baseInputComponent';
5
+ import { debounceTime, switchMap } from 'rxjs/operators';
6
+ import { ModelTreeviewComponent } from '../model-treeview/model-treeview.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ import * as i2 from "@ionic/angular";
10
+ import * as i3 from "@angular/common";
11
+ export class InputPesquisaComponent extends BaseInputComponent {
12
+ constructor(httpClient, modalCtrl) {
13
+ super();
14
+ this.httpClient = httpClient;
15
+ this.modalCtrl = modalCtrl;
16
+ this.podePesquisar = true;
17
+ this.textoPesquisa = '';
18
+ this.selectElementVisivel = false;
19
+ this.listaPesquisa = [];
20
+ this.max = '30';
21
+ this.pesquisaSubject = new Subject();
22
+ this.filterFunction = null;
23
+ this.selectId = 'selectElement';
24
+ this.campoId = 'Id';
25
+ this.campoPaiId = 'PaiId';
26
+ this.campoDisplay = 'Descricao';
27
+ this.tipo = '';
28
+ //@ViewChild('selectElement', { read: ElementRef, static: true }) selectElement;
29
+ this.selectElement = null;
30
+ //parametros para chamada API
31
+ //endpoint para pesquisa por digitação
32
+ this.url = '';
33
+ this.urlItem = '';
34
+ //endpoint para montar a arvore, se estiver vazia será usado o campo 'url'
35
+ this.urlTree = '';
36
+ this.empresa = 0;
37
+ this.loadInit = false;
38
+ this.onChange = (data) => { };
39
+ this.onTouch = () => { };
40
+ this.disabled = false;
41
+ this.console = console;
42
+ this.modelChanged = new Subject();
43
+ this.modelChangeSubscription = this.modelChanged
44
+ .pipe(debounceTime(500))
45
+ .subscribe(data => {
46
+ this.carregaItemIdParaLista(data);
47
+ });
48
+ }
49
+ writeValue(value) {
50
+ //console.log('write value', value);
51
+ this.onChange(value);
52
+ this.data = value;
53
+ if (value == null || value == 0) {
54
+ this.writePesquisa('');
55
+ this.selectedItem = null;
56
+ }
57
+ else {
58
+ if (this.loadInit == true) {
59
+ this.loadInit = false;
60
+ this.modelChanged.next(value);
61
+ //this.carregaItemIdParaLista(value);
62
+ }
63
+ else {
64
+ //console.log(this.selectedItem);
65
+ if (!this.selectedItem || (this.selectedItem && this.selectedItem[this.campoId] != value)) {
66
+ console.log('Id diferente');
67
+ this.modelChanged.next(value);
68
+ //this.carregaItemIdParaLista(value);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ registerOnChange(fn) {
74
+ this.onChange = fn;
75
+ }
76
+ registerOnTouched(fn) {
77
+ this.onTouch = fn;
78
+ }
79
+ setDisabledState(isDisabled) {
80
+ this.disabled = this.disabled;
81
+ }
82
+ onBlur(event) {
83
+ console.log('blur', event);
84
+ console.log(event.detail.relatedTarget);
85
+ if (event.detail.relatedTarget == null || event.detail.relatedTarget.id.indexOf(this.selectId + 'IonItem') == -1) {
86
+ console.log("true", event.detail.relatedTarget.id);
87
+ //pesquisar item na lista
88
+ if (!this.existeNaListaTexto(this.textoPesquisa, true)) {
89
+ this.limparClick();
90
+ }
91
+ this.dropDownPesquisa(0);
92
+ if (this.form) {
93
+ this.form.get(this.formControlName)?.markAsTouched();
94
+ }
95
+ }
96
+ }
97
+ ngOnInit() {
98
+ this.pesquisaSubject.pipe(switchMap((url) => {
99
+ this.console.log('subject url:', url);
100
+ if (!this.isEmpty(url))
101
+ return this.httpClient.get(url);
102
+ else
103
+ return of([]);
104
+ }))
105
+ .subscribe({
106
+ next: (result) => {
107
+ //this.listaPesquisa = result;
108
+ this.console.log('subject subscribe result:', result);
109
+ this.listaPesquisa = [];
110
+ if (result && result.length > 0) {
111
+ if (this.filterFunction) {
112
+ result = result.filter(this.filterFunction);
113
+ }
114
+ result.forEach((ent, index) => {
115
+ this.listaPesquisa.push({ ...ent, Index: index, Selected: false });
116
+ });
117
+ }
118
+ this.podePesquisar = true;
119
+ if (this.listaPesquisa.length > 0) {
120
+ this.dropDownPesquisa(this.listaPesquisa.length);
121
+ }
122
+ },
123
+ error: (error) => {
124
+ this.podePesquisar = true;
125
+ console.log('erro pesquisa', error);
126
+ }
127
+ });
128
+ }
129
+ writePesquisa(value) {
130
+ //console.log('write pesquisa', value);
131
+ this.textoPesquisa = value;
132
+ }
133
+ showPesquisa(e) {
134
+ //console.log('show pesquisa', e.keyCode);
135
+ var self = this;
136
+ if ((e.keyCode >= 48 && e.keyCode <= 57) ||
137
+ (e.keyCode >= 65 && e.keyCode <= 90) ||
138
+ (e.keyCode >= 96 && e.keyCode <= 105) ||
139
+ (e.keyCode == 8)) {
140
+ if (!self.podePesquisar) {
141
+ return;
142
+ }
143
+ let filtro = self.textoPesquisa;
144
+ if (filtro != null && filtro != '' && filtro.length >= 2) {
145
+ self.pesquisarEntidade(filtro);
146
+ }
147
+ else {
148
+ if (e.keyCode == 8 && !filtro) {
149
+ this.limparClick();
150
+ }
151
+ }
152
+ }
153
+ else {
154
+ if (e.keyCode == 40 || e.keyCode == 38) {
155
+ self.dropDownPesquisa(self.listaPesquisa.length);
156
+ if (self.selectElementVisivel == true) {
157
+ //let select = self.selectElement; //document.getElementById(self.TemplateSelect1Id());
158
+ //ion-list
159
+ //selecionado
160
+ //console.log(self.listaPesquisa);
161
+ let inc = e.keyCode == 40 ? 1 : -1;
162
+ let selected = self.listaPesquisa.find(s => s['Selected'] === true);
163
+ let cur = 0;
164
+ if (selected != null) {
165
+ cur = selected['Index'];
166
+ //desmarcar o atual
167
+ selected['Selected'] = false;
168
+ cur = cur + inc;
169
+ }
170
+ else {
171
+ cur = 0;
172
+ }
173
+ if (cur < 0) {
174
+ cur = self.listaPesquisa.length - 1;
175
+ }
176
+ else if (cur >= self.listaPesquisa.length) {
177
+ cur = 0;
178
+ }
179
+ let novoSelected = self.listaPesquisa.find(n => n['Index'] === cur);
180
+ if (novoSelected != null) {
181
+ novoSelected['Selected'] = true;
182
+ self.selectedItem = novoSelected;
183
+ self.textoPesquisa = novoSelected[self.campoDisplay];
184
+ }
185
+ /*
186
+ let select = document.getElementById(this.selectId) as any;
187
+ console.log('select Element', select)
188
+ if (select != null) {
189
+ let inc = e.keyCode == 40 ? 1 : -1;
190
+ let cur = select.selectedIndex;
191
+ if (cur == NaN) cur = -1;
192
+ select.selectedIndex = cur + inc;
193
+ if (select.selectedIndex >= 0 && select.selectedIndex < self.listaPesquisa.length) {
194
+ self.selectedItem = self.listaPesquisa[select.selectedIndex];
195
+ if (self.selectedItem != null) {
196
+ self.textoPesquisa = self.selectedItem[self.campoDisplay];
197
+ }
198
+ }
199
+ }
200
+ */
201
+ }
202
+ }
203
+ else if (e.keyCode == 13) {
204
+ console.log('enter key', e);
205
+ //self.selecionarComboClick(e);
206
+ self.selecionarComboClick(null);
207
+ //return false;
208
+ }
209
+ else if (e.keyCode == 27) {
210
+ //ESC
211
+ self.dropDownPesquisa(0);
212
+ }
213
+ }
214
+ }
215
+ highlight(texto) {
216
+ let index = texto.toLowerCase().indexOf(this.textoPesquisa.toLowerCase());
217
+ //console.log(index);
218
+ if (index >= 0) {
219
+ return texto.substring(0, index) + '<strong>' + texto.substring(index, index + this.textoPesquisa.length) + '</strong>' + texto.substring(index + this.textoPesquisa.length); //texto.replace(this.textoPesquisa, `<strong>${this.textoPesquisa}</strong>`);
220
+ }
221
+ else {
222
+ return texto;
223
+ }
224
+ }
225
+ selecionarComboClick(item) {
226
+ // console.log(item);
227
+ var self = this;
228
+ // console.log('combo click', self);
229
+ /*
230
+ let select = document.getElementById(this.selectId) as any;
231
+ if (select.selectedIndex >= 0) {
232
+ self.selectedItem = self.listaPesquisa[select.selectedIndex];
233
+ }
234
+ console.log('selected', this.selectedItem);
235
+ //self.selectedItem = this.listaPesquisa.find(i => i[this.campoId] == e);
236
+ if (self.selectedItem != null) {
237
+ self.textoPesquisa = self.selectedItem[self.campoDisplay];
238
+ self.writeValue(self.selectedItem[self.campoId]);
239
+ if (e != null) {
240
+ self.selectElementVisivel = false;
241
+ if (self.action != null) {
242
+ self.action(self.selectedItem(), e);
243
+ }
244
+ }
245
+ }
246
+ else {
247
+ self.selectElementVisivel = false;
248
+ }
249
+ */
250
+ // pesquisar selecionado
251
+ // console.log(this.listaPesquisa);
252
+ let selected = this.listaPesquisa.find(s => s['Selected'] === true);
253
+ // if (!selected) {
254
+ // console.log(this.campoId, item);
255
+ // selected = this.listaPesquisa.filter( s => s[this.campoId] == item[this.campoId]);
256
+ // }
257
+ //se o item form passado como parametro (click no ion-item)
258
+ if (item != null) {
259
+ if (selected != null) {
260
+ selected['Selected'] = false;
261
+ }
262
+ item['Selected'] = true;
263
+ selected = item;
264
+ }
265
+ if (selected != null) {
266
+ self.selectedItem = selected;
267
+ self.textoPesquisa = selected[self.campoDisplay];
268
+ self.writeValue(selected[self.campoId]);
269
+ self.selectElementVisivel = false;
270
+ console.log('action', self.change);
271
+ if (self.change != null) {
272
+ self.change(self.selectedItem);
273
+ }
274
+ }
275
+ else {
276
+ self.selectElementVisivel = false;
277
+ }
278
+ // this.listaPesquisa.forEach( pesquisa => {
279
+ // console.log(pesquisa, self.data);
280
+ // } );
281
+ // console.log(this.textoPesquisa);
282
+ }
283
+ selecionarComboChange(e) {
284
+ var self = this;
285
+ console.log('combo change', e);
286
+ self.selectedItem = this.listaPesquisa.find(i => i[this.campoId] == e);
287
+ if (self.selectedItem != null) {
288
+ self.writeValue(e);
289
+ self.textoPesquisa = self.selectedItem[self.campoDisplay];
290
+ if (e != null) {
291
+ self.selectElementVisivel = false;
292
+ if (self.change != null) {
293
+ self.change(self.selectedItem, e);
294
+ }
295
+ }
296
+ }
297
+ else {
298
+ self.selectElementVisivel = false;
299
+ }
300
+ }
301
+ dropDownPesquisa(length) {
302
+ var self = this;
303
+ if (self.listaPesquisa != null && self.listaPesquisa.length > 0) {
304
+ if (length == -1) {
305
+ length = self.listaPesquisa.length;
306
+ }
307
+ self.selectElementVisivel = length == 0 ? false : true;
308
+ //console.log(this.selectElement);
309
+ //this.selectElement.open();
310
+ /*
311
+ //let element = this.selectElement;
312
+ let element = document.getElementById(this.selectId);
313
+ console.log('dropDown', element);
314
+ (element as any).size = length + 1;
315
+ if (length == 0) {
316
+ self.selectElementVisivel = false;
317
+ } else {
318
+ self.selectElementVisivel = true;
319
+ }
320
+ */
321
+ }
322
+ }
323
+ pesquisarEntidade(filtro) {
324
+ let url = this.url.replace('<<FILTRO>>', filtro).replace('<<EMPRESA>>', this.empresa.toString());
325
+ console.log('pesquisarEntidade url', url);
326
+ this.podePesquisar = false;
327
+ this.pesquisaSubject.next(url);
328
+ }
329
+ pesquisarEntidadeOld(filtro) {
330
+ let url = this.url.replace('<<FILTRO>>', filtro).replace('<<EMPRESA>>', this.empresa.toString());
331
+ console.log('pesquisarEntidade url', url);
332
+ this.podePesquisar = false;
333
+ this.httpClient.get(url)
334
+ .subscribe({ next: (result) => {
335
+ //this.listaPesquisa = result;
336
+ if (this.filterFunction) {
337
+ result = result.filter(this.filterFunction);
338
+ }
339
+ this.listaPesquisa = [];
340
+ result.forEach((ent, index) => {
341
+ this.listaPesquisa.push({ ...ent, Index: index, Selected: false });
342
+ });
343
+ this.podePesquisar = true;
344
+ if (this.listaPesquisa.length > 0) {
345
+ this.dropDownPesquisa(this.listaPesquisa.length);
346
+ }
347
+ }, error: error => {
348
+ console.log('erro pesquisa', error);
349
+ this.podePesquisar = true;
350
+ } });
351
+ }
352
+ existeNaLista(id, setRegistro = false) {
353
+ if (this.listaPesquisa && this.listaPesquisa.length > 0) {
354
+ let existe = this.listaPesquisa.find(l => l[this.campoId] === id);
355
+ if (existe) {
356
+ if (setRegistro) {
357
+ this.selectedItem = existe;
358
+ this.selecionarComboClick(this.selectedItem);
359
+ }
360
+ return true;
361
+ }
362
+ else {
363
+ return false;
364
+ }
365
+ }
366
+ else {
367
+ return false;
368
+ }
369
+ }
370
+ existeNaListaTexto(texto, setRegistro = false) {
371
+ console.log("existe texto:", texto, this.campoDisplay, this.listaPesquisa);
372
+ if (this.listaPesquisa && this.listaPesquisa.length > 0) {
373
+ let existe = this.listaPesquisa.find(l => l[this.campoDisplay].toUpperCase() === texto.toUpperCase());
374
+ if (existe) {
375
+ if (setRegistro) {
376
+ this.selectedItem = existe;
377
+ this.selecionarComboClick(this.selectedItem);
378
+ }
379
+ return true;
380
+ }
381
+ else {
382
+ return false;
383
+ }
384
+ }
385
+ else {
386
+ return false;
387
+ }
388
+ }
389
+ validarItemSelecionado(setarRegistro = false) {
390
+ console.log('validar selecionado');
391
+ //passar pela função de filtro
392
+ let valido = false;
393
+ if (this.selectedItem) {
394
+ if (this.filterFunction) {
395
+ let existe = [{ ...this.selectedItem }].filter(this.filterFunction);
396
+ if (existe != null && existe.length > 0) {
397
+ valido = true;
398
+ }
399
+ }
400
+ else {
401
+ valido = true;
402
+ }
403
+ if (valido && setarRegistro) {
404
+ this.selecionarComboClick(this.selectedItem);
405
+ }
406
+ return valido;
407
+ }
408
+ else {
409
+ return false;
410
+ }
411
+ }
412
+ carregaItemIdParaLista(id) {
413
+ let url = this.urlItem.replace('<<ID>>', id.toString());
414
+ console.log(this.urlItem);
415
+ console.log('pesquisar ID url', url);
416
+ this.podePesquisar = false;
417
+ this.httpClient.get(url)
418
+ .subscribe({ next: (result) => {
419
+ this.listaPesquisa = [];
420
+ this.listaPesquisa.push({ ...result, Index: 0, Selected: true });
421
+ this.podePesquisar = true;
422
+ if (this.listaPesquisa.length > 0) {
423
+ this.selectedItem = this.listaPesquisa[0];
424
+ this.selecionarComboClick(this.selectedItem);
425
+ }
426
+ }, error: error => {
427
+ console.log('erro pesquisa', error);
428
+ this.podePesquisar = true;
429
+ } });
430
+ }
431
+ limparClick() {
432
+ this.writeValue(null);
433
+ this.writePesquisa(null);
434
+ this.listaPesquisa = [];
435
+ this.dropDownPesquisa(0);
436
+ //this.podePesquisar = true;
437
+ this.pesquisaSubject.next('');
438
+ if (this.limpar) {
439
+ this.limpar();
440
+ }
441
+ }
442
+ verificarPesquisa() {
443
+ //TODO: verificar se o texto corresponde com um item da lista
444
+ this.selecionarComboClick(null);
445
+ }
446
+ async pesquisarClick() {
447
+ /*
448
+ if (this.pesquisaAction != null) {
449
+ this.pesquisaAction();
450
+ }
451
+ */
452
+ //pesquisaCategoria
453
+ console.log(this.filterFunction, this.url, this.urlTree);
454
+ const modal = await this.modalCtrl.create({
455
+ component: ModelTreeviewComponent,
456
+ componentProps: {
457
+ //campoId: this.campoId,
458
+ //campoPai: this.campoPaiId,
459
+ //campoLabel: this.campoDisplay,
460
+ filterFunction: this.filterFunction,
461
+ empresaSelecionadaId: this.empresa,
462
+ tipo: this.tipo,
463
+ //especifico
464
+ //planoContas: this.planoContas,
465
+ url: this.isEmpty(this.urlTree) ? this.url : this.urlTree
466
+ },
467
+ cssClass: 'my-custom-modal-pesquisa'
468
+ });
469
+ modal.onDidDismiss().then(data => {
470
+ let result = data['data'];
471
+ console.log(result);
472
+ if (result != null && result.Id > 0) {
473
+ this.carregaItemIdParaLista(result.Id);
474
+ }
475
+ });
476
+ modal.present();
477
+ }
478
+ isEmpty(valor) {
479
+ return valor == null || valor == undefined || valor == '';
480
+ }
481
+ }
482
+ InputPesquisaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: InputPesquisaComponent, deps: [{ token: i1.HttpClient }, { token: i2.ModalController }], target: i0.ɵɵFactoryTarget.Component });
483
+ InputPesquisaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: InputPesquisaComponent, selector: "kb-input-pesquisa", inputs: { textoPesquisa: "textoPesquisa", max: "max", filterFunction: "filterFunction", selectId: "selectId", campoId: "campoId", campoPaiId: "campoPaiId", campoDisplay: "campoDisplay", tipo: "tipo", change: "change", pesquisaAction: "pesquisaAction", limpar: "limpar", url: "url", urlItem: "urlItem", urlTree: "urlTree", empresa: "empresa", loadInit: "loadInit" }, providers: [{
484
+ provide: NG_VALUE_ACCESSOR,
485
+ useExisting: InputPesquisaComponent,
486
+ multi: true
487
+ }], viewQueries: [{ propertyName: "selectElement", first: true, predicate: ["selectElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div style=\"padding-inline-end: 0px;\">\n <ion-item lines=\"none\" style=\"--background: inherited; --background-focused: transparent; margin-top: 2px;\" [class]=\"itemClass\">\n <ion-label position=\"{{ labelPosition }}\" color=\"{{ labelColor }}\">{{ label }}</ion-label>\n <!-- formControlName=\"{{ campo }}\" -->\n <ion-spinner *ngIf=\"!podePesquisar\"\n style=\"--min-height: 0px !important; margin-inline-end: 5px !important; margin-top: 16px;\" \n slot=\"start\" name=\"lines\"></ion-spinner>\n <!-- (ionBlur)=\"verificarPesquisa()\" -->\n <!-- conflito com click da lista -->\n <ion-input #inputPesquisa\n type=\"{{type}}\" \n [placeholder]=\"placeholder\" \n maxlength=\"{{ max }}\" \n (ionBlur)=\"onBlur($event)\"\n [value]=\"textoPesquisa\" (input)=\"writePesquisa(inputPesquisa.value)\" \n (keyup)=\"showPesquisa($event)\"\n autocomplete=\"off\" style=\"--background:{{ inputBackgroungColor }};\"\n (click)=\"dropDownPesquisa(-1)\"\n [disabled]=\"readonly\" debounce=\"500\"></ion-input>\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"limparClick()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n \n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"pesquisarClick()\">\n <ion-icon color=\"primary\" name=\"search\"></ion-icon>\n </ion-button>\n \n </ion-item>\n \n <ion-list tabindex=\"-1\" [hidden]=\"!selectElementVisivel || !listaPesquisa || listaPesquisa.length == 0\" class=\"pesquisa-list\" style=\"max-height: 250px; overflow-y: auto;\">\n \n <ion-item tabindex=\"-1\" button *ngFor=\"let item of listaPesquisa\" \n (click)=\"selecionarComboClick(item)\" [id]=\"selectId + 'IonItem' + item['Index']\"\n class=\"pesquisa-item\">\n <!-- {{ item | json}} -->\n <span [class]=\"{'selected-item': item['Selected'] === true}\" [innerHTML]=\"highlight(item[campoDisplay])\"></span>\n </ion-item>\n \n </ion-list>\n \n <!--\n <ion-select interface=\"popover\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (ionChange)=\"selecionarComboChange($event.target.value)\">\n <ion-select-option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </ion-select-option>\n </ion-select>\n -->\n \n <!--\n <select [id]=\"selectId\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (change)=\"selecionarComboChange($event.target.value)\" class=\"pesquisa-select\">\n <option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </option>\n \n </select>\n -->\n \n <div class=\"validation-errors\" *ngIf=\"form\">\n \n <ng-container *ngFor=\"let validation of validation_messages\">\n <div class=\"error-message\"\n *ngIf=\"form.get(formControlName)?.hasError(validation.type) && (form.get(formControlName)?.dirty || form.get(formControlName)?.touched)\">\n &#8226; {{ validation.message }}\n </div>\n </ng-container>\n \n </div>\n </div>", styles: ["ion-label{margin-bottom:4px!important;opacity:1!important}ion-input{padding:4px;border:1px solid darkgray;border-radius:4px;width:100%;margin-top:2px;max-height:29px}input:focus{border:1px solid lightblue!important}input:focus ion-label{--color: blue !important}.error-message{font-size:small;color:red;margin-left:15px}.padding{padding:auto}.no-padding{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px;height:55px!important}.no-padding-no-height{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px}.padding-top{--padding-top: 0px}.pesquisa-select{display:block;position:absolute;top:58px;left:20px;width:100%;z-index:800;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.pesquisa-select option{overflow-y:hidden}.pesquisa-select option:hover,.pesquisa-select option:checked{background-color:#add8e6}.pesquisa-list{display:block;position:absolute;top:58px;left:20px;width:calc(100% - 50px);z-index:800;border:1px lightgrey solid;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:0}.pesquisa-item{--inner-padding-top: 0px;--inner-padding-bottom: 0px;--padding-top: 0px;--padding-bottom: 0px;--min-height: 30px !important;font-size:12px}.pesquisa-item button{padding:0}.selected-item{background-color:#add8e6}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }] });
488
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: InputPesquisaComponent, decorators: [{
489
+ type: Component,
490
+ args: [{ selector: 'kb-input-pesquisa', providers: [{
491
+ provide: NG_VALUE_ACCESSOR,
492
+ useExisting: InputPesquisaComponent,
493
+ multi: true
494
+ }], template: "<div style=\"padding-inline-end: 0px;\">\n <ion-item lines=\"none\" style=\"--background: inherited; --background-focused: transparent; margin-top: 2px;\" [class]=\"itemClass\">\n <ion-label position=\"{{ labelPosition }}\" color=\"{{ labelColor }}\">{{ label }}</ion-label>\n <!-- formControlName=\"{{ campo }}\" -->\n <ion-spinner *ngIf=\"!podePesquisar\"\n style=\"--min-height: 0px !important; margin-inline-end: 5px !important; margin-top: 16px;\" \n slot=\"start\" name=\"lines\"></ion-spinner>\n <!-- (ionBlur)=\"verificarPesquisa()\" -->\n <!-- conflito com click da lista -->\n <ion-input #inputPesquisa\n type=\"{{type}}\" \n [placeholder]=\"placeholder\" \n maxlength=\"{{ max }}\" \n (ionBlur)=\"onBlur($event)\"\n [value]=\"textoPesquisa\" (input)=\"writePesquisa(inputPesquisa.value)\" \n (keyup)=\"showPesquisa($event)\"\n autocomplete=\"off\" style=\"--background:{{ inputBackgroungColor }};\"\n (click)=\"dropDownPesquisa(-1)\"\n [disabled]=\"readonly\" debounce=\"500\"></ion-input>\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"limparClick()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n \n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"pesquisarClick()\">\n <ion-icon color=\"primary\" name=\"search\"></ion-icon>\n </ion-button>\n \n </ion-item>\n \n <ion-list tabindex=\"-1\" [hidden]=\"!selectElementVisivel || !listaPesquisa || listaPesquisa.length == 0\" class=\"pesquisa-list\" style=\"max-height: 250px; overflow-y: auto;\">\n \n <ion-item tabindex=\"-1\" button *ngFor=\"let item of listaPesquisa\" \n (click)=\"selecionarComboClick(item)\" [id]=\"selectId + 'IonItem' + item['Index']\"\n class=\"pesquisa-item\">\n <!-- {{ item | json}} -->\n <span [class]=\"{'selected-item': item['Selected'] === true}\" [innerHTML]=\"highlight(item[campoDisplay])\"></span>\n </ion-item>\n \n </ion-list>\n \n <!--\n <ion-select interface=\"popover\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (ionChange)=\"selecionarComboChange($event.target.value)\">\n <ion-select-option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </ion-select-option>\n </ion-select>\n -->\n \n <!--\n <select [id]=\"selectId\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (change)=\"selecionarComboChange($event.target.value)\" class=\"pesquisa-select\">\n <option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </option>\n \n </select>\n -->\n \n <div class=\"validation-errors\" *ngIf=\"form\">\n \n <ng-container *ngFor=\"let validation of validation_messages\">\n <div class=\"error-message\"\n *ngIf=\"form.get(formControlName)?.hasError(validation.type) && (form.get(formControlName)?.dirty || form.get(formControlName)?.touched)\">\n &#8226; {{ validation.message }}\n </div>\n </ng-container>\n \n </div>\n </div>", styles: ["ion-label{margin-bottom:4px!important;opacity:1!important}ion-input{padding:4px;border:1px solid darkgray;border-radius:4px;width:100%;margin-top:2px;max-height:29px}input:focus{border:1px solid lightblue!important}input:focus ion-label{--color: blue !important}.error-message{font-size:small;color:red;margin-left:15px}.padding{padding:auto}.no-padding{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px;height:55px!important}.no-padding-no-height{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px}.padding-top{--padding-top: 0px}.pesquisa-select{display:block;position:absolute;top:58px;left:20px;width:100%;z-index:800;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.pesquisa-select option{overflow-y:hidden}.pesquisa-select option:hover,.pesquisa-select option:checked{background-color:#add8e6}.pesquisa-list{display:block;position:absolute;top:58px;left:20px;width:calc(100% - 50px);z-index:800;border:1px lightgrey solid;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:0}.pesquisa-item{--inner-padding-top: 0px;--inner-padding-bottom: 0px;--padding-top: 0px;--padding-bottom: 0px;--min-height: 30px !important;font-size:12px}.pesquisa-item button{padding:0}.selected-item{background-color:#add8e6}\n"] }]
495
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ModalController }]; }, propDecorators: { textoPesquisa: [{
496
+ type: Input
497
+ }], max: [{
498
+ type: Input
499
+ }], filterFunction: [{
500
+ type: Input
501
+ }], selectId: [{
502
+ type: Input
503
+ }], campoId: [{
504
+ type: Input
505
+ }], campoPaiId: [{
506
+ type: Input
507
+ }], campoDisplay: [{
508
+ type: Input
509
+ }], tipo: [{
510
+ type: Input
511
+ }], selectElement: [{
512
+ type: ViewChild,
513
+ args: ['selectElement', { static: false }]
514
+ }], change: [{
515
+ type: Input
516
+ }], pesquisaAction: [{
517
+ type: Input
518
+ }], limpar: [{
519
+ type: Input
520
+ }], url: [{
521
+ type: Input
522
+ }], urlItem: [{
523
+ type: Input
524
+ }], urlTree: [{
525
+ type: Input
526
+ }], empresa: [{
527
+ type: Input
528
+ }], loadInit: [{
529
+ type: Input
530
+ }] } });
531
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvaW5wdXQtcGVzcXVpc2EvaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvaW5wdXQtcGVzcXVpc2EvaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7O0FBWXBGLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxrQkFBa0I7SUE0RTVELFlBQW9CLFVBQXNCLEVBQ2hDLFNBQTBCO1FBQ2xDLEtBQUssRUFBRSxDQUFDO1FBRlUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNoQyxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQTNFcEMsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDckIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDcEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBRVIsUUFBRyxHQUFXLElBQUksQ0FBQztRQUM3QixvQkFBZSxHQUFvQixJ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V0FBVyx3QkFBd0I7NEJBQ25DLEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUM7K0hBS08sYUFBYTtzQkFBckIsS0FBSztnQkFJWSxHQUFHO3NCQUFwQixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFFeUMsYUFBYTtzQkFBM0QsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVwQyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBQcmVkaWNhdGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uU2VsZWN0LCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCYXNlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlSW5wdXRDb21wb25lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IE1vZGVsVHJlZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9tb2RlbC10cmVldmlldy9tb2RlbC10cmVldmlldy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdrYi1pbnB1dC1wZXNxdWlzYScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1wZXNxdWlzYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LXBlc3F1aXNhLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3tcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogSW5wdXRQZXNxdWlzYUNvbXBvbmVudCxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBJbnB1dFBlc3F1aXNhQ29tcG9uZW50IGV4dGVuZHMgQmFzZUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgcG9kZVBlc3F1aXNhcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHRleHRvUGVzcXVpc2E6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RFbGVtZW50VmlzaXZlbDogYm9vbGVhbiA9IGZhbHNlO1xuICBsaXN0YVBlc3F1aXNhOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZEl0ZW06IGFueTtcbiAgQElucHV0KCkgb3ZlcnJpZGUgbWF4OiBzdHJpbmcgPSAnMzAnO1xuICBwcml2YXRlIHBlc3F1aXNhU3ViamVjdDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3QoKTtcblxuICBASW5wdXQoKSBmaWx0ZXJGdW5jdGlvbjogUHJlZGljYXRlPGFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgc2VsZWN0SWQ6IHN0cmluZyA9ICdzZWxlY3RFbGVtZW50JztcbiAgQElucHV0KCkgY2FtcG9JZDogc3RyaW5nID0gJ0lkJztcbiAgQElucHV0KCkgY2FtcG9QYWlJZDogc3RyaW5nID0gJ1BhaUlkJztcbiAgQElucHV0KCkgY2FtcG9EaXNwbGF5OiBzdHJpbmcgPSAnRGVzY3JpY2FvJztcbiAgQElucHV0KCkgdGlwbzogc3RyaW5nID0gJyc7XG4gIC8vQFZpZXdDaGlsZCgnc2VsZWN0RWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHNlbGVjdEVsZW1lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdEVsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0RWxlbWVudDogSW9uU2VsZWN0IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgY2hhbmdlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHBlc3F1aXNhQWN0aW9uPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGxpbXBhcj86IEZ1bmN0aW9uO1xuICAvL3BhcmFtZXRyb3MgcGFyYSBjaGFtYWRhIEFQSVxuICAvL2VuZHBvaW50IHBhcmEgcGVzcXVpc2EgcG9yIGRpZ2l0YcOnw6NvXG4gIEBJbnB1dCgpIHVybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHVybEl0ZW06IHN0cmluZyA9ICcnO1xuICAvL2VuZHBvaW50IHBhcmEgbW9udGFyIGEgYXJ2b3JlLCBzZSBlc3RpdmVyIHZhemlhIHNlcsOhIHVzYWRvIG8gY2FtcG8gJ3VybCdcbiAgQElucHV0KCkgdXJsVHJlZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVtcHJlc2E6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGxvYWRJbml0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy9wbGFub0NvbnRhczogbnVtYmVyO1xuXG4gIC8vY29udHJvbCB2YWx1ZSBhY2Vzc29yXG4gIHB1YmxpYyBkYXRhOiBudW1iZXIgfCBhbnk7XG4gIHByaXZhdGUgb25DaGFuZ2U6IEZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcikgPT4geyB9O1xuICBwcml2YXRlIG9uVG91Y2g6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xuICBwcml2YXRlIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjb25zb2xlID0gY29uc29sZTtcblxuICBtb2RlbENoYW5nZWQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgbW9kZWxDaGFuZ2VTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgYW55KTogdm9pZCB7XG4gICAgLy9jb25zb2xlLmxvZygnd3JpdGUgdmFsdWUnLCB2YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gMCkge1xuICAgICAgdGhpcy53cml0ZVBlc3F1aXNhKCcnKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubG9hZEluaXQgPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmxvYWRJbml0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9kZWxDaGFuZ2VkLm5leHQodmFsdWUpO1xuICAgICAgICAvL3RoaXMuY2FycmVnYUl0ZW1JZFBhcmFMaXN0YSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkSXRlbSB8fCAodGhpcy5zZWxlY3RlZEl0ZW0gJiYgdGhpcy5zZWxlY3RlZEl0ZW1bdGhpcy5jYW1wb0lkXSAhPSB2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnSWQgZGlmZXJlbnRlJyk7XG4gICAgICAgICAgdGhpcy5tb2RlbENoYW5nZWQubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgLy90aGlzLmNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5tb2RlbENoYW5nZWRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEoZGF0YSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uQmx1cihldmVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2JsdXInLCBldmVudCk7XG4gICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsLnJlbGF0ZWRUYXJnZXQpO1xuICAgIGlmIChldmVudC5kZXRhaWwucmVsYXRlZFRhcmdldCA9PSBudWxsIHx8IGV2ZW50LmRldGFpbC5yZWxhdGVkVGFyZ2V0LmlkLmluZGV4T2YodGhpcy5zZWxlY3RJZCArICdJb25JdGVtJykgPT0gLTEpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwidHJ1ZVwiLCBldmVudC5kZXRhaWwucmVsYXRlZFRhcmdldC5pZCk7XG4gICAgICAvL3Blc3F1aXNhciBpdGVtIG5hIGxpc3RhXG4gICAgICBpZiAoIXRoaXMuZXhpc3RlTmFMaXN0YVRleHRvKHRoaXMudGV4dG9QZXNxdWlzYSwgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy5saW1wYXJDbGljaygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRyb3BEb3duUGVzcXVpc2EoMCk7XG4gICAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wZXNxdWlzYVN1YmplY3QucGlwZShzd2l0Y2hNYXAoKHVybCkgPT4ge1xuICAgICAgdGhpcy5jb25zb2xlLmxvZygnc3ViamVjdCB1cmw6JywgdXJsKTtcbiAgICAgIGlmICghdGhpcy5pc0VtcHR5KHVybCkpXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PGFueT4odXJsKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICB9KSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAvL3RoaXMubGlzdGFQZXNxdWlzYSA9IHJlc3VsdDtcbiAgICAgICAgICB0aGlzLmNvbnNvbGUubG9nKCdzdWJqZWN0IHN1YnNjcmliZSByZXN1bHQ6JywgcmVzdWx0KTtcbiAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EgPSBbXTtcblxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIodGhpcy5maWx0ZXJGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChlbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EucHVzaCh7IC4uLmVudCwgSW5kZXg6IGluZGV4LCBTZWxlY3RlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wRG93blBlc3F1aXNhKHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvIHBlc3F1aXNhJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHdyaXRlUGVzcXVpc2EodmFsdWU6IHN0cmluZyB8IGFueSk6IHZvaWQge1xuICAgIC8vY29uc29sZS5sb2coJ3dyaXRlIHBlc3F1aXNhJywgdmFsdWUpO1xuICAgIHRoaXMudGV4dG9QZXNxdWlzYSA9IHZhbHVlO1xuICB9XG5cbiAgc2hvd1Blc3F1aXNhKGU6IGFueSk6IHZvaWQge1xuICAgIC8vY29uc29sZS5sb2coJ3Nob3cgcGVzcXVpc2EnLCBlLmtleUNvZGUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoKGUua2V5Q29kZSA+PSA0OCAmJiBlLmtleUNvZGUgPD0gNTcpIHx8XG4gICAgICAoZS5rZXlDb2RlID49IDY1ICYmIGUua2V5Q29kZSA8PSA5MCkgfHxcbiAgICAgIChlLmtleUNvZGUgPj0gOTYgJiYgZS5rZXlDb2RlIDw9IDEwNSkgfHxcbiAgICAgIChlLmtleUNvZGUgPT0gOCkpIHtcbiAgICAgIGlmICghc2VsZi5wb2RlUGVzcXVpc2FyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBmaWx0cm8gPSBzZWxmLnRleHRvUGVzcXVpc2E7XG4gICAgICBpZiAoZmlsdHJvICE9IG51bGwgJiYgZmlsdHJvICE9ICcnICYmIGZpbHRyby5sZW5ndGggPj0gMikge1xuICAgICAgICBzZWxmLnBlc3F1aXNhckVudGlkYWRlKGZpbHRybyk7XG5cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoZS5rZXlDb2RlID09IDggJiYgIWZpbHRybykge1xuICAgICAgICAgIHRoaXMubGltcGFyQ2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGVsc2Uge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PSA0MCB8fCBlLmtleUNvZGUgPT0gMzgpIHtcbiAgICAgICAgc2VsZi5kcm9wRG93blBlc3F1aXNhKHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGgpO1xuICAgICAgICBpZiAoc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9PSB0cnVlKSB7XG4gICAgICAgICAgLy9sZXQgc2VsZWN0ID0gc2VsZi5zZWxlY3RFbGVtZW50OyAvL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuVGVtcGxhdGVTZWxlY3QxSWQoKSk7XG5cbiAgICAgICAgICAvL2lvbi1saXN0XG4gICAgICAgICAgLy9zZWxlY2lvbmFkb1xuICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZi5saXN0YVBlc3F1aXNhKTtcbiAgICAgICAgICBsZXQgaW5jID0gZS5rZXlDb2RlID09IDQwID8gMSA6IC0xO1xuICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNlbGYubGlzdGFQZXNxdWlzYS5maW5kKHMgPT4gc1snU2VsZWN0ZWQnXSA9PT0gdHJ1ZSk7XG4gICAgICAgICAgbGV0IGN1ciA9IDA7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGN1ciA9IHNlbGVjdGVkWydJbmRleCddO1xuICAgICAgICAgICAgLy9kZXNtYXJjYXIgbyBhdHVhbFxuICAgICAgICAgICAgc2VsZWN0ZWRbJ1NlbGVjdGVkJ10gPSBmYWxzZTtcbiAgICAgICAgICAgIGN1ciA9IGN1ciArIGluYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VyID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY3VyIDwgMCkge1xuICAgICAgICAgICAgY3VyID0gc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXIgPj0gc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCkge1xuICAgICAgICAgICAgY3VyID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgbm92b1NlbGVjdGVkID0gc2VsZi5saXN0YVBlc3F1aXNhLmZpbmQobiA9PiBuWydJbmRleCddID09PSBjdXIpO1xuICAgICAgICAgIGlmIChub3ZvU2VsZWN0ZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbm92b1NlbGVjdGVkWydTZWxlY3RlZCddID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRJdGVtID0gbm92b1NlbGVjdGVkO1xuICAgICAgICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gbm92b1NlbGVjdGVkW3NlbGYuY2FtcG9EaXNwbGF5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLypcbiAgICAgICAgICBsZXQgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWxlY3RJZCkgYXMgYW55O1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3QgRWxlbWVudCcsIHNlbGVjdClcbiAgICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBpbmMgPSBlLmtleUNvZGUgPT0gNDAgPyAxIDogLTE7XG4gICAgICAgICAgICBsZXQgY3VyID0gc2VsZWN0LnNlbGVjdGVkSW5kZXg7XG4gICAgICAgICAgICBpZiAoY3VyID09IE5hTikgY3VyID0gLTE7XG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGN1ciArIGluYztcbiAgICAgICAgICAgIGlmIChzZWxlY3Quc2VsZWN0ZWRJbmRleCA+PSAwICYmIHNlbGVjdC5zZWxlY3RlZEluZGV4IDwgc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCkge1xuICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkSXRlbSA9IHNlbGYubGlzdGFQZXNxdWlzYVtzZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkSXRlbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gc2VsZi5zZWxlY3RlZEl0ZW1bc2VsZi5jYW1wb0Rpc3BsYXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgICovXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZW50ZXIga2V5JywgZSlcbiAgICAgICAgICAvL3NlbGYuc2VsZWNpb25hckNvbWJvQ2xpY2soZSk7XG4gICAgICAgICAgc2VsZi5zZWxlY2lvbmFyQ29tYm9DbGljayhudWxsKTtcbiAgICAgICAgICAvL3JldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gMjcpIHtcbiAgICAgICAgICAvL0VTQ1xuICAgICAgICAgIHNlbGYuZHJvcERvd25QZXNxdWlzYSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgaGlnaGxpZ2h0KHRleHRvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBpbmRleCA9IHRleHRvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLnRleHRvUGVzcXVpc2EudG9Mb3dlckNhc2UoKSk7XG4gICAgLy9jb25zb2xlLmxvZyhpbmRleCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB0ZXh0by5zdWJzdHJpbmcoMCwgaW5kZXgpICsgJzxzdHJvbmc+JyArIHRleHRvLnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyB0aGlzLnRleHRvUGVzcXVpc2EubGVuZ3RoKSArICc8L3N0cm9uZz4nICsgdGV4dG8uc3Vic3RyaW5nKGluZGV4ICsgdGhpcy50ZXh0b1Blc3F1aXNhLmxlbmd0aCk7ICAvL3RleHRvLnJlcGxhY2UodGhpcy50ZXh0b1Blc3F1aXNhLCBgPHN0cm9uZz4ke3RoaXMudGV4dG9QZXNxdWlzYX08L3N0cm9uZz5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRleHRvO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjaW9uYXJDb21ib0NsaWNrKGl0ZW06IGFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBjb25zb2xlLmxvZygnY29tYm8gY2xpY2snLCBzZWxmKTtcblxuICAgIC8qXG4gICAgbGV0IHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VsZWN0SWQpIGFzIGFueTtcbiAgICBpZiAoc2VsZWN0LnNlbGVjdGVkSW5kZXggPj0gMCkge1xuICAgICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSBzZWxmLmxpc3RhUGVzcXVpc2Fbc2VsZWN0LnNlbGVjdGVkSW5kZXhdO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQnLCB0aGlzLnNlbGVjdGVkSXRlbSk7XG4gICAgLy9zZWxmLnNlbGVjdGVkSXRlbSA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKGkgPT4gaVt0aGlzLmNhbXBvSWRdID09IGUpO1xuICAgIGlmIChzZWxmLnNlbGVjdGVkSXRlbSAhPSBudWxsKSB7XG4gICAgICBzZWxmLnRleHRvUGVzcXVpc2EgPSBzZWxmLnNlbGVjdGVkSXRlbVtzZWxmLmNhbXBvRGlzcGxheV07XG4gICAgICBzZWxmLndyaXRlVmFsdWUoc2VsZi5zZWxlY3RlZEl0ZW1bc2VsZi5jYW1wb0lkXSk7XG4gICAgICBpZiAoZSAhPSBudWxsKSB7XG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKHNlbGYuYWN0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICBzZWxmLmFjdGlvbihzZWxmLnNlbGVjdGVkSXRlbSgpLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICB9XG4gICAgKi9cbiAgICAvLyBwZXNxdWlzYXIgc2VsZWNpb25hZG9cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmxpc3RhUGVzcXVpc2EpO1xuICAgIGxldCBzZWxlY3RlZCA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKHMgPT4gc1snU2VsZWN0ZWQnXSA9PT0gdHJ1ZSk7XG5cbiAgICAvLyBpZiAoIXNlbGVjdGVkKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyh0aGlzLmNhbXBvSWQsIGl0ZW0pO1xuICAgIC8vICAgc2VsZWN0ZWQgPSB0aGlzLmxpc3RhUGVzcXVpc2EuZmlsdGVyKCBzID0+IHNbdGhpcy5jYW1wb0lkXSA9PSBpdGVtW3RoaXMuY2FtcG9JZF0pO1xuICAgIC8vIH1cblxuICAgIC8vc2UgbyBpdGVtIGZvcm0gcGFzc2FkbyBjb21vIHBhcmFtZXRybyAoY2xpY2sgbm8gaW9uLWl0ZW0pXG4gICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHtcbiAgICAgICAgc2VsZWN0ZWRbJ1NlbGVjdGVkJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1bJ1NlbGVjdGVkJ10gPSB0cnVlO1xuICAgICAgc2VsZWN0ZWQgPSBpdGVtO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkge1xuICAgICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZDtcbiAgICAgIHNlbGYudGV4dG9QZXNxdWlzYSA9IHNlbGVjdGVkW3NlbGYuY2FtcG9EaXNwbGF5XTtcbiAgICAgIHNlbGYud3JpdGVWYWx1ZShzZWxlY3RlZFtzZWxmLmNhbXBvSWRdKTtcbiAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUubG9nKCdhY3Rpb24nLCBzZWxmLmNoYW5nZSk7XG4gICAgICBpZiAoc2VsZi5jaGFuZ2UgIT0gbnVsbCkge1xuICAgICAgICBzZWxmLmNoYW5nZShzZWxmLnNlbGVjdGVkSXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gdGhpcy5saXN0YVBlc3F1aXNhLmZvckVhY2goIHBlc3F1aXNhID0+IHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKHBlc3F1aXNhLCBzZWxmLmRhdGEpO1xuICAgIC8vIH0gKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRleHRvUGVzcXVpc2EpO1xuICB9XG5cbiAgc2VsZWNpb25hckNvbWJvQ2hhbmdlKGU6IGFueSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjb25zb2xlLmxvZygnY29tYm8gY2hhbmdlJywgZSk7XG4gICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSB0aGlzLmxpc3RhUGVzcXVpc2EuZmluZChpID0+IGlbdGhpcy5jYW1wb0lkXSA9PSBlKTtcbiAgICBpZiAoc2VsZi5zZWxlY3RlZEl0ZW0gIT0gbnVsbCkge1xuICAgICAgc2VsZi53cml0ZVZhbHVlKGUpO1xuICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gc2VsZi5zZWxlY3RlZEl0ZW1bc2VsZi5jYW1wb0Rpc3BsYXldO1xuICAgICAgaWYgKGUgIT0gbnVsbCkge1xuICAgICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gZmFsc2U7XG4gICAgICAgIGlmIChzZWxmLmNoYW5nZSAhPSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5jaGFuZ2Uoc2VsZi5zZWxlY3RlZEl0ZW0sIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BEb3duUGVzcXVpc2EobGVuZ3RoOiBudW1iZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYubGlzdGFQZXNxdWlzYSAhPSBudWxsICYmIHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoID09IC0xKSB7XG4gICAgICAgIGxlbmd0aCA9IHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gbGVuZ3RoID09IDAgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgIC8vY29uc29sZS5sb2codGhpcy5zZWxlY3RFbGVtZW50KTtcbiAgICAgIC8vdGhpcy5zZWxlY3RFbGVtZW50Lm9wZW4oKTtcblxuICAgICAgLypcbiAgICAgIC8vbGV0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdEVsZW1lbnQ7XG4gICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VsZWN0SWQpO1xuICAgICAgY29uc29sZS5sb2coJ2Ryb3BEb3duJywgZWxlbWVudCk7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpLnNpemUgPSBsZW5ndGggKyAxO1xuICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgKi9cbiAgICB9XG4gIH1cblxuICBwZXNxdWlzYXJFbnRpZGFkZShmaWx0cm86IHN0cmluZykge1xuICAgIGxldCB1cmwgPSB0aGlzLnVybC5yZXBsYWNlKCc8PEZJTFRSTz4+JywgZmlsdHJvKS5yZXBsYWNlKCc8PEVNUFJFU0E+PicsIHRoaXMuZW1wcmVzYS50b1N0cmluZygpKTtcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyRW50aWRhZGUgdXJsJywgdXJsKTtcbiAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSBmYWxzZTtcbiAgICB0aGlzLnBlc3F1aXNhU3ViamVjdC5uZXh0KHVybCk7XG4gIH1cblxuICBwZXNxdWlzYXJFbnRpZGFkZU9sZChmaWx0cm86IHN0cmluZykge1xuICAgIGxldCB1cmwgPSB0aGlzLnVybC5yZXBsYWNlKCc8PEZJTFRSTz4+JywgZmlsdHJvKS5yZXBsYWNlKCc8PEVNUFJFU0E+PicsIHRoaXMuZW1wcmVzYS50b1N0cmluZygpKTtcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyRW50aWRhZGUgdXJsJywgdXJsKTtcbiAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSBmYWxzZTtcbiAgICB0aGlzLmh0dHBDbGllbnQuZ2V0PGFueT4odXJsKVxuICAgICAgLnN1YnNjcmliZSh7IG5leHQ6IChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAvL3RoaXMubGlzdGFQZXNxdWlzYSA9IHJlc3VsdDtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKHRoaXMuZmlsdGVyRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGFQZXNxdWlzYSA9IFtdO1xuICAgICAgICByZXN1bHQuZm9yRWFjaCgoZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EucHVzaCh7IC4uLmVudCwgSW5kZXg6IGluZGV4LCBTZWxlY3RlZDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm8gcGVzcXVpc2EnLCBlcnJvcik7XG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICB9fSk7XG4gIH1cblxuICBleGlzdGVOYUxpc3RhKGlkOiBudW1iZXIsIHNldFJlZ2lzdHJvOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5saXN0YVBlc3F1aXNhICYmIHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZXhpc3RlID0gdGhpcy5saXN0YVBlc3F1aXNhLmZpbmQobCA9PiBsW3RoaXMuY2FtcG9JZF0gPT09IGlkKTtcbiAgICAgIGlmIChleGlzdGUpIHtcbiAgICAgICAgaWYgKHNldFJlZ2lzdHJvKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBleGlzdGU7XG4gICAgICAgICAgdGhpcy5zZWxlY2lvbmFyQ29tYm9DbGljayh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBleGlzdGVOYUxpc3RhVGV4dG8odGV4dG86IHN0cmluZywgc2V0UmVnaXN0cm86IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnNvbGUubG9nKFwiZXhpc3RlIHRleHRvOlwiLCB0ZXh0bywgdGhpcy5jYW1wb0Rpc3BsYXksIHRoaXMubGlzdGFQZXNxdWlzYSk7XG4gICAgaWYgKHRoaXMubGlzdGFQZXNxdWlzYSAmJiB0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGV4aXN0ZSA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKGwgPT4gbFt0aGlzLmNhbXBvRGlzcGxheV0udG9VcHBlckNhc2UoKSA9PT0gdGV4dG8udG9VcHBlckNhc2UoKSk7XG4gICAgICBpZiAoZXhpc3RlKSB7XG4gICAgICAgIGlmIChzZXRSZWdpc3Rybykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZXhpc3RlO1xuICAgICAgICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sodGhpcy5zZWxlY3RlZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhckl0ZW1TZWxlY2lvbmFkbyhzZXRhclJlZ2lzdHJvOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBjb25zb2xlLmxvZygndmFsaWRhciBzZWxlY2lvbmFkbycpO1xuICAgIC8vcGFzc2FyIHBlbGEgZnVuw6fDo28gZGUgZmlsdHJvXG4gICAgbGV0IHZhbGlkbyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgbGV0IGV4aXN0ZSA9IFt7IC4uLnRoaXMuc2VsZWN0ZWRJdGVtIH1dLmZpbHRlcih0aGlzLmZpbHRlckZ1bmN0aW9uKTtcbiAgICAgICAgaWYgKGV4aXN0ZSAhPSBudWxsICYmIGV4aXN0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRvID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZG8gJiYgc2V0YXJSZWdpc3Rybykge1xuICAgICAgICB0aGlzLnNlbGVjaW9uYXJDb21ib0NsaWNrKHRoaXMuc2VsZWN0ZWRJdGVtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbGlkbztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEoaWQ6IG51bWJlcikge1xuICAgIGxldCB1cmwgPSB0aGlzLnVybEl0ZW0ucmVwbGFjZSgnPDxJRD4+JywgaWQudG9TdHJpbmcoKSk7XG4gICAgY29uc29sZS5sb2codGhpcy51cmxJdGVtKTtcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyIElEIHVybCcsIHVybCk7XG4gICAgdGhpcy5wb2RlUGVzcXVpc2FyID0gZmFsc2U7XG4gICAgdGhpcy5odHRwQ2xpZW50LmdldDxhbnk+KHVybClcbiAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5saXN0YVBlc3F1aXNhID0gW107XG4gICAgICAgIHRoaXMubGlzdGFQZXNxdWlzYS5wdXNoKHsgLi4ucmVzdWx0LCBJbmRleDogMCwgU2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5saXN0YVBlc3F1aXNhWzBdO1xuICAgICAgICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sodGhpcy5zZWxlY3RlZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9LCBlcnJvcjogIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm8gcGVzcXVpc2EnLCBlcnJvcik7XG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICB9fSk7XG4gIH1cblxuICBsaW1wYXJDbGljaygpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgdGhpcy53cml0ZVBlc3F1aXNhKG51bGwpO1xuICAgIHRoaXMubGlzdGFQZXNxdWlzYSA9IFtdO1xuICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSgwKTtcbiAgICAvL3RoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgdGhpcy5wZXNxdWlzYVN1YmplY3QubmV4dCgnJyk7XG4gICAgaWYgKHRoaXMubGltcGFyKSB7XG4gICAgICB0aGlzLmxpbXBhcigpO1xuICAgIH1cbiAgfVxuXG4gIHZlcmlmaWNhclBlc3F1aXNhKCkge1xuICAgIC8vVE9ETzogdmVyaWZpY2FyIHNlIG8gdGV4dG8gY29ycmVzcG9uZGUgY29tIHVtIGl0ZW0gZGEgbGlzdGFcbiAgICB0aGlzLnNlbGVjaW9uYXJDb21ib0NsaWNrKG51bGwpO1xuICB9XG5cbiAgYXN5bmMgcGVzcXVpc2FyQ2xpY2soKSB7XG4gICAgLypcbiAgICBpZiAodGhpcy5wZXNxdWlzYUFjdGlvbiAhPSBudWxsKSB7XG4gICAgICB0aGlzLnBlc3F1aXNhQWN0aW9uKCk7XG4gICAgfVxuICAgICovXG4gICAgLy9wZXNxdWlzYUNhdGVnb3JpYVxuICAgIGNvbnNvbGUubG9nKHRoaXMuZmlsdGVyRnVuY3Rpb24sIHRoaXMudXJsLCB0aGlzLnVybFRyZWUpO1xuXG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBNb2RlbFRyZWV2aWV3Q29tcG9uZW50LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgLy9jYW1wb0lkOiB0aGlzLmNhbXBvSWQsXG4gICAgICAgIC8vY2FtcG9QYWk6IHRoaXMuY2FtcG9QYWlJZCxcbiAgICAgICAgLy9jYW1wb0xhYmVsOiB0aGlzLmNhbXBvRGlzcGxheSxcbiAgICAgICAgZmlsdGVyRnVuY3Rpb246IHRoaXMuZmlsdGVyRnVuY3Rpb24sXG4gICAgICAgIGVtcHJlc2FTZWxlY2lvbmFkYUlkOiB0aGlzLmVtcHJlc2EsXG4gICAgICAgIHRpcG86IHRoaXMudGlwbyxcbiAgICAgICAgLy9lc3BlY2lmaWNvXG4gICAgICAgIC8vcGxhbm9Db250YXM6IHRoaXMucGxhbm9Db250YXMsXG4gICAgICAgIHVybDogdGhpcy5pc0VtcHR5KHRoaXMudXJsVHJlZSkgPyB0aGlzLnVybCA6IHRoaXMudXJsVHJlZVxuICAgICAgfSxcbiAgICAgIGNzc0NsYXNzOiAnbXktY3VzdG9tLW1vZGFsLXBlc3F1aXNhJ1xuICAgIH0pO1xuXG4gICAgbW9kYWwub25EaWREaXNtaXNzKCkudGhlbihkYXRhID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBkYXRhWydkYXRhJ107XG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5JZCA+IDApIHtcbiAgICAgICAgdGhpcy5jYXJyZWdhSXRlbUlkUGFyYUxpc3RhKHJlc3VsdC5JZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9kYWwucHJlc2VudCgpO1xuXG4gIH1cblxuICBpc0VtcHR5KHZhbG9yOiBzdHJpbmcgfCBhbnkpIHtcbiAgICByZXR1cm4gdmFsb3IgPT0gbnVsbCB8fCB2YWxvciA9PSB1bmRlZmluZWQgfHwgdmFsb3IgPT0gJydcbiAgfVxufVxuIiwiPGRpdiBzdHlsZT1cInBhZGRpbmctaW5saW5lLWVuZDogMHB4O1wiPlxuICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBzdHlsZT1cIi0tYmFja2dyb3VuZDogaW5oZXJpdGVkOyAtLWJhY2tncm91bmQtZm9jdXNlZDogdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IDJweDtcIiBbY2xhc3NdPVwiaXRlbUNsYXNzXCI+XG4gICAgICA8aW9uLWxhYmVsIHBvc2l0aW9uPVwie3sgbGFiZWxQb3NpdGlvbiB9fVwiIGNvbG9yPVwie3sgbGFiZWxDb2xvciB9fVwiPnt7IGxhYmVsIH19PC9pb24tbGFiZWw+XG4gICAgICA8IS0tIGZvcm1Db250cm9sTmFtZT1cInt7IGNhbXBvIH19XCIgIC0tPlxuICAgICAgPGlvbi1zcGlubmVyICpuZ0lmPVwiIXBvZGVQZXNxdWlzYXJcIlxuICAgICAgICBzdHlsZT1cIi0tbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1pbmxpbmUtZW5kOiA1cHggIWltcG9ydGFudDsgbWFyZ2luLXRvcDogMTZweDtcIiBcbiAgICAgICAgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImxpbmVzXCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgIDwhLS0gKGlvbkJsdXIpPVwidmVyaWZpY2FyUGVzcXVpc2EoKVwiIC0tPlxuICAgICAgPCEtLSBjb25mbGl0byBjb20gY2xpY2sgZGEgbGlzdGEgLS0+XG4gICAgICA8aW9uLWlucHV0ICNpbnB1dFBlc3F1aXNhXG4gICAgICAgIHR5cGU9XCJ7e3R5cGV9fVwiIFxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBcbiAgICAgICAgbWF4bGVuZ3RoPVwie3sgbWF4IH19XCIgXG4gICAgICAgIChpb25CbHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgW3ZhbHVlXT1cInRleHRvUGVzcXVpc2FcIiAoaW5wdXQpPVwid3JpdGVQZXNxdWlzYShpbnB1dFBlc3F1aXNhLnZhbHVlKVwiIFxuICAgICAgICAoa2V5dXApPVwic2hvd1Blc3F1aXNhKCRldmVudClcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBzdHlsZT1cIi0tYmFja2dyb3VuZDp7eyBpbnB1dEJhY2tncm91bmdDb2xvciB9fTtcIlxuICAgICAgICAoY2xpY2spPVwiZHJvcERvd25QZXNxdWlzYSgtMSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIiBkZWJvdW5jZT1cIjUwMFwiPjwvaW9uLWlucHV0PlxuICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgc2xvdD1cImVuZFwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDI1cHg7IG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDRweCAhaW1wb3J0YW50OyAtLXBhZGRpbmctc3RhcnQ6MnB4OyAtLXBhZGRpbmctZW5kOiAycHg7XCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJtZWRpdW1cIlxuICAgICAgICAoY2xpY2spPVwibGltcGFyQ2xpY2soKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3NlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICBcbiAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIHNsb3Q9XCJlbmRcIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNXB4OyBtYXJnaW4taW5saW5lLXN0YXJ0OiA0cHggIWltcG9ydGFudDsgLS1wYWRkaW5nLXN0YXJ0OjJweDsgLS1wYWRkaW5nLWVuZDogMnB4O1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwibWVkaXVtXCJcbiAgICAgICAgKGNsaWNrKT1cInBlc3F1aXNhckNsaWNrKClcIj5cbiAgICAgICAgPGlvbi1pY29uIGNvbG9yPVwicHJpbWFyeVwiIG5hbWU9XCJzZWFyY2hcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgXG4gICAgPC9pb24taXRlbT5cbiAgXG4gICAgPGlvbi1saXN0IHRhYmluZGV4PVwiLTFcIiBbaGlkZGVuXT1cIiFzZWxlY3RFbGVtZW50VmlzaXZlbCB8fCAhbGlzdGFQZXNxdWlzYSB8fCBsaXN0YVBlc3F1aXNhLmxlbmd0aCA9PSAwXCIgY2xhc3M9XCJwZXNxdWlzYS1saXN0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgIFxuICAgICAgPGlvbi1pdGVtIHRhYmluZGV4PVwiLTFcIiBidXR0b24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGlzdGFQZXNxdWlzYVwiIFxuICAgICAgKGNsaWNrKT1cInNlbGVjaW9uYXJDb21ib0NsaWNrKGl0ZW0pXCIgW2lkXT1cInNlbGVjdElkICsgJ0lvbkl0ZW0nICsgaXRlbVsnSW5kZXgnXVwiXG4gICAgICAgIGNsYXNzPVwicGVzcXVpc2EtaXRlbVwiPlxuICAgICAgICA8IS0tIHt7IGl0ZW0gfCBqc29ufX0gLS0+XG4gICAgICAgIDxzcGFuIFtjbGFzc109XCJ7J3NlbGVjdGVkLWl0ZW0nOiBpdGVtWydTZWxlY3RlZCddID09PSB0cnVlfVwiIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0KGl0ZW1bY2FtcG9EaXNwbGF5XSlcIj48L3NwYW4+XG4gICAgICA8L2lvbi1pdGVtPlxuICBcbiAgICA8L2lvbi1saXN0PlxuICBcbiAgICA8IS0tXG4gICAgPGlvbi1zZWxlY3QgaW50ZXJmYWNlPVwicG9wb3ZlclwiICNzZWxlY3RFbGVtZW50IHRhYmluZGV4PVwiLTFcIiBbaGlkZGVuXT1cIiFzZWxlY3RFbGVtZW50VmlzaXZlbFwiXG4gICAgICAoaW9uQ2hhbmdlKT1cInNlbGVjaW9uYXJDb21ib0NoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3RhUGVzcXVpc2FcIiBbdmFsdWVdPVwiaXRlbVtjYW1wb0lkXVwiIChjbGljayk9XCJzZWxlY2lvbmFyQ29tYm9DbGljayhpdGVtW2NhbXBvSWRdKVwiPlxuICAgICAgICB7eyBpdGVtW2NhbXBvRGlzcGxheV0gfX1cbiAgICAgIDwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgPC9pb24tc2VsZWN0PlxuICAgIC0tPlxuICBcbiAgICA8IS0tXG4gICAgPHNlbGVjdCBbaWRdPVwic2VsZWN0SWRcIiAjc2VsZWN0RWxlbWVudCB0YWJpbmRleD1cIi0xXCIgW2hpZGRlbl09XCIhc2VsZWN0RWxlbWVudFZpc2l2ZWxcIlxuICAgICAgKGNoYW5nZSk9XCJzZWxlY2lvbmFyQ29tYm9DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSlcIiBjbGFzcz1cInBlc3F1aXNhLXNlbGVjdFwiPlxuICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsaXN0YVBlc3F1aXNhXCIgW3ZhbHVlXT1cIml0ZW1bY2FtcG9JZF1cIiAoY2xpY2spPVwic2VsZWNpb25hckNvbWJvQ2xpY2soaXRlbVtjYW1wb0lkXSlcIj5cbiAgICAgICAge3sgaXRlbVtjYW1wb0Rpc3BsYXldIH19XG4gICAgICA8L29wdGlvbj5cbiAgXG4gICAgPC9zZWxlY3Q+XG4gICAgLS0+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uLWVycm9yc1wiICpuZ0lmPVwiZm9ybVwiPlxuICBcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhbGlkYXRpb24gb2YgdmFsaWRhdGlvbl9tZXNzYWdlc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiXG4gICAgICAgICAgKm5nSWY9XCJmb3JtLmdldChmb3JtQ29udHJvbE5hbWUpPy5oYXNFcnJvcih2YWxpZGF0aW9uLnR5cGUpICYmIChmb3JtLmdldChmb3JtQ29udHJvbE5hbWUpPy5kaXJ0eSB8fCBmb3JtLmdldChmb3JtQ29udHJvbE5hbWUpPy50b3VjaGVkKVwiPlxuICAgICAgICAgICYjODIyNjsge3sgdmFsaWRhdGlvbi5tZXNzYWdlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gIFxuICAgIDwvZGl2PlxuICA8L2Rpdj4iXX0=