uitec-ng-header 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +11 -182
  2. package/esm2020/lib/ui-header.component.mjs +20 -26
  3. package/esm2020/lib/ui-header.module.mjs +4 -10
  4. package/esm2020/public-api.mjs +1 -17
  5. package/fesm2015/uitec-ng-header.mjs +24 -1808
  6. package/fesm2015/uitec-ng-header.mjs.map +1 -1
  7. package/fesm2020/uitec-ng-header.mjs +24 -1771
  8. package/fesm2020/uitec-ng-header.mjs.map +1 -1
  9. package/lib/ui-header.component.d.ts +8 -11
  10. package/lib/ui-header.module.d.ts +1 -2
  11. package/package.json +2 -3
  12. package/public-api.d.ts +0 -15
  13. package/esm2020/lib/assistant/components/assistant-action-card/ui-assistant-action-card.component.mjs +0 -102
  14. package/esm2020/lib/assistant/components/assistant-button/ui-assistant-button.component.mjs +0 -18
  15. package/esm2020/lib/assistant/components/assistant-composer/ui-assistant-composer.component.mjs +0 -79
  16. package/esm2020/lib/assistant/components/assistant-layout/ui-assistant-layout.component.mjs +0 -140
  17. package/esm2020/lib/assistant/components/assistant-messages/ui-assistant-messages.component.mjs +0 -144
  18. package/esm2020/lib/assistant/components/assistant-panel/ui-assistant-panel.component.mjs +0 -156
  19. package/esm2020/lib/assistant/components/assistant-text/ui-assistant-text.component.mjs +0 -26
  20. package/esm2020/lib/assistant/models/uiny-api.models.mjs +0 -12
  21. package/esm2020/lib/assistant/models/uiny.models.mjs +0 -2
  22. package/esm2020/lib/assistant/services/ui-assistant.service.mjs +0 -137
  23. package/esm2020/lib/assistant/services/uiny-api.service.mjs +0 -149
  24. package/esm2020/lib/assistant/services/uiny-chat.service.mjs +0 -368
  25. package/esm2020/lib/assistant/services/uiny-session.service.mjs +0 -74
  26. package/esm2020/lib/assistant/ui-assistant.module.mjs +0 -59
  27. package/esm2020/lib/assistant/uiny.config.mjs +0 -53
  28. package/esm2020/lib/assistant/utils/uiny-api.adapter.mjs +0 -154
  29. package/esm2020/lib/assistant/utils/uiny-contexto.mjs +0 -43
  30. package/esm2020/lib/assistant/utils/uiny-markdown.mjs +0 -122
  31. package/lib/assistant/components/assistant-action-card/ui-assistant-action-card.component.d.ts +0 -33
  32. package/lib/assistant/components/assistant-button/ui-assistant-button.component.d.ts +0 -9
  33. package/lib/assistant/components/assistant-composer/ui-assistant-composer.component.d.ts +0 -24
  34. package/lib/assistant/components/assistant-layout/ui-assistant-layout.component.d.ts +0 -51
  35. package/lib/assistant/components/assistant-messages/ui-assistant-messages.component.d.ts +0 -38
  36. package/lib/assistant/components/assistant-panel/ui-assistant-panel.component.d.ts +0 -53
  37. package/lib/assistant/components/assistant-text/ui-assistant-text.component.d.ts +0 -14
  38. package/lib/assistant/models/uiny-api.models.d.ts +0 -109
  39. package/lib/assistant/models/uiny.models.d.ts +0 -104
  40. package/lib/assistant/services/ui-assistant.service.d.ts +0 -55
  41. package/lib/assistant/services/uiny-api.service.d.ts +0 -38
  42. package/lib/assistant/services/uiny-chat.service.d.ts +0 -82
  43. package/lib/assistant/services/uiny-session.service.d.ts +0 -38
  44. package/lib/assistant/ui-assistant.module.d.ts +0 -19
  45. package/lib/assistant/uiny.config.d.ts +0 -31
  46. package/lib/assistant/utils/uiny-api.adapter.d.ts +0 -22
  47. package/lib/assistant/utils/uiny-contexto.d.ts +0 -7
  48. package/lib/assistant/utils/uiny-markdown.d.ts +0 -37
@@ -1,368 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, of, Subject, Subscription } from 'rxjs';
3
- import { distinctUntilChanged, filter, finalize, map, switchMap, takeUntil } from 'rxjs/operators';
4
- import { UINY_MENSAGEM_MAX_CARACTERES } from '../uiny.config';
5
- import { adaptarAcao, adaptarConversa, adaptarInstrucoes, adaptarMensagem } from '../utils/uiny-api.adapter';
6
- import { contextoParaApi } from '../utils/uiny-contexto';
7
- import { UiAssistantService } from './ui-assistant.service';
8
- import { UinyApiService } from './uiny-api.service';
9
- import { UinySessionService } from './uiny-session.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./uiny-api.service";
12
- import * as i2 from "./uiny-session.service";
13
- import * as i3 from "./ui-assistant.service";
14
- const ESTADO_INICIAL = {
15
- conversa: null,
16
- mensagens: [],
17
- acoes: {},
18
- enviando: false,
19
- carregandoConversa: false,
20
- erro: null,
21
- aviso: null,
22
- conversas: null,
23
- carregandoConversas: false,
24
- textoComFalha: null,
25
- };
26
- /**
27
- * Estado da conversa, só em memória. Nada vai para localStorage/sessionStorage.
28
- *
29
- * Limpeza: qualquer mudança de sessão (logout, outro usuário, outra empresa, novo token,
30
- * 401 da API) ou a Uiny ficar indisponível cancela as requisições em andamento e
31
- * descarta todo o estado.
32
- */
33
- export class UinyChatService {
34
- constructor(api, session, assistant) {
35
- this.api = api;
36
- this.session = session;
37
- this.assistant = assistant;
38
- this.estado$ = new BehaviorSubject(ESTADO_INICIAL);
39
- /** Emite para abortar as requisições da sessão/conversa atual. */
40
- this.cancelarConversa$ = new Subject();
41
- this.cancelarSessao$ = new Subject();
42
- this.anuncios$ = new Subject();
43
- this.subs = new Subscription();
44
- this.sessao = null;
45
- this.idLocal = 0;
46
- /** Loja usada ao criar a conversa atual: o backend restringe a conversa a ela. */
47
- this.escopoLoja = null;
48
- this.estado = this.estado$.asObservable();
49
- /** Textos curtos para a região aria-live do painel. */
50
- this.anuncios = this.anuncios$.asObservable();
51
- this.subs.add(this.session.sessao$.subscribe(sessao => {
52
- if (sessao?.id !== this.sessao?.id) {
53
- this.sessao = sessao;
54
- this.limparTudo();
55
- }
56
- }));
57
- this.subs.add(this.assistant.disponivel$.pipe(filter(d => !d)).subscribe(() => this.limparTudo()));
58
- // Trocar de loja muda o escopo da conversa: não reaproveitamos a anterior.
59
- this.subs.add(this.assistant.contexto$.pipe(map(c => c.idLoja ?? null), distinctUntilChanged()).subscribe(idLoja => {
60
- if (this.valor.conversa && this.escopoLoja !== idLoja) {
61
- this.encerrarConversa('Você mudou de loja. Começamos uma nova conversa para manter os assuntos separados.');
62
- }
63
- }));
64
- }
65
- ngOnDestroy() {
66
- this.cancelarSessao$.next();
67
- this.subs.unsubscribe();
68
- }
69
- get valor() {
70
- return this.estado$.value;
71
- }
72
- get ocupado() {
73
- const v = this.valor;
74
- return v.enviando || Object.values(v.acoes).some(a => a.enviando || a.estado === 'executando');
75
- }
76
- enviar(textoBruto) {
77
- const texto = (textoBruto || '').trim();
78
- const sistema = this.assistant.sistemaOrigem;
79
- if (!texto || !sistema || !this.sessao || this.valor.enviando)
80
- return false;
81
- if (texto.length > UINY_MENSAGEM_MAX_CARACTERES) {
82
- this.patch({ erro: this.erroLocal('invalido', `A mensagem pode ter até ${UINY_MENSAGEM_MAX_CARACTERES} caracteres.`) });
83
- return false;
84
- }
85
- const contexto = contextoParaApi(sistema, this.assistant.contexto);
86
- const local = {
87
- id: this.novoIdLocal(), papel: 'usuario', estado: null, texto, idAcao: null, opcoes: [], criadaEm: new Date(),
88
- };
89
- this.patch({
90
- mensagens: [...this.valor.mensagens.filter(m => !m.erro), local],
91
- enviando: true,
92
- erro: null,
93
- aviso: null,
94
- textoComFalha: null,
95
- });
96
- this.anuncios$.next('A Uiny está respondendo…');
97
- const conversa$ = this.valor.conversa
98
- ? of(this.valor.conversa)
99
- : this.api.criarConversa(contexto).pipe(map(r => {
100
- const conversa = adaptarConversa(r?.conversa);
101
- if (!conversa)
102
- throw this.erroLocal('servidor', 'Não foi possível iniciar a conversa.');
103
- this.escopoLoja = contexto.id_loja ?? null;
104
- this.patch({ conversa, conversas: null });
105
- return conversa;
106
- }));
107
- conversa$.pipe(switchMap(conversa => this.api.enviarMensagem(conversa.id, texto, contexto)), takeUntil(this.cancelarConversa$), finalize(() => this.valor.enviando && this.patch({ enviando: false }))).subscribe({
108
- next: resposta => {
109
- this.aplicarResposta(resposta, true);
110
- this.patch({ enviando: false });
111
- this.anuncios$.next(resposta?.mensagem ? 'Nova resposta da Uiny.' : '');
112
- },
113
- error: err => {
114
- const erro = this.normalizar(err);
115
- // erros da API podem trazer a mensagem da Uiny (ex.: falha do provedor registrada)
116
- if (erro.corpo?.mensagem)
117
- this.aplicarResposta(erro.corpo, false);
118
- this.patch({
119
- mensagens: this.valor.mensagens.map(m => m.id === local.id ? { ...m, erro: true } : m),
120
- enviando: false,
121
- erro,
122
- textoComFalha: erro.tipo === 'sessao' ? null : texto,
123
- });
124
- this.anuncios$.next(erro.mensagem);
125
- },
126
- });
127
- return true;
128
- }
129
- /** Começa do zero. Bloqueado enquanto há envio ou ação em execução. */
130
- novaConversa() {
131
- if (this.ocupado)
132
- return false;
133
- this.encerrarConversa(null);
134
- return true;
135
- }
136
- listarConversas() {
137
- if (!this.sessao || this.valor.carregandoConversas)
138
- return;
139
- this.patch({ carregandoConversas: true, erro: null });
140
- this.api.listarConversas().pipe(takeUntil(this.cancelarSessao$), finalize(() => this.patch({ carregandoConversas: false }))).subscribe({
141
- next: r => this.patch({
142
- conversas: (Array.isArray(r?.data) ? r.data : []).map(adaptarConversa).filter(c => !!c && this.doContextoAtual(c)),
143
- }),
144
- error: err => this.patch({ erro: this.normalizar(err), conversas: [] }),
145
- });
146
- }
147
- abrirConversa(id) {
148
- const resumo = this.valor.conversas?.find(c => c.id === id);
149
- if (!resumo || this.ocupado || !this.doContextoAtual(resumo))
150
- return;
151
- this.encerrarConversa(null);
152
- this.patch({ carregandoConversa: true });
153
- this.api.historico(id).pipe(takeUntil(this.cancelarConversa$), finalize(() => this.patch({ carregandoConversa: false }))).subscribe({
154
- next: r => {
155
- const conversa = adaptarConversa(r?.conversa) ?? resumo;
156
- if (!this.doContextoAtual(conversa)) {
157
- this.patch({ aviso: 'Essa conversa pertence a outro contexto e não pode ser continuada aqui.' });
158
- return;
159
- }
160
- this.escopoLoja = conversa.idLoja;
161
- const mensagensApi = Array.isArray(r?.data) ? r.data : [];
162
- this.patch({
163
- conversa,
164
- mensagens: mensagensApi.map(adaptarMensagem).filter(Boolean),
165
- acoes: this.mesclarAcoes(mensagensApi.map(m => m?.acao_pendente)),
166
- });
167
- // Histórico não reemite instruções de interface: elas já foram tratadas quando chegaram.
168
- },
169
- error: err => this.patch({ erro: this.normalizar(err) }),
170
- });
171
- }
172
- /**
173
- * Confirma pelo id da ação persistida no backend. Só é chamado pelo clique no card;
174
- * nenhum texto da conversa dispara isto. Nunca há repetição automática.
175
- */
176
- confirmar(idAcao) {
177
- const acao = this.valor.acoes[idAcao];
178
- if (!acao || acao.enviando || acao.estado !== 'pendente')
179
- return;
180
- if (acao.expiraEm && acao.expiraEm.getTime() <= Date.now()) {
181
- this.atualizarAcao(idAcao, { estado: 'expirada', aviso: 'O prazo para confirmar terminou. Peça a alteração de novo.' });
182
- return;
183
- }
184
- this.atualizarAcao(idAcao, { enviando: true, estado: 'executando', aviso: null });
185
- this.anuncios$.next('Executando a alteração…');
186
- this.api.confirmarAcao(idAcao).pipe(takeUntil(this.cancelarSessao$)).subscribe({
187
- next: resposta => this.concluirDecisao(idAcao, resposta, null, true),
188
- error: err => {
189
- const erro = this.normalizar(err);
190
- if (erro.corpo?.acao_pendente || erro.corpo?.acao_anterior) {
191
- // 409 (expirada, invalidada com nova proposta, em execução) ou 502/504: o corpo traz o estado real
192
- this.concluirDecisao(idAcao, erro.corpo, erro, true);
193
- }
194
- else if (erro.tipo === 'timeout' || erro.tipo === 'rede' || erro.tipo === 'servidor') {
195
- // A operação pode ter sido executada. Não repetimos: o usuário verifica o estado.
196
- this.atualizarAcao(idAcao, {
197
- enviando: false,
198
- estado: 'indeterminada',
199
- aviso: 'Não recebemos a resposta da confirmação. Verifique o resultado antes de pedir de novo.',
200
- });
201
- }
202
- else if (erro.tipo === 'conflito' || erro.tipo === 'nao_encontrado') {
203
- this.atualizarAcao(idAcao, { enviando: false, estado: 'indeterminada', aviso: erro.mensagem });
204
- this.verificarAcao(idAcao);
205
- }
206
- else {
207
- this.atualizarAcao(idAcao, { enviando: false, estado: 'pendente', aviso: erro.mensagem });
208
- }
209
- this.anuncios$.next(erro.mensagem);
210
- },
211
- });
212
- }
213
- cancelar(idAcao) {
214
- const acao = this.valor.acoes[idAcao];
215
- if (!acao || acao.enviando || acao.estado !== 'pendente')
216
- return;
217
- this.atualizarAcao(idAcao, { enviando: true, aviso: null });
218
- this.api.cancelarAcao(idAcao).pipe(takeUntil(this.cancelarSessao$)).subscribe({
219
- next: resposta => this.concluirDecisao(idAcao, resposta, null, false),
220
- error: err => {
221
- const erro = this.normalizar(err);
222
- if (erro.corpo?.acao_pendente) {
223
- this.concluirDecisao(idAcao, erro.corpo, erro, false);
224
- }
225
- else {
226
- this.atualizarAcao(idAcao, { enviando: false, aviso: erro.mensagem });
227
- }
228
- },
229
- });
230
- }
231
- /** Consulta a situação real da ação relendo o histórico da conversa. */
232
- verificarAcao(idAcao) {
233
- const acao = this.valor.acoes[idAcao];
234
- const idConversa = this.valor.conversa?.id;
235
- if (!acao || !idConversa)
236
- return;
237
- this.atualizarAcao(idAcao, { enviando: true });
238
- this.api.historico(idConversa).pipe(takeUntil(this.cancelarSessao$)).subscribe({
239
- next: r => {
240
- const mensagens = Array.isArray(r?.data) ? r.data : [];
241
- const atual = mensagens.map(m => adaptarAcao(m?.acao_pendente)).find(a => a?.id === idAcao);
242
- if (atual) {
243
- this.atualizarAcao(idAcao, { ...atual, enviando: false, aviso: atual.estado === 'indeterminada' ? 'Confira no sistema se a alteração foi aplicada.' : null });
244
- this.patch({ mensagens: this.mesclar(this.valor.mensagens, mensagens.map(adaptarMensagem).filter(Boolean)) });
245
- }
246
- else {
247
- this.atualizarAcao(idAcao, {
248
- enviando: false,
249
- aviso: 'Não foi possível consultar o estado desta ação. Confira na tela correspondente se a alteração foi aplicada.',
250
- });
251
- }
252
- },
253
- error: err => this.atualizarAcao(idAcao, { enviando: false, aviso: this.normalizar(err).mensagem }),
254
- });
255
- }
256
- limparErro() {
257
- this.patch({ erro: null, aviso: null });
258
- }
259
- /* ---------------- internos ---------------- */
260
- /** Aplica uma resposta de confirmar/cancelar (de sucesso ou de erro com corpo). */
261
- concluirDecisao(idAcao, resposta, erro, confirmacao) {
262
- const anterior = this.valor.acoes[idAcao];
263
- this.aplicarResposta(resposta, !erro);
264
- const atual = this.valor.acoes[idAcao];
265
- // sem a ação na resposta, o resultado é desconhecido
266
- if (!atual || atual === anterior) {
267
- this.atualizarAcao(idAcao, {
268
- enviando: false,
269
- estado: confirmacao ? 'indeterminada' : anterior?.estado,
270
- aviso: erro?.mensagem ?? 'A API não informou o resultado. Confira se a alteração foi aplicada.',
271
- });
272
- }
273
- else {
274
- this.atualizarAcao(idAcao, { enviando: false, aviso: erro?.mensagem ?? null });
275
- }
276
- const final = this.valor.acoes[idAcao];
277
- // Sucesso só quando a API devolve a ação como executada.
278
- if (confirmacao && final?.estado === 'concluida') {
279
- this.assistant.emitir({ tipo: 'acao_concluida', idAcao, ferramenta: final.ferramenta });
280
- this.anuncios$.next('Alteração concluída.');
281
- }
282
- else if (final?.estado === 'falha') {
283
- this.anuncios$.next('A alteração não foi concluída.');
284
- }
285
- }
286
- /** Resposta padrão (ApresentadorConversa::resposta): conversa, mensagem e ação pendente. */
287
- aplicarResposta(resposta, emitirInstrucoes) {
288
- if (!resposta || typeof resposta !== 'object')
289
- return;
290
- const mensagem = adaptarMensagem(resposta.mensagem);
291
- this.patch({
292
- conversa: adaptarConversa(resposta.conversa) ?? this.valor.conversa,
293
- mensagens: mensagem ? this.mesclar(this.valor.mensagens, [mensagem]) : this.valor.mensagens,
294
- acoes: this.mesclarAcoes([resposta.acao_anterior, resposta.mensagem?.acao_pendente, resposta.acao_pendente]),
295
- });
296
- if (emitirInstrucoes && resposta.mensagem?.papel === 'assistente') {
297
- adaptarInstrucoes(resposta.mensagem.instrucoes_interface).forEach(e => this.assistant.emitir(e));
298
- }
299
- }
300
- mesclar(atuais, novas) {
301
- const ids = new Set(atuais.map(m => m.id));
302
- return [...atuais, ...novas.filter(m => !ids.has(m.id))];
303
- }
304
- mesclarAcoes(novas) {
305
- const acoes = { ...this.valor.acoes };
306
- novas.map(adaptarAcao).filter(Boolean).forEach(a => {
307
- // uma ação já resolvida localmente não volta a "pendente" por uma resposta antiga
308
- const anterior = acoes[a.id];
309
- acoes[a.id] = anterior && anterior.estado !== 'pendente' && anterior.estado !== 'executando' && a.estado === 'pendente'
310
- ? anterior
311
- : { ...a, enviando: anterior?.enviando, aviso: anterior?.aviso };
312
- });
313
- return acoes;
314
- }
315
- atualizarAcao(id, parcial) {
316
- const atual = this.valor.acoes[id];
317
- if (!atual)
318
- return;
319
- this.patch({ acoes: { ...this.valor.acoes, [id]: { ...atual, ...parcial, id } } });
320
- }
321
- doContextoAtual(conversa) {
322
- const sistema = this.assistant.sistemaOrigem;
323
- const idLoja = this.assistant.contexto.idLoja ?? null;
324
- return conversa.sistemaOrigem === sistema && (conversa.idLoja ?? null) === idLoja;
325
- }
326
- encerrarConversa(aviso) {
327
- this.cancelarConversa$.next();
328
- this.escopoLoja = null;
329
- this.patch({
330
- conversa: null,
331
- mensagens: [],
332
- acoes: {},
333
- enviando: false,
334
- carregandoConversa: false,
335
- erro: null,
336
- aviso,
337
- conversas: null,
338
- textoComFalha: null,
339
- });
340
- }
341
- limparTudo() {
342
- this.cancelarConversa$.next();
343
- this.cancelarSessao$.next();
344
- this.escopoLoja = null;
345
- this.estado$.next(ESTADO_INICIAL);
346
- }
347
- patch(parcial) {
348
- this.estado$.next({ ...this.estado$.value, ...parcial });
349
- }
350
- novoIdLocal() {
351
- return 'local-' + (++this.idLocal);
352
- }
353
- normalizar(err) {
354
- if (err && typeof err === 'object' && typeof err.tipo === 'string' && typeof err.mensagem === 'string')
355
- return err;
356
- return this.erroLocal('servidor', 'Algo deu errado ao falar com a Uiny. Tente de novo.');
357
- }
358
- erroLocal(tipo, mensagem) {
359
- return { tipo, status: 0, codigo: null, mensagem, correlacao: null };
360
- }
361
- }
362
- UinyChatService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinyChatService, deps: [{ token: i1.UinyApiService }, { token: i2.UinySessionService }, { token: i3.UiAssistantService }], target: i0.ɵɵFactoryTarget.Injectable });
363
- UinyChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinyChatService, providedIn: 'root' });
364
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinyChatService, decorators: [{
365
- type: Injectable,
366
- args: [{ providedIn: 'root' }]
367
- }], ctorParameters: function () { return [{ type: i1.UinyApiService }, { type: i2.UinySessionService }, { type: i3.UiAssistantService }]; } });
368
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlueS1jaGF0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1oZWFkZXIvc3JjL2xpYi9hc3Npc3RhbnQvc2VydmljZXMvdWlueS1jaGF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQWMsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFpQnhFLE1BQU0sY0FBYyxHQUFtQjtJQUNuQyxRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxFQUFFO0lBQ2IsS0FBSyxFQUFFLEVBQUU7SUFDVCxRQUFRLEVBQUUsS0FBSztJQUNmLGtCQUFrQixFQUFFLEtBQUs7SUFDekIsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsSUFBSTtJQUNYLFNBQVMsRUFBRSxJQUFJO0lBQ2YsbUJBQW1CLEVBQUUsS0FBSztJQUMx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QUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFnQztRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxXQUFXO1FBQ2YsT0FBTyxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sVUFBVSxDQUFDLEdBQVE7UUFDdkIsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNuSCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLHFEQUFxRCxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFzQixFQUFFLFFBQWdCO1FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekUsQ0FBQzs7NkdBcldRLGVBQWU7aUhBQWYsZUFBZSxjQURGLE1BQU07NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZpbmFsaXplLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVWlueUFjYW9BcGksIFVpbnlNZW5zYWdlbUFwaSwgVWlueVJlc3Bvc3RhQXBpLCBVaW55U2lzdGVtYU9yaWdlbSB9IGZyb20gJy4uL21vZGVscy91aW55LWFwaS5tb2RlbHMnO1xuaW1wb3J0IHsgVWlueUFjYW8sIFVpbnlDb252ZXJzYVJlc3VtbywgVWlueUVycm8sIFVpbnlNZW5zYWdlbSB9IGZyb20gJy4uL21vZGVscy91aW55Lm1vZGVscyc7XG5pbXBvcnQgeyBVSU5ZX01FTlNBR0VNX01BWF9DQVJBQ1RFUkVTIH0gZnJvbSAnLi4vdWlueS5jb25maWcnO1xuaW1wb3J0IHsgYWRhcHRhckFjYW8sIGFkYXB0YXJDb252ZXJzYSwgYWRhcHRhckluc3RydWNvZXMsIGFkYXB0YXJNZW5zYWdlbSB9IGZyb20gJy4uL3V0aWxzL3VpbnktYXBpLmFkYXB0ZXInO1xuaW1wb3J0IHsgY29udGV4dG9QYXJhQXBpIH0gZnJvbSAnLi4vdXRpbHMvdWlueS1jb250ZXh0byc7XG5pbXBvcnQgeyBVaUFzc2lzdGFudFNlcnZpY2UgfSBmcm9tICcuL3VpLWFzc2lzdGFudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVpbnlBcGlTZXJ2aWNlIH0gZnJvbSAnLi91aW55LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFVpbnlTZXNzYW8sIFVpbnlTZXNzaW9uU2VydmljZSB9IGZyb20gJy4vdWlueS1zZXNzaW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVpbnlDaGF0RXN0YWRvIHtcbiAgICBjb252ZXJzYTogVWlueUNvbnZlcnNhUmVzdW1vIHwgbnVsbDtcbiAgICBtZW5zYWdlbnM6IFVpbnlNZW5zYWdlbVtdO1xuICAgIGFjb2VzOiB7IFtpZDogc3RyaW5nXTogVWlueUFjYW8gfTtcbiAgICBlbnZpYW5kbzogYm9vbGVhbjtcbiAgICBjYXJyZWdhbmRvQ29udmVyc2E6IGJvb2xlYW47XG4gICAgZXJybzogVWlueUVycm8gfCBudWxsO1xuICAgIC8qKiBBdmlzbyBpbmZvcm1hdGl2byAoZXguOiB0cm9jYSBkZSBsb2phIGVuY2Vycm91IGEgY29udmVyc2EpLiAqL1xuICAgIGF2aXNvOiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbnZlcnNhczogVWlueUNvbnZlcnNhUmVzdW1vW10gfCBudWxsO1xuICAgIGNhcnJlZ2FuZG9Db252ZXJzYXM6IGJvb2xlYW47XG4gICAgLyoqIFRleHRvIGRhIMO6bHRpbWEgbWVuc2FnZW0gcXVlIGZhbGhvdSwgcGFyYSBcInRlbnRhciBkZSBub3ZvXCIuICovXG4gICAgdGV4dG9Db21GYWxoYTogc3RyaW5nIHwgbnVsbDtcbn1cblxuY29uc3QgRVNUQURPX0lOSUNJQUw6IFVpbnlDaGF0RXN0YWRvID0ge1xuICAgIGNvbnZlcnNhOiBudWxsLFxuICAgIG1lbnNhZ2VuczogW10sXG4gICAgYWNvZXM6IHt9LFxuICAgIGVudmlhbmRvOiBmYWxzZSxcbiAgICBjYXJyZWdhbmRvQ29udmVyc2E6IGZhbHNlLFxuICAgIGVycm86IG51bGwsXG4gICAgYXZpc286IG51bGwsXG4gICAgY29udmVyc2FzOiBudWxsLFxuICAgIGNhcnJlZ2FuZG9Db252ZXJzYXM6IGZhbHNlLFxuICAgIHRleHRvQ29tRmFsaGE6IG51bGwsXG59O1xuXG4vKipcbiAqIEVzdGFkbyBkYSBjb252ZXJzYSwgc8OzIGVtIG1lbcOzcmlhLiBOYWRhIHZhaSBwYXJhIGxvY2FsU3RvcmFnZS9zZXNzaW9uU3RvcmFnZS5cbiAqXG4gKiBMaW1wZXphOiBxdWFscXVlciBtdWRhbsOnYSBkZSBzZXNzw6NvIChsb2dvdXQsIG91dHJvIHVzdcOhcmlvLCBvdXRyYSBlbXByZXNhLCBub3ZvIHRva2VuLFxuICogNDAxIGRhIEFQSSkgb3UgYSBVaW55IGZpY2FyIGluZGlzcG9uw612ZWwgY2FuY2VsYSBhcyByZXF1aXNpw6fDtWVzIGVtIGFuZGFtZW50byBlXG4gKiBkZXNjYXJ0YSB0b2RvIG8gZXN0YWRvLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVpbnlDaGF0U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVzdGFkbyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVpbnlDaGF0RXN0YWRvPihFU1RBRE9fSU5JQ0lBTCk7XG4gICAgLyoqIEVtaXRlIHBhcmEgYWJvcnRhciBhcyByZXF1aXNpw6fDtWVzIGRhIHNlc3PDo28vY29udmVyc2EgYXR1YWwuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYW5jZWxhckNvbnZlcnNhJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYW5jZWxhclNlc3NhbyQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYW51bmNpb3MkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICBwcml2YXRlIHNlc3NhbzogVWlueVNlc3NhbyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgaWRMb2NhbCA9IDA7XG4gICAgLyoqIExvamEgdXNhZGEgYW8gY3JpYXIgYSBjb252ZXJzYSBhdHVhbDogbyBiYWNrZW5kIHJlc3RyaW5nZSBhIGNvbnZlcnNhIGEgZWxhLiAqL1xuICAgIHByaXZhdGUgZXNjb3BvTG9qYTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICByZWFkb25seSBlc3RhZG86IE9ic2VydmFibGU8VWlueUNoYXRFc3RhZG8+ID0gdGhpcy5lc3RhZG8kLmFzT2JzZXJ2YWJsZSgpO1xuICAgIC8qKiBUZXh0b3MgY3VydG9zIHBhcmEgYSByZWdpw6NvIGFyaWEtbGl2ZSBkbyBwYWluZWwuICovXG4gICAgcmVhZG9ubHkgYW51bmNpb3M6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuYW51bmNpb3MkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgYXBpOiBVaW55QXBpU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZXNzaW9uOiBVaW55U2Vzc2lvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXNzaXN0YW50OiBVaUFzc2lzdGFudFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLnNlc3Npb24uc2Vzc2FvJC5zdWJzY3JpYmUoc2Vzc2FvID0+IHtcbiAgICAgICAgICAgIGlmIChzZXNzYW8/LmlkICE9PSB0aGlzLnNlc3Nhbz8uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlc3NhbyA9IHNlc3NhbztcbiAgICAgICAgICAgICAgICB0aGlzLmxpbXBhclR1ZG8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHRoaXMuc3Vicy5hZGQodGhpcy5hc3Npc3RhbnQuZGlzcG9uaXZlbCQucGlwZShmaWx0ZXIoZCA9PiAhZCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxpbXBhclR1ZG8oKSkpO1xuXG4gICAgICAgIC8vIFRyb2NhciBkZSBsb2phIG11ZGEgbyBlc2NvcG8gZGEgY29udmVyc2E6IG7Do28gcmVhcHJvdmVpdGFtb3MgYSBhbnRlcmlvci5cbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLmFzc2lzdGFudC5jb250ZXh0byQucGlwZShcbiAgICAgICAgICAgIG1hcChjID0+IGMuaWRMb2phID8/IG51bGwpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApLnN1YnNjcmliZShpZExvamEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsb3IuY29udmVyc2EgJiYgdGhpcy5lc2NvcG9Mb2phICE9PSBpZExvamEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuY2VycmFyQ29udmVyc2EoJ1ZvY8OqIG11ZG91IGRlIGxvamEuIENvbWXDp2Ftb3MgdW1hIG5vdmEgY29udmVyc2EgcGFyYSBtYW50ZXIgb3MgYXNzdW50b3Mgc2VwYXJhZG9zLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FuY2VsYXJTZXNzYW8kLm5leHQoKTtcbiAgICAgICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHZhbG9yKCk6IFVpbnlDaGF0RXN0YWRvIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXN0YWRvJC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgb2N1cGFkbygpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsb3I7XG4gICAgICAgIHJldHVybiB2LmVudmlhbmRvIHx8IE9iamVjdC52YWx1ZXModi5hY29lcykuc29tZShhID0+IGEuZW52aWFuZG8gfHwgYS5lc3RhZG8gPT09ICdleGVjdXRhbmRvJyk7XG4gICAgfVxuXG4gICAgZW52aWFyKHRleHRvQnJ1dG86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZXh0byA9ICh0ZXh0b0JydXRvIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHNpc3RlbWEgPSB0aGlzLmFzc2lzdGFudC5zaXN0ZW1hT3JpZ2VtO1xuICAgICAgICBpZiAoIXRleHRvIHx8ICFzaXN0ZW1hIHx8ICF0aGlzLnNlc3NhbyB8fCB0aGlzLnZhbG9yLmVudmlhbmRvKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0ZXh0by5sZW5ndGggPiBVSU5ZX01FTlNBR0VNX01BWF9DQVJBQ1RFUkVTKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGNoKHsgZXJybzogdGhpcy5lcnJvTG9jYWwoJ2ludmFsaWRvJywgYEEgbWVuc2FnZW0gcG9kZSB0ZXIgYXTDqSAke1VJTllfTUVOU0FHRU1fTUFYX0NBUkFDVEVSRVN9IGNhcmFjdGVyZXMuYCkgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0byA9IGNvbnRleHRvUGFyYUFwaShzaXN0ZW1hLCB0aGlzLmFzc2lzdGFudC5jb250ZXh0byk7XG4gICAgICAgIGNvbnN0IGxvY2FsOiBVaW55TWVuc2FnZW0gPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5ub3ZvSWRMb2NhbCgpLCBwYXBlbDogJ3VzdWFyaW8nLCBlc3RhZG86IG51bGwsIHRleHRvLCBpZEFjYW86IG51bGwsIG9wY29lczogW10sIGNyaWFkYUVtOiBuZXcgRGF0ZSgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBhdGNoKHtcbiAgICAgICAgICAgIG1lbnNhZ2VuczogWy4uLnRoaXMudmFsb3IubWVuc2FnZW5zLmZpbHRlcihtID0+ICFtLmVycm8pLCBsb2NhbF0sXG4gICAgICAgICAgICBlbnZpYW5kbzogdHJ1ZSxcbiAgICAgICAgICAgIGVycm86IG51bGwsXG4gICAgICAgICAgICBhdmlzbzogbnVsbCxcbiAgICAgICAgICAgIHRleHRvQ29tRmFsaGE6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFudW5jaW9zJC5uZXh0KCdBIFVpbnkgZXN0w6EgcmVzcG9uZGVuZG/igKYnKTtcblxuICAgICAgICBjb25zdCBjb252ZXJzYSQgPSB0aGlzLnZhbG9yLmNvbnZlcnNhXG4gICAgICAgICAgICA/IG9mKHRoaXMudmFsb3IuY29udmVyc2EpXG4gICAgICAgICAgICA6IHRoaXMuYXBpLmNyaWFyQ29udmVyc2EoY29udGV4dG8pLnBpcGUobWFwKHIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnNhID0gYWRhcHRhckNvbnZlcnNhKHI/LmNvbnZlcnNhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnNhKSB0aHJvdyB0aGlzLmVycm9Mb2NhbCgnc2Vydmlkb3InLCAnTsOjbyBmb2kgcG9zc8OtdmVsIGluaWNpYXIgYSBjb252ZXJzYS4nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVzY29wb0xvamEgPSBjb250ZXh0by5pZF9sb2phID8/IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRjaCh7IGNvbnZlcnNhLCBjb252ZXJzYXM6IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnNhO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnZlcnNhJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnZlcnNhID0+IHRoaXMuYXBpLmVudmlhck1lbnNhZ2VtKGNvbnZlcnNhLmlkLCB0ZXh0bywgY29udGV4dG8pKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNhbmNlbGFyQ29udmVyc2EkKSxcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMudmFsb3IuZW52aWFuZG8gJiYgdGhpcy5wYXRjaCh7IGVudmlhbmRvOiBmYWxzZSB9KSlcbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogcmVzcG9zdGEgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhclJlc3Bvc3RhKHJlc3Bvc3RhLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGNoKHsgZW52aWFuZG86IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYW51bmNpb3MkLm5leHQocmVzcG9zdGE/Lm1lbnNhZ2VtID8gJ05vdmEgcmVzcG9zdGEgZGEgVWlueS4nIDogJycpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm8gPSB0aGlzLm5vcm1hbGl6YXIoZXJyKTtcbiAgICAgICAgICAgICAgICAvLyBlcnJvcyBkYSBBUEkgcG9kZW0gdHJhemVyIGEgbWVuc2FnZW0gZGEgVWlueSAoZXguOiBmYWxoYSBkbyBwcm92ZWRvciByZWdpc3RyYWRhKVxuICAgICAgICAgICAgICAgIGlmIChlcnJvLmNvcnBvPy5tZW5zYWdlbSkgdGhpcy5hcGxpY2FyUmVzcG9zdGEoZXJyby5jb3JwbywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICBtZW5zYWdlbnM6IHRoaXMudmFsb3IubWVuc2FnZW5zLm1hcChtID0+IG0uaWQgPT09IGxvY2FsLmlkID8geyAuLi5tLCBlcnJvOiB0cnVlIH0gOiBtKSxcbiAgICAgICAgICAgICAgICAgICAgZW52aWFuZG86IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJvLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0b0NvbUZhbGhhOiBlcnJvLnRpcG8gPT09ICdzZXNzYW8nID8gbnVsbCA6IHRleHRvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYW51bmNpb3MkLm5leHQoZXJyby5tZW5zYWdlbSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIENvbWXDp2EgZG8gemVyby4gQmxvcXVlYWRvIGVucXVhbnRvIGjDoSBlbnZpbyBvdSBhw6fDo28gZW0gZXhlY3XDp8Ojby4gKi9cbiAgICBub3ZhQ29udmVyc2EoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm9jdXBhZG8pIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbmNlcnJhckNvbnZlcnNhKG51bGwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsaXN0YXJDb252ZXJzYXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zZXNzYW8gfHwgdGhpcy52YWxvci5jYXJyZWdhbmRvQ29udmVyc2FzKSByZXR1cm47XG4gICAgICAgIHRoaXMucGF0Y2goeyBjYXJyZWdhbmRvQ29udmVyc2FzOiB0cnVlLCBlcnJvOiBudWxsIH0pO1xuICAgICAgICB0aGlzLmFwaS5saXN0YXJDb252ZXJzYXMoKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY2FuY2VsYXJTZXNzYW8kKSxcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMucGF0Y2goeyBjYXJyZWdhbmRvQ29udmVyc2FzOiBmYWxzZSB9KSlcbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogciA9PiB0aGlzLnBhdGNoKHtcbiAgICAgICAgICAgICAgICBjb252ZXJzYXM6IChBcnJheS5pc0FycmF5KHI/LmRhdGEpID8gci5kYXRhIDogW10pLm1hcChhZGFwdGFyQ29udmVyc2EpLmZpbHRlcihjID0+ICEhYyAmJiB0aGlzLmRvQ29udGV4dG9BdHVhbChjKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgPT4gdGhpcy5wYXRjaCh7IGVycm86IHRoaXMubm9ybWFsaXphcihlcnIpLCBjb252ZXJzYXM6IFtdIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhYnJpckNvbnZlcnNhKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdW1vID0gdGhpcy52YWxvci5jb252ZXJzYXM/LmZpbmQoYyA9PiBjLmlkID09PSBpZCk7XG4gICAgICAgIGlmICghcmVzdW1vIHx8IHRoaXMub2N1cGFkbyB8fCAhdGhpcy5kb0NvbnRleHRvQXR1YWwocmVzdW1vKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVuY2VycmFyQ29udmVyc2EobnVsbCk7XG4gICAgICAgIHRoaXMucGF0Y2goeyBjYXJyZWdhbmRvQ29udmVyc2E6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuYXBpLmhpc3RvcmljbyhpZCkucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNhbmNlbGFyQ29udmVyc2EkKSxcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMucGF0Y2goeyBjYXJyZWdhbmRvQ29udmVyc2E6IGZhbHNlIH0pKVxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJzYSA9IGFkYXB0YXJDb252ZXJzYShyPy5jb252ZXJzYSkgPz8gcmVzdW1vO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb0NvbnRleHRvQXR1YWwoY29udmVyc2EpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0Y2goeyBhdmlzbzogJ0Vzc2EgY29udmVyc2EgcGVydGVuY2UgYSBvdXRybyBjb250ZXh0byBlIG7Do28gcG9kZSBzZXIgY29udGludWFkYSBhcXVpLicgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lc2NvcG9Mb2phID0gY29udmVyc2EuaWRMb2phO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lbnNhZ2Vuc0FwaTogVWlueU1lbnNhZ2VtQXBpW10gPSBBcnJheS5pc0FycmF5KHI/LmRhdGEpID8gci5kYXRhIDogW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnNhLFxuICAgICAgICAgICAgICAgICAgICBtZW5zYWdlbnM6IG1lbnNhZ2Vuc0FwaS5tYXAoYWRhcHRhck1lbnNhZ2VtKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgICAgICAgICAgICAgIGFjb2VzOiB0aGlzLm1lc2NsYXJBY29lcyhtZW5zYWdlbnNBcGkubWFwKG0gPT4gbT8uYWNhb19wZW5kZW50ZSkpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEhpc3TDs3JpY28gbsOjbyByZWVtaXRlIGluc3RydcOnw7VlcyBkZSBpbnRlcmZhY2U6IGVsYXMgasOhIGZvcmFtIHRyYXRhZGFzIHF1YW5kbyBjaGVnYXJhbS5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHRoaXMucGF0Y2goeyBlcnJvOiB0aGlzLm5vcm1hbGl6YXIoZXJyKSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlybWEgcGVsbyBpZCBkYSBhw6fDo28gcGVyc2lzdGlkYSBubyBiYWNrZW5kLiBTw7Mgw6kgY2hhbWFkbyBwZWxvIGNsaXF1ZSBubyBjYXJkO1xuICAgICAqIG5lbmh1bSB0ZXh0byBkYSBjb252ZXJzYSBkaXNwYXJhIGlzdG8uIE51bmNhIGjDoSByZXBldGnDp8OjbyBhdXRvbcOhdGljYS5cbiAgICAgKi9cbiAgICBjb25maXJtYXIoaWRBY2FvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWNhbyA9IHRoaXMudmFsb3IuYWNvZXNbaWRBY2FvXTtcbiAgICAgICAgaWYgKCFhY2FvIHx8IGFjYW8uZW52aWFuZG8gfHwgYWNhby5lc3RhZG8gIT09ICdwZW5kZW50ZScpIHJldHVybjtcbiAgICAgICAgaWYgKGFjYW8uZXhwaXJhRW0gJiYgYWNhby5leHBpcmFFbS5nZXRUaW1lKCkgPD0gRGF0ZS5ub3coKSkge1xuICAgICAgICAgICAgdGhpcy5hdHVhbGl6YXJBY2FvKGlkQWNhbywgeyBlc3RhZG86ICdleHBpcmFkYScsIGF2aXNvOiAnTyBwcmF6byBwYXJhIGNvbmZpcm1hciB0ZXJtaW5vdS4gUGXDp2EgYSBhbHRlcmHDp8OjbyBkZSBub3ZvLicgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdHVhbGl6YXJBY2FvKGlkQWNhbywgeyBlbnZpYW5kbzogdHJ1ZSwgZXN0YWRvOiAnZXhlY3V0YW5kbycsIGF2aXNvOiBudWxsIH0pO1xuICAgICAgICB0aGlzLmFudW5jaW9zJC5uZXh0KCdFeGVjdXRhbmRvIGEgYWx0ZXJhw6fDo2/igKYnKTtcblxuICAgICAgICB0aGlzLmFwaS5jb25maXJtYXJBY2FvKGlkQWNhbykucGlwZSh0YWtlVW50aWwodGhpcy5jYW5jZWxhclNlc3NhbyQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogcmVzcG9zdGEgPT4gdGhpcy5jb25jbHVpckRlY2lzYW8oaWRBY2FvLCByZXNwb3N0YSwgbnVsbCwgdHJ1ZSksXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvID0gdGhpcy5ub3JtYWxpemFyKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm8uY29ycG8/LmFjYW9fcGVuZGVudGUgfHwgZXJyby5jb3Jwbz8uYWNhb19hbnRlcmlvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyA0MDkgKGV4cGlyYWRhLCBpbnZhbGlkYWRhIGNvbSBub3ZhIHByb3Bvc3RhLCBlbSBleGVjdcOnw6NvKSBvdSA1MDIvNTA0OiBvIGNvcnBvIHRyYXogbyBlc3RhZG8gcmVhbFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmNsdWlyRGVjaXNhbyhpZEFjYW8sIGVycm8uY29ycG8sIGVycm8sIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyby50aXBvID09PSAndGltZW91dCcgfHwgZXJyby50aXBvID09PSAncmVkZScgfHwgZXJyby50aXBvID09PSAnc2Vydmlkb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgb3BlcmHDp8OjbyBwb2RlIHRlciBzaWRvIGV4ZWN1dGFkYS4gTsOjbyByZXBldGltb3M6IG8gdXN1w6FyaW8gdmVyaWZpY2EgbyBlc3RhZG8uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR1YWxpemFyQWNhbyhpZEFjYW8sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmlhbmRvOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzdGFkbzogJ2luZGV0ZXJtaW5hZGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXZpc286ICdOw6NvIHJlY2ViZW1vcyBhIHJlc3Bvc3RhIGRhIGNvbmZpcm1hw6fDo28uIFZlcmlmaXF1ZSBvIHJlc3VsdGFkbyBhbnRlcyBkZSBwZWRpciBkZSBub3ZvLicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyby50aXBvID09PSAnY29uZmxpdG8nIHx8IGVycm8udGlwbyA9PT0gJ25hb19lbmNvbnRyYWRvJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dWFsaXphckFjYW8oaWRBY2FvLCB7IGVudmlhbmRvOiBmYWxzZSwgZXN0YWRvOiAnaW5kZXRlcm1pbmFkYScsIGF2aXNvOiBlcnJvLm1lbnNhZ2VtIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcmlmaWNhckFjYW8oaWRBY2FvKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dWFsaXphckFjYW8oaWRBY2FvLCB7IGVudmlhbmRvOiBmYWxzZSwgZXN0YWRvOiAncGVuZGVudGUnLCBhdmlzbzogZXJyby5tZW5zYWdlbSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hbnVuY2lvcyQubmV4dChlcnJvLm1lbnNhZ2VtKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbmNlbGFyKGlkQWNhbzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFjYW8gPSB0aGlzLnZhbG9yLmFjb2VzW2lkQWNhb107XG4gICAgICAgIGlmICghYWNhbyB8fCBhY2FvLmVudmlhbmRvIHx8IGFjYW8uZXN0YWRvICE9PSAncGVuZGVudGUnKSByZXR1cm47XG4gICAgICAgIHRoaXMuYXR1YWxpemFyQWNhbyhpZEFjYW8sIHsgZW52aWFuZG86IHRydWUsIGF2aXNvOiBudWxsIH0pO1xuICAgICAgICB0aGlzLmFwaS5jYW5jZWxhckFjYW8oaWRBY2FvKS5waXBlKHRha2VVbnRpbCh0aGlzLmNhbmNlbGFyU2Vzc2FvJCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByZXNwb3N0YSA9PiB0aGlzLmNvbmNsdWlyRGVjaXNhbyhpZEFjYW8sIHJlc3Bvc3RhLCBudWxsLCBmYWxzZSksXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvID0gdGhpcy5ub3JtYWxpemFyKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm8uY29ycG8/LmFjYW9fcGVuZGVudGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25jbHVpckRlY2lzYW8oaWRBY2FvLCBlcnJvLmNvcnBvLCBlcnJvLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHVhbGl6YXJBY2FvKGlkQWNhbywgeyBlbnZpYW5kbzogZmFsc2UsIGF2aXNvOiBlcnJvLm1lbnNhZ2VtIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBDb25zdWx0YSBhIHNpdHVhw6fDo28gcmVhbCBkYSBhw6fDo28gcmVsZW5kbyBvIGhpc3TDs3JpY28gZGEgY29udmVyc2EuICovXG4gICAgdmVyaWZpY2FyQWNhbyhpZEFjYW86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBhY2FvID0gdGhpcy52YWxvci5hY29lc1tpZEFjYW9dO1xuICAgICAgICBjb25zdCBpZENvbnZlcnNhID0gdGhpcy52YWxvci5jb252ZXJzYT8uaWQ7XG4gICAgICAgIGlmICghYWNhbyB8fCAhaWRDb252ZXJzYSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmF0dWFsaXphckFjYW8oaWRBY2FvLCB7IGVudmlhbmRvOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmFwaS5oaXN0b3JpY28oaWRDb252ZXJzYSkucGlwZSh0YWtlVW50aWwodGhpcy5jYW5jZWxhclNlc3NhbyQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVuc2FnZW5zOiBVaW55TWVuc2FnZW1BcGlbXSA9IEFycmF5LmlzQXJyYXkocj8uZGF0YSkgPyByLmRhdGEgOiBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHVhbCA9IG1lbnNhZ2Vucy5tYXAobSA9PiBhZGFwdGFyQWNhbyhtPy5hY2FvX3BlbmRlbnRlKSkuZmluZChhID0+IGE/LmlkID09PSBpZEFjYW8pO1xuICAgICAgICAgICAgICAgIGlmIChhdHVhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dWFsaXphckFjYW8oaWRBY2FvLCB7IC4uLmF0dWFsLCBlbnZpYW5kbzogZmFsc2UsIGF2aXNvOiBhdHVhbC5lc3RhZG8gPT09ICdpbmRldGVybWluYWRhJyA/ICdDb25maXJhIG5vIHNpc3RlbWEgc2UgYSBhbHRlcmHDp8OjbyBmb2kgYXBsaWNhZGEuJyA6IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0Y2goeyBtZW5zYWdlbnM6IHRoaXMubWVzY2xhcih0aGlzLnZhbG9yLm1lbnNhZ2VucywgbWVuc2FnZW5zLm1hcChhZGFwdGFyTWVuc2FnZW0pLmZpbHRlcihCb29sZWFuKSkgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHVhbGl6YXJBY2FvKGlkQWNhbywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52aWFuZG86IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXZpc286ICdOw6NvIGZvaSBwb3Nzw612ZWwgY29uc3VsdGFyIG8gZXN0YWRvIGRlc3RhIGHDp8Ojby4gQ29uZmlyYSBuYSB0ZWxhIGNvcnJlc3BvbmRlbnRlIHNlIGEgYWx0ZXJhw6fDo28gZm9pIGFwbGljYWRhLicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHRoaXMuYXR1YWxpemFyQWNhbyhpZEFjYW8sIHsgZW52aWFuZG86IGZhbHNlLCBhdmlzbzogdGhpcy5ub3JtYWxpemFyKGVycikubWVuc2FnZW0gfSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpbXBhckVycm8oKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGF0Y2goeyBlcnJvOiBudWxsLCBhdmlzbzogbnVsbCB9KTtcbiAgICB9XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIGludGVybm9zIC0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIC8qKiBBcGxpY2EgdW1hIHJlc3Bvc3RhIGRlIGNvbmZpcm1hci9jYW5jZWxhciAoZGUgc3VjZXNzbyBvdSBkZSBlcnJvIGNvbSBjb3JwbykuICovXG4gICAgcHJpdmF0ZSBjb25jbHVpckRlY2lzYW8oaWRBY2FvOiBzdHJpbmcsIHJlc3Bvc3RhOiBVaW55UmVzcG9zdGFBcGksIGVycm86IFVpbnlFcnJvIHwgbnVsbCwgY29uZmlybWFjYW86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYW50ZXJpb3IgPSB0aGlzLnZhbG9yLmFjb2VzW2lkQWNhb107XG4gICAgICAgIHRoaXMuYXBsaWNhclJlc3Bvc3RhKHJlc3Bvc3RhLCAhZXJybyk7XG5cbiAgICAgICAgY29uc3QgYXR1YWwgPSB0aGlzLnZhbG9yLmFjb2VzW2lkQWNhb107XG4gICAgICAgIC8vIHNlbSBhIGHDp8OjbyBuYSByZXNwb3N0YSwgbyByZXN1bHRhZG8gw6kgZGVzY29uaGVjaWRvXG4gICAgICAgIGlmICghYXR1YWwgfHwgYXR1YWwgPT09IGFudGVyaW9yKSB7XG4gICAgICAgICAgICB0aGlzLmF0dWFsaXphckFjYW8oaWRBY2FvLCB7XG4gICAgICAgICAgICAgICAgZW52aWFuZG86IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVzdGFkbzogY29uZmlybWFjYW8gPyAnaW5kZXRlcm1pbmFkYScgOiBhbnRlcmlvcj8uZXN0YWRvLFxuICAgICAgICAgICAgICAgIGF2aXNvOiBlcnJvPy5tZW5zYWdlbSA/PyAnQSBBUEkgbsOjbyBpbmZvcm1vdSBvIHJlc3VsdGFkby4gQ29uZmlyYSBzZSBhIGFsdGVyYcOnw6NvIGZvaSBhcGxpY2FkYS4nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF0dWFsaXphckFjYW8oaWRBY2FvLCB7IGVudmlhbmRvOiBmYWxzZSwgYXZpc286IGVycm8/Lm1lbnNhZ2VtID8/IG51bGwgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbCA9IHRoaXMudmFsb3IuYWNvZXNbaWRBY2FvXTtcbiAgICAgICAgLy8gU3VjZXNzbyBzw7MgcXVhbmRvIGEgQVBJIGRldm9sdmUgYSBhw6fDo28gY29tbyBleGVjdXRhZGEuXG4gICAgICAgIGlmIChjb25maXJtYWNhbyAmJiBmaW5hbD8uZXN0YWRvID09PSAnY29uY2x1aWRhJykge1xuICAgICAgICAgICAgdGhpcy5hc3Npc3RhbnQuZW1pdGlyKHsgdGlwbzogJ2FjYW9fY29uY2x1aWRhJywgaWRBY2FvLCBmZXJyYW1lbnRhOiBmaW5hbC5mZXJyYW1lbnRhIH0pO1xuICAgICAgICAgICAgdGhpcy5hbnVuY2lvcyQubmV4dCgnQWx0ZXJhw6fDo28gY29uY2x1w61kYS4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaW5hbD8uZXN0YWRvID09PSAnZmFsaGEnKSB7XG4gICAgICAgICAgICB0aGlzLmFudW5jaW9zJC5uZXh0KCdBIGFsdGVyYcOnw6NvIG7Do28gZm9pIGNvbmNsdcOtZGEuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmVzcG9zdGEgcGFkcsOjbyAoQXByZXNlbnRhZG9yQ29udmVyc2E6OnJlc3Bvc3RhKTogY29udmVyc2EsIG1lbnNhZ2VtIGUgYcOnw6NvIHBlbmRlbnRlLiAqL1xuICAgIHByaXZhdGUgYXBsaWNhclJlc3Bvc3RhKHJlc3Bvc3RhOiBVaW55UmVzcG9zdGFBcGksIGVtaXRpckluc3RydWNvZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFyZXNwb3N0YSB8fCB0eXBlb2YgcmVzcG9zdGEgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1lbnNhZ2VtID0gYWRhcHRhck1lbnNhZ2VtKHJlc3Bvc3RhLm1lbnNhZ2VtKTtcbiAgICAgICAgdGhpcy5wYXRjaCh7XG4gICAgICAgICAgICBjb252ZXJzYTogYWRhcHRhckNvbnZlcnNhKHJlc3Bvc3RhLmNvbnZlcnNhKSA/PyB0aGlzLnZhbG9yLmNvbnZlcnNhLFxuICAgICAgICAgICAgbWVuc2FnZW5zOiBtZW5zYWdlbSA/IHRoaXMubWVzY2xhcih0aGlzLnZhbG9yLm1lbnNhZ2VucywgW21lbnNhZ2VtXSkgOiB0aGlzLnZhbG9yLm1lbnNhZ2VucyxcbiAgICAgICAgICAgIGFjb2VzOiB0aGlzLm1lc2NsYXJBY29lcyhbcmVzcG9zdGEuYWNhb19hbnRlcmlvciwgcmVzcG9zdGEubWVuc2FnZW0/LmFjYW9fcGVuZGVudGUsIHJlc3Bvc3RhLmFjYW9fcGVuZGVudGVdKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlbWl0aXJJbnN0cnVjb2VzICYmIHJlc3Bvc3RhLm1lbnNhZ2VtPy5wYXBlbCA9PT0gJ2Fzc2lzdGVudGUnKSB7XG4gICAgICAgICAgICBhZGFwdGFySW5zdHJ1Y29lcyhyZXNwb3N0YS5tZW5zYWdlbS5pbnN0cnVjb2VzX2ludGVyZmFjZSkuZm9yRWFjaChlID0+IHRoaXMuYXNzaXN0YW50LmVtaXRpcihlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1lc2NsYXIoYXR1YWlzOiBVaW55TWVuc2FnZW1bXSwgbm92YXM6IFVpbnlNZW5zYWdlbVtdKTogVWlueU1lbnNhZ2VtW10ge1xuICAgICAgICBjb25zdCBpZHMgPSBuZXcgU2V0KGF0dWFpcy5tYXAobSA9PiBtLmlkKSk7XG4gICAgICAgIHJldHVybiBbLi4uYXR1YWlzLCAuLi5ub3Zhcy5maWx0ZXIobSA9PiAhaWRzLmhhcyhtLmlkKSldO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVzY2xhckFjb2VzKG5vdmFzOiBVaW55QWNhb0FwaVtdKTogeyBbaWQ6IHN0cmluZ106IFVpbnlBY2FvIH0ge1xuICAgICAgICBjb25zdCBhY29lcyA9IHsgLi4udGhpcy52YWxvci5hY29lcyB9O1xuICAgICAgICBub3Zhcy5tYXAoYWRhcHRhckFjYW8pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGEgPT4ge1xuICAgICAgICAgICAgLy8gdW1hIGHDp8OjbyBqw6EgcmVzb2x2aWRhIGxvY2FsbWVudGUgbsOjbyB2b2x0YSBhIFwicGVuZGVudGVcIiBwb3IgdW1hIHJlc3Bvc3RhIGFudGlnYVxuICAgICAgICAgICAgY29uc3QgYW50ZXJpb3IgPSBhY29lc1thLmlkXTtcbiAgICAgICAgICAgIGFjb2VzW2EuaWRdID0gYW50ZXJpb3IgJiYgYW50ZXJpb3IuZXN0YWRvICE9PSAncGVuZGVudGUnICYmIGFudGVyaW9yLmVzdGFkbyAhPT0gJ2V4ZWN1dGFuZG8nICYmIGEuZXN0YWRvID09PSAncGVuZGVudGUnXG4gICAgICAgICAgICAgICAgPyBhbnRlcmlvclxuICAgICAgICAgICAgICAgIDogeyAuLi5hLCBlbnZpYW5kbzogYW50ZXJpb3I/LmVudmlhbmRvLCBhdmlzbzogYW50ZXJpb3I/LmF2aXNvIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYWNvZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHVhbGl6YXJBY2FvKGlkOiBzdHJpbmcsIHBhcmNpYWw6IFBhcnRpYWw8VWlueUFjYW8+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGF0dWFsID0gdGhpcy52YWxvci5hY29lc1tpZF07XG4gICAgICAgIGlmICghYXR1YWwpIHJldHVybjtcbiAgICAgICAgdGhpcy5wYXRjaCh7IGFjb2VzOiB7IC4uLnRoaXMudmFsb3IuYWNvZXMsIFtpZF06IHsgLi4uYXR1YWwsIC4uLnBhcmNpYWwsIGlkIH0gfSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRvQ29udGV4dG9BdHVhbChjb252ZXJzYTogVWlueUNvbnZlcnNhUmVzdW1vKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNpc3RlbWE6IFVpbnlTaXN0ZW1hT3JpZ2VtIHwgbnVsbCA9IHRoaXMuYXNzaXN0YW50LnNpc3RlbWFPcmlnZW07XG4gICAgICAgIGNvbnN0IGlkTG9qYSA9IHRoaXMuYXNzaXN0YW50LmNvbnRleHRvLmlkTG9qYSA/PyBudWxsO1xuICAgICAgICByZXR1cm4gY29udmVyc2Euc2lzdGVtYU9yaWdlbSA9PT0gc2lzdGVtYSAmJiAoY29udmVyc2EuaWRMb2phID8/IG51bGwpID09PSBpZExvamE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmNlcnJhckNvbnZlcnNhKGF2aXNvOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FuY2VsYXJDb252ZXJzYSQubmV4dCgpO1xuICAgICAgICB0aGlzLmVzY29wb0xvamEgPSBudWxsO1xuICAgICAgICB0aGlzLnBhdGNoKHtcbiAgICAgICAgICAgIGNvbnZlcnNhOiBudWxsLFxuICAgICAgICAgICAgbWVuc2FnZW5zOiBbXSxcbiAgICAgICAgICAgIGFjb2VzOiB7fSxcbiAgICAgICAgICAgIGVudmlhbmRvOiBmYWxzZSxcbiAgICAgICAgICAgIGNhcnJlZ2FuZG9Db252ZXJzYTogZmFsc2UsXG4gICAgICAgICAgICBlcnJvOiBudWxsLFxuICAgICAgICAgICAgYXZpc28sXG4gICAgICAgICAgICBjb252ZXJzYXM6IG51bGwsXG4gICAgICAgICAgICB0ZXh0b0NvbUZhbGhhOiBudWxsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxpbXBhclR1ZG8oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FuY2VsYXJDb252ZXJzYSQubmV4dCgpO1xuICAgICAgICB0aGlzLmNhbmNlbGFyU2Vzc2FvJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZXNjb3BvTG9qYSA9IG51bGw7XG4gICAgICAgIHRoaXMuZXN0YWRvJC5uZXh0KEVTVEFET19JTklDSUFMKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhdGNoKHBhcmNpYWw6IFBhcnRpYWw8VWlueUNoYXRFc3RhZG8+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXN0YWRvJC5uZXh0KHsgLi4udGhpcy5lc3RhZG8kLnZhbHVlLCAuLi5wYXJjaWFsIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm92b0lkTG9jYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdsb2NhbC0nICsgKCsrdGhpcy5pZExvY2FsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6YXIoZXJyOiBhbnkpOiBVaW55RXJybyB7XG4gICAgICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGVyci50aXBvID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZXJyLm1lbnNhZ2VtID09PSAnc3RyaW5nJykgcmV0dXJuIGVycjtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb0xvY2FsKCdzZXJ2aWRvcicsICdBbGdvIGRldSBlcnJhZG8gYW8gZmFsYXIgY29tIGEgVWlueS4gVGVudGUgZGUgbm92by4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVycm9Mb2NhbCh0aXBvOiBVaW55RXJyb1sndGlwbyddLCBtZW5zYWdlbTogc3RyaW5nKTogVWlueUVycm8ge1xuICAgICAgICByZXR1cm4geyB0aXBvLCBzdGF0dXM6IDAsIGNvZGlnbzogbnVsbCwgbWVuc2FnZW0sIGNvcnJlbGFjYW86IG51bGwgfTtcbiAgICB9XG59XG4iXX0=
@@ -1,74 +0,0 @@
1
- import { Injectable, NgZone } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, fromEvent, merge, of } from 'rxjs';
3
- import { distinctUntilChanged, map, shareReplay, startWith } from 'rxjs/operators';
4
- import { AuthService } from 'uitec-ng-core';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "uitec-ng-core";
7
- /**
8
- * Deriva a sessão do AuthService do uitec-ng-core (mesma fonte do JwtInterceptor).
9
- * Não lê cookies nem localStorage diretamente e não guarda o token.
10
- */
11
- export class UinySessionService {
12
- constructor(authService, zone) {
13
- this.authService = authService;
14
- this.zone = zone;
15
- /** Chave recusada pela API (401). Fica sem sessão até o AuthService mudar. */
16
- this.chaveRecusada$ = new BehaviorSubject(null);
17
- this.sequencia = 0;
18
- this.ultimaChave = null;
19
- this.ultimaSessao = null;
20
- const usuario$ = this.authService.currentUser.pipe(startWith(this.authService.currentUserValue));
21
- const acesso$ = this.authService.currentAccess.pipe(startWith(this.authService.currentAccessValue));
22
- this.sessao$ = combineLatest([usuario$, acesso$, this.chaveRecusada$]).pipe(map(([usuario, acesso, recusada]) => {
23
- const chave = this.chave(usuario, acesso);
24
- if (!chave || chave === recusada)
25
- return null;
26
- return this.sessaoDaChave(chave, usuario, acesso);
27
- }), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: false }));
28
- this.online$ = typeof window === 'undefined'
29
- ? of(true)
30
- : merge(fromEvent(window, 'online').pipe(map(() => true)), fromEvent(window, 'offline').pipe(map(() => false))).pipe(startWith(typeof navigator === 'undefined' ? true : navigator.onLine !== false), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: false }));
31
- }
32
- /** Token da sessão atual, lido do AuthService no momento da requisição. */
33
- token() {
34
- const usuario = this.authService.currentUserValue;
35
- return usuario?.token || null;
36
- }
37
- /** A API recusou a sessão (401): esconde a Uiny até o usuário autenticar de novo. */
38
- recusarSessaoAtual() {
39
- const chave = this.chave(this.authService.currentUserValue, this.acessoAtual(this.authService.currentUserValue, this.authService.currentAccessValue));
40
- if (chave)
41
- this.zone.run(() => this.chaveRecusada$.next(chave));
42
- }
43
- acessoAtual(usuario, acesso) {
44
- if (!usuario)
45
- return null;
46
- return acesso || usuario.acessos?.find(a => a.in_atual) || null;
47
- }
48
- chave(usuario, acesso) {
49
- const atual = this.acessoAtual(usuario, acesso);
50
- const idUsuario = usuario?.usuario?.id_usuario;
51
- if (!usuario?.token || !idUsuario || !atual?.id_empresa)
52
- return null;
53
- return `${idUsuario}|${atual.id_empresa}|${usuario.token}`;
54
- }
55
- sessaoDaChave(chave, usuario, acesso) {
56
- if (chave === this.ultimaChave && this.ultimaSessao)
57
- return this.ultimaSessao;
58
- const atual = this.acessoAtual(usuario, acesso);
59
- this.ultimaChave = chave;
60
- this.ultimaSessao = {
61
- id: ++this.sequencia,
62
- idUsuario: Number(usuario.usuario.id_usuario),
63
- idEmpresa: Number(atual.id_empresa),
64
- };
65
- return this.ultimaSessao;
66
- }
67
- }
68
- UinySessionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinySessionService, deps: [{ token: i1.AuthService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
69
- UinySessionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinySessionService, providedIn: 'root' });
70
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinySessionService, decorators: [{
71
- type: Injectable,
72
- args: [{ providedIn: 'root' }]
73
- }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i0.NgZone }]; } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlueS1zZXNzaW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1oZWFkZXIvc3JjL2xpYi9hc3Npc3RhbnQvc2VydmljZXMvdWlueS1zZXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkYsT0FBTyxFQUFjLFdBQVcsRUFBZSxNQUFNLGVBQWUsQ0FBQzs7O0FBWXJFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFXM0IsWUFDWSxXQUF3QixFQUN4QixJQUFZO1FBRFosZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQVh4Qiw4RUFBOEU7UUFDN0QsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbkUsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUNsQyxpQkFBWSxHQUFzQixJQUFJLENBQUM7UUFTM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNqRyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBRXBHLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3ZFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLEVBQ0Ysb0JBQW9CLEVBQUUsRUFDdEIsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDbEQsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVztZQUN4QyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNWLENBQUMsQ0FBQyxLQUFLLENBQ0gsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ2pELFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUN0RCxDQUFDLElBQUksQ0FDRixTQUFTLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQy9FLG9CQUFvQixFQUFFLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ2xELENBQUM7SUFDVixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLEtBQUs7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1FBQ2xELE9BQU8sT0FBTyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixrQkFBa0I7UUFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ3RKLElBQUksS0FBSztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUEyQixFQUFFLE1BQXlCO1FBQ3RFLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUIsT0FBTyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3BFLENBQUM7SUFFTyxLQUFLLENBQUMsT0FBMkIsRUFBRSxNQUF5QjtRQUNoRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckUsT0FBTyxHQUFHLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQWEsRUFBRSxPQUFvQixFQUFFLE1BQXlCO1FBQ2hGLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNoQixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUztZQUNwQixTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQzdDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUN0QyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7O2dIQTFFUSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQURMLE1BQU07NEZBQ25CLGtCQUFrQjtrQkFEOUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50LCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRoQWNlc3NvLCBBdXRoU2VydmljZSwgVXNlckF1dGhEVE8gfSBmcm9tICd1aXRlYy1uZy1jb3JlJztcblxuLyoqXG4gKiBTZXNzw6NvIHZpc3RhIHBlbGEgVWlueS4gXCJpZFwiIG11ZGEgYSBjYWRhIG5vdmEgY29tYmluYcOnw6NvIHVzdcOhcmlvL2VtcHJlc2EvdG9rZW4sXG4gKiBpbmNsdXNpdmUgZW0gdW0gbm92byBsb2dpbiBkbyBtZXNtbyB1c3XDoXJpbzogdHVkbyBxdWUgZXN0aXZlciBlbSBtZW3Ds3JpYSDDqSBkZXNjYXJ0YWRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpbnlTZXNzYW8ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgaWRVc3VhcmlvOiBudW1iZXI7XG4gICAgaWRFbXByZXNhOiBudW1iZXI7XG59XG5cbi8qKlxuICogRGVyaXZhIGEgc2Vzc8OjbyBkbyBBdXRoU2VydmljZSBkbyB1aXRlYy1uZy1jb3JlIChtZXNtYSBmb250ZSBkbyBKd3RJbnRlcmNlcHRvcikuXG4gKiBOw6NvIGzDqiBjb29raWVzIG5lbSBsb2NhbFN0b3JhZ2UgZGlyZXRhbWVudGUgZSBuw6NvIGd1YXJkYSBvIHRva2VuLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVpbnlTZXNzaW9uU2VydmljZSB7XG5cbiAgICAvKiogQ2hhdmUgcmVjdXNhZGEgcGVsYSBBUEkgKDQwMSkuIEZpY2Egc2VtIHNlc3PDo28gYXTDqSBvIEF1dGhTZXJ2aWNlIG11ZGFyLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhdmVSZWN1c2FkYSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgc2VxdWVuY2lhID0gMDtcbiAgICBwcml2YXRlIHVsdGltYUNoYXZlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHVsdGltYVNlc3NhbzogVWlueVNlc3NhbyB8IG51bGwgPSBudWxsO1xuXG4gICAgcmVhZG9ubHkgc2Vzc2FvJDogT2JzZXJ2YWJsZTxVaW55U2Vzc2FvIHwgbnVsbD47XG4gICAgcmVhZG9ubHkgb25saW5lJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgICApIHtcbiAgICAgICAgY29uc3QgdXN1YXJpbyQgPSB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRVc2VyLnBpcGUoc3RhcnRXaXRoKHRoaXMuYXV0aFNlcnZpY2UuY3VycmVudFVzZXJWYWx1ZSkpO1xuICAgICAgICBjb25zdCBhY2Vzc28kID0gdGhpcy5hdXRoU2VydmljZS5jdXJyZW50QWNjZXNzLnBpcGUoc3RhcnRXaXRoKHRoaXMuYXV0aFNlcnZpY2UuY3VycmVudEFjY2Vzc1ZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5zZXNzYW8kID0gY29tYmluZUxhdGVzdChbdXN1YXJpbyQsIGFjZXNzbyQsIHRoaXMuY2hhdmVSZWN1c2FkYSRdKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbdXN1YXJpbywgYWNlc3NvLCByZWN1c2FkYV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGF2ZSA9IHRoaXMuY2hhdmUodXN1YXJpbywgYWNlc3NvKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYXZlIHx8IGNoYXZlID09PSByZWN1c2FkYSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2FvRGFDaGF2ZShjaGF2ZSwgdXN1YXJpbywgYWNlc3NvKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IGZhbHNlIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbmxpbmUkID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gb2YodHJ1ZSlcbiAgICAgICAgICAgIDogbWVyZ2UoXG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ29ubGluZScpLnBpcGUobWFwKCgpID0+IHRydWUpKSxcbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQod2luZG93LCAnb2ZmbGluZScpLnBpcGUobWFwKCgpID0+IGZhbHNlKSlcbiAgICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogbmF2aWdhdG9yLm9uTGluZSAhPT0gZmFsc2UpLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2UgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIFRva2VuIGRhIHNlc3PDo28gYXR1YWwsIGxpZG8gZG8gQXV0aFNlcnZpY2Ugbm8gbW9tZW50byBkYSByZXF1aXNpw6fDo28uICovXG4gICAgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHVzdWFyaW8gPSB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRVc2VyVmFsdWU7XG4gICAgICAgIHJldHVybiB1c3VhcmlvPy50b2tlbiB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKiBBIEFQSSByZWN1c291IGEgc2Vzc8OjbyAoNDAxKTogZXNjb25kZSBhIFVpbnkgYXTDqSBvIHVzdcOhcmlvIGF1dGVudGljYXIgZGUgbm92by4gKi9cbiAgICByZWN1c2FyU2Vzc2FvQXR1YWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNoYXZlID0gdGhpcy5jaGF2ZSh0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRVc2VyVmFsdWUsIHRoaXMuYWNlc3NvQXR1YWwodGhpcy5hdXRoU2VydmljZS5jdXJyZW50VXNlclZhbHVlLCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRBY2Nlc3NWYWx1ZSkpO1xuICAgICAgICBpZiAoY2hhdmUpIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5jaGF2ZVJlY3VzYWRhJC5uZXh0KGNoYXZlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY2Vzc29BdHVhbCh1c3VhcmlvOiBVc2VyQXV0aERUTyB8IG51bGwsIGFjZXNzbzogQXV0aEFjZXNzbyB8IG51bGwpOiBBdXRoQWNlc3NvIHwgbnVsbCB7XG4gICAgICAgIGlmICghdXN1YXJpbykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBhY2Vzc28gfHwgdXN1YXJpby5hY2Vzc29zPy5maW5kKGEgPT4gYS5pbl9hdHVhbCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYXZlKHVzdWFyaW86IFVzZXJBdXRoRFRPIHwgbnVsbCwgYWNlc3NvOiBBdXRoQWNlc3NvIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBhdHVhbCA9IHRoaXMuYWNlc3NvQXR1YWwodXN1YXJpbywgYWNlc3NvKTtcbiAgICAgICAgY29uc3QgaWRVc3VhcmlvID0gdXN1YXJpbz8udXN1YXJpbz8uaWRfdXN1YXJpbztcbiAgICAgICAgaWYgKCF1c3VhcmlvPy50b2tlbiB8fCAhaWRVc3VhcmlvIHx8ICFhdHVhbD8uaWRfZW1wcmVzYSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBgJHtpZFVzdWFyaW99fCR7YXR1YWwuaWRfZW1wcmVzYX18JHt1c3VhcmlvLnRva2VufWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXNzYW9EYUNoYXZlKGNoYXZlOiBzdHJpbmcsIHVzdWFyaW86IFVzZXJBdXRoRFRPLCBhY2Vzc286IEF1dGhBY2Vzc28gfCBudWxsKTogVWlueVNlc3NhbyB7XG4gICAgICAgIGlmIChjaGF2ZSA9PT0gdGhpcy51bHRpbWFDaGF2ZSAmJiB0aGlzLnVsdGltYVNlc3NhbykgcmV0dXJuIHRoaXMudWx0aW1hU2Vzc2FvO1xuICAgICAgICBjb25zdCBhdHVhbCA9IHRoaXMuYWNlc3NvQXR1YWwodXN1YXJpbywgYWNlc3NvKTtcbiAgICAgICAgdGhpcy51bHRpbWFDaGF2ZSA9IGNoYXZlO1xuICAgICAgICB0aGlzLnVsdGltYVNlc3NhbyA9IHtcbiAgICAgICAgICAgIGlkOiArK3RoaXMuc2VxdWVuY2lhLFxuICAgICAgICAgICAgaWRVc3VhcmlvOiBOdW1iZXIodXN1YXJpby51c3VhcmlvLmlkX3VzdWFyaW8pLFxuICAgICAgICAgICAgaWRFbXByZXNhOiBOdW1iZXIoYXR1YWwuaWRfZW1wcmVzYSksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnVsdGltYVNlc3NhbztcbiAgICB9XG59XG4iXX0=
@@ -1,59 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { NgModule } from '@angular/core';
3
- import { UiIconModule } from 'uitec-ng-icon';
4
- import { UiAssistantActionCardComponent } from './components/assistant-action-card/ui-assistant-action-card.component';
5
- import { UiAssistantButtonComponent } from './components/assistant-button/ui-assistant-button.component';
6
- import { UiAssistantComposerComponent } from './components/assistant-composer/ui-assistant-composer.component';
7
- import { UiAssistantLayoutComponent } from './components/assistant-layout/ui-assistant-layout.component';
8
- import { UiAssistantMessagesComponent } from './components/assistant-messages/ui-assistant-messages.component';
9
- import { UiAssistantPanelComponent } from './components/assistant-panel/ui-assistant-panel.component';
10
- import { UiAssistantTextComponent } from './components/assistant-text/ui-assistant-text.component';
11
- import { UINY_CONFIG } from './uiny.config';
12
- import * as i0 from "@angular/core";
13
- const COMPONENTES = [
14
- UiAssistantButtonComponent,
15
- UiAssistantLayoutComponent,
16
- UiAssistantPanelComponent,
17
- UiAssistantMessagesComponent,
18
- UiAssistantTextComponent,
19
- UiAssistantComposerComponent,
20
- UiAssistantActionCardComponent,
21
- ];
22
- export class UiAssistantModule {
23
- /** Importe uma vez no AppModule do consumidor. */
24
- static forRoot(config) {
25
- return {
26
- ngModule: UiAssistantModule,
27
- providers: [{ provide: UINY_CONFIG, useValue: config }]
28
- };
29
- }
30
- }
31
- UiAssistantModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
32
- UiAssistantModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantModule, declarations: [UiAssistantButtonComponent,
33
- UiAssistantLayoutComponent,
34
- UiAssistantPanelComponent,
35
- UiAssistantMessagesComponent,
36
- UiAssistantTextComponent,
37
- UiAssistantComposerComponent,
38
- UiAssistantActionCardComponent], imports: [CommonModule,
39
- UiIconModule], exports: [UiAssistantButtonComponent,
40
- UiAssistantLayoutComponent,
41
- UiAssistantPanelComponent,
42
- UiAssistantMessagesComponent,
43
- UiAssistantTextComponent,
44
- UiAssistantComposerComponent,
45
- UiAssistantActionCardComponent] });
46
- UiAssistantModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantModule, imports: [CommonModule,
47
- UiIconModule] });
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantModule, decorators: [{
49
- type: NgModule,
50
- args: [{
51
- declarations: COMPONENTES,
52
- imports: [
53
- CommonModule,
54
- UiIconModule
55
- ],
56
- exports: COMPONENTES
57
- }]
58
- }] });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktYXNzaXN0YW50Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWhlYWRlci9zcmMvbGliL2Fzc2lzdGFudC91aS1hc3Npc3RhbnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXVCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQy9HLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQy9HLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRW5HLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTVDLE1BQU0sV0FBVyxHQUFHO0lBQ2hCLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsNEJBQTRCO0lBQzVCLDhCQUE4QjtDQUNqQyxDQUFDO0FBVUYsTUFBTSxPQUFPLGlCQUFpQjtJQUMxQixrREFBa0Q7SUFDbEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFrQjtRQUM3QixPQUFPO1lBQ0gsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQzFELENBQUM7SUFDTixDQUFDOzsrR0FQUSxpQkFBaUI7Z0hBQWpCLGlCQUFpQixpQkFqQjFCLDBCQUEwQjtRQUMxQiwwQkFBMEI7UUFDMUIseUJBQXlCO1FBQ3pCLDRCQUE0QjtRQUM1Qix3QkFBd0I7UUFDeEIsNEJBQTRCO1FBQzVCLDhCQUE4QixhQU0xQixZQUFZO1FBQ1osWUFBWSxhQWJoQiwwQkFBMEI7UUFDMUIsMEJBQTBCO1FBQzFCLHlCQUF5QjtRQUN6Qiw0QkFBNEI7UUFDNUIsd0JBQXdCO1FBQ3hCLDRCQUE0QjtRQUM1Qiw4QkFBOEI7Z0hBV3JCLGlCQUFpQixZQUx0QixZQUFZO1FBQ1osWUFBWTs0RkFJUCxpQkFBaUI7a0JBUjdCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLFdBQVc7b0JBQ3pCLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLFlBQVk7cUJBQ2Y7b0JBQ0QsT0FBTyxFQUFFLFdBQVc7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVaUljb25Nb2R1bGUgfSBmcm9tICd1aXRlYy1uZy1pY29uJztcbmltcG9ydCB7IFVpQXNzaXN0YW50QWN0aW9uQ2FyZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hc3Npc3RhbnQtYWN0aW9uLWNhcmQvdWktYXNzaXN0YW50LWFjdGlvbi1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVaUFzc2lzdGFudEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hc3Npc3RhbnQtYnV0dG9uL3VpLWFzc2lzdGFudC1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFVpQXNzaXN0YW50Q29tcG9zZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXNzaXN0YW50LWNvbXBvc2VyL3VpLWFzc2lzdGFudC1jb21wb3Nlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVWlBc3Npc3RhbnRMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXNzaXN0YW50LWxheW91dC91aS1hc3Npc3RhbnQtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVaUFzc2lzdGFudE1lc3NhZ2VzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Fzc2lzdGFudC1tZXNzYWdlcy91aS1hc3Npc3RhbnQtbWVzc2FnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFVpQXNzaXN0YW50UGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXNzaXN0YW50LXBhbmVsL3VpLWFzc2lzdGFudC1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVWlBc3Npc3RhbnRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Fzc2lzdGFudC10ZXh0L3VpLWFzc2lzdGFudC10ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVaW55Q29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvdWlueS5tb2RlbHMnO1xuaW1wb3J0IHsgVUlOWV9DT05GSUcgfSBmcm9tICcuL3VpbnkuY29uZmlnJztcblxuY29uc3QgQ09NUE9ORU5URVMgPSBbXG4gICAgVWlBc3Npc3RhbnRCdXR0b25Db21wb25lbnQsXG4gICAgVWlBc3Npc3RhbnRMYXlvdXRDb21wb25lbnQsXG4gICAgVWlBc3Npc3RhbnRQYW5lbENvbXBvbmVudCxcbiAgICBVaUFzc2lzdGFudE1lc3NhZ2VzQ29tcG9uZW50LFxuICAgIFVpQXNzaXN0YW50VGV4dENvbXBvbmVudCxcbiAgICBVaUFzc2lzdGFudENvbXBvc2VyQ29tcG9uZW50LFxuICAgIFVpQXNzaXN0YW50QWN0aW9uQ2FyZENvbXBvbmVudCxcbl07XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBDT01QT05FTlRFUyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgVWlJY29uTW9kdWxlXG4gICAgXSxcbiAgICBleHBvcnRzOiBDT01QT05FTlRFU1xufSlcbmV4cG9ydCBjbGFzcyBVaUFzc2lzdGFudE1vZHVsZSB7XG4gICAgLyoqIEltcG9ydGUgdW1hIHZleiBubyBBcHBNb2R1bGUgZG8gY29uc3VtaWRvci4gKi9cbiAgICBzdGF0aWMgZm9yUm9vdChjb25maWc6IFVpbnlDb25maWcpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFVpQXNzaXN0YW50TW9kdWxlPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZ01vZHVsZTogVWlBc3Npc3RhbnRNb2R1bGUsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFVJTllfQ09ORklHLCB1c2VWYWx1ZTogY29uZmlnIH1dXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19