@esfaenza/extensions 15.2.48 → 15.2.51

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/{esm2022 → esm2020}/esfaenza-extensions.mjs +4 -4
  2. package/esm2020/lib/models/CallResult.mjs +6 -0
  3. package/esm2020/lib/models/CsvHeaders.mjs +6 -0
  4. package/{esm2022 → esm2020}/lib/models/ExportConsts.mjs +31 -31
  5. package/esm2020/lib/models/ExtensionsModuleConfig.mjs +4 -0
  6. package/esm2020/lib/models/GenericItem.mjs +6 -0
  7. package/{esm2022 → esm2020}/lib/models/InboundMessageTypes.mjs +6 -6
  8. package/esm2020/lib/models/InterComMessage.mjs +14 -0
  9. package/{esm2022 → esm2020}/lib/models/TypeCode.mjs +24 -24
  10. package/{esm2022 → esm2020}/lib/modules/extensions.module.mjs +32 -32
  11. package/esm2020/lib/pipes/loc_date.pipe.mjs +37 -0
  12. package/esm2020/lib/services/extensions.base.mjs +29 -0
  13. package/esm2020/lib/services/extensions.clipboard.service.mjs +219 -0
  14. package/esm2020/lib/services/extensions.dates.service.mjs +246 -0
  15. package/esm2020/lib/services/extensions.embedding.service.mjs +248 -0
  16. package/esm2020/lib/services/extensions.exports.service.mjs +615 -0
  17. package/esm2020/lib/services/extensions.hashing.service.mjs +310 -0
  18. package/esm2020/lib/services/extensions.intercom.service.mjs +54 -0
  19. package/esm2020/lib/services/extensions.messages.service.mjs +433 -0
  20. package/esm2020/lib/services/extensions.utilities.service.mjs +252 -0
  21. package/{esm2022 → esm2020}/lib/tokens.mjs +11 -11
  22. package/{esm2022 → esm2020}/public-api.mjs +21 -21
  23. package/fesm2015/esfaenza-extensions.mjs +2558 -0
  24. package/fesm2015/esfaenza-extensions.mjs.map +1 -0
  25. package/{fesm2022 → fesm2020}/esfaenza-extensions.mjs +2486 -2510
  26. package/fesm2020/esfaenza-extensions.mjs.map +1 -0
  27. package/index.d.ts +5 -5
  28. package/lib/models/CallResult.d.ts +23 -23
  29. package/lib/models/CsvHeaders.d.ts +25 -25
  30. package/lib/models/ExportConsts.d.ts +31 -31
  31. package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
  32. package/lib/models/GenericItem.d.ts +9 -9
  33. package/lib/models/InboundMessageTypes.d.ts +5 -5
  34. package/lib/models/InterComMessage.d.ts +12 -12
  35. package/lib/models/TypeCode.d.ts +23 -23
  36. package/lib/modules/extensions.module.d.ts +11 -11
  37. package/lib/pipes/loc_date.pipe.d.ts +24 -24
  38. package/lib/services/extensions.base.d.ts +22 -22
  39. package/lib/services/extensions.clipboard.service.d.ts +54 -54
  40. package/lib/services/extensions.dates.service.d.ts +101 -99
  41. package/lib/services/extensions.embedding.service.d.ts +33 -28
  42. package/lib/services/extensions.exports.service.d.ts +234 -234
  43. package/lib/services/extensions.hashing.service.d.ts +121 -121
  44. package/lib/services/extensions.intercom.service.d.ts +28 -28
  45. package/lib/services/extensions.messages.service.d.ts +195 -195
  46. package/lib/services/extensions.utilities.service.d.ts +107 -107
  47. package/lib/tokens.d.ts +11 -11
  48. package/package.json +11 -5
  49. package/public-api.d.ts +18 -18
  50. package/esm2022/lib/models/CallResult.mjs +0 -24
  51. package/esm2022/lib/models/CsvHeaders.mjs +0 -26
  52. package/esm2022/lib/models/ExtensionsModuleConfig.mjs +0 -10
  53. package/esm2022/lib/models/GenericItem.mjs +0 -10
  54. package/esm2022/lib/models/InterComMessage.mjs +0 -16
  55. package/esm2022/lib/pipes/loc_date.pipe.mjs +0 -38
  56. package/esm2022/lib/services/extensions.base.mjs +0 -30
  57. package/esm2022/lib/services/extensions.clipboard.service.mjs +0 -221
  58. package/esm2022/lib/services/extensions.dates.service.mjs +0 -244
  59. package/esm2022/lib/services/extensions.embedding.service.mjs +0 -213
  60. package/esm2022/lib/services/extensions.exports.service.mjs +0 -617
  61. package/esm2022/lib/services/extensions.hashing.service.mjs +0 -308
  62. package/esm2022/lib/services/extensions.intercom.service.mjs +0 -52
  63. package/esm2022/lib/services/extensions.messages.service.mjs +0 -450
  64. package/esm2022/lib/services/extensions.utilities.service.mjs +0 -250
  65. package/fesm2022/esfaenza-extensions.mjs.map +0 -1
@@ -0,0 +1,219 @@
1
+ // Angular
2
+ import { Injectable, Optional } from "@angular/core";
3
+ // Librerie
4
+ import Swal from "sweetalert2";
5
+ import { first } from "rxjs/operators";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./extensions.messages.service";
8
+ import * as i2 from "@esfaenza/localizations";
9
+ /**
10
+ * Service che fornisce un accesso base in lettura/scrittura sulla clipboard
11
+ */
12
+ export class ClipboardService {
13
+ /**
14
+ * Costruttore
15
+ *
16
+ * @ignore
17
+ */
18
+ constructor(msgService, locProvider) {
19
+ this.msgService = msgService;
20
+ this.locProvider = locProvider;
21
+ /**
22
+ * Oggetto statico di localizzazione per i messaggi di questa Service
23
+ */
24
+ this.loc = {
25
+ "Unfortunately Firefox doesn't yet support direct Clipboard access if not via extensions, Please use Chrome to do this operation": {
26
+ 'en-US': "Unfortunately Firefox doesn't yet support direct Clipboard access if not via extensions, Please use Chrome to do this operation",
27
+ 'it-IT': "Mi dispiace ma Firefox non supporta l'accesso diretto alla Clipboard, se non attraverso le estensioni. Si prega di usare Chrome"
28
+ },
29
+ "Generic error during 'copy' command execution": {
30
+ 'en-US': "Generic error during 'copy' command execution",
31
+ 'it-IT': "Errore generico durante l'esecuzione del comando 'copy'"
32
+ },
33
+ "Error during Clipboard content read operation": {
34
+ 'en-US': "Error during Clipboard content read operation",
35
+ 'it-IT': "Errore nella lettura del contenuto della Clipboard"
36
+ },
37
+ "Error during Clipboard content copy operation": {
38
+ 'en-US': "Error during Clipboard content copy operation",
39
+ 'it-IT': "Errore nella scrittura del contenuto nella Clipboard"
40
+ },
41
+ "Please insert your clipboard content": {
42
+ 'en-US': "Please insert your clipboard content",
43
+ 'it-IT': "Si prega di incollare il contenuto della Clipboard"
44
+ },
45
+ "User input required": {
46
+ 'en-US': "User input required",
47
+ 'it-IT': "Richiesto Input utente"
48
+ },
49
+ "Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation": {
50
+ 'en-US': "Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation",
51
+ 'it-IT': "Il browser corrente non supporta la lettura diretta dei dati della Clipboard, si prega di effettuare un'incolla (CTRL + V) nella casella di testo e confermare l'operazione"
52
+ },
53
+ "Confirm": {
54
+ 'en-US': "Confirm",
55
+ 'it-IT': "Conferma"
56
+ },
57
+ "Cancel": {
58
+ 'en-US': "Cancel",
59
+ 'it-IT': "Annulla"
60
+ },
61
+ };
62
+ }
63
+ /**
64
+ * Prende il valore della clipboard.
65
+ * Si può specificare se ci si aspetta una lista o una matrice di valori in modo da ricevere già un risultato utilizzabile
66
+ *
67
+ * @param {'array' | 'matrix'} style Stile dell'output desiderato, se array o matrice
68
+ * @param {Function} valueFoundCallback Callback che questa funzione chiamerà una volta ottenuto i valori richiesti dalla clipboard
69
+ */
70
+ async getClipboard(style, valueFoundCallback) {
71
+ let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
72
+ if (navigator.userAgent.indexOf("Firefox") != -1) {
73
+ Swal.fire({
74
+ title: this.loc["User input required"][LOCALE],
75
+ text: this.loc["Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation"][LOCALE],
76
+ input: 'textarea',
77
+ icon: "warning",
78
+ confirmButtonText: this.loc["Confirm"][LOCALE],
79
+ cancelButtonText: this.loc["Cancel"][LOCALE],
80
+ showCancelButton: true,
81
+ customClass: {
82
+ confirmButton: "btn btn-primary",
83
+ cancelButton: "btn btn-secondary app-margin-right-15",
84
+ container: "app-wrap",
85
+ },
86
+ reverseButtons: true,
87
+ allowOutsideClick: false,
88
+ inputValidator: (value) => {
89
+ if (!value)
90
+ return this.loc["Please insert your clipboard content"][LOCALE];
91
+ }
92
+ }).then(t => {
93
+ if (t.isConfirmed) {
94
+ console.log("[@esfaenza/extensions] Retrieving input data from user input");
95
+ this.doClipboardDataGet(t.value, style, valueFoundCallback);
96
+ }
97
+ });
98
+ return;
99
+ }
100
+ if (window.clipboardData) {
101
+ console.log("[@esfaenza/extensions] Found clipboardData");
102
+ let data = window.clipboardData.getData("Text");
103
+ this.doClipboardDataGet(data, style, valueFoundCallback);
104
+ }
105
+ else if (window.navigator.clipboard) {
106
+ console.log("[@esfaenza/extensions] Found navigator clipboard");
107
+ window.navigator.permissions.query({ name: 'clipboard-read' }).then(result => {
108
+ if (!(result.state === 'granted' || result.state === 'prompt')) {
109
+ console.error("[@esfaenza/extensions] Clipboard permission not granted");
110
+ if (valueFoundCallback)
111
+ valueFoundCallback([]);
112
+ return;
113
+ }
114
+ console.log("[@esfaenza/extensions] Clipboard permission granted, retrieving values");
115
+ window.navigator.clipboard.readText()
116
+ .then((t) => this.doClipboardDataGet(t, style, valueFoundCallback))
117
+ .catch((err) => this.msgService.simpleError(this.loc["Error during Clipboard content read operation"][LOCALE] + ": " + err));
118
+ });
119
+ }
120
+ }
121
+ /** @ignore */
122
+ doClipboardDataGet(clipboardText, style, valueFoundCallback) {
123
+ console.log("[@esfaenza/extensions] Retrieved clipboard values: " + clipboardText);
124
+ let value = style == "array" ? this.getClipboardLines(clipboardText) :
125
+ style == "matrix" ? this.getClipboardMatrix(clipboardText) : [];
126
+ console.log(`[@esfaenza/extensions] Adapted for ${style}: ${JSON.stringify(value)}`);
127
+ if (valueFoundCallback)
128
+ valueFoundCallback(value);
129
+ }
130
+ /**
131
+ * Ottiene il contenuto della clipboard diviso per righe (separate da newline)
132
+ *
133
+ * @param {string} data contenuto letto dalla clipboard
134
+ *
135
+ * @returns {string[]} Array contenente il testo preso dalla clipboard diviso per riga
136
+ */
137
+ getClipboardLines(data) {
138
+ let trimmedData = data.trim();
139
+ if (!trimmedData.includes("\r\n") && trimmedData.includes("\n"))
140
+ return trimmedData.split("\n");
141
+ return trimmedData.split("\r\n");
142
+ }
143
+ /**
144
+ * Ottiene il contenuto della clipboard diviso per righe (separate da newline) e colonne (separate da tab)
145
+ *
146
+ * @param {string} data contenuto letto dalla clipboard
147
+ *
148
+ * @returns {string[][]} Matrice contenente il testo preso dalla clipboard diviso per riga e colonna
149
+ */
150
+ getClipboardMatrix(data) {
151
+ var ret = [];
152
+ var rows = !data.includes("\r\n") && data.includes("\n") ? data.split("\n") : data.split("\r\n");
153
+ // A quanto pare ogni valore è separato da un \t... spero che sia uno standard di quando si copia da excel altrimenti ciao
154
+ for (let i = 0; i < rows.length; i++)
155
+ ret.push(rows[i].split('\t').map(t => t.trim()));
156
+ return ret;
157
+ }
158
+ /**
159
+ * Metodo che copia un testo all'interno della clipboard
160
+ *
161
+ * @param {string} text Testo da inserire nella clipboard
162
+ */
163
+ async copyTextToClipboard(text) {
164
+ let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
165
+ var textArea = document.createElement("textarea");
166
+ //
167
+ // *** This styling is an extra step which is likely not required. ***
168
+ //
169
+ // Why is it here? To ensure:
170
+ // 1. the element is able to have focus and selection.
171
+ // 2. if element was to flash render it has minimal visual impact.
172
+ // 3. less flakyness with selection and copying which **might** occur if
173
+ // the textarea element is not visible.
174
+ //
175
+ // The likelihood is the element won't even render, not even a flash,
176
+ // so some of these are just precautions. However in IE the element
177
+ // is visible whilst the popup box asking the user for permission for
178
+ // the web page to copy to the clipboard.
179
+ //
180
+ // Place in top-left corner of screen regardless of scroll position.
181
+ textArea.style.position = "fixed";
182
+ textArea.style.top = "0";
183
+ textArea.style.left = "0";
184
+ // Ensure it has a small width and height. Setting to 1px / 1em
185
+ // doesn't work as this gives a negative w/h on some browsers.
186
+ textArea.style.width = "2em";
187
+ textArea.style.height = "2em";
188
+ // We don't need padding, reducing the size if it does flash render.
189
+ textArea.style.padding = "0";
190
+ // Clean up any borders.
191
+ textArea.style.border = "none";
192
+ textArea.style.outline = "none";
193
+ textArea.style.boxShadow = "none";
194
+ // Avoid flash of white box if rendered for any reason.
195
+ textArea.style.background = "transparent";
196
+ textArea.value = text;
197
+ document.body.appendChild(textArea);
198
+ textArea.focus();
199
+ textArea.select();
200
+ try {
201
+ var successful = document.execCommand("copy");
202
+ if (!successful)
203
+ this.msgService.simpleError(this.loc["Generic error during 'copy' command execution"][LOCALE]);
204
+ }
205
+ catch (err) {
206
+ this.msgService.simpleError(this.loc["Error during Clipboard content copy operation"][LOCALE] + ": " + err);
207
+ }
208
+ document.body.removeChild(textArea);
209
+ }
210
+ }
211
+ ClipboardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ClipboardService, deps: [{ token: i1.MessageService }, { token: i2.BaseLocalization, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
212
+ ClipboardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ClipboardService, providedIn: "root" });
213
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ClipboardService, decorators: [{
214
+ type: Injectable,
215
+ args: [{ providedIn: "root" }]
216
+ }], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.BaseLocalization, decorators: [{
217
+ type: Optional
218
+ }] }]; } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5jbGlwYm9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9zZXJ2aWNlcy9leHRlbnNpb25zLmNsaXBib2FyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVFyRCxXQUFXO0FBQ1gsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUV2Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE0Q3pCOzs7O09BSUc7SUFDSCxZQUEyQixVQUEwQixFQUFzQixXQUE2QjtRQUE3RSxlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUFzQixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUEvQ3hHOztXQUVHO1FBQ0ssUUFBRyxHQUFHO1lBQ1YsaUlBQWlJLEVBQUU7Z0JBQy9ILE9BQU8sRUFBRSxpSUFBaUk7Z0JBQzFJLE9BQU8sRUFBRSxpSUFBaUk7YUFDN0k7WUFDRCwrQ0FBK0MsRUFBRTtnQkFDN0MsT0FBTyxFQUFFLCtDQUErQztnQkFDeEQsT0FBTyxFQUFFLHlEQUF5RDthQUNyRTtZQUNELCtDQUErQyxFQUFFO2dCQUM3QyxPQUFPLEVBQUUsK0NBQStDO2dCQUN4RCxPQUFPLEVBQUUsb0RBQW9EO2FBQ2hFO1lBQ0QsK0NBQStDLEVBQUM7Z0JBQzVDLE9BQU8sRUFBRSwrQ0FBK0M7Z0JBQ3hELE9BQU8sRUFBRSxzREFBc0Q7YUFDbEU7WUFDRCxzQ0FBc0MsRUFBRTtnQkFDcEMsT0FBTyxFQUFFLHNDQUFzQztnQkFDL0MsT0FBTyxFQUFFLG9EQUFvRDthQUNoRTtZQUNELHFCQUFxQixFQUFFO2dCQUNuQixPQUFPLEVBQUUscUJBQXFCO2dCQUM5QixPQUFPLEVBQUUsd0JBQXdCO2FBQ3BDO1lBQ0QsZ0tBQWdLLEVBQUU7Z0JBQzlKLE9BQU8sRUFBRSxnS0FBZ0s7Z0JBQ3pLLE9BQU8sRUFBRSw2S0FBNks7YUFDekw7WUFDRCxTQUFTLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLE9BQU8sRUFBRSxVQUFVO2FBQ3RCO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixPQUFPLEVBQUUsU0FBUzthQUNyQjtTQUNKLENBQUM7SUFPMEcsQ0FBQztJQUU3Rzs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQXlCLEVBQUUsa0JBQTREO1FBQzdHLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVuRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBRTlDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGdLQUFnSyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUN4TCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQzlDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUM1QyxnQkFBZ0IsRUFBRSxJQUFJO2dCQUN0QixXQUFXLEVBQUU7b0JBQ1QsYUFBYSxFQUFFLGlCQUFpQjtvQkFDaEMsWUFBWSxFQUFFLHVDQUF1QztvQkFDckQsU0FBUyxFQUFFLFVBQVU7aUJBQ3hCO2dCQUNELGNBQWMsRUFBRSxJQUFJO2dCQUNwQixpQkFBaUIsRUFBRSxLQUFLO2dCQUN4QixjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLEtBQUs7d0JBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ25FLENBQUM7YUFDRixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNSLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7b0JBQzVFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2lCQUMvRDtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztTQUNaO1FBRUQsSUFBVSxNQUFPLENBQUMsYUFBYSxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBUyxNQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1NBQzVEO2FBRUksSUFBVSxNQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtZQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7WUFDMUQsTUFBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2hGLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQzlEO29CQUNJLE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztvQkFDekUsSUFBSSxrQkFBa0I7d0JBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQy9DLE9BQU87aUJBQ1Y7Z0JBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO2dCQUNoRixNQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7cUJBQ3ZDLElBQUksQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztxQkFDMUUsS0FBSyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUksQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ04sa0JBQWtCLENBQUMsYUFBcUIsRUFBRSxLQUF5QixFQUFFLGtCQUE0QjtRQUNyRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ25GLElBQUksS0FBSyxHQUFHLEtBQUssSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLEtBQUssS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLGtCQUFrQjtZQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2xDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUMzRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxrQkFBa0IsQ0FBQyxJQUFZO1FBQ25DLElBQUksR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVqRywwSEFBMEg7UUFDMUgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ2hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBWTtRQUN6QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFbkcsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsRCxFQUFFO1FBQ0Ysc0VBQXNFO1FBQ3RFLEVBQUU7UUFDRiw2QkFBNkI7UUFDN0Isc0RBQXNEO1FBQ3RELGtFQUFrRTtRQUNsRSx3RUFBd0U7UUFDeEUsMENBQTBDO1FBQzFDLEVBQUU7UUFDRixxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLHFFQUFxRTtRQUNyRSx5Q0FBeUM7UUFDekMsRUFBRTtRQUVGLG9FQUFvRTtRQUNwRSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDbEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUUxQiwrREFBK0Q7UUFDL0QsOERBQThEO1FBQzlELFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM3QixRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFOUIsb0VBQW9FO1FBQ3BFLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUU3Qix3QkFBd0I7UUFDeEIsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFFbEMsdURBQXVEO1FBQ3ZELFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUUxQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUV0QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWxCLElBQUk7WUFDQSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLElBQUcsQ0FBQyxVQUFVO2dCQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3RHO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzlHO1FBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7NkdBMU5RLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBREosTUFBTTsyRkFDbEIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBa0Q0QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFc1xyXG5pbXBvcnQgeyBCYXNlTG9jYWxpemF0aW9uIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLm1lc3NhZ2VzLnNlcnZpY2UnO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IFN3YWwgZnJvbSBcInN3ZWV0YWxlcnQyXCI7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKipcclxuICogU2VydmljZSBjaGUgZm9ybmlzY2UgdW4gYWNjZXNzbyBiYXNlIGluIGxldHR1cmEvc2NyaXR0dXJhIHN1bGxhIGNsaXBib2FyZFxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIENsaXBib2FyZFNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2dnZXR0byBzdGF0aWNvIGRpIGxvY2FsaXp6YXppb25lIHBlciBpIG1lc3NhZ2dpIGRpIHF1ZXN0YSBTZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9jID0ge1xyXG4gICAgICAgIFwiVW5mb3J0dW5hdGVseSBGaXJlZm94IGRvZXNuJ3QgeWV0IHN1cHBvcnQgZGlyZWN0IENsaXBib2FyZCBhY2Nlc3MgaWYgbm90IHZpYSBleHRlbnNpb25zLCBQbGVhc2UgdXNlIENocm9tZSB0byBkbyB0aGlzIG9wZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiVW5mb3J0dW5hdGVseSBGaXJlZm94IGRvZXNuJ3QgeWV0IHN1cHBvcnQgZGlyZWN0IENsaXBib2FyZCBhY2Nlc3MgaWYgbm90IHZpYSBleHRlbnNpb25zLCBQbGVhc2UgdXNlIENocm9tZSB0byBkbyB0aGlzIG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIk1pIGRpc3BpYWNlIG1hIEZpcmVmb3ggbm9uIHN1cHBvcnRhIGwnYWNjZXNzbyBkaXJldHRvIGFsbGEgQ2xpcGJvYXJkLCBzZSBub24gYXR0cmF2ZXJzbyBsZSBlc3RlbnNpb25pLiBTaSBwcmVnYSBkaSB1c2FyZSBDaHJvbWVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJHZW5lcmljIGVycm9yIGR1cmluZyAnY29weScgY29tbWFuZCBleGVjdXRpb25cIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkdlbmVyaWMgZXJyb3IgZHVyaW5nICdjb3B5JyBjb21tYW5kIGV4ZWN1dGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBnZW5lcmljbyBkdXJhbnRlIGwnZXNlY3V6aW9uZSBkZWwgY29tYW5kbyAnY29weSdcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJFcnJvciBkdXJpbmcgQ2xpcGJvYXJkIGNvbnRlbnQgcmVhZCBvcGVyYXRpb25cIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCByZWFkIG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBuZWxsYSBsZXR0dXJhIGRlbCBjb250ZW51dG8gZGVsbGEgQ2xpcGJvYXJkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiRXJyb3IgZHVyaW5nIENsaXBib2FyZCBjb250ZW50IGNvcHkgb3BlcmF0aW9uXCI6e1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCBjb3B5IG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBuZWxsYSBzY3JpdHR1cmEgZGVsIGNvbnRlbnV0byBuZWxsYSBDbGlwYm9hcmRcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJQbGVhc2UgaW5zZXJ0IHlvdXIgY2xpcGJvYXJkIGNvbnRlbnRcIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIlBsZWFzZSBpbnNlcnQgeW91ciBjbGlwYm9hcmQgY29udGVudFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIlNpIHByZWdhIGRpIGluY29sbGFyZSBpbCBjb250ZW51dG8gZGVsbGEgQ2xpcGJvYXJkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiVXNlciBpbnB1dCByZXF1aXJlZFwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiVXNlciBpbnB1dCByZXF1aXJlZFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIlJpY2hpZXN0byBJbnB1dCB1dGVudGVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJZb3VyIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgZnJvbSB0aGUgY2xpcGJvYXJkIGRpcmVjdGx5LiBQbGVhc2UgcGFzdGUgeW91ciBjbGlwYm9hcmQncyBjb250ZW50IGluIHRoaXMgSW5wdXQgZmllbGQgYW5kIGNvbmZpcm0gdGhlIG9wZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiWW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlIGNsaXBib2FyZCBkaXJlY3RseS4gUGxlYXNlIHBhc3RlIHlvdXIgY2xpcGJvYXJkJ3MgY29udGVudCBpbiB0aGlzIElucHV0IGZpZWxkIGFuZCBjb25maXJtIHRoZSBvcGVyYXRpb25cIixcclxuICAgICAgICAgICAgJ2l0LUlUJzogXCJJbCBicm93c2VyIGNvcnJlbnRlIG5vbiBzdXBwb3J0YSBsYSBsZXR0dXJhIGRpcmV0dGEgZGVpIGRhdGkgZGVsbGEgQ2xpcGJvYXJkLCBzaSBwcmVnYSBkaSBlZmZldHR1YXJlIHVuJ2luY29sbGEgKENUUkwgKyBWKSBuZWxsYSBjYXNlbGxhIGRpIHRlc3RvIGUgY29uZmVybWFyZSBsJ29wZXJhemlvbmVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJDb25maXJtXCI6IHtcclxuICAgICAgICAgICAgJ2VuLVVTJzogXCJDb25maXJtXCIsXHJcbiAgICAgICAgICAgICdpdC1JVCc6IFwiQ29uZmVybWFcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJDYW5jZWxcIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkNhbmNlbFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkFubnVsbGFcIlxyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBtc2dTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsb2NQcm92aWRlcjogQmFzZUxvY2FsaXphdGlvbikgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVuZGUgaWwgdmFsb3JlIGRlbGxhIGNsaXBib2FyZC4gXHJcbiAgICAgKiBTaSBwdcOyIHNwZWNpZmljYXJlIHNlIGNpIHNpIGFzcGV0dGEgdW5hIGxpc3RhIG8gdW5hIG1hdHJpY2UgZGkgdmFsb3JpIGluIG1vZG8gZGEgcmljZXZlcmUgZ2nDoCB1biByaXN1bHRhdG8gdXRpbGl6emFiaWxlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICdtYXRyaXgnfSBzdHlsZSBTdGlsZSBkZWxsJ291dHB1dCBkZXNpZGVyYXRvLCBzZSBhcnJheSBvIG1hdHJpY2VcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbHVlRm91bmRDYWxsYmFjayBDYWxsYmFjayBjaGUgcXVlc3RhIGZ1bnppb25lIGNoaWFtZXLDoCB1bmEgdm9sdGEgb3R0ZW51dG8gaSB2YWxvcmkgcmljaGllc3RpIGRhbGxhIGNsaXBib2FyZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2xpcGJvYXJkKHN0eWxlOiAnYXJyYXknIHwgJ21hdHJpeCcsIHZhbHVlRm91bmRDYWxsYmFjayA6ICh2YWx1ZXM6IHN0cmluZ1tdIHwgc3RyaW5nW11bXSkgPT4gdm9pZCkge1xyXG4gICAgICAgIGxldCBMT0NBTEUgPSB0aGlzLmxvY1Byb3ZpZGVyID8gIGF3YWl0IHRoaXMubG9jUHJvdmlkZXIuTG9jYWxlLnBpcGUoZmlyc3QoKSkudG9Qcm9taXNlKCkgOiAnaXQtSVQnO1xyXG5cclxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgU3dhbC5maXJlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIlVzZXIgaW5wdXQgcmVxdWlyZWRcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubG9jW1wiWW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlIGNsaXBib2FyZCBkaXJlY3RseS4gUGxlYXNlIHBhc3RlIHlvdXIgY2xpcGJvYXJkJ3MgY29udGVudCBpbiB0aGlzIElucHV0IGZpZWxkIGFuZCBjb25maXJtIHRoZSBvcGVyYXRpb25cIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgICAgIGlucHV0OiAndGV4dGFyZWEnLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJ3YXJuaW5nXCIsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDb25maXJtXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNhbmNlbFwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b246IFwiYnRuIGJ0bi1zZWNvbmRhcnkgYXBwLW1hcmdpbi1yaWdodC0xNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaW5wdXRWYWxpZGF0b3I6ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY1tcIlBsZWFzZSBpbnNlcnQgeW91ciBjbGlwYm9hcmQgY29udGVudFwiXVtMT0NBTEVdXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSkudGhlbih0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBSZXRyaWV2aW5nIGlucHV0IGRhdGEgZnJvbSB1c2VyIGlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0NsaXBib2FyZERhdGFHZXQodC52YWx1ZSwgc3R5bGUsIHZhbHVlRm91bmRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKDxhbnk+d2luZG93KS5jbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBGb3VuZCBjbGlwYm9hcmREYXRhXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICg8YW55PndpbmRvdykuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcclxuICAgICAgICAgICAgdGhpcy5kb0NsaXBib2FyZERhdGFHZXQoZGF0YSwgc3R5bGUsIHZhbHVlRm91bmRDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlIGlmICgoPGFueT53aW5kb3cpLm5hdmlnYXRvci5jbGlwYm9hcmQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIEZvdW5kIG5hdmlnYXRvciBjbGlwYm9hcmRcIik7XHJcbiAgICAgICAgICAgICg8YW55PndpbmRvdykubmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHsgbmFtZTogJ2NsaXBib2FyZC1yZWFkJyB9KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQuc3RhdGUgPT09ICdncmFudGVkJyB8fCByZXN1bHQuc3RhdGUgPT09ICdwcm9tcHQnKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBDbGlwYm9hcmQgcGVybWlzc2lvbiBub3QgZ3JhbnRlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVGb3VuZENhbGxiYWNrKSB2YWx1ZUZvdW5kQ2FsbGJhY2soW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gQ2xpcGJvYXJkIHBlcm1pc3Npb24gZ3JhbnRlZCwgcmV0cmlldmluZyB2YWx1ZXNcIik7XHJcbiAgICAgICAgICAgICAgICAoPGFueT53aW5kb3cpLm5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh0OiBzdHJpbmcpID0+IHRoaXMuZG9DbGlwYm9hcmREYXRhR2V0KHQsIHN0eWxlLCB2YWx1ZUZvdW5kQ2FsbGJhY2spKVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMubXNnU2VydmljZS5zaW1wbGVFcnJvcih0aGlzLmxvY1tcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCByZWFkIG9wZXJhdGlvblwiXVtMT0NBTEVdICsgXCI6IFwiICsgZXJyKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBkb0NsaXBib2FyZERhdGFHZXQoY2xpcGJvYXJkVGV4dDogc3RyaW5nLCBzdHlsZTogXCJtYXRyaXhcIiB8IFwiYXJyYXlcIiwgdmFsdWVGb3VuZENhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBSZXRyaWV2ZWQgY2xpcGJvYXJkIHZhbHVlczogXCIgKyBjbGlwYm9hcmRUZXh0KTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZSA9PSBcImFycmF5XCIgPyB0aGlzLmdldENsaXBib2FyZExpbmVzKGNsaXBib2FyZFRleHQpIDpcclxuICAgICAgICAgICAgc3R5bGUgPT0gXCJtYXRyaXhcIiA/IHRoaXMuZ2V0Q2xpcGJvYXJkTWF0cml4KGNsaXBib2FyZFRleHQpIDogW107XHJcbiAgICAgICAgY29uc29sZS5sb2coYFtAZXNmYWVuemEvZXh0ZW5zaW9uc10gQWRhcHRlZCBmb3IgJHtzdHlsZX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xyXG4gICAgICAgIGlmICh2YWx1ZUZvdW5kQ2FsbGJhY2spIHZhbHVlRm91bmRDYWxsYmFjayh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNvbnRlbnV0byBkZWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdoZSAoc2VwYXJhdGUgZGEgbmV3bGluZSlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgY29udGVudXRvIGxldHRvIGRhbGxhIGNsaXBib2FyZFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IGNvbnRlbmVudGUgaWwgdGVzdG8gcHJlc28gZGFsbGEgY2xpcGJvYXJkIGRpdmlzbyBwZXIgcmlnYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldENsaXBib2FyZExpbmVzKGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgdHJpbW1lZERhdGEgPSBkYXRhLnRyaW0oKTtcclxuXHJcbiAgICAgICAgaWYgKCF0cmltbWVkRGF0YS5pbmNsdWRlcyhcIlxcclxcblwiKSAmJiB0cmltbWVkRGF0YS5pbmNsdWRlcyhcIlxcblwiKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWREYXRhLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJpbW1lZERhdGEuc3BsaXQoXCJcXHJcXG5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNvbnRlbnV0byBkZWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdoZSAoc2VwYXJhdGUgZGEgbmV3bGluZSkgZSBjb2xvbm5lIChzZXBhcmF0ZSBkYSB0YWIpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIGNvbnRlbnV0byBsZXR0byBkYWxsYSBjbGlwYm9hcmRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdW119IE1hdHJpY2UgY29udGVuZW50ZSBpbCB0ZXN0byBwcmVzbyBkYWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdhIGUgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldENsaXBib2FyZE1hdHJpeChkYXRhOiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICAgICAgICB2YXIgcmV0OiBzdHJpbmdbXVtdID0gW107XHJcbiAgICAgICAgdmFyIHJvd3MgPSAhZGF0YS5pbmNsdWRlcyhcIlxcclxcblwiKSAmJiBkYXRhLmluY2x1ZGVzKFwiXFxuXCIpID8gZGF0YS5zcGxpdChcIlxcblwiKSA6IGRhdGEuc3BsaXQoXCJcXHJcXG5cIik7XHJcblxyXG4gICAgICAgIC8vIEEgcXVhbnRvIHBhcmUgb2duaSB2YWxvcmUgw6ggc2VwYXJhdG8gZGEgdW4gXFx0Li4uIHNwZXJvIGNoZSBzaWEgdW5vIHN0YW5kYXJkIGRpIHF1YW5kbyBzaSBjb3BpYSBkYSBleGNlbCBhbHRyaW1lbnRpIGNpYW9cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHJldC5wdXNoKHJvd3NbaV0uc3BsaXQoJ1xcdCcpLm1hcCh0ID0+IHQudHJpbSgpKSk7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgY29waWEgdW4gdGVzdG8gYWxsJ2ludGVybm8gZGVsbGEgY2xpcGJvYXJkXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIGluc2VyaXJlIG5lbGxhIGNsaXBib2FyZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgY29weVRleHRUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgTE9DQUxFID0gdGhpcy5sb2NQcm92aWRlciA/ICBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuXHJcbiAgICAgICAgdmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vICoqKiBUaGlzIHN0eWxpbmcgaXMgYW4gZXh0cmEgc3RlcCB3aGljaCBpcyBsaWtlbHkgbm90IHJlcXVpcmVkLiAqKipcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdoeSBpcyBpdCBoZXJlPyBUbyBlbnN1cmU6XHJcbiAgICAgICAgLy8gMS4gdGhlIGVsZW1lbnQgaXMgYWJsZSB0byBoYXZlIGZvY3VzIGFuZCBzZWxlY3Rpb24uXHJcbiAgICAgICAgLy8gMi4gaWYgZWxlbWVudCB3YXMgdG8gZmxhc2ggcmVuZGVyIGl0IGhhcyBtaW5pbWFsIHZpc3VhbCBpbXBhY3QuXHJcbiAgICAgICAgLy8gMy4gbGVzcyBmbGFreW5lc3Mgd2l0aCBzZWxlY3Rpb24gYW5kIGNvcHlpbmcgd2hpY2ggKiptaWdodCoqIG9jY3VyIGlmXHJcbiAgICAgICAgLy8gICAgdGhlIHRleHRhcmVhIGVsZW1lbnQgaXMgbm90IHZpc2libGUuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGUgbGlrZWxpaG9vZCBpcyB0aGUgZWxlbWVudCB3b24ndCBldmVuIHJlbmRlciwgbm90IGV2ZW4gYSBmbGFzaCxcclxuICAgICAgICAvLyBzbyBzb21lIG9mIHRoZXNlIGFyZSBqdXN0IHByZWNhdXRpb25zLiBIb3dldmVyIGluIElFIHRoZSBlbGVtZW50XHJcbiAgICAgICAgLy8gaXMgdmlzaWJsZSB3aGlsc3QgdGhlIHBvcHVwIGJveCBhc2tpbmcgdGhlIHVzZXIgZm9yIHBlcm1pc3Npb24gZm9yXHJcbiAgICAgICAgLy8gdGhlIHdlYiBwYWdlIHRvIGNvcHkgdG8gdGhlIGNsaXBib2FyZC5cclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICAvLyBQbGFjZSBpbiB0b3AtbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIHJlZ2FyZGxlc3Mgb2Ygc2Nyb2xsIHBvc2l0aW9uLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnRvcCA9IFwiMFwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlIGl0IGhhcyBhIHNtYWxsIHdpZHRoIGFuZCBoZWlnaHQuIFNldHRpbmcgdG8gMXB4IC8gMWVtXHJcbiAgICAgICAgLy8gZG9lc24ndCB3b3JrIGFzIHRoaXMgZ2l2ZXMgYSBuZWdhdGl2ZSB3L2ggb24gc29tZSBicm93c2Vycy5cclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS53aWR0aCA9IFwiMmVtXCI7XHJcbiAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gXCIyZW1cIjtcclxuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBwYWRkaW5nLCByZWR1Y2luZyB0aGUgc2l6ZSBpZiBpdCBkb2VzIGZsYXNoIHJlbmRlci5cclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XHJcblxyXG4gICAgICAgIC8vIENsZWFuIHVwIGFueSBib3JkZXJzLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmJvcmRlciA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLm91dGxpbmUgPSBcIm5vbmVcIjtcclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5ib3hTaGFkb3cgPSBcIm5vbmVcIjtcclxuXHJcbiAgICAgICAgLy8gQXZvaWQgZmxhc2ggb2Ygd2hpdGUgYm94IGlmIHJlbmRlcmVkIGZvciBhbnkgcmVhc29uLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmJhY2tncm91bmQgPSBcInRyYW5zcGFyZW50XCI7XHJcblxyXG4gICAgICAgIHRleHRBcmVhLnZhbHVlID0gdGV4dDtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XHJcbiAgICAgICAgdGV4dEFyZWEuZm9jdXMoKTtcclxuICAgICAgICB0ZXh0QXJlYS5zZWxlY3QoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHN1Y2Nlc3NmdWwgPSBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XHJcbiAgICAgICAgICAgIGlmKCFzdWNjZXNzZnVsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5tc2dTZXJ2aWNlLnNpbXBsZUVycm9yKHRoaXMubG9jW1wiR2VuZXJpYyBlcnJvciBkdXJpbmcgJ2NvcHknIGNvbW1hbmQgZXhlY3V0aW9uXCJdW0xPQ0FMRV0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uuc2ltcGxlRXJyb3IodGhpcy5sb2NbXCJFcnJvciBkdXJpbmcgQ2xpcGJvYXJkIGNvbnRlbnQgY29weSBvcGVyYXRpb25cIl1bTE9DQUxFXSArIFwiOiBcIisgZXJyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xyXG4gICAgfVxyXG59Il19
@@ -0,0 +1,246 @@
1
+ // Angular
2
+ import { Injectable, Inject, Optional } from "@angular/core";
3
+ // Modelli
4
+ import { EXT_ALLOW_UTC } from "../tokens";
5
+ // Librerie
6
+ import { first } from "rxjs/operators";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@esfaenza/localizations";
9
+ /**
10
+ * Service che fornisce dei metodi di estensione per la gestione/manipolazione delle date
11
+ */
12
+ export class DateService {
13
+ /**
14
+ * Costruttore
15
+ *
16
+ * @ignore
17
+ */
18
+ constructor(locProvider, allowUtc) {
19
+ this.locProvider = locProvider;
20
+ this.allowUtc = allowUtc;
21
+ /**
22
+ * Oggetto statico di localizzazione per i messaggi di questa Service
23
+ */
24
+ this.loc = {
25
+ "SMALL_DATE_FORMAT": { 'en-US': "MM/DD/YYYY", 'it-IT': "DD/MM/YYYY" },
26
+ "FULL_DATE_FORMAT": { 'en-US': "MM/DD/YYYY HH:mm:ss", 'it-IT': "DD/MM/YYYY HH:mm:ss" },
27
+ "FULL_DATE_FORMAT_NO_SS": { 'en-US': "MM/DD/YYYY HH:mm", 'it-IT': "DD/MM/YYYY HH:mm" },
28
+ "SMALL_DATE_DISPLAY_FORMAT": { 'en-US': "DD/MM/YYYY", 'it-IT': "DD/MM/YYYY" },
29
+ "SMALL_DATE_DISPLAY_FORMAT_WITH_HOUR": { 'en-US': "DD/MM/YYYY HH", 'it-IT': "DD/MM/YYYY HH" },
30
+ "SMALL_DATE_DISPLAY_FORMAT_WITH_MINUTE": { 'en-US': "DD/MM/YYYY HH:mm", 'it-IT': "DD/MM/YYYY HH:mm" },
31
+ "FULL_DATE_DISPLAY_FORMAT": { 'en-US': "DD/MM/YYYY HH:mm:ss", 'it-IT': "DD/MM/YYYY HH:mm:ss" },
32
+ "FULL_DATE_DISPLAY_FORMAT_NO_SS": { 'en-US': "DD/MM/YYYY HH:mm", 'it-IT': "DD/MM/YYYY HH:mm" }
33
+ };
34
+ /**
35
+ * Oggetto di configurazione per tenere da conto le informazioni sui formati
36
+ */
37
+ this.cfg = {
38
+ fulldate: "",
39
+ fulldateDisplay: "",
40
+ smallDate: "",
41
+ fulldateNoSS: "",
42
+ smallDateWithH: "",
43
+ smallDateWithM: "",
44
+ fulldateDisplayNoSS: ""
45
+ };
46
+ this.init();
47
+ }
48
+ async init() {
49
+ let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
50
+ this.cfg.smallDate = this.loc["SMALL_DATE_FORMAT"][LOCALE];
51
+ this.cfg.fulldate = this.loc["FULL_DATE_FORMAT"][LOCALE];
52
+ this.cfg.fulldateNoSS = this.loc["FULL_DATE_FORMAT_NO_SS"][LOCALE];
53
+ this.cfg.fulldateDisplay = this.loc["FULL_DATE_DISPLAY_FORMAT"][LOCALE];
54
+ this.cfg.fulldateDisplayNoSS = this.loc["FULL_DATE_DISPLAY_FORMAT_NO_SS"][LOCALE];
55
+ this.cfg.smallDate = this.loc["SMALL_DATE_DISPLAY_FORMAT"][LOCALE];
56
+ this.cfg.smallDateWithH = this.loc["SMALL_DATE_DISPLAY_FORMAT_WITH_HOUR"][LOCALE];
57
+ this.cfg.smallDateWithM = this.loc["SMALL_DATE_DISPLAY_FORMAT_WITH_MINUTE"][LOCALE];
58
+ }
59
+ /**
60
+ * Aggiusta una data in "istante finale" in base a qual è la parte di data significativa.
61
+ *
62
+ * Es. Istante finale delle ore: 05/10/1992 --> 04/10/1992 24:00(:00)
63
+ *
64
+ * @param {any} date Data qualsiasi (Date, stringa, dayjs...), verrà ricondotta ad un oggetto dayJs
65
+ * @param {'day' | 'hour' | 'minute'} timepart Parte significativa della data
66
+ * @param {boolean} printSeconds Indica se effettuare la stampa dei secondi o no
67
+ */
68
+ adjustDateToFinalInstant(date, timepart, printSeconds = true) {
69
+ let mydt = this.getDateConvertion(date);
70
+ if (mydt == null)
71
+ return "FE: Not a Date";
72
+ let isZeroTime = mydt.startOf(timepart).valueOf() === mydt.valueOf();
73
+ if (!isZeroTime) {
74
+ if (timepart == "day" && mydt.subtract(1, "hour").hour() == mydt.hour()) {
75
+ // Se l'ora precedente è lo stesso orario dell'ora attuale l'istante finale dev'essere mandato avanti di 1
76
+ mydt = mydt.add(1, "hour");
77
+ }
78
+ return printSeconds ? mydt.format(this.cfg.fulldateDisplay) : mydt.format(this.cfg.fulldateDisplayNoSS);
79
+ }
80
+ let tmpValue = mydt.subtract(1, timepart);
81
+ let value = "";
82
+ // Istante finale delle ore: 05/10/1992 --> 04/10/1992 24:00(:00)
83
+ if (timepart == 'day')
84
+ value = tmpValue.format(this.cfg.smallDate) + " 24:00" + (printSeconds ? ':00' : '');
85
+ // Istante finale dei minuti: giorno 05/10/1992 04:00:00 --> 05/10/1992 03:60(:00)
86
+ else if (timepart == 'hour')
87
+ value = tmpValue.format(this.cfg.smallDateWithH) + ":60" + (printSeconds ? ':00' : '');
88
+ // Istante finale dei secondi: giorno 05/10/1992 04:10:00 --> 05/10/1992 04:09:60
89
+ else if (timepart == 'minute')
90
+ value = tmpValue.format(this.cfg.smallDateWithM) + ":60";
91
+ return value;
92
+ }
93
+ /**
94
+ * Funzione che effettua l'ordinamento fra 2 date in base alla direzione specificata
95
+ *
96
+ * @param {any} a Prima data per il confronto
97
+ * @param {any} b Seconda data per il confronto
98
+ * @param {'asc' | 'desc'} direction Direzione rispetto a cui ordinare le due date
99
+ *
100
+ * @returns {number} 0 se le date sono uguali, 1 se la data A deve venire logicamente prima della data B, -1 altrimenti
101
+ */
102
+ dateSort(a, b, direction) {
103
+ if (a < b)
104
+ return direction == 'asc' ? 1 : -1;
105
+ else if (a > b)
106
+ return direction == 'asc' ? -1 : 1;
107
+ // con a uguale a b
108
+ return 0;
109
+ }
110
+ /**
111
+ * Effettua il trim dei secondi da una data espressa come stringa
112
+ *
113
+ * @param {string} value Data espressa come stringa
114
+ *
115
+ * @returns {string} Data senza i secondi
116
+ */
117
+ trimSeconds(value) {
118
+ //I numeri mangiati da dayjs spesso vengono ricondotti a date vere. Mi assicuro che se ci sono solo numeri proseguo
119
+ if (!isNaN(value))
120
+ return value;
121
+ //Se non ho qualcosa del tipo XX/YY/ZZZZ aa:bb:cc di sicuro non è una data che mi interessa
122
+ if (!/^\d\d\/\d\d\/\d\d\d\d \d\d:\d\d:\d\d$/g.test(value))
123
+ return value;
124
+ //In questo caso mi arrivano valori che devono essere stampati as-is, solo tagliando i secondi
125
+ return "'" + value.substr(0, value.length - 3);
126
+ }
127
+ /**
128
+ * Data una lista di date Da e una lista di date A restituisce un oggetto rappresentante il range che include tutte le date passate
129
+ *
130
+ * @param {any[]} fromDates Lista dei Da
131
+ * @param {any[]} toDates Lista dei A
132
+ *
133
+ * @returns {{ from: any, to: any }} Range di date Da - A che include tutti i valori di **fromDates** e **toDates**
134
+ */
135
+ getMinMaxDatesRange(fromDates, toDates) {
136
+ let datesFroms = [];
137
+ let datesTo = [];
138
+ for (let i = 0; i < fromDates.length; i++) {
139
+ let d = fromDates[i];
140
+ var convertion = this.getDateConvertion(d);
141
+ if (convertion)
142
+ datesFroms.push(convertion);
143
+ }
144
+ for (let i = 0; i < toDates.length; i++) {
145
+ let d = toDates[i];
146
+ var convertion = this.getDateConvertion(d);
147
+ if (convertion)
148
+ datesTo.push(convertion);
149
+ }
150
+ return { from: dayjs.min(datesFroms), to: dayjs.max(datesTo) };
151
+ }
152
+ /**
153
+ * Ottiene la conversione di una data in qualsiasi formato al formato standard DayJs
154
+ *
155
+ * @param {any} date Oggetto rappresentante una data. Potrebbe essere una stringa, un Date o già un DayJs
156
+ * @param {boolean} useUtc Indica se usare l'estensione utc di Dayjs per parsare la data o no
157
+ * @param {string} format formato in cui emettere la conversione
158
+ *
159
+ * @returns {any} Data in modalità {format}
160
+ */
161
+ getDateConvertion(date, useUtc = false, format = 'dayjs', timestringSmall = true) {
162
+ if (!date)
163
+ return null;
164
+ if (this.isDayJs(date))
165
+ return this.formattedDayjs(date, format, timestringSmall);
166
+ if (this.isJsDate(date))
167
+ return this.formattedDayjs(useUtc ? dayjs.utc(date) : dayjs(date), format, timestringSmall);
168
+ // Se non c'è la proprietà length vuol dire che non è una stringa e a questo punto non ho idea di che minchia sia
169
+ let length = date.length;
170
+ if (!length)
171
+ return null;
172
+ if (useUtc && !this.allowUtc)
173
+ throw "@esfaenza/extensions: Richiesta data UTC ma da configurazione la libreria non lo supporta";
174
+ // Per risparmiare chiamate a tentoni, in base alla lunghezza della stringa chiamo direttamente il metodo giusto,
175
+ // controllando poi che mi generi una data come me la aspetto io
176
+ let tryThis = null;
177
+ let toCall = useUtc ? dayjs.utc : dayjs;
178
+ // Se la data contiene la lettera "T" vuol dire che è una data del tipo 2020-10-15T00:00:00, direttamente parsabile dal dayjs col locale corretto.
179
+ // Per il resto mi baso sulla lunghezza della stringa
180
+ if (date.includes("T"))
181
+ tryThis = toCall(date);
182
+ else if (length == this.cfg.fulldate.length)
183
+ tryThis = toCall(date, this.cfg.fulldate);
184
+ else if (length == this.cfg.smallDate.length)
185
+ tryThis = toCall(date, this.cfg.smallDate);
186
+ else if (length == this.cfg.fulldateNoSS.length)
187
+ tryThis = toCall(date, this.cfg.fulldateNoSS);
188
+ if (tryThis && tryThis.isValid && tryThis.isValid())
189
+ return this.formattedDayjs(tryThis, format, timestringSmall);
190
+ // Se niente funziona, null.
191
+ // Ricondurre l'Input ad una data non è possibile.
192
+ return null;
193
+ }
194
+ formattedDayjs(dayjs, format, timestringSmall) {
195
+ return format == 'dayjs' ? dayjs : format == 'date' ? dayjs.toDate() : this.getFormatted(dayjs, timestringSmall, false);
196
+ }
197
+ /**
198
+ * Helper che restituisce **true** qualora l'oggetto passato fosse una data vera e propria, **false** altrimenti
199
+ *
200
+ * @param {any} check Oggetto da controllare
201
+ *
202
+ * @returns {boolean} Indicazione se l'oggetto è un vero Date di Javascript o no
203
+ */
204
+ isJsDate(check) {
205
+ return check && Object.prototype.toString.call(check) === "[object Date]" && !isNaN(check);
206
+ }
207
+ /**
208
+ * Helper che restituisce **true** qualora l'oggetto passato fosse un DayJs vero e proprio, **false** altrimenti
209
+ *
210
+ * @param {any} check Oggetto da controllare
211
+ * @returns {boolean} Indicazione se l'oggetto è un vero DayJs o no
212
+ */
213
+ isDayJs(check) {
214
+ // Non uso instanceof perché sarebbe estremamente più lento
215
+ // Non uso nemmeno isDayjs() della libreria Dayjs dato che ha lo stesso problema: https://github.com/iamkun/dayjs/blob/06f88f425828b1ce96b737332d25145a95a4ee9d/src/index.js#L9
216
+ return check.$D !== undefined && check.$M !== undefined && check.$y !== undefined;
217
+ }
218
+ /**
219
+ * Ottiene la formattazione di una data in base alla versione richiesta "small" o "long" e a se stampare o meno i secondi
220
+ *
221
+ * @param {any} date Oggetto rappresentante una data. Potrebbe essere una stringa, un Date o già un DayJs
222
+ * @param {boolean} small Indica se formattarla con un formato breve (se **true**) o un formato più lungo (se **false**)
223
+ *
224
+ * @returns {string} Data formattata nel formato richiesto
225
+ */
226
+ getFormatted(date, small, seconds) {
227
+ var date = this.getDateConvertion(date);
228
+ if (!date)
229
+ return null;
230
+ return date.format(small ? this.cfg.smallDate : seconds ? this.cfg.fulldateDisplay : this.cfg.fulldateDisplayNoSS);
231
+ }
232
+ }
233
+ DateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateService, deps: [{ token: i1.BaseLocalization, optional: true }, { token: EXT_ALLOW_UTC, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
234
+ DateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateService, providedIn: "root" });
235
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateService, decorators: [{
236
+ type: Injectable,
237
+ args: [{ providedIn: "root" }]
238
+ }], ctorParameters: function () { return [{ type: i1.BaseLocalization, decorators: [{
239
+ type: Optional
240
+ }] }, { type: undefined, decorators: [{
241
+ type: Optional
242
+ }, {
243
+ type: Inject,
244
+ args: [EXT_ALLOW_UTC]
245
+ }] }]; } });
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5kYXRlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMuZGF0ZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzdELFVBQVU7QUFDVixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFDLFdBQVc7QUFDWCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVN0Qzs7RUFFRTtBQUVILE1BQU0sT0FBTyxXQUFXO0lBNkJwQjs7OztPQUlHO0lBQ0gsWUFBdUMsV0FBNkIsRUFBNkMsUUFBaUI7UUFBM0YsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQTZDLGFBQVEsR0FBUixRQUFRLENBQVM7UUFoQ2xJOztXQUVHO1FBQ0ssUUFBRyxHQUFHO1lBQ1YsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUU7WUFDckUsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO1lBQ3RGLHdCQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtZQUN0RiwyQkFBMkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUM3RSxxQ0FBcUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRTtZQUM3Rix1Q0FBdUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsa0JBQWtC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QUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRXNcclxuaW1wb3J0IHsgQmFzZUxvY2FsaXphdGlvbiB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBFWFRfQUxMT1dfVVRDIH0gZnJvbSBcIi4uL3Rva2Vuc1wiO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRGF5anMgfSBmcm9tIFwiZGF5anNcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuIGRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4gLyoqXHJcbiAqIFNlcnZpY2UgY2hlIGZvcm5pc2NlIGRlaSBtZXRvZGkgZGkgZXN0ZW5zaW9uZSBwZXIgbGEgZ2VzdGlvbmUvbWFuaXBvbGF6aW9uZSBkZWxsZSBkYXRlXHJcbiAqL1xyXG4gQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIERhdGVTZXJ2aWNlIHtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBPZ2dldHRvIHN0YXRpY28gZGkgbG9jYWxpenphemlvbmUgcGVyIGkgbWVzc2FnZ2kgZGkgcXVlc3RhIFNlcnZpY2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsb2MgPSB7XHJcbiAgICAgICAgXCJTTUFMTF9EQVRFX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiTU0vREQvWVlZWVwiLCAnaXQtSVQnOiBcIkREL01NL1lZWVlcIiB9LFxyXG4gICAgICAgIFwiRlVMTF9EQVRFX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiTU0vREQvWVlZWSBISDptbTpzc1wiLCAnaXQtSVQnOiBcIkREL01NL1lZWVkgSEg6bW06c3NcIiB9LFxyXG4gICAgICAgIFwiRlVMTF9EQVRFX0ZPUk1BVF9OT19TU1wiOiB7ICdlbi1VUyc6IFwiTU0vREQvWVlZWSBISDptbVwiLCAnaXQtSVQnOiBcIkREL01NL1lZWVkgSEg6bW1cIiB9LFxyXG4gICAgICAgIFwiU01BTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiREQvTU0vWVlZWVwiLCAnaXQtSVQnOiBcIkREL01NL1lZWVlcIiB9LFxyXG4gICAgICAgIFwiU01BTExfREFURV9ESVNQTEFZX0ZPUk1BVF9XSVRIX0hPVVJcIjogeyAnZW4tVVMnOiBcIkREL01NL1lZWVkgSEhcIiwgJ2l0LUlUJzogXCJERC9NTS9ZWVlZIEhIXCIgfSxcclxuICAgICAgICBcIlNNQUxMX0RBVEVfRElTUExBWV9GT1JNQVRfV0lUSF9NSU5VVEVcIjogeyAnZW4tVVMnOiBcIkREL01NL1lZWVkgSEg6bW1cIiwgJ2l0LUlUJzogXCJERC9NTS9ZWVlZIEhIOm1tXCIgfSxcclxuICAgICAgICBcIkZVTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiREQvTU0vWVlZWSBISDptbTpzc1wiLCAnaXQtSVQnOiBcIkREL01NL1lZWVkgSEg6bW06c3NcIiB9LFxyXG4gICAgICAgIFwiRlVMTF9EQVRFX0RJU1BMQVlfRk9STUFUX05PX1NTXCI6IHsgJ2VuLVVTJzogXCJERC9NTS9ZWVlZIEhIOm1tXCIsICdpdC1JVCc6IFwiREQvTU0vWVlZWSBISDptbVwiIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPZ2dldHRvIGRpIGNvbmZpZ3VyYXppb25lIHBlciB0ZW5lcmUgZGEgY29udG8gbGUgaW5mb3JtYXppb25pIHN1aSBmb3JtYXRpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2ZnID0ge1xyXG4gICAgICAgIGZ1bGxkYXRlOiBcIlwiLFxyXG4gICAgICAgIGZ1bGxkYXRlRGlzcGxheTogXCJcIixcclxuICAgICAgICBzbWFsbERhdGU6IFwiXCIsXHJcbiAgICAgICAgZnVsbGRhdGVOb1NTOiBcIlwiLFxyXG4gICAgICAgIHNtYWxsRGF0ZVdpdGhIOiBcIlwiLFxyXG4gICAgICAgIHNtYWxsRGF0ZVdpdGhNOiBcIlwiLFxyXG4gICAgICAgIGZ1bGxkYXRlRGlzcGxheU5vU1M6IFwiXCJcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvc3RydXR0b3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgbG9jUHJvdmlkZXI6IEJhc2VMb2NhbGl6YXRpb24sIEBPcHRpb25hbCgpIEBJbmplY3QoRVhUX0FMTE9XX1VUQykgcHJpdmF0ZSBhbGxvd1V0YzogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICBsZXQgTE9DQUxFID0gdGhpcy5sb2NQcm92aWRlciA/ICBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmNmZy5zbWFsbERhdGUgPSB0aGlzLmxvY1tcIlNNQUxMX0RBVEVfRk9STUFUXCJdW0xPQ0FMRV07XHJcbiAgICAgICAgdGhpcy5jZmcuZnVsbGRhdGUgPSB0aGlzLmxvY1tcIkZVTExfREFURV9GT1JNQVRcIl1bTE9DQUxFXTtcclxuICAgICAgICB0aGlzLmNmZy5mdWxsZGF0ZU5vU1MgPSB0aGlzLmxvY1tcIkZVTExfREFURV9GT1JNQVRfTk9fU1NcIl1bTE9DQUxFXTtcclxuICAgICAgICB0aGlzLmNmZy5mdWxsZGF0ZURpc3BsYXkgPSB0aGlzLmxvY1tcIkZVTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLmZ1bGxkYXRlRGlzcGxheU5vU1MgID10aGlzLmxvY1tcIkZVTExfREFURV9ESVNQTEFZX0ZPUk1BVF9OT19TU1wiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLnNtYWxsRGF0ZSA9IHRoaXMubG9jW1wiU01BTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLnNtYWxsRGF0ZVdpdGhIID0gdGhpcy5sb2NbXCJTTUFMTF9EQVRFX0RJU1BMQVlfRk9STUFUX1dJVEhfSE9VUlwiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLnNtYWxsRGF0ZVdpdGhNID0gdGhpcy5sb2NbXCJTTUFMTF9EQVRFX0RJU1BMQVlfRk9STUFUX1dJVEhfTUlOVVRFXCJdW0xPQ0FMRV07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFnZ2l1c3RhIHVuYSBkYXRhIGluIFwiaXN0YW50ZSBmaW5hbGVcIiBpbiBiYXNlIGEgcXVhbCDDqCBsYSBwYXJ0ZSBkaSBkYXRhIHNpZ25pZmljYXRpdmEuXHJcbiAgICAgKiBcclxuICAgICAqIEVzLiBJc3RhbnRlIGZpbmFsZSBkZWxsZSBvcmU6IDA1LzEwLzE5OTIgLS0+IDA0LzEwLzE5OTIgMjQ6MDAoOjAwKVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZGF0ZSBEYXRhIHF1YWxzaWFzaSAoRGF0ZSwgc3RyaW5nYSwgZGF5anMuLi4pLCB2ZXJyw6Agcmljb25kb3R0YSBhZCB1biBvZ2dldHRvIGRheUpzXHJcbiAgICAgKiBAcGFyYW0geydkYXknIHwgJ2hvdXInIHwgJ21pbnV0ZSd9IHRpbWVwYXJ0IFBhcnRlIHNpZ25pZmljYXRpdmEgZGVsbGEgZGF0YVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwcmludFNlY29uZHMgSW5kaWNhIHNlIGVmZmV0dHVhcmUgbGEgc3RhbXBhIGRlaSBzZWNvbmRpIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkanVzdERhdGVUb0ZpbmFsSW5zdGFudChkYXRlOiBhbnksIHRpbWVwYXJ0OiAnZGF5JyB8ICdob3VyJyB8ICdtaW51dGUnLCBwcmludFNlY29uZHM6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbXlkdCA9IHRoaXMuZ2V0RGF0ZUNvbnZlcnRpb24oZGF0ZSk7XHJcbiAgICAgICAgaWYgKG15ZHQgPT0gbnVsbCkgcmV0dXJuIFwiRkU6IE5vdCBhIERhdGVcIjtcclxuXHJcbiAgICAgICAgbGV0IGlzWmVyb1RpbWUgPSBteWR0LnN0YXJ0T2YodGltZXBhcnQpLnZhbHVlT2YoKSA9PT0gbXlkdC52YWx1ZU9mKCk7XHJcbiAgICAgICAgaWYgKCFpc1plcm9UaW1lKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lcGFydCA9PSBcImRheVwiICYmIG15ZHQuc3VidHJhY3QoMSwgXCJob3VyXCIpLmhvdXIoKSA9PSBteWR0LmhvdXIoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2UgbCdvcmEgcHJlY2VkZW50ZSDDqCBsbyBzdGVzc28gb3JhcmlvIGRlbGwnb3JhIGF0dHVhbGUgbCdpc3RhbnRlIGZpbmFsZSBkZXYnZXNzZXJlIG1hbmRhdG8gYXZhbnRpIGRpIDFcclxuICAgICAgICAgICAgICAgIG15ZHQgPSBteWR0LmFkZCgxLCBcImhvdXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmludFNlY29uZHMgPyBteWR0LmZvcm1hdCh0aGlzLmNmZy5mdWxsZGF0ZURpc3BsYXkpIDogbXlkdC5mb3JtYXQodGhpcy5jZmcuZnVsbGRhdGVEaXNwbGF5Tm9TUyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG1wVmFsdWUgPSBteWR0LnN1YnRyYWN0KDEsIHRpbWVwYXJ0KTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xyXG5cclxuICAgICAgICAvLyBJc3RhbnRlIGZpbmFsZSBkZWxsZSBvcmU6IDA1LzEwLzE5OTIgLS0+IDA0LzEwLzE5OTIgMjQ6MDAoOjAwKVxyXG4gICAgICAgIGlmICh0aW1lcGFydCA9PSAnZGF5JylcclxuICAgICAgICAgICAgdmFsdWUgPSB0bXBWYWx1ZS5mb3JtYXQodGhpcy5jZmcuc21hbGxEYXRlKSArIFwiIDI0OjAwXCIgKyAocHJpbnRTZWNvbmRzID8gJzowMCcgOiAnJyk7XHJcblxyXG4gICAgICAgIC8vIElzdGFudGUgZmluYWxlIGRlaSBtaW51dGk6IGdpb3JubyAwNS8xMC8xOTkyIDA0OjAwOjAwIC0tPiAwNS8xMC8xOTkyIDAzOjYwKDowMClcclxuICAgICAgICBlbHNlIGlmICh0aW1lcGFydCA9PSAnaG91cicpXHJcbiAgICAgICAgICAgIHZhbHVlID0gdG1wVmFsdWUuZm9ybWF0KHRoaXMuY2ZnLnNtYWxsRGF0ZVdpdGhIKSArIFwiOjYwXCIgKyAocHJpbnRTZWNvbmRzID8gJzowMCcgOiAnJyk7XHJcblxyXG4gICAgICAgIC8vIElzdGFudGUgZmluYWxlIGRlaSBzZWNvbmRpOiBnaW9ybm8gMDUvMTAvMTk5MiAwNDoxMDowMCAtLT4gMDUvMTAvMTk5MiAwNDowOTo2MFxyXG4gICAgICAgIGVsc2UgaWYgKHRpbWVwYXJ0ID09ICdtaW51dGUnKVxyXG4gICAgICAgICAgICB2YWx1ZSA9IHRtcFZhbHVlLmZvcm1hdCh0aGlzLmNmZy5zbWFsbERhdGVXaXRoTSkgKyBcIjo2MFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBjaGUgZWZmZXR0dWEgbCdvcmRpbmFtZW50byBmcmEgMiBkYXRlIGluIGJhc2UgYWxsYSBkaXJlemlvbmUgc3BlY2lmaWNhdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGEgUHJpbWEgZGF0YSBwZXIgaWwgY29uZnJvbnRvXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gYiBTZWNvbmRhIGRhdGEgcGVyIGlsIGNvbmZyb250b1xyXG4gICAgICogQHBhcmFtIHsnYXNjJyB8ICdkZXNjJ30gZGlyZWN0aW9uIERpcmV6aW9uZSByaXNwZXR0byBhIGN1aSBvcmRpbmFyZSBsZSBkdWUgZGF0ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAwIHNlIGxlIGRhdGUgc29ubyB1Z3VhbGksIDEgc2UgbGEgZGF0YSBBIGRldmUgdmVuaXJlIGxvZ2ljYW1lbnRlIHByaW1hIGRlbGxhIGRhdGEgQiwgLTEgYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGF0ZVNvcnQoYTogYW55LCBiOiBhbnksIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChhIDwgYikgcmV0dXJuIGRpcmVjdGlvbiA9PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgICAgICBlbHNlIGlmIChhID4gYikgcmV0dXJuIGRpcmVjdGlvbiA9PSAnYXNjJyA/IC0xIDogMTtcclxuXHJcbiAgICAgICAgLy8gY29uIGEgdWd1YWxlIGEgYlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgdHJpbSBkZWkgc2Vjb25kaSBkYSB1bmEgZGF0YSBlc3ByZXNzYSBjb21lIHN0cmluZ2FcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIERhdGEgZXNwcmVzc2EgY29tZSBzdHJpbmdhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IERhdGEgc2VuemEgaSBzZWNvbmRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmltU2Vjb25kcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICAvL0kgbnVtZXJpIG1hbmdpYXRpIGRhIGRheWpzIHNwZXNzbyB2ZW5nb25vIHJpY29uZG90dGkgYSBkYXRlIHZlcmUuIE1pIGFzc2ljdXJvIGNoZSBzZSBjaSBzb25vIHNvbG8gbnVtZXJpIHByb3NlZ3VvXHJcbiAgICAgICAgaWYgKCFpc05hTig8YW55PnZhbHVlKSlcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgICAgICAvL1NlIG5vbiBobyBxdWFsY29zYSBkZWwgdGlwbyBYWC9ZWS9aWlpaIGFhOmJiOmNjIGRpIHNpY3VybyBub24gw6ggdW5hIGRhdGEgY2hlIG1pIGludGVyZXNzYVxyXG4gICAgICAgIGlmICghL15cXGRcXGRcXC9cXGRcXGRcXC9cXGRcXGRcXGRcXGQgXFxkXFxkOlxcZFxcZDpcXGRcXGQkL2cudGVzdCh2YWx1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy9JbiBxdWVzdG8gY2FzbyBtaSBhcnJpdmFubyB2YWxvcmkgY2hlIGRldm9ubyBlc3NlcmUgc3RhbXBhdGkgYXMtaXMsIHNvbG8gdGFnbGlhbmRvIGkgc2Vjb25kaVxyXG4gICAgICAgIHJldHVybiBcIidcIiArIHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5sZW5ndGggLSAzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIGxpc3RhIGRpIGRhdGUgRGEgZSB1bmEgbGlzdGEgZGkgZGF0ZSBBIHJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gcmFwcHJlc2VudGFudGUgaWwgcmFuZ2UgY2hlIGluY2x1ZGUgdHV0dGUgbGUgZGF0ZSBwYXNzYXRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IGZyb21EYXRlcyBMaXN0YSBkZWkgRGFcclxuICAgICAqIEBwYXJhbSB7YW55W119IHRvRGF0ZXMgTGlzdGEgZGVpIEFcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3sgZnJvbTogYW55LCB0bzogYW55IH19IFJhbmdlIGRpIGRhdGUgRGEgLSBBIGNoZSBpbmNsdWRlIHR1dHRpIGkgdmFsb3JpIGRpICoqZnJvbURhdGVzKiogZSAqKnRvRGF0ZXMqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWluTWF4RGF0ZXNSYW5nZShmcm9tRGF0ZXM6IGFueVtdLCB0b0RhdGVzOiBhbnlbXSk6IHsgZnJvbTogYW55LCB0bzogYW55IH0ge1xyXG4gICAgICAgIGxldCBkYXRlc0Zyb21zOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGxldCBkYXRlc1RvOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZnJvbURhdGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGQgPSBmcm9tRGF0ZXNbaV07XHJcbiAgICAgICAgICAgIHZhciBjb252ZXJ0aW9uID0gdGhpcy5nZXREYXRlQ29udmVydGlvbihkKTtcclxuICAgICAgICAgICAgaWYgKGNvbnZlcnRpb24pXHJcbiAgICAgICAgICAgICAgICBkYXRlc0Zyb21zLnB1c2goY29udmVydGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdG9EYXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBkID0gdG9EYXRlc1tpXTtcclxuICAgICAgICAgICAgdmFyIGNvbnZlcnRpb24gPSB0aGlzLmdldERhdGVDb252ZXJ0aW9uKGQpO1xyXG4gICAgICAgICAgICBpZiAoY29udmVydGlvbilcclxuICAgICAgICAgICAgICAgIGRhdGVzVG8ucHVzaChjb252ZXJ0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGZyb206IGRheWpzLm1pbihkYXRlc0Zyb21zKSwgdG86IGRheWpzLm1heChkYXRlc1RvKSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBsYSBjb252ZXJzaW9uZSBkaSB1bmEgZGF0YSBpbiBxdWFsc2lhc2kgZm9ybWF0byBhbCBmb3JtYXRvIHN0YW5kYXJkIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBkYXRlIE9nZ2V0dG8gcmFwcHJlc2VudGFudGUgdW5hIGRhdGEuIFBvdHJlYmJlIGVzc2VyZSB1bmEgc3RyaW5nYSwgdW4gRGF0ZSBvIGdpw6AgdW4gRGF5SnNcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlVXRjIEluZGljYSBzZSB1c2FyZSBsJ2VzdGVuc2lvbmUgdXRjIGRpIERheWpzIHBlciBwYXJzYXJlIGxhIGRhdGEgbyBub1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBmb3JtYXRvIGluIGN1aSBlbWV0dGVyZSBsYSBjb252ZXJzaW9uZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7YW55fSBEYXRhIGluIG1vZGFsaXTDoCB7Zm9ybWF0fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGF0ZUNvbnZlcnRpb24oZGF0ZTogYW55LCB1c2VVdGM6IGJvb2xlYW4gPSBmYWxzZSwgZm9ybWF0OiAnZGF0ZScgfCAndGltZXN0cmluZycgfCAnZGF5anMnID0gJ2RheWpzJywgdGltZXN0cmluZ1NtYWxsOiBib29sZWFuID0gdHJ1ZSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNEYXlKcyhkYXRlKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkRGF5anMoZGF0ZSwgZm9ybWF0LCB0aW1lc3RyaW5nU21hbGwpO1xyXG5cclxuICAgICAgICBpZih0aGlzLmlzSnNEYXRlKGRhdGUpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWREYXlqcyh1c2VVdGMgPyBkYXlqcy51dGMoZGF0ZSk6IGRheWpzKGRhdGUpLCBmb3JtYXQsIHRpbWVzdHJpbmdTbWFsbCk7XHJcblxyXG4gICAgICAgIC8vIFNlIG5vbiBjJ8OoIGxhIHByb3ByaWV0w6AgbGVuZ3RoIHZ1b2wgZGlyZSBjaGUgbm9uIMOoIHVuYSBzdHJpbmdhIGUgYSBxdWVzdG8gcHVudG8gbm9uIGhvIGlkZWEgZGkgY2hlIG1pbmNoaWEgc2lhXHJcbiAgICAgICAgbGV0IGxlbmd0aCA9IGRhdGUubGVuZ3RoO1xyXG4gICAgICAgIGlmICghbGVuZ3RoKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHVzZVV0YyAmJiAhdGhpcy5hbGxvd1V0YylcclxuICAgICAgICAgICAgdGhyb3cgXCJAZXNmYWVuemEvZXh0ZW5zaW9uczogUmljaGllc3RhIGRhdGEgVVRDIG1hIGRhIGNvbmZpZ3VyYXppb25lIGxhIGxpYnJlcmlhIG5vbiBsbyBzdXBwb3J0YVwiO1xyXG5cclxuICAgICAgICAvLyBQZXIgcmlzcGFybWlhcmUgY2hpYW1hdGUgYSB0ZW50b25pLCBpbiBiYXNlIGFsbGEgbHVuZ2hlenphIGRlbGxhIHN0cmluZ2EgY2hpYW1vIGRpcmV0dGFtZW50ZSBpbCBtZXRvZG8gZ2l1c3RvLCBcclxuICAgICAgICAvLyBjb250cm9sbGFuZG8gcG9pIGNoZSBtaSBnZW5lcmkgdW5hIGRhdGEgY29tZSBtZSBsYSBhc3BldHRvIGlvXHJcbiAgICAgICAgbGV0IHRyeVRoaXM6IERheWpzID0gbnVsbDtcclxuICAgICAgICBsZXQgdG9DYWxsID0gdXNlVXRjID8gZGF5anMudXRjIDogZGF5anM7XHJcblxyXG4gICAgICAgIC8vIFNlIGxhIGRhdGEgY29udGllbmUgbGEgbGV0dGVyYSBcIlRcIiB2dW9sIGRpcmUgY2hlIMOoIHVuYSBkYXRhIGRlbCB0aXBvIDIwMjAtMTAtMTVUMDA6MDA6MDAsIGRpcmV0dGFtZW50ZSBwYXJzYWJpbGUgZGFsIGRheWpzIGNvbCBsb2NhbGUgY29ycmV0dG8uXHJcbiAgICAgICAgLy8gUGVyIGlsIHJlc3RvIG1pIGJhc28gc3VsbGEgbHVuZ2hlenphIGRlbGxhIHN0cmluZ2FcclxuICAgICAgICBpZiAoKDxzdHJpbmc+ZGF0ZSkuaW5jbHVkZXMoXCJUXCIpKVxyXG4gICAgICAgICAgICB0cnlUaGlzID0gdG9DYWxsKGRhdGUpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA9PSB0aGlzLmNmZy5mdWxsZGF0ZS5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRyeVRoaXMgPSB0b0NhbGwoZGF0ZSwgdGhpcy5jZmcuZnVsbGRhdGUpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA9PSB0aGlzLmNmZy5zbWFsbERhdGUubGVuZ3RoKVxyXG4gICAgICAgICAgICB0cnlUaGlzID0gdG9DYWxsKGRhdGUsIHRoaXMuY2ZnLnNtYWxsRGF0ZSk7XHJcbiAgICAgICAgZWxzZSBpZiAobGVuZ3RoID09IHRoaXMuY2ZnLmZ1bGxkYXRlTm9TUy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRyeVRoaXMgPSB0b0NhbGwoZGF0ZSwgdGhpcy5jZmcuZnVsbGRhdGVOb1NTKVxyXG5cclxuICAgICAgICBpZiAodHJ5VGhpcyAmJiB0cnlUaGlzLmlzVmFsaWQgJiYgdHJ5VGhpcy5pc1ZhbGlkKCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlZERheWpzKHRyeVRoaXMsIGZvcm1hdCwgdGltZXN0cmluZ1NtYWxsKTtcclxuXHJcbiAgICAgICAgLy8gU2UgbmllbnRlIGZ1bnppb25hLCBudWxsLiBcclxuICAgICAgICAvLyBSaWNvbmR1cnJlIGwnSW5wdXQgYWQgdW5hIGRhdGEgbm9uIMOoIHBvc3NpYmlsZS5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvcm1hdHRlZERheWpzKGRheWpzOiBEYXlqcywgZm9ybWF0OiBcImRheWpzXCIgfCBcImRhdGVcIiB8IFwidGltZXN0cmluZ1wiLCB0aW1lc3RyaW5nU21hbGwpe1xyXG4gICAgICAgIHJldHVybiBmb3JtYXQgPT0gJ2RheWpzJyA/IGRheWpzIDogZm9ybWF0ID09ICdkYXRlJyA/IGRheWpzLnRvRGF0ZSgpIDogdGhpcy5nZXRGb3JtYXR0ZWQoZGF5anMsIHRpbWVzdHJpbmdTbWFsbCwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBjaGUgcmVzdGl0dWlzY2UgKip0cnVlKiogcXVhbG9yYSBsJ29nZ2V0dG8gcGFzc2F0byBmb3NzZSB1bmEgZGF0YSB2ZXJhIGUgcHJvcHJpYSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGNoZWNrIE9nZ2V0dG8gZGEgY29udHJvbGxhcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEluZGljYXppb25lIHNlIGwnb2dnZXR0byDDqCB1biB2ZXJvIERhdGUgZGkgSmF2YXNjcmlwdCBvIG5vXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNKc0RhdGUoY2hlY2s6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBjaGVjayAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY2hlY2spID09PSBcIltvYmplY3QgRGF0ZV1cIiAmJiAhaXNOYU4oY2hlY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSByZXN0aXR1aXNjZSAqKnRydWUqKiBxdWFsb3JhIGwnb2dnZXR0byBwYXNzYXRvIGZvc3NlIHVuIERheUpzIHZlcm8gZSBwcm9wcmlvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gY2hlY2sgT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEluZGljYXppb25lIHNlIGwnb2dnZXR0byDDqCB1biB2ZXJvIERheUpzIG8gbm9cclxuICAgICAqL1xyXG4gICAgIHByaXZhdGUgaXNEYXlKcyhjaGVjazogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgLy8gTm9uIHVzbyBpbnN0YW5jZW9mIHBlcmNow6kgc2FyZWJiZSBlc3RyZW1hbWVudGUgcGnDuSBsZW50b1xyXG4gICAgICAgIC8vIE5vbiB1c28gbmVtbWVubyBpc0RheWpzKCkgZGVsbGEgbGlicmVyaWEgRGF5anMgZGF0byBjaGUgaGEgbG8gc3Rlc3NvIHByb2JsZW1hOiBodHRwczovL2dpdGh1Yi5jb20vaWFta3VuL2RheWpzL2Jsb2IvMDZmODhmNDI1ODI4YjFjZTk2YjczNzMzMmQyNTE0NWE5NWE0ZWU5ZC9zcmMvaW5kZXguanMjTDlcclxuICAgICAgICByZXR1cm4gY2hlY2suJEQgIT09IHVuZGVmaW5lZCAmJiBjaGVjay4kTSAhPT0gdW5kZWZpbmVkICYmIGNoZWNrLiR5ICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGxhIGZvcm1hdHRhemlvbmUgZGkgdW5hIGRhdGEgaW4gYmFzZSBhbGxhIHZlcnNpb25lIHJpY2hpZXN0YSBcInNtYWxsXCIgbyBcImxvbmdcIiBlIGEgc2Ugc3RhbXBhcmUgbyBtZW5vIGkgc2Vjb25kaVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZGF0ZSBPZ2dldHRvIHJhcHByZXNlbnRhbnRlIHVuYSBkYXRhLiBQb3RyZWJiZSBlc3NlcmUgdW5hIHN0cmluZ2EsIHVuIERhdGUgbyBnacOgIHVuIERheUpzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNtYWxsIEluZGljYSBzZSBmb3JtYXR0YXJsYSBjb24gdW4gZm9ybWF0byBicmV2ZSAoc2UgKip0cnVlKiopIG8gdW4gZm9ybWF0byBwacO5IGx1bmdvIChzZSAqKmZhbHNlKiopXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IERhdGEgZm9ybWF0dGF0YSBuZWwgZm9ybWF0byByaWNoaWVzdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZvcm1hdHRlZChkYXRlOiBhbnksIHNtYWxsOiBib29sZWFuLCBzZWNvbmRzOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgZGF0ZSA9IHRoaXMuZ2V0RGF0ZUNvbnZlcnRpb24oZGF0ZSk7XHJcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZm9ybWF0KHNtYWxsID8gdGhpcy5jZmcuc21hbGxEYXRlIDogc2Vjb25kcyA/IHRoaXMuY2ZnLmZ1bGxkYXRlRGlzcGxheSA6IHRoaXMuY2ZnLmZ1bGxkYXRlRGlzcGxheU5vU1MpO1xyXG4gICAgfVxyXG59Il19