@esfaenza/extensions 15.2.45 → 16.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 (65) hide show
  1. package/{esm2020 → esm2022}/esfaenza-extensions.mjs +4 -4
  2. package/esm2022/lib/models/CallResult.mjs +24 -0
  3. package/esm2022/lib/models/CsvHeaders.mjs +26 -0
  4. package/{esm2020 → esm2022}/lib/models/ExportConsts.mjs +31 -31
  5. package/esm2022/lib/models/ExtensionsModuleConfig.mjs +10 -0
  6. package/esm2022/lib/models/GenericItem.mjs +10 -0
  7. package/{esm2020 → esm2022}/lib/models/InboundMessageTypes.mjs +6 -6
  8. package/esm2022/lib/models/InterComMessage.mjs +16 -0
  9. package/{esm2020 → esm2022}/lib/models/TypeCode.mjs +24 -24
  10. package/{esm2020 → esm2022}/lib/modules/extensions.module.mjs +32 -32
  11. package/esm2022/lib/pipes/loc_date.pipe.mjs +38 -0
  12. package/esm2022/lib/services/extensions.base.mjs +30 -0
  13. package/esm2022/lib/services/extensions.clipboard.service.mjs +221 -0
  14. package/esm2022/lib/services/extensions.dates.service.mjs +244 -0
  15. package/esm2022/lib/services/extensions.embedding.service.mjs +213 -0
  16. package/esm2022/lib/services/extensions.exports.service.mjs +617 -0
  17. package/esm2022/lib/services/extensions.hashing.service.mjs +308 -0
  18. package/esm2022/lib/services/extensions.intercom.service.mjs +52 -0
  19. package/esm2022/lib/services/extensions.messages.service.mjs +450 -0
  20. package/esm2022/lib/services/extensions.utilities.service.mjs +250 -0
  21. package/{esm2020 → esm2022}/lib/tokens.mjs +11 -11
  22. package/{esm2020 → esm2022}/public-api.mjs +21 -21
  23. package/{fesm2020 → fesm2022}/esfaenza-extensions.mjs +2509 -2441
  24. package/fesm2022/esfaenza-extensions.mjs.map +1 -0
  25. package/index.d.ts +5 -5
  26. package/lib/models/CallResult.d.ts +23 -23
  27. package/lib/models/CsvHeaders.d.ts +25 -25
  28. package/lib/models/ExportConsts.d.ts +31 -31
  29. package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
  30. package/lib/models/GenericItem.d.ts +9 -9
  31. package/lib/models/InboundMessageTypes.d.ts +5 -5
  32. package/lib/models/InterComMessage.d.ts +12 -12
  33. package/lib/models/TypeCode.d.ts +23 -23
  34. package/lib/modules/extensions.module.d.ts +11 -11
  35. package/lib/pipes/loc_date.pipe.d.ts +24 -24
  36. package/lib/services/extensions.base.d.ts +22 -22
  37. package/lib/services/extensions.clipboard.service.d.ts +54 -54
  38. package/lib/services/extensions.dates.service.d.ts +99 -99
  39. package/lib/services/extensions.embedding.service.d.ts +28 -28
  40. package/lib/services/extensions.exports.service.d.ts +234 -234
  41. package/lib/services/extensions.hashing.service.d.ts +121 -121
  42. package/lib/services/extensions.intercom.service.d.ts +28 -28
  43. package/lib/services/extensions.messages.service.d.ts +195 -195
  44. package/lib/services/extensions.utilities.service.d.ts +107 -107
  45. package/lib/tokens.d.ts +11 -11
  46. package/package.json +13 -19
  47. package/public-api.d.ts +18 -18
  48. package/esm2020/lib/models/CallResult.mjs +0 -6
  49. package/esm2020/lib/models/CsvHeaders.mjs +0 -6
  50. package/esm2020/lib/models/ExtensionsModuleConfig.mjs +0 -4
  51. package/esm2020/lib/models/GenericItem.mjs +0 -6
  52. package/esm2020/lib/models/InterComMessage.mjs +0 -14
  53. package/esm2020/lib/pipes/loc_date.pipe.mjs +0 -37
  54. package/esm2020/lib/services/extensions.base.mjs +0 -29
  55. package/esm2020/lib/services/extensions.clipboard.service.mjs +0 -219
  56. package/esm2020/lib/services/extensions.dates.service.mjs +0 -242
  57. package/esm2020/lib/services/extensions.embedding.service.mjs +0 -208
  58. package/esm2020/lib/services/extensions.exports.service.mjs +0 -615
  59. package/esm2020/lib/services/extensions.hashing.service.mjs +0 -310
  60. package/esm2020/lib/services/extensions.intercom.service.mjs +0 -54
  61. package/esm2020/lib/services/extensions.messages.service.mjs +0 -433
  62. package/esm2020/lib/services/extensions.utilities.service.mjs +0 -252
  63. package/fesm2015/esfaenza-extensions.mjs +0 -2513
  64. package/fesm2015/esfaenza-extensions.mjs.map +0 -1
  65. package/fesm2020/esfaenza-extensions.mjs.map +0 -1
@@ -1,433 +0,0 @@
1
- // Angular
2
- import { Injectable, Inject, Optional, Injector } from "@angular/core";
3
- // Configurazioni
4
- import { ToastrService } from "ngx-toastr";
5
- import swal from "sweetalert2";
6
- // RXJS
7
- import { of } from "rxjs";
8
- import { filter, first, map, take } from "rxjs/operators";
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@esfaenza/localizations";
11
- import * as i2 from "./extensions.hashing.service";
12
- /**
13
- * Service che fornisce funzionalità di alert nei tipi fondamentali: success, info, warning e danger
14
- */
15
- export class MessageService {
16
- /** Costruttore @ignore */
17
- constructor(injector, locProvider, hash) {
18
- this.injector = injector;
19
- this.locProvider = locProvider;
20
- this.hash = hash;
21
- /** Oggetto statico in supporto alla localizzazione */
22
- this.loc = {
23
- 'Confirm': { 'en-US': "Confirm", 'it-IT': "Conferma", },
24
- 'Cancel': { 'en-US': "Cancel", 'it-IT': "Annulla", },
25
- 'Close': { 'en-US': "Close", 'it-IT': "Chiudi", },
26
- 'Error': { 'en-US': "Error", 'it-IT': "Errore", },
27
- 'Info': { 'en-US': "Info", 'it-IT': "Informazione", },
28
- 'Success': { 'en-US': "Success", 'it-IT': "Successo", },
29
- 'Warning': { 'en-US': "Warning", 'it-IT': "Attenzione", }
30
- };
31
- /** Supporto all'Embedding */
32
- this.Embedded = false;
33
- this.MainWindow = null;
34
- this.MessageObserver = null;
35
- this.GuidRepsonseFunctionsMap = {};
36
- this.init();
37
- }
38
- /** Getter per il servizio dei toast. ngx-toastr è fatta talmente male che la service dev'essere recuperata in questo modo */
39
- get toastr() {
40
- return this.injector.get(ToastrService);
41
- }
42
- configureEmbeddability(mainWindow, messageObserver) {
43
- this.Embedded = true;
44
- this.MainWindow = mainWindow;
45
- this.MessageObserver = messageObserver;
46
- }
47
- async init() {
48
- let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
49
- this.expiredSessionSwal = swal.mixin({
50
- showCancelButton: false,
51
- confirmButtonText: 'Login',
52
- customClass: {
53
- confirmButton: "btn btn-primary",
54
- container: "app-wrap",
55
- },
56
- buttonsStyling: false,
57
- reverseButtons: false,
58
- allowOutsideClick: false,
59
- icon: "warning"
60
- });
61
- this.successSwalWithCancel = swal.mixin({
62
- title: this.loc["Success"][LOCALE],
63
- customClass: {
64
- confirmButton: "btn btn-primary",
65
- cancelButton: "btn btn-secondary app-margin-right-10",
66
- container: "app-wrap",
67
- },
68
- buttonsStyling: false,
69
- reverseButtons: true,
70
- showCancelButton: true,
71
- confirmButtonText: this.loc["Confirm"][LOCALE],
72
- cancelButtonText: this.loc["Cancel"][LOCALE],
73
- icon: "success"
74
- });
75
- this.warningSwalWithCancel = swal.mixin({
76
- title: this.loc["Warning"][LOCALE],
77
- customClass: {
78
- confirmButton: "btn btn-primary",
79
- cancelButton: "btn btn-secondary app-margin-right-10",
80
- container: "app-wrap",
81
- },
82
- buttonsStyling: false,
83
- reverseButtons: true,
84
- showCancelButton: true,
85
- confirmButtonText: this.loc["Confirm"][LOCALE],
86
- cancelButtonText: this.loc["Cancel"][LOCALE],
87
- icon: "warning"
88
- });
89
- this.warningSwal = swal.mixin({
90
- title: this.loc["Warning"][LOCALE],
91
- customClass: {
92
- confirmButton: "btn btn-primary",
93
- container: "app-wrap",
94
- },
95
- buttonsStyling: false,
96
- reverseButtons: true,
97
- showCancelButton: false,
98
- confirmButtonText: this.loc["Close"][LOCALE],
99
- icon: "warning"
100
- });
101
- this.successSwal = swal.mixin({
102
- title: this.loc["Success"][LOCALE],
103
- customClass: {
104
- confirmButton: "btn btn-primary",
105
- container: "app-wrap",
106
- },
107
- buttonsStyling: false,
108
- reverseButtons: true,
109
- showCancelButton: false,
110
- confirmButtonText: this.loc["Close"][LOCALE],
111
- icon: "success"
112
- });
113
- this.errorSwal = swal.mixin({
114
- title: this.loc["Error"][LOCALE],
115
- customClass: {
116
- confirmButton: "btn btn-primary",
117
- container: "app-wrap",
118
- },
119
- buttonsStyling: false,
120
- reverseButtons: true,
121
- showCancelButton: false,
122
- confirmButtonText: this.loc["Close"][LOCALE],
123
- icon: "error"
124
- });
125
- this.infoSwal = swal.mixin({
126
- title: this.loc["Info"][LOCALE],
127
- customClass: {
128
- confirmButton: "btn btn-primary",
129
- container: "app-wrap",
130
- },
131
- buttonsStyling: false,
132
- reverseButtons: true,
133
- showCancelButton: false,
134
- confirmButtonText: this.loc["Close"][LOCALE],
135
- icon: "info"
136
- });
137
- }
138
- /**
139
- * Presentazione di un semplice messaggio di successo
140
- *
141
- * Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
142
- * Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
143
- *
144
- * @param {string} text Testo da mostrare
145
- * @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
146
- */
147
- simpleSuccess(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
148
- if (this.Embedded) {
149
- this.MainWindow.postMessage({ type: "alert", level: 'success', msg: text }, "*");
150
- return;
151
- }
152
- let tos = this.toastrOrSwal(secondaryNotificationType);
153
- if (tos == "swal")
154
- this.successSwal.fire("", text);
155
- else
156
- this.toastr.success(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
157
- }
158
- /**
159
- * Presentazione di un semplice messaggio di informazione
160
- *
161
- * Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
162
- * Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
163
- *
164
- * @param {string} text Testo da mostrare
165
- * @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
166
- */
167
- simpleInfo(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
168
- if (this.Embedded) {
169
- this.MainWindow.postMessage({ type: "alert", level: 'info', msg: text }, "*");
170
- return;
171
- }
172
- let tos = this.toastrOrSwal(secondaryNotificationType);
173
- if (tos == "swal")
174
- this.infoSwal.fire("", text);
175
- else
176
- this.toastr.info(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
177
- }
178
- /**
179
- * Presentazione di un semplice messaggio di errore
180
- *
181
- * Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
182
- * Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
183
- *
184
- * @param {string} text Testo da mostrare
185
- * @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
186
- */
187
- simpleError(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
188
- if (this.Embedded) {
189
- this.MainWindow.postMessage({ type: "alert", level: 'error', msg: text }, "*");
190
- return;
191
- }
192
- let tos = this.toastrOrSwal(secondaryNotificationType);
193
- if (tos == "swal")
194
- this.errorSwal.fire("", text);
195
- else
196
- this.toastr.error(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
197
- }
198
- /**
199
- * Presentazione di un semplice messaggio di avviso
200
- *
201
- * Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
202
- * Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
203
- *
204
- * @param {string} text Testo da mostrare
205
- * @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
206
- */
207
- simpleWarning(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
208
- if (this.Embedded) {
209
- this.MainWindow.postMessage({ type: "alert", level: 'warning', msg: text }, "*");
210
- return;
211
- }
212
- let tos = this.toastrOrSwal(secondaryNotificationType);
213
- if (tos == "swal")
214
- this.warningSwal.fire("", text);
215
- else
216
- this.toastr.warning(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
217
- }
218
- /**
219
- * Ripulisce tutti i messaggi presenti in un dato momento sullo schermo
220
- */
221
- clearMessages() {
222
- this.toastr.clear();
223
- swal.close();
224
- }
225
- /**
226
- * Mostra un messaggio di avviso con richiesta di conferma
227
- *
228
- * @param {string} title Titolo del messaggio
229
- * @param {string} text Contenuto del messaggio
230
- *
231
- * @returns {Promise} Restituisce una Promise col risultato scelto dall'utente (conferma o no)
232
- */
233
- promiseWarningWithChoice(title, text) {
234
- return this.warningSwalWithCancel.fire(title, text);
235
- }
236
- /**
237
- * In base alla configurazione attuale e all'eventuale override per la chiamata del caso indica se bisogna utilizzare toastr o sweetalert
238
- *
239
- * @param {"toastr" | "swal" | null} providerOverride Override alla modalità configurata
240
- *
241
- * @returns {"toastr" | "swal"} Indicazione su che provider di messaggi di avviso debba essere utilizzato
242
- */
243
- toastrOrSwal(providerOverride) {
244
- if (providerOverride != null)
245
- return providerOverride;
246
- return "swal";
247
- }
248
- simpleWarningWithChoice(title, text, onsuccess, onerror, confirmtext = "", aborttext = '') {
249
- this.withChoiceBase("warning", title, text, onsuccess, onerror, confirmtext, aborttext);
250
- }
251
- simpleSuccessWithChoice(title, text, onsuccess, onerror, confirmtext = "", aborttext = '') {
252
- this.withChoiceBase("success", title, text, onsuccess, onerror, confirmtext, aborttext);
253
- }
254
- withChoiceBase(level, title, text, onsuccess, onerror, confirmtext = "", aborttext = '') {
255
- if (this.Embedded) {
256
- let guid = this.hash.getGUID();
257
- this.GuidRepsonseFunctionsMap[guid] = { onsuccess, onerror };
258
- this.MainWindow.postMessage({ type: "confirm", level, title, text, guid }, "*");
259
- // Observe sulla risposta
260
- console.log("Inviata confirm request alla pagina principale, in attesa di risposta...");
261
- this.MessageObserver.pipe(filter(event => event?.data?.type == "confirm-response" && event?.data?.guid == guid), take(1)).subscribe(event => {
262
- console.log("Event listener su window-message. Risposta pergiunta");
263
- if (event?.data?.result === true)
264
- this.GuidRepsonseFunctionsMap[guid].onsuccess();
265
- else if (event?.data?.result === true)
266
- this.GuidRepsonseFunctionsMap[guid].onerror();
267
- });
268
- }
269
- else
270
- (level == "warning" ? this._simpleWarningWithChoice.bind(this) : this._simpleSuccessWithChoice.bind(this))(title, text, onsuccess, onerror, confirmtext, aborttext);
271
- }
272
- /**
273
- * Mostra un messaggio di avviso con richiesta di conferma e gestisce il risultato chiamato i callback **onsuccess** o **onerror**
274
- *
275
- * @param {string} title Titolo del messaggio
276
- * @param {string} text Contenuto del messaggio
277
- * @param {Function} onsuccess Callback da chimare su conferma
278
- * @param {Function} onerror Callback da chimare su errori
279
- */
280
- _simpleWarningWithChoice(title, text, onconfirm = null, onabort = null, confirmtext = "", aborttext = '') {
281
- this._simpleWithChoice(this.warningSwalWithCancel, title, text, onconfirm, onabort, confirmtext, aborttext);
282
- }
283
- /**
284
- * Mostra un messaggio di success con richiesta di conferma e gestisce il risultato chiamato i callback **onconfirm** o **onabort**
285
- *
286
- * @param {string} title Titolo del messaggio
287
- * @param {string} text Contenuto del messaggio
288
- * @param {Function} onconfirm Callback da chimare su conferma
289
- * @param {Function} onabort Callback da chimare su annullamento
290
- * @param {string} confirmtext Testo del pulsante di azione
291
- * @param {string} aborttext Testo del pulsante di annullamento
292
- */
293
- _simpleSuccessWithChoice(title, text, onconfirm = null, onabort = null, confirmtext = "", aborttext = '') {
294
- this._simpleWithChoice(this.successSwalWithCancel, title, text, onconfirm, onabort, confirmtext, aborttext);
295
- }
296
- /**
297
- * Metodo base per richiedere una scelta all'utente
298
- *
299
- * @param {any} swal Swal mixin da utilizzare per visualizzare il messaggio di choice
300
- * @param {string} title Titolo del messaggio
301
- * @param {string} text Contenuto del messaggio
302
- * @param {Function} onconfirm Callback da chimare su conferma
303
- * @param {Function} onabort Callback da chimare su annullamento
304
- * @param {string} confirmtext Testo del pulsante di azione
305
- * @param {string} aborttext Testo del pulsante di annullamento
306
- */
307
- _simpleWithChoice(swal, title, text, onconfirm = null, onabort = null, confirmtext = "", aborttext = '') {
308
- var configuration = {
309
- title: title,
310
- html: text
311
- };
312
- if (confirmtext)
313
- configuration["confirmButtonText"] = confirmtext;
314
- if (aborttext)
315
- configuration["cancelButtonText"] = aborttext;
316
- swal.fire(configuration).then((result) => {
317
- if (result.value && onconfirm)
318
- onconfirm();
319
- else if (onabort)
320
- onabort();
321
- });
322
- }
323
- /**
324
- * Mostra un messaggio di avviso con richiesta di conferma e gestisce il risultato chiamato i callback **onsuccess** o **onerror**
325
- *
326
- * @param {string} title Titolo del messaggio
327
- * @param {string} text Contenuto del messaggio
328
- */
329
- observableSimpleWarningWithChoice(title, text) {
330
- return of(this.warningSwalWithCancel.fire(title, text)).pipe(map(t => !!t.value));
331
- }
332
- /**
333
- * Mostra un messaggio di avviso che la sessione corrente è scaduta e propone all'utente di navigare al login. Qualora l'utente decidesse di farlo
334
- * verrà chiamata la funzione di callback **onnavigate
335
- *
336
- * @param {string} title Titolo del messaggio
337
- * @param {string} text Contenuto del messaggio
338
- * @param {Function} onnavigate Callback da chimare su navigazione in corso
339
- */
340
- expiredSessionMessage(title, text, onnavigate = null) {
341
- this.expiredSessionSwal.fire(title, text).then((result) => {
342
- if (result.value && onnavigate)
343
- onnavigate();
344
- });
345
- }
346
- /**
347
- * Metodo helper per gestire in maniera standardizzata una risposta di tipo **CallResult**
348
- *
349
- * @param {CallResult} response Risposta ricevuta dal server
350
- * @param {string} successMsg Messaggio da visualizzare in caso di successo
351
- * @param {string} errorMsg Messaggio da visualizzare in caso di fallimento
352
- * @param {Function} postSuccess Callback da chimare in caso di successo
353
- * @param {Function} postFailure Callback da chimare in caso di fallimento
354
- */
355
- manageCallResultResponse(response, successMsg, errorMsg, postSuccess = null, postFailure = null) {
356
- let anyReponse = response;
357
- if (response.success || anyReponse.Success) {
358
- if (response.haswarning || anyReponse.HasWarning)
359
- this.simpleWarning(response.warning || anyReponse.Warning);
360
- else if (successMsg)
361
- this.simpleSuccess(successMsg);
362
- if (postSuccess)
363
- postSuccess();
364
- }
365
- else {
366
- this.simpleError((errorMsg ? errorMsg + ": " : "") + ((response.haserror || anyReponse.HasError) ? (response.error || anyReponse.Error) : '[NO ERR.]'));
367
- if (postFailure)
368
- postFailure();
369
- }
370
- }
371
- /**
372
- * Metodo helper per gestire in maniera standardizzata una risposta di tipo **string**, considerando che:
373
- *
374
- * Stringa vuota --> Tutto bene
375
- *
376
- * Stringa piena --> Questo è il messaggio d'errore per cui la chiamata è fallita
377
- *
378
- * @param {string} response Risposta ricevuta dal server
379
- * @param {string} successMsg Messaggio da visualizzare in caso di successo
380
- * @param {string} errorMsg Messaggio da visualizzare in caso di fallimento
381
- * @param {Function} postSuccess Callback da chimare in caso di successo
382
- * @param {Function} postFailure Callback da chimare in caso di fallimento
383
- */
384
- manageStringResponse(response, successMsg, errorMsg, postSuccess = null, postFailure = null) {
385
- if (!response) {
386
- if (successMsg)
387
- this.simpleSuccess(successMsg);
388
- if (postSuccess)
389
- postSuccess();
390
- }
391
- else {
392
- if (errorMsg)
393
- this.simpleError(errorMsg + ": " + response);
394
- if (postFailure)
395
- postFailure();
396
- }
397
- }
398
- /**
399
- * Metodo helper per gestire in maniera standardizzata una risposta di tipo **boolean**
400
- *
401
- * @param {string} response Risposta ricevuta dal server
402
- * @param {string} successMsg Messaggio da visualizzare in caso di successo
403
- * @param {string} errorMsg Messaggio da visualizzare in caso di fallimento
404
- * @param {Function} postSuccess Callback da chimare in caso di successo
405
- * @param {Function} postFailure Callback da chimare in caso di fallimento
406
- */
407
- manageStringResponseBool(response, successMsg, errorMsg, postSuccess = null, postFailure = null) {
408
- if (response) {
409
- if (successMsg)
410
- this.simpleSuccess(successMsg);
411
- if (postSuccess)
412
- postSuccess();
413
- }
414
- else {
415
- if (errorMsg)
416
- this.simpleError(errorMsg);
417
- if (postFailure)
418
- postFailure();
419
- }
420
- }
421
- }
422
- MessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MessageService, deps: [{ token: Injector }, { token: i1.BaseLocalization, optional: true }, { token: i2.HashingService }], target: i0.ɵɵFactoryTarget.Injectable });
423
- MessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MessageService, providedIn: "root" });
424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MessageService, decorators: [{
425
- type: Injectable,
426
- args: [{ providedIn: "root" }]
427
- }], ctorParameters: function () { return [{ type: i0.Injector, decorators: [{
428
- type: Inject,
429
- args: [Injector]
430
- }] }, { type: i1.BaseLocalization, decorators: [{
431
- type: Optional
432
- }] }, { type: i2.HashingService }]; } });
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5tZXNzYWdlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMubWVzc2FnZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUt2RSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFFL0IsT0FBTztBQUNQLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQVMxRDs7R0FFRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBNEN2QiwyQkFBMkI7SUFDM0IsWUFBNkMsUUFBa0IsRUFBc0IsV0FBNkIsRUFBVSxJQUFvQjtRQUFuRyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQXNCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWdCO1FBM0NoSixzREFBc0Q7UUFDOUMsUUFBRyxHQUFHO1lBQ1YsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHO1lBQ3ZELFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsR0FBRztZQUNwRCxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUc7WUFDakQsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFB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Y1EsY0FBYyxrQkE2Q0ksUUFBUTsrR0E3QzFCLGNBQWMsY0FERCxNQUFNOzJGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBOENWLE1BQU07MkJBQUMsUUFBUTs7MEJBQStCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwsIEluamVjdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzXHJcbmltcG9ydCB7IEJhc2VMb2NhbGl6YXRpb24gfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tIFwibmd4LXRvYXN0clwiO1xyXG5pbXBvcnQgc3dhbCBmcm9tIFwic3dlZXRhbGVydDJcIjtcclxuXHJcbi8vIFJYSlNcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHRha2UgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQ2FsbFJlc3VsdCB9IGZyb20gXCIuLi9tb2RlbHMvQ2FsbFJlc3VsdFwiO1xyXG5cclxuLy8gU2Vydml6aVxyXG5pbXBvcnQgeyBBcHBFbWJlZGRpbmdFeHRlbnNpb25zIH0gZnJvbSBcIi4vZXh0ZW5zaW9ucy5lbWJlZGRpbmcuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBIYXNoaW5nU2VydmljZSB9IGZyb20gXCIuL2V4dGVuc2lvbnMuaGFzaGluZy5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogU2VydmljZSBjaGUgZm9ybmlzY2UgZnVuemlvbmFsaXTDoCBkaSBhbGVydCBuZWkgdGlwaSBmb25kYW1lbnRhbGk6IHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcgZSBkYW5nZXJcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VTZXJ2aWNlIHtcclxuXHJcbiAgICAvKiogT2dnZXR0byBzdGF0aWNvIGluIHN1cHBvcnRvIGFsbGEgbG9jYWxpenphemlvbmUgKi9cclxuICAgIHByaXZhdGUgbG9jID0ge1xyXG4gICAgICAgICdDb25maXJtJzogeyAnZW4tVVMnOiBcIkNvbmZpcm1cIiwgJ2l0LUlUJzogXCJDb25mZXJtYVwiLCB9LFxyXG4gICAgICAgICdDYW5jZWwnOiB7ICdlbi1VUyc6IFwiQ2FuY2VsXCIsICdpdC1JVCc6IFwiQW5udWxsYVwiLCB9LFxyXG4gICAgICAgICdDbG9zZSc6IHsgJ2VuLVVTJzogXCJDbG9zZVwiLCAnaXQtSVQnOiBcIkNoaXVkaVwiLCB9LFxyXG4gICAgICAgICdFcnJvcic6IHsgJ2VuLVVTJzogXCJFcnJvclwiLCAnaXQtSVQnOiBcIkVycm9yZVwiLCB9LFxyXG4gICAgICAgICdJbmZvJzogeyAnZW4tVVMnOiBcIkluZm9cIiwgJ2l0LUlUJzogXCJJbmZvcm1hemlvbmVcIiwgfSxcclxuICAgICAgICAnU3VjY2Vzcyc6IHsgJ2VuLVVTJzogXCJTdWNjZXNzXCIsICdpdC1JVCc6IFwiU3VjY2Vzc29cIiwgfSxcclxuICAgICAgICAnV2FybmluZyc6IHsgJ2VuLVVTJzogXCJXYXJuaW5nXCIsICdpdC1JVCc6IFwiQXR0ZW56aW9uZVwiLCB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBkaSB1biB3YXJuaW5nIGNvbiByaWNoaWVzdGEgZGkgY29uZmVybWEgKi9cclxuICAgIHByaXZhdGUgd2FybmluZ1N3YWxXaXRoQ2FuY2VsOiBhbnk7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIGRpIHVuIHdhcm5pbmcgY29uIHJpY2hpZXN0YSBkaSBjb25mZXJtYSAqL1xyXG4gICAgcHJpdmF0ZSBzdWNjZXNzU3dhbFdpdGhDYW5jZWw6IGFueTtcclxuXHJcbiAgICAvKiogVGVtcGxhdGUgZGkgdW4gZXJyb3JlICovXHJcbiAgICBwcml2YXRlIGVycm9yU3dhbDogYW55O1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBkaSB1biBtZXNzYWdnaW8gZGkgc3VjY2Vzc28gKi9cclxuICAgIHByaXZhdGUgc3VjY2Vzc1N3YWw6IGFueTtcclxuXHJcbiAgICAvKiogVGVtcGxhdGUgZGkgdW4gYXZ2aXNvICovXHJcbiAgICBwcml2YXRlIHdhcm5pbmdTd2FsOiBhbnk7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIGRpIHVuIG1lc3NhZ2dpbyBpbmZvcm1hdGl2byAqL1xyXG4gICAgcHJpdmF0ZSBpbmZvU3dhbDogYW55O1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBkaSB1biB3YXJuaW5nIHBlciBsYSBzZXNzaW9uZSBzY2FkdXRhICovXHJcbiAgICBwcml2YXRlIGV4cGlyZWRTZXNzaW9uU3dhbDogYW55O1xyXG5cclxuICAgIC8qKiBHZXR0ZXIgcGVyIGlsIHNlcnZpemlvIGRlaSB0b2FzdC4gbmd4LXRvYXN0ciDDqCBmYXR0YSB0YWxtZW50ZSBtYWxlIGNoZSBsYSBzZXJ2aWNlIGRldidlc3NlcmUgcmVjdXBlcmF0YSBpbiBxdWVzdG8gbW9kbyAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgdG9hc3RyKCk6IFRvYXN0clNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChUb2FzdHJTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU3VwcG9ydG8gYWxsJ0VtYmVkZGluZyAqL1xyXG4gICAgRW1iZWRkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIE1haW5XaW5kb3c6IFdpbmRvdyA9IG51bGw7XHJcbiAgICBNZXNzYWdlT2JzZXJ2ZXI6IFN1YmplY3Q8eyBldmVudDogYW55LCBkYXRhOiBhbnkgfT4gPSBudWxsO1xyXG5cclxuICAgIC8qKiBDb3N0cnV0dG9yZSAgQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKEBJbmplY3QoSW5qZWN0b3IpIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBAT3B0aW9uYWwoKSBwcml2YXRlIGxvY1Byb3ZpZGVyOiBCYXNlTG9jYWxpemF0aW9uLCBwcml2YXRlIGhhc2g6IEhhc2hpbmdTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbmZpZ3VyZUVtYmVkZGFiaWxpdHkobWFpbldpbmRvdzogV2luZG93LCBtZXNzYWdlT2JzZXJ2ZXI6IFN1YmplY3Q8eyBldmVudDogYW55LCBkYXRhOiBhbnkgfT4pIHtcclxuICAgICAgICB0aGlzLkVtYmVkZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLk1haW5XaW5kb3cgPSBtYWluV2luZG93O1xyXG4gICAgICAgIHRoaXMuTWVzc2FnZU9ic2VydmVyID0gbWVzc2FnZU9ic2VydmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKSB7XHJcbiAgICAgICAgbGV0IExPQ0FMRSA9IHRoaXMubG9jUHJvdmlkZXIgPyBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuXHJcbiAgICAgICAgdGhpcy5leHBpcmVkU2Vzc2lvblN3YWwgPSBzd2FsLm1peGluKHtcclxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnTG9naW4nLFxyXG4gICAgICAgICAgICBjdXN0b21DbGFzczoge1xyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBidXR0b25zU3R5bGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1Y2Nlc3NTd2FsV2l0aENhbmNlbCA9IHN3YWwubWl4aW4oe1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5sb2NbXCJTdWNjZXNzXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiBcImJ0biBidG4tc2Vjb25kYXJ5IGFwcC1tYXJnaW4tcmlnaHQtMTBcIixcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBidXR0b25zU3R5bGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDb25maXJtXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IHRoaXMubG9jW1wiQ2FuY2VsXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMud2FybmluZ1N3YWxXaXRoQ2FuY2VsID0gc3dhbC5taXhpbih7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIldhcm5pbmdcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M6IHtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b246IFwiYnRuIGJ0bi1wcmltYXJ5XCIsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b246IFwiYnRuIGJ0bi1zZWNvbmRhcnkgYXBwLW1hcmdpbi1yaWdodC0xMFwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNvbmZpcm1cIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDYW5jZWxcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgaWNvbjogXCJ3YXJuaW5nXCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy53YXJuaW5nU3dhbCA9IHN3YWwubWl4aW4oe1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5sb2NbXCJXYXJuaW5nXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDbG9zZVwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1Y2Nlc3NTd2FsID0gc3dhbC5taXhpbih7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIlN1Y2Nlc3NcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M6IHtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b246IFwiYnRuIGJ0bi1wcmltYXJ5XCIsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IFwiYXBwLXdyYXBcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYnV0dG9uc1N0eWxpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcclxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNsb3NlXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3JTd2FsID0gc3dhbC5taXhpbih7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIkVycm9yXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDbG9zZVwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICBpY29uOiBcImVycm9yXCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbmZvU3dhbCA9IHN3YWwubWl4aW4oe1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5sb2NbXCJJbmZvXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDbG9zZVwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICBpY29uOiBcImluZm9cIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXNlbnRhemlvbmUgZGkgdW4gc2VtcGxpY2UgbWVzc2FnZ2lvIGRpIHN1Y2Nlc3NvXHJcbiAgICAgKiBcclxuICAgICAqIFNlIHZpZW5lIGNoaWFtYXRvIGNvbiBsZSBpbXBvc3RhemlvbmkgZGkgZGVmYXVsdCBlIHRvYXN0ciDDqCBhYmlsaXRhdG8sIHZpZW5lIG1vc3RyYXRvIGFsIGNlbnRyb1xyXG4gICAgICogU2UgdmllbmUgY2hpYW1hdG8gY29uIG92ZXJyaWRlIHN1IHRvYXN0ciB2dW9sIGRpcmUgY2hlIMOoIHVuYSBub3RpZmljYSBzZWNvbmRhcmlhIGUgYXBwYXJlIGluIGFsdG8gYSBkZXN0cmFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGVzdG8gZGEgbW9zdHJhcmVcclxuICAgICAqIEBwYXJhbSB7XCJ0b2FzdHJcIiB8IFwic3dhbFwiIHwgbnVsbH0gc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVHlwZSBRdWFsb3JhIHNpYSB1bmEgbm90aWZpY2Egc2Vjb25kYXJpYSwgbmUgaW5kaWNhIGlsIHRpcG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNpbXBsZVN1Y2Nlc3ModGV4dDogc3RyaW5nLCBzZWNvbmRhcnlOb3RpZmljYXRpb25UeXBlOiBcInRvYXN0clwiIHwgXCJzd2FsXCIgfCBudWxsID0gbnVsbCwgc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVGltZW91dDogbnVtYmVyID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLkVtYmVkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuTWFpbldpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwiYWxlcnRcIiwgbGV2ZWw6ICdzdWNjZXNzJywgbXNnOiB0ZXh0IH0sIFwiKlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvcyA9IHRoaXMudG9hc3RyT3JTd2FsKHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUpO1xyXG5cclxuICAgICAgICBpZiAodG9zID09IFwic3dhbFwiKSB0aGlzLnN1Y2Nlc3NTd2FsLmZpcmUoXCJcIiwgdGV4dCk7XHJcbiAgICAgICAgZWxzZSB0aGlzLnRvYXN0ci5zdWNjZXNzKHRleHQsIG51bGwsIHsgcG9zaXRpb25DbGFzczogdG9zID09IFwidG9hc3RyXCIgPyBcInRvYXN0LXRvcC1yaWdodFwiIDogXCJ0b2FzdC10b3AtY2VudGVyXCIsIHRpbWVPdXQ6IHNlY29uZGFyeU5vdGlmaWNhdGlvblRpbWVvdXQgfHwgKHRvcyA9PSBcInRvYXN0clwiID8gMCA6IDUwMDApLCBleHRlbmRlZFRpbWVPdXQ6IHRvcyA9PSBcInRvYXN0clwiID8gMCA6IDEwMDAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVzZW50YXppb25lIGRpIHVuIHNlbXBsaWNlIG1lc3NhZ2dpbyBkaSBpbmZvcm1hemlvbmVcclxuICAgICAqIFxyXG4gICAgICogU2UgdmllbmUgY2hpYW1hdG8gY29uIGxlIGltcG9zdGF6aW9uaSBkaSBkZWZhdWx0IGUgdG9hc3RyIMOoIGFiaWxpdGF0bywgdmllbmUgbW9zdHJhdG8gYWwgY2VudHJvXHJcbiAgICAgKiBTZSB2aWVuZSBjaGlhbWF0byBjb24gb3ZlcnJpZGUgc3UgdG9hc3RyIHZ1b2wgZGlyZSBjaGUgw6ggdW5hIG5vdGlmaWNhIHNlY29uZGFyaWEgZSBhcHBhcmUgaW4gYWx0byBhIGRlc3RyYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXN0byBkYSBtb3N0cmFyZVxyXG4gICAgICogQHBhcmFtIHtcInRvYXN0clwiIHwgXCJzd2FsXCIgfCBudWxsfSBzZWNvbmRhcnlOb3RpZmljYXRpb25UeXBlIFF1YWxvcmEgc2lhIHVuYSBub3RpZmljYSBzZWNvbmRhcmlhLCBuZSBpbmRpY2EgaWwgdGlwb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2ltcGxlSW5mbyh0ZXh0OiBzdHJpbmcsIHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGU6IFwidG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGwgPSBudWxsLCBzZWNvbmRhcnlOb3RpZmljYXRpb25UaW1lb3V0OiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRW1iZWRkZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5NYWluV2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJhbGVydFwiLCBsZXZlbDogJ2luZm8nLCBtc2c6IHRleHQgfSwgXCIqXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG9zID0gdGhpcy50b2FzdHJPclN3YWwoc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0b3MgPT0gXCJzd2FsXCIpIHRoaXMuaW5mb1N3YWwuZmlyZShcIlwiLCB0ZXh0KTtcclxuICAgICAgICBlbHNlIHRoaXMudG9hc3RyLmluZm8odGV4dCwgbnVsbCwgeyBwb3NpdGlvbkNsYXNzOiB0b3MgPT0gXCJ0b2FzdHJcIiA/IFwidG9hc3QtdG9wLXJpZ2h0XCIgOiBcInRvYXN0LXRvcC1jZW50ZXJcIiwgdGltZU91dDogc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVGltZW91dCB8fCAodG9zID09IFwidG9hc3RyXCIgPyAwIDogNTAwMCksIGV4dGVuZGVkVGltZU91dDogdG9zID09IFwidG9hc3RyXCIgPyAwIDogMTAwMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXNlbnRhemlvbmUgZGkgdW4gc2VtcGxpY2UgbWVzc2FnZ2lvIGRpIGVycm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBTZSB2aWVuZSBjaGlhbWF0byBjb24gbGUgaW1wb3N0YXppb25pIGRpIGRlZmF1bHQgZSB0b2FzdHIgw6ggYWJpbGl0YXRvLCB2aWVuZSBtb3N0cmF0byBhbCBjZW50cm9cclxuICAgICAqIFNlIHZpZW5lIGNoaWFtYXRvIGNvbiBvdmVycmlkZSBzdSB0b2FzdHIgdnVvbCBkaXJlIGNoZSDDqCB1bmEgbm90aWZpY2Egc2Vjb25kYXJpYSBlIGFwcGFyZSBpbiBhbHRvIGEgZGVzdHJhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIG1vc3RyYXJlXHJcbiAgICAgKiBAcGFyYW0ge1widG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGx9IHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUgUXVhbG9yYSBzaWEgdW5hIG5vdGlmaWNhIHNlY29uZGFyaWEsIG5lIGluZGljYSBpbCB0aXBvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaW1wbGVFcnJvcih0ZXh0OiBzdHJpbmcsIHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGU6IFwidG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGwgPSBudWxsLCBzZWNvbmRhcnlOb3RpZmljYXRpb25UaW1lb3V0OiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRW1iZWRkZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5NYWluV2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJhbGVydFwiLCBsZXZlbDogJ2Vycm9yJywgbXNnOiB0ZXh0IH0sIFwiKlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvcyA9IHRoaXMudG9hc3RyT3JTd2FsKHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUpO1xyXG5cclxuICAgICAgICBpZiAodG9zID09IFwic3dhbFwiKSB0aGlzLmVycm9yU3dhbC5maXJlKFwiXCIsIHRleHQpO1xyXG4gICAgICAgIGVsc2UgdGhpcy50b2FzdHIuZXJyb3IodGV4dCwgbnVsbCwgeyBwb3NpdGlvbkNsYXNzOiB0b3MgPT0gXCJ0b2FzdHJcIiA/IFwidG9hc3QtdG9wLXJpZ2h0XCIgOiBcInRvYXN0LXRvcC1jZW50ZXJcIiwgdGltZU91dDogc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVGltZW91dCB8fCAodG9zID09IFwidG9hc3RyXCIgPyAwIDogNTAwMCksIGV4dGVuZGVkVGltZU91dDogdG9zID09IFwidG9hc3RyXCIgPyAwIDogMTAwMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXNlbnRhemlvbmUgZGkgdW4gc2VtcGxpY2UgbWVzc2FnZ2lvIGRpIGF2dmlzb1xyXG4gICAgICogXHJcbiAgICAgKiBTZSB2aWVuZSBjaGlhbWF0byBjb24gbGUgaW1wb3N0YXppb25pIGRpIGRlZmF1bHQgZSB0b2FzdHIgw6ggYWJpbGl0YXRvLCB2aWVuZSBtb3N0cmF0byBhbCBjZW50cm9cclxuICAgICAqIFNlIHZpZW5lIGNoaWFtYXRvIGNvbiBvdmVycmlkZSBzdSB0b2FzdHIgdnVvbCBkaXJlIGNoZSDDqCB1bmEgbm90aWZpY2Egc2Vjb25kYXJpYSBlIGFwcGFyZSBpbiBhbHRvIGEgZGVzdHJhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIG1vc3RyYXJlXHJcbiAgICAgKiBAcGFyYW0ge1widG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGx9IHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUgUXVhbG9yYSBzaWEgdW5hIG5vdGlmaWNhIHNlY29uZGFyaWEsIG5lIGluZGljYSBpbCB0aXBvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaW1wbGVXYXJuaW5nKHRleHQ6IHN0cmluZywgc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVHlwZTogXCJ0b2FzdHJcIiB8IFwic3dhbFwiIHwgbnVsbCA9IG51bGwsIHNlY29uZGFyeU5vdGlmaWNhdGlvblRpbWVvdXQ6IG51bWJlciA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5FbWJlZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLk1haW5XaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlOiBcImFsZXJ0XCIsIGxldmVsOiAnd2FybmluZycsIG1zZzogdGV4dCB9LCBcIipcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3MgPSB0aGlzLnRvYXN0ck9yU3dhbChzZWNvbmRhcnlOb3RpZmljYXRpb25UeXBlKTtcclxuXHJcbiAgICAgICAgaWYgKHRvcyA9PSBcInN3YWxcIikgdGhpcy53YXJuaW5nU3dhbC5maXJlKFwiXCIsIHRleHQpO1xyXG4gICAgICAgIGVsc2UgdGhpcy50b2FzdHIud2FybmluZyh0ZXh0LCBudWxsLCB7IHBvc2l0aW9uQ2xhc3M6IHRvcyA9PSBcInRvYXN0clwiID8gXCJ0b2FzdC10b3AtcmlnaHRcIiA6IFwidG9hc3QtdG9wLWNlbnRlclwiLCB0aW1lT3V0OiBzZWNvbmRhcnlOb3RpZmljYXRpb25UaW1lb3V0IHx8ICh0b3MgPT0gXCJ0b2FzdHJcIiA/IDAgOiA1MDAwKSwgZXh0ZW5kZWRUaW1lT3V0OiB0b3MgPT0gXCJ0b2FzdHJcIiA/IDAgOiAxMDAwIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmlwdWxpc2NlIHR1dHRpIGkgbWVzc2FnZ2kgcHJlc2VudGkgaW4gdW4gZGF0byBtb21lbnRvIHN1bGxvIHNjaGVybW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyTWVzc2FnZXMoKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuY2xlYXIoKTtcclxuICAgICAgICBzd2FsLmNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3N0cmEgdW4gbWVzc2FnZ2lvIGRpIGF2dmlzbyBjb24gcmljaGllc3RhIGRpIGNvbmZlcm1hXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IFJlc3RpdHVpc2NlIHVuYSBQcm9taXNlIGNvbCByaXN1bHRhdG8gc2NlbHRvIGRhbGwndXRlbnRlIChjb25mZXJtYSBvIG5vKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvbWlzZVdhcm5pbmdXaXRoQ2hvaWNlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2FybmluZ1N3YWxXaXRoQ2FuY2VsLmZpcmUodGl0bGUsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW4gYmFzZSBhbGxhIGNvbmZpZ3VyYXppb25lIGF0dHVhbGUgZSBhbGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjaGlhbWF0YSBkZWwgY2FzbyBpbmRpY2Egc2UgYmlzb2duYSB1dGlsaXp6YXJlIHRvYXN0ciBvIHN3ZWV0YWxlcnRcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtcInRvYXN0clwiIHwgXCJzd2FsXCIgfCBudWxsfSBwcm92aWRlck92ZXJyaWRlIE92ZXJyaWRlIGFsbGEgbW9kYWxpdMOgIGNvbmZpZ3VyYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtcInRvYXN0clwiIHwgXCJzd2FsXCJ9IEluZGljYXppb25lIHN1IGNoZSBwcm92aWRlciBkaSBtZXNzYWdnaSBkaSBhdnZpc28gZGViYmEgZXNzZXJlIHV0aWxpenphdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0b2FzdHJPclN3YWwocHJvdmlkZXJPdmVycmlkZTogXCJ0b2FzdHJcIiB8IFwic3dhbFwiIHwgbnVsbCk6IFwidG9hc3RyXCIgfCBcInN3YWxcIiB7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyT3ZlcnJpZGUgIT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyT3ZlcnJpZGU7XHJcbiAgICAgICAgcmV0dXJuIFwic3dhbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgR3VpZFJlcHNvbnNlRnVuY3Rpb25zTWFwOiB7IFtpZDogc3RyaW5nXTogeyBvbnN1Y2Nlc3M6IEZ1bmN0aW9uLCBvbmVycm9yOiBGdW5jdGlvbiB9IH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc2ltcGxlV2FybmluZ1dpdGhDaG9pY2UodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBvbnN1Y2Nlc3M/OiBGdW5jdGlvbiwgb25lcnJvcj86IEZ1bmN0aW9uLCBjb25maXJtdGV4dDogc3RyaW5nID0gXCJcIiwgYWJvcnR0ZXh0OiBzdHJpbmcgPSAnJykge1xyXG4gICAgICAgIHRoaXMud2l0aENob2ljZUJhc2UoXCJ3YXJuaW5nXCIsIHRpdGxlLCB0ZXh0LCBvbnN1Y2Nlc3MsIG9uZXJyb3IsIGNvbmZpcm10ZXh0LCBhYm9ydHRleHQpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNpbXBsZVN1Y2Nlc3NXaXRoQ2hvaWNlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb25zdWNjZXNzPzogRnVuY3Rpb24sIG9uZXJyb3I/OiBGdW5jdGlvbiwgY29uZmlybXRleHQ6IHN0cmluZyA9IFwiXCIsIGFib3J0dGV4dDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICB0aGlzLndpdGhDaG9pY2VCYXNlKFwic3VjY2Vzc1wiLCB0aXRsZSwgdGV4dCwgb25zdWNjZXNzLCBvbmVycm9yLCBjb25maXJtdGV4dCwgYWJvcnR0ZXh0KVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2l0aENob2ljZUJhc2UobGV2ZWw6IFwid2FybmluZ1wiIHwgXCJzdWNjZXNzXCIsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb25zdWNjZXNzPzogRnVuY3Rpb24sIG9uZXJyb3I/OiBGdW5jdGlvbiwgY29uZmlybXRleHQ6IHN0cmluZyA9IFwiXCIsIGFib3J0dGV4dDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICBpZiAodGhpcy5FbWJlZGRlZCkge1xyXG4gICAgICAgICAgICBsZXQgZ3VpZCA9IHRoaXMuaGFzaC5nZXRHVUlEKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR3VpZFJlcHNvbnNlRnVuY3Rpb25zTWFwW2d1aWRdID0geyBvbnN1Y2Nlc3MsIG9uZXJyb3IgfTtcclxuICAgICAgICAgICAgdGhpcy5NYWluV2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJjb25maXJtXCIsIGxldmVsLCB0aXRsZSwgdGV4dCwgZ3VpZCB9LCBcIipcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBPYnNlcnZlIHN1bGxhIHJpc3Bvc3RhXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW52aWF0YSBjb25maXJtIHJlcXVlc3QgYWxsYSBwYWdpbmEgcHJpbmNpcGFsZSwgaW4gYXR0ZXNhIGRpIHJpc3Bvc3RhLi4uXCIpXHJcbiAgICAgICAgICAgIHRoaXMuTWVzc2FnZU9ic2VydmVyLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50Py5kYXRhPy50eXBlID09IFwiY29uZmlybS1yZXNwb25zZVwiICYmIGV2ZW50Py5kYXRhPy5ndWlkID09IGd1aWQpLCB0YWtlKDEpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFdmVudCBsaXN0ZW5lciBzdSB3aW5kb3ctbWVzc2FnZS4gUmlzcG9zdGEgcGVyZ2l1bnRhXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudD8uZGF0YT8ucmVzdWx0ID09PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR3VpZFJlcHNvbnNlRnVuY3Rpb25zTWFwW2d1aWRdLm9uc3VjY2VzcygpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQ/LmRhdGE/LnJlc3VsdCA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkd1aWRSZXBzb25zZUZ1bmN0aW9uc01hcFtndWlkXS5vbmVycm9yKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgKGxldmVsID09IFwid2FybmluZ1wiID8gdGhpcy5fc2ltcGxlV2FybmluZ1dpdGhDaG9pY2UuYmluZCh0aGlzKSA6IHRoaXMuX3NpbXBsZVN1Y2Nlc3NXaXRoQ2hvaWNlLmJpbmQodGhpcykpKHRpdGxlLCB0ZXh0LCBvbnN1Y2Nlc3MsIG9uZXJyb3IsIGNvbmZpcm10ZXh0LCBhYm9ydHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9zdHJhIHVuIG1lc3NhZ2dpbyBkaSBhdnZpc28gY29uIHJpY2hpZXN0YSBkaSBjb25mZXJtYSBlIGdlc3Rpc2NlIGlsIHJpc3VsdGF0byBjaGlhbWF0byBpIGNhbGxiYWNrICoqb25zdWNjZXNzKiogbyAqKm9uZXJyb3IqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgVGl0b2xvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IENvbnRlbnV0byBkZWwgbWVzc2FnZ2lvXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbnN1Y2Nlc3MgQ2FsbGJhY2sgZGEgY2hpbWFyZSBzdSBjb25mZXJtYVxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25lcnJvciBDYWxsYmFjayBkYSBjaGltYXJlIHN1IGVycm9yaVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zaW1wbGVXYXJuaW5nV2l0aENob2ljZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG9uY29uZmlybTogRnVuY3Rpb24gPSBudWxsLCBvbmFib3J0OiBGdW5jdGlvbiA9IG51bGwsIGNvbmZpcm10ZXh0OiBzdHJpbmcgPSBcIlwiLCBhYm9ydHRleHQ6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgdGhpcy5fc2ltcGxlV2l0aENob2ljZSh0aGlzLndhcm5pbmdTd2FsV2l0aENhbmNlbCwgdGl0bGUsIHRleHQsIG9uY29uZmlybSwgb25hYm9ydCwgY29uZmlybXRleHQsIGFib3J0dGV4dClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vc3RyYSB1biBtZXNzYWdnaW8gZGkgc3VjY2VzcyBjb24gcmljaGllc3RhIGRpIGNvbmZlcm1hIGUgZ2VzdGlzY2UgaWwgcmlzdWx0YXRvIGNoaWFtYXRvIGkgY2FsbGJhY2sgKipvbmNvbmZpcm0qKiBvICoqb25hYm9ydCoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uY29uZmlybSBDYWxsYmFjayBkYSBjaGltYXJlIHN1IGNvbmZlcm1hXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbmFib3J0IENhbGxiYWNrIGRhIGNoaW1hcmUgc3UgYW5udWxsYW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlybXRleHQgVGVzdG8gZGVsIHB1bHNhbnRlIGRpIGF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFib3J0dGV4dCBUZXN0byBkZWwgcHVsc2FudGUgZGkgYW5udWxsYW1lbnRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NpbXBsZVN1Y2Nlc3NXaXRoQ2hvaWNlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb25jb25maXJtOiBGdW5jdGlvbiA9IG51bGwsIG9uYWJvcnQ6IEZ1bmN0aW9uID0gbnVsbCwgY29uZmlybXRleHQ6IHN0cmluZyA9IFwiXCIsIGFib3J0dGV4dDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICB0aGlzLl9zaW1wbGVXaXRoQ2hvaWNlKHRoaXMuc3VjY2Vzc1N3YWxXaXRoQ2FuY2VsLCB0aXRsZSwgdGV4dCwgb25jb25maXJtLCBvbmFib3J0LCBjb25maXJtdGV4dCwgYWJvcnR0ZXh0KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGJhc2UgcGVyIHJpY2hpZWRlcmUgdW5hIHNjZWx0YSBhbGwndXRlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBzd2FsIFN3YWwgbWl4aW4gZGEgdXRpbGl6emFyZSBwZXIgdmlzdWFsaXp6YXJlIGlsIG1lc3NhZ2dpbyBkaSBjaG9pY2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uY29uZmlybSBDYWxsYmFjayBkYSBjaGltYXJlIHN1IGNvbmZlcm1hXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbmFib3J0IENhbGxiYWNrIGRhIGNoaW1hcmUgc3UgYW5udWxsYW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlybXRleHQgVGVzdG8gZGVsIHB1bHNhbnRlIGRpIGF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFib3J0dGV4dCBUZXN0byBkZWwgcHVsc2FudGUgZGkgYW5udWxsYW1lbnRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NpbXBsZVdpdGhDaG9pY2Uoc3dhbDogYW55LCB0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG9uY29uZmlybTogRnVuY3Rpb24gPSBudWxsLCBvbmFib3J0OiBGdW5jdGlvbiA9IG51bGwsIGNvbmZpcm10ZXh0OiBzdHJpbmcgPSBcIlwiLCBhYm9ydHRleHQ6IHN0cmluZyA9ICcnKXtcclxuICAgICAgICB2YXIgY29uZmlndXJhdGlvbiA9IHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBodG1sOiB0ZXh0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoY29uZmlybXRleHQpXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25bXCJjb25maXJtQnV0dG9uVGV4dFwiXSA9IGNvbmZpcm10ZXh0O1xyXG4gICAgICAgIGlmIChhYm9ydHRleHQpXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25bXCJjYW5jZWxCdXR0b25UZXh0XCJdID0gYWJvcnR0ZXh0O1xyXG5cclxuICAgICAgICBzd2FsLmZpcmUoY29uZmlndXJhdGlvbikudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWUgJiYgb25jb25maXJtKVxyXG4gICAgICAgICAgICAgICAgb25jb25maXJtKCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9uYWJvcnQpXHJcbiAgICAgICAgICAgICAgICBvbmFib3J0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3N0cmEgdW4gbWVzc2FnZ2lvIGRpIGF2dmlzbyBjb24gcmljaGllc3RhIGRpIGNvbmZlcm1hIGUgZ2VzdGlzY2UgaWwgcmlzdWx0YXRvIGNoaWFtYXRvIGkgY2FsbGJhY2sgKipvbnN1Y2Nlc3MqKiBvICoqb25lcnJvcioqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9ic2VydmFibGVTaW1wbGVXYXJuaW5nV2l0aENob2ljZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy53YXJuaW5nU3dhbFdpdGhDYW5jZWwuZmlyZSh0aXRsZSwgdGV4dCkpLnBpcGUobWFwKHQgPT4gISF0LnZhbHVlKSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vc3RyYSB1biBtZXNzYWdnaW8gZGkgYXZ2aXNvIGNoZSBsYSBzZXNzaW9uZSBjb3JyZW50ZSDDqCBzY2FkdXRhIGUgcHJvcG9uZSBhbGwndXRlbnRlIGRpIG5hdmlnYXJlIGFsIGxvZ2luLiBRdWFsb3JhIGwndXRlbnRlIGRlY2lkZXNzZSBkaSBmYXJsbyBcclxuICAgICAqIHZlcnLDoCBjaGlhbWF0YSBsYSBmdW56aW9uZSBkaSBjYWxsYmFjayAqKm9ubmF2aWdhdGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIFRpdG9sbyBkZWwgbWVzc2FnZ2lvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDb250ZW51dG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25uYXZpZ2F0ZSBDYWxsYmFjayBkYSBjaGltYXJlIHN1IG5hdmlnYXppb25lIGluIGNvcnNvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBpcmVkU2Vzc2lvbk1lc3NhZ2UodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBvbm5hdmlnYXRlOiBGdW5jdGlvbiA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLmV4cGlyZWRTZXNzaW9uU3dhbC5maXJlKHRpdGxlLCB0ZXh0KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiBvbm5hdmlnYXRlKVxyXG4gICAgICAgICAgICAgICAgb25uYXZpZ2F0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGhlbHBlciBwZXIgZ2VzdGlyZSBpbiBtYW5pZXJhIHN0YW5kYXJkaXp6YXRhIHVuYSByaXNwb3N0YSBkaSB0aXBvICoqQ2FsbFJlc3VsdCoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Q2FsbFJlc3VsdH0gcmVzcG9uc2UgUmlzcG9zdGEgcmljZXZ1dGEgZGFsIHNlcnZlclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIHN1Y2Nlc3NvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBvc3RTdWNjZXNzIENhbGxiYWNrIGRhIGNoaW1hcmUgaW4gY2FzbyBkaSBzdWNjZXNzb1xyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcG9zdEZhaWx1cmUgQ2FsbGJhY2sgZGEgY2hpbWFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hbmFnZUNhbGxSZXN1bHRSZXNwb25zZShyZXNwb25zZTogQ2FsbFJlc3VsdCwgc3VjY2Vzc01zZzogc3RyaW5nLCBlcnJvck1zZzogc3RyaW5nLCBwb3N0U3VjY2VzczogRnVuY3Rpb24gPSBudWxsLCBwb3N0RmFpbHVyZTogRnVuY3Rpb24gPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGFueVJlcG9uc2UgPSA8YW55PnJlc3BvbnNlO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzIHx8IGFueVJlcG9uc2UuU3VjY2Vzcykge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuaGFzd2FybmluZyB8fCBhbnlSZXBvbnNlLkhhc1dhcm5pbmcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZVdhcm5pbmcocmVzcG9uc2Uud2FybmluZyB8fCBhbnlSZXBvbnNlLldhcm5pbmcpO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAoc3VjY2Vzc01zZylcclxuICAgICAgICAgICAgICAgIHRoaXMuc2ltcGxlU3VjY2VzcyhzdWNjZXNzTXNnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0U3VjY2VzcykgcG9zdFN1Y2Nlc3MoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNpbXBsZUVycm9yKChlcnJvck1zZyA/IGVycm9yTXNnICsgXCI6IFwiIDogXCJcIikgKyAoKHJlc3BvbnNlLmhhc2Vycm9yIHx8IGFueVJlcG9uc2UuSGFzRXJyb3IpID8gKHJlc3BvbnNlLmVycm9yIHx8IGFueVJlcG9uc2UuRXJyb3IpIDogJ1tOTyBFUlIuXScpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0RmFpbHVyZSkgcG9zdEZhaWx1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gaGVscGVyIHBlciBnZXN0aXJlIGluIG1hbmllcmEgc3RhbmRhcmRpenphdGEgdW5hIHJpc3Bvc3RhIGRpIHRpcG8gKipzdHJpbmcqKiwgY29uc2lkZXJhbmRvIGNoZTpcclxuICAgICAqIFxyXG4gICAgICogU3RyaW5nYSB2dW90YSAtLT4gVHV0dG8gYmVuZVxyXG4gICAgICogXHJcbiAgICAgKiBTdHJpbmdhIHBpZW5hIC0tPiBRdWVzdG8gw6ggaWwgbWVzc2FnZ2lvIGQnZXJyb3JlIHBlciBjdWkgbGEgY2hpYW1hdGEgw6ggZmFsbGl0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgUmlzcG9zdGEgcmljZXZ1dGEgZGFsIHNlcnZlclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIHN1Y2Nlc3NvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBvc3RTdWNjZXNzIENhbGxiYWNrIGRhIGNoaW1hcmUgaW4gY2FzbyBkaSBzdWNjZXNzb1xyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcG9zdEZhaWx1cmUgQ2FsbGJhY2sgZGEgY2hpbWFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hbmFnZVN0cmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcsIHN1Y2Nlc3NNc2c6IHN0cmluZywgZXJyb3JNc2c6IHN0cmluZywgcG9zdFN1Y2Nlc3M6IEZ1bmN0aW9uID0gbnVsbCwgcG9zdEZhaWx1cmU6IEZ1bmN0aW9uID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NNc2cpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZVN1Y2Nlc3Moc3VjY2Vzc01zZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9zdFN1Y2Nlc3MpIHBvc3RTdWNjZXNzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yTXNnKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVFcnJvcihlcnJvck1zZyArIFwiOiBcIiArIHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0RmFpbHVyZSkgcG9zdEZhaWx1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gaGVscGVyIHBlciBnZXN0aXJlIGluIG1hbmllcmEgc3RhbmRhcmRpenphdGEgdW5hIHJpc3Bvc3RhIGRpIHRpcG8gKipib29sZWFuKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIFJpc3Bvc3RhIHJpY2V2dXRhIGRhbCBzZXJ2ZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzTXNnIE1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgaW4gY2FzbyBkaSBzdWNjZXNzb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTXNnIE1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgaW4gY2FzbyBkaSBmYWxsaW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb3N0U3VjY2VzcyBDYWxsYmFjayBkYSBjaGltYXJlIGluIGNhc28gZGkgc3VjY2Vzc29cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBvc3RGYWlsdXJlIENhbGxiYWNrIGRhIGNoaW1hcmUgaW4gY2FzbyBkaSBmYWxsaW1lbnRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYW5hZ2VTdHJpbmdSZXNwb25zZUJvb2wocmVzcG9uc2U6IGJvb2xlYW4sIHN1Y2Nlc3NNc2c6IHN0cmluZywgZXJyb3JNc2c6IHN0cmluZywgcG9zdFN1Y2Nlc3M6IEZ1bmN0aW9uID0gbnVsbCwgcG9zdEZhaWx1cmU6IEZ1bmN0aW9uID0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAoc3VjY2Vzc01zZylcclxuICAgICAgICAgICAgICAgIHRoaXMuc2ltcGxlU3VjY2VzcyhzdWNjZXNzTXNnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0U3VjY2VzcykgcG9zdFN1Y2Nlc3MoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3JNc2cpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZUVycm9yKGVycm9yTXNnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0RmFpbHVyZSkgcG9zdEZhaWx1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=