@magic-xpa/utils 4.801.0-dev481.242 → 4.801.0-dev481.248

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 (40) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-utils.js → esm2020/magic-xpa-utils.mjs} +0 -0
  3. package/{esm2015/src/Base64.js → esm2020/src/Base64.mjs} +0 -0
  4. package/{esm2015/src/ChoiceUtils.js → esm2020/src/ChoiceUtils.mjs} +0 -0
  5. package/{esm2015/src/Constants.js → esm2020/src/Constants.mjs} +0 -0
  6. package/{esm2015/src/DateTimeUtils.js → esm2020/src/DateTimeUtils.mjs} +0 -0
  7. package/{esm2015/src/DateUtil.js → esm2020/src/DateUtil.mjs} +0 -0
  8. package/{esm2015/src/InternalInterface.js → esm2020/src/InternalInterface.mjs} +0 -0
  9. package/{esm2015/src/JSON_Utils.js → esm2020/src/JSON_Utils.mjs} +0 -0
  10. package/esm2020/src/Logger.mjs +216 -0
  11. package/{esm2015/src/MagicConstants.js → esm2020/src/MagicConstants.mjs} +0 -0
  12. package/{esm2015/src/Misc.js → esm2020/src/Misc.mjs} +0 -0
  13. package/{esm2015/src/MsgInterface.js → esm2020/src/MsgInterface.mjs} +0 -0
  14. package/{esm2015/src/PICInterface.js → esm2020/src/PICInterface.mjs} +0 -0
  15. package/{esm2015/src/PlatformUtils.js → esm2020/src/PlatformUtils.mjs} +0 -0
  16. package/{esm2015/src/Queue.js → esm2020/src/Queue.mjs} +0 -0
  17. package/{esm2015/src/Randomizer.js → esm2020/src/Randomizer.mjs} +0 -0
  18. package/{esm2015/src/RequestInfo.js → esm2020/src/RequestInfo.mjs} +0 -0
  19. package/{esm2015/src/Rtf.js → esm2020/src/Rtf.mjs} +0 -0
  20. package/{esm2015/src/StorageAttribute.js → esm2020/src/StorageAttribute.mjs} +0 -0
  21. package/esm2020/src/StrUtil.mjs +456 -0
  22. package/{esm2015/src/SyncExecutionHelper.js → esm2020/src/SyncExecutionHelper.mjs} +0 -0
  23. package/{esm2015/src/UtilDateJpn.js → esm2020/src/UtilDateJpn.mjs} +0 -0
  24. package/{esm2015/src/UtilImeJpn.js → esm2020/src/UtilImeJpn.mjs} +0 -0
  25. package/{esm2015/src/UtilStrByteMode.js → esm2020/src/UtilStrByteMode.mjs} +0 -0
  26. package/{esm2015/src/XMLConstants.js → esm2020/src/XMLConstants.mjs} +0 -0
  27. package/{esm2015/src/Xml/XmlParser.js → esm2020/src/Xml/XmlParser.mjs} +0 -0
  28. package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
  29. package/fesm2015/{magic-xpa-utils.js → magic-xpa-utils.mjs} +2 -3
  30. package/fesm2015/magic-xpa-utils.mjs.map +1 -0
  31. package/fesm2020/magic-xpa-utils.mjs +5381 -0
  32. package/fesm2020/magic-xpa-utils.mjs.map +1 -0
  33. package/package.json +25 -12
  34. package/bundles/magic-xpa-utils.umd.js +0 -5271
  35. package/bundles/magic-xpa-utils.umd.js.map +0 -1
  36. package/bundles/magic-xpa-utils.umd.min.js +0 -2
  37. package/bundles/magic-xpa-utils.umd.min.js.map +0 -1
  38. package/esm2015/src/Logger.js +0 -217
  39. package/esm2015/src/StrUtil.js +0 -457
  40. package/fesm2015/magic-xpa-utils.js.map +0 -1
@@ -1,217 +0,0 @@
1
- import { Logger_LogLevels, Logger_MessageDirection } from "./enums";
2
- import { DateTime, Debug, Exception, NString, StringBuilder, Thread } from "@magic-xpa/mscorelib";
3
- import { OSEnvironment } from "./PlatformUtils";
4
- import { DateTimeUtils } from "./DateTimeUtils";
5
- import { XMLConstants } from "./XMLConstants";
6
- import { isNullOrUndefined } from "util";
7
- import { RequestInfo } from "./RequestInfo";
8
- import { StrUtil } from "./StrUtil";
9
- export var LogType;
10
- (function (LogType) {
11
- LogType[LogType["info"] = 1] = "info";
12
- LogType[LogType["warning"] = 2] = "warning";
13
- LogType[LogType["error"] = 3] = "error";
14
- })(LogType || (LogType = {}));
15
- export class Logger {
16
- constructor() {
17
- this.LogLevel = 0;
18
- this.ShouldBeep = false;
19
- }
20
- static set Instance(value) {
21
- Logger.instance = value;
22
- }
23
- static get Instance() {
24
- if (Logger.instance === null) {
25
- Logger.instance = new Logger();
26
- }
27
- return Logger.instance;
28
- }
29
- Initialize(logLevel, shouldBeep) {
30
- try {
31
- this.LogLevel = logLevel;
32
- this.ShouldBeep = shouldBeep;
33
- }
34
- catch (e) {
35
- this.WriteDevToLog("ClientManager.init(): " + e.Message);
36
- }
37
- }
38
- ShouldLog(logLevel) {
39
- if (arguments.length === 1)
40
- return this.ShouldLog_0(logLevel);
41
- else
42
- return this.ShouldLog_1();
43
- }
44
- ShouldLog_0(logLevel) {
45
- return this.LogLevel === logLevel;
46
- }
47
- ShouldLog_1() {
48
- return this.LogLevel > Logger_LogLevels.None;
49
- }
50
- ShouldLogServerRelatedMessages() {
51
- return (this.ShouldLogExtendedServerRelatedMessages() || Logger.Instance.ShouldLog(Logger_LogLevels.Server)) && this.LogLevel !== Logger_LogLevels.Basic;
52
- }
53
- ShouldLogExtendedServerRelatedMessages() {
54
- return (Logger.Instance.ShouldLog(Logger_LogLevels.ServerMessages) || Logger.Instance.ShouldLog(Logger_LogLevels.Support) || Logger.Instance.ShouldLog(Logger_LogLevels.Development)) && this.LogLevel !== Logger_LogLevels.Basic;
55
- }
56
- WriteToLog(msg, openIfNecessary, logType = LogType.info) {
57
- if (this.LogLevel > Logger_LogLevels.None || openIfNecessary) {
58
- msg = NString.Format("{0} {1}", (this.LogLevel === Logger_LogLevels.Basic) ? new Date().toISOString() : DateTimeUtils.ToString(DateTime.Now, XMLConstants.ERROR_LOG_TIME_FORMAT, this), msg);
59
- switch (logType) {
60
- case LogType.error:
61
- console.error(msg);
62
- break;
63
- case LogType.warning:
64
- console.warn(msg);
65
- break;
66
- default:
67
- console.log(msg);
68
- }
69
- }
70
- }
71
- WriteServerToLog(msg) {
72
- if (this.ShouldLogServerRelatedMessages()) {
73
- this.WriteToLog(NString.Format("Server, Thread={0}: ", Thread.CurrentThread.ManagedThreadId) + msg, false, LogType.info);
74
- }
75
- }
76
- WriteServerMessagesToLog(msg) {
77
- if (this.ShouldLogExtendedServerRelatedMessages()) {
78
- this.WriteToLog("Server#: " + msg, false, LogType.info);
79
- }
80
- }
81
- WriteSupportToLog(msg, skipLine) {
82
- if (this.LogLevel >= Logger_LogLevels.Support && this.LogLevel !== Logger_LogLevels.Basic) {
83
- if (skipLine) {
84
- this.WriteToLog("SUPPORT: " + msg, false, LogType.info);
85
- }
86
- else {
87
- this.WriteToLog("SUPPORT: " + msg + OSEnvironment.EolSeq + "-----------------------------------------------------------------------------------------------------------", false, LogType.info);
88
- }
89
- }
90
- }
91
- WriteGuiToLog(msg) {
92
- if (this.LogLevel >= Logger_LogLevels.Gui && this.LogLevel !== Logger_LogLevels.Basic) {
93
- this.WriteToLog(msg, false, LogType.info);
94
- }
95
- }
96
- WriteDevToLog(msg) {
97
- if (this.LogLevel >= Logger_LogLevels.Development && this.LogLevel !== Logger_LogLevels.Basic) {
98
- this.WriteToLog("DEV: " + msg, false, LogType.info);
99
- }
100
- }
101
- WriteBasicToLog(messageDirection, contextID, sessionCounter, clientID, serverID, responseTime, statusCode, httpHeaders, contentLength) {
102
- if (this.LogLevel === Logger_LogLevels.Basic) {
103
- let text = httpHeaders;
104
- text = text.trim();
105
- text = NString.Replace(text, "\r\n", "|");
106
- let arg_E4_0 = "RIA,{0}_{1},{2},{3},{4},{5},-,{6},{7},{8},{9},{10},{11}";
107
- let expr_3E = new Array(12);
108
- expr_3E[1] = Thread.CurrentThread.ManagedThreadId;
109
- expr_3E[2] = new Date().toISOString();
110
- expr_3E[3] = ((messageDirection === Logger_MessageDirection.MessageLeaving) ? "MSGL" : "MSGE");
111
- expr_3E[4] = contextID;
112
- expr_3E[5] = sessionCounter;
113
- expr_3E[6] = clientID;
114
- expr_3E[7] = serverID;
115
- expr_3E[8] = ((responseTime !== 0) ? responseTime.toString() : "-");
116
- let arg_D3_1 = 9;
117
- let arg_D3_2;
118
- arg_D3_2 = statusCode;
119
- expr_3E[arg_D3_1] = arg_D3_2;
120
- expr_3E[10] = text;
121
- expr_3E[11] = contentLength;
122
- let value = NString.Format(arg_E4_0, expr_3E);
123
- console.log(value);
124
- }
125
- }
126
- WriteRequestInfoToLog(requestInfo, extraMessageStr) {
127
- if (this.LogLevel === Logger_LogLevels.RequestInfo) {
128
- console.log(extraMessageStr, RequestInfo.clone(requestInfo));
129
- }
130
- }
131
- WriteBasicErrorToLog() {
132
- Debug.Assert(this.LogLevel === Logger_LogLevels.Basic);
133
- }
134
- WriteErrorToLog(msg) {
135
- this.WriteToLog("MagicWeb [ERROR]: " + StrUtil.getConsoleErorString(msg), true, LogType.error);
136
- }
137
- WriteExceptionToLog(msgOrEx, msg) {
138
- if (msgOrEx instanceof Error) {
139
- this.WriteExceptionToLog_2(msgOrEx, msg);
140
- return;
141
- }
142
- if (arguments.length === 1 && (msgOrEx !== null || msgOrEx instanceof Exception)) {
143
- this.WriteExceptionToLog_1(msgOrEx);
144
- return;
145
- }
146
- this.WriteExceptionToLog_3(msgOrEx, msg);
147
- }
148
- WriteExceptionToLogWithMsg(msg) {
149
- this.WriteToLog("MagicWeb [ERROR]: " + StrUtil.getConsoleErorString(msg), true, LogType.error);
150
- }
151
- WriteExceptionToLog_1(ex) {
152
- this.WriteExceptionToLogWithMsg(NString.Format("{0} : {1}{2}{3}{4}", [
153
- ex.GetType(), OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
154
- ]));
155
- }
156
- WriteExceptionToLog_2(ex, message) {
157
- if (isNullOrUndefined(message))
158
- this.WriteExceptionToLogWithMsg(NString.Format("{0}{1}{2}", [ex.stack, OSEnvironment.EolSeq, ex.message]));
159
- else
160
- this.WriteExceptionToLogWithMsg(NString.Format("{0}{1}{2}{4}{5}", [message, OSEnvironment.EolSeq, ex.stack, OSEnvironment.EolSeq, ex.message]));
161
- }
162
- WriteExceptionToLog_3(ex, msg) {
163
- this.WriteExceptionToLogWithMsg(NString.Format("{0}, {1} : {2}{3}{4}{5}", [
164
- ex.GetType(), msg, OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
165
- ]));
166
- }
167
- WriteWarningToLog(msgOrEx, msg) {
168
- if (arguments.length === 1 && msgOrEx !== null) {
169
- if (msgOrEx instanceof Exception)
170
- this.WriteWarningToLog_1(msgOrEx);
171
- else if (msgOrEx instanceof Error)
172
- this.WriteWarningToLog_2(msgOrEx);
173
- }
174
- else
175
- this.WriteWarningToLog_3(msgOrEx, msg);
176
- }
177
- WriteWarningToLogWithMsg(msg) {
178
- if (this.LogLevel !== Logger_LogLevels.Basic) {
179
- this.WriteToLog("MagicWeb [WARNING]: " + msg, true, LogType.warning);
180
- }
181
- }
182
- WriteWarningToLog_1(ex) {
183
- this.WriteWarningToLogWithMsg(ex.GetType() + " : " + OSEnvironment.EolSeq + ex.StackTrace + OSEnvironment.EolSeq + ex.Message);
184
- }
185
- WriteWarningToLog_2(ex) {
186
- this.WriteWarningToLogWithMsg(NString.Format("{0}{1}{2}", [
187
- ex.stack, OSEnvironment.EolSeq, ex.message
188
- ]));
189
- }
190
- WriteWarningToLog_3(ex, msg) {
191
- this.WriteWarningToLogWithMsg(NString.Format("{0}, {1} : {2}{3}{4}{5}", [
192
- ex.GetType(), msg, OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
193
- ]));
194
- }
195
- WriteStackTrace(stackTrace, framesToPrint, traceTitle) {
196
- if (traceTitle === null) {
197
- traceTitle = "Stack trace:";
198
- }
199
- let stringBuilder = new StringBuilder(traceTitle + OSEnvironment.EolSeq);
200
- let frames = stackTrace.GetFrames();
201
- let array = frames;
202
- for (let i = 0; i < array.length; i = i + 1) {
203
- let stackFrame = array[i];
204
- framesToPrint = framesToPrint - 1;
205
- stringBuilder.Append(stackFrame.toString());
206
- if (framesToPrint === 0) {
207
- stringBuilder.Append("\t... more stack frames ...\n");
208
- break;
209
- }
210
- }
211
- this.WriteToLog(stringBuilder.ToString(), true);
212
- }
213
- Flush() {
214
- }
215
- }
216
- Logger.instance = null;
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdXRpbHMvc3JjL0xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUcsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdsQyxNQUFNLENBQU4sSUFBWSxPQUlYO0FBSkQsV0FBWSxPQUFPO0lBQ2pCLHFDQUFRLENBQUE7SUFDUiwyQ0FBTyxDQUFBO0lBQ1AsdUNBQUssQ0FBQTtBQUNQLENBQUMsRUFKVyxPQUFPLEtBQVAsT0FBTyxRQUlsQjtBQU9ELE1BQU0sT0FBTyxNQUFNO0lBb1ZqQjtRQWxWQSxhQUFRLEdBQXFCLENBQUMsQ0FBQztRQUsvQixlQUFVLEdBQVksS0FBSyxDQUFDO0lBOFU1QixDQUFDO0lBNVVELE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBYTtRQUMvQixNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxLQUFLLFFBQVE7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtZQUM1QixNQUFNLENB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QUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuRCxJQUFJLFVBQVUsR0FBaUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGFBQWEsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBRWxDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFNUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixhQUFhLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUM7Z0JBQ3RELE1BQU07YUFDUDtTQUNGO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUtELEtBQUs7SUFFTCxDQUFDOztBQWpWTSxlQUFRLEdBQVcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMb2dnZXJfTG9nTGV2ZWxzLCBMb2dnZXJfTWVzc2FnZURpcmVjdGlvbn0gZnJvbSBcIi4vZW51bXNcIjtcclxuaW1wb3J0IHtEYXRlVGltZSwgRGVidWcsIEV4Y2VwdGlvbiwgTlN0cmluZywgU3RhY2tUcmFjZSwgU3RyaW5nQnVpbGRlciwgVGhyZWFkfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtPU0Vudmlyb25tZW50fSBmcm9tIFwiLi9QbGF0Zm9ybVV0aWxzXCI7XHJcbmltcG9ydCB7RGF0ZVRpbWVVdGlsc30gZnJvbSBcIi4vRGF0ZVRpbWVVdGlsc1wiO1xyXG5pbXBvcnQge1hNTENvbnN0YW50c30gZnJvbSBcIi4vWE1MQ29uc3RhbnRzXCI7XHJcbmltcG9ydCAqIGFzIEpTU3RhY2tUcmFjZSBmcm9tICdzdGFja3RyYWNlLWpzJztcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcInV0aWxcIjtcclxuaW1wb3J0IHtSZXF1ZXN0SW5mb30gZnJvbSBcIi4vUmVxdWVzdEluZm9cIjtcclxuaW1wb3J0IHtTdHJVdGlsfSBmcm9tIFwiLi9TdHJVdGlsXCI7XHJcbmltcG9ydCBKU1N0YWNrRnJhbWUgPSBKU1N0YWNrVHJhY2UuU3RhY2tGcmFtZTtcclxuXHJcbmV4cG9ydCBlbnVtIExvZ1R5cGUge1xyXG4gIGluZm8gPSAxLFxyXG4gIHdhcm5pbmcsXHJcbiAgZXJyb3JcclxufVxyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIExvZ2dlciBjbGFzcyB3aWxsIHRha2UgY2FyZSBvZiBjbGllbnQgc2lkZSBsb2dnaW5nIC4gSXQgd2lsbCBjaGVjayBmb3IgdmFyaW91cyBsb2cgbGV2ZWxzIGFuZCBhY2NvcmRpbmdseSB3aWxsIHdyaXRlIG1lc3NhZ2VzIGluIGxvZyBmaWxlLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vL0BkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xyXG4gIHN0YXRpYyBpbnN0YW5jZTogTG9nZ2VyID0gbnVsbDtcclxuICBMb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyA9IDA7IC8vIEludGVybmFsTG9nTGV2ZWxcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXaGlsZSB3cml0aW5nIHRoZSBlcnJvciBtZXNzYWdlcyBpbiB0aGUgZmlsZSBwbGF5IHRoZSBiZWVwLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2hvdWxkQmVlcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdGF0aWMgc2V0IEluc3RhbmNlKHZhbHVlOiBMb2dnZXIpIHtcclxuICAgIExvZ2dlci5pbnN0YW5jZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBMb2dnZXIge1xyXG4gICAgaWYgKExvZ2dlci5pbnN0YW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICBMb2dnZXIuaW5zdGFuY2UgPSBuZXcgTG9nZ2VyKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTG9nZ2VyLmluc3RhbmNlO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5pdGlhbGl6ZSBsb2dnZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxvZ0xldmVsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbnRlcm5hbExvZ1N5bmNcIj48L3BhcmFtPlxyXG4gIEluaXRpYWxpemUobG9nTGV2ZWw6IExvZ2dlcl9Mb2dMZXZlbHMsIHNob3VsZEJlZXA6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGxldCBsb2dTeW5jOiBMb2dTeW5jTW9kZSAgPSBMb2dTeW5jTW9kZS5TZXNzaW9uO1xyXG4gICAgICB0aGlzLkxvZ0xldmVsID0gbG9nTGV2ZWw7XHJcbiAgICAgIHRoaXMuU2hvdWxkQmVlcCA9IHNob3VsZEJlZXA7XHJcblxyXG4gICAgICAvLyBUT0RPOiBpbXBsZW1lbnRcclxuLy8gICBTdHJpbmcgc3RyTG9nU3luYyA9IGludGVybmFsTG9nU3luYztcclxuLy8gICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHN0ckxvZ1N5bmMpKVxyXG4vLyB7XHJcbi8vICAgaWYgKHN0ckxvZ1N5bmMuU3RhcnRzV2l0aChcIk1cIiwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpKVxyXG4vLyAgIGxvZ1N5bmMgPSBMb2dTeW5jTW9kZS5NZXNzYWdlO1xyXG4vLyAgIGVsc2UgaWYgKHN0ckxvZ1N5bmMuU3RhcnRzV2l0aChcIkZcIiwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpKVxyXG4vLyAgIGxvZ1N5bmMgPSBMb2dTeW5jTW9kZS5GbHVzaDtcclxuLy8gfVxyXG4vL1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5Xcml0ZURldlRvTG9nKFwiQ2xpZW50TWFuYWdlci5pbml0KCk6IFwiICsgZS5NZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibG9nTGV2ZWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcblxyXG4gIFNob3VsZExvZyhsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW47XHJcbiAgU2hvdWxkTG9nKCk6IGJvb2xlYW47XHJcbiAgU2hvdWxkTG9nKGxvZ0xldmVsPzogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHJldHVybiB0aGlzLlNob3VsZExvZ18wKGxvZ0xldmVsKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuU2hvdWxkTG9nXzEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgU2hvdWxkTG9nXzAobG9nTGV2ZWw6IExvZ2dlcl9Mb2dMZXZlbHMpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkxvZ0xldmVsID09PSBsb2dMZXZlbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgU2hvdWxkTG9nXzEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5Mb2dMZXZlbCA+IExvZ2dlcl9Mb2dMZXZlbHMuTm9uZTtcclxuICB9XHJcblxyXG4gIFNob3VsZExvZ1NlcnZlclJlbGF0ZWRNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5TaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpIHx8IExvZ2dlci5JbnN0YW5jZS5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5TZXJ2ZXIpKSAmJiB0aGlzLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljO1xyXG4gIH1cclxuXHJcbiAgU2hvdWxkTG9nRXh0ZW5kZWRTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKExvZ2dlci5JbnN0YW5jZS5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5TZXJ2ZXJNZXNzYWdlcykgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlN1cHBvcnQpIHx8IExvZ2dlci5JbnN0YW5jZS5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpICYmIHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbklmTmVjZXNzYXJ5XCI+b3BlbiB0aGUgbG9nIGZpbGUgaWYgbm90IG9wZW5lZCB5ZXQ8L3BhcmFtPlxyXG5cclxuICBXcml0ZVRvTG9nKG1zZzogc3RyaW5nLCBvcGVuSWZOZWNlc3Nhcnk6IGJvb2xlYW4sIGxvZ1R5cGU6IExvZ1R5cGUgPSBMb2dUeXBlLmluZm8pOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+IExvZ2dlcl9Mb2dMZXZlbHMuTm9uZSB8fCBvcGVuSWZOZWNlc3NhcnkpIHtcclxuICAgICAgbXNnID0gTlN0cmluZy5Gb3JtYXQoXCJ7MH0gezF9XCIsICh0aGlzLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSA/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSA6IERhdGVUaW1lVXRpbHMuVG9TdHJpbmcoRGF0ZVRpbWUuTm93LCBYTUxDb25zdGFudHMuRVJST1JfTE9HX1RJTUVfRk9STUFULCB0aGlzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKTtcclxuXHJcbiAgICAgIHN3aXRjaCAobG9nVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTG9nVHlwZS5lcnJvcjpcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTG9nVHlwZS53YXJuaW5nOlxyXG4gICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3cml0ZSBhIHNlcnZlciBhY2Nlc3MgdG8gdGhlIGxvZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVTZXJ2ZXJUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU2hvdWxkTG9nU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkpIHtcclxuICAgICAgdGhpcy5Xcml0ZVRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2VydmVyLCBUaHJlYWQ9ezB9OiBcIiwgVGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkKSArIG1zZywgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdyaXRlIGEgc2VydmVyIGFjY2VzcyB0byB0aGUgbG9nLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU2hvdWxkTG9nRXh0ZW5kZWRTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSkge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coXCJTZXJ2ZXIjOiBcIiArIG1zZywgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+V3JpdGUgYSBRQyBtZXNzYWdlIHRvIHRoZSBsb2c8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVTdXBwb3J0VG9Mb2cobXNnOiBzdHJpbmcsIHNraXBMaW5lOiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgPj0gTG9nZ2VyX0xvZ0xldmVscy5TdXBwb3J0ICYmIHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgaWYgKHNraXBMaW5lKSB7XHJcbiAgICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiU1VQUE9SVDogXCIgKyBtc2csIGZhbHNlLCBMb2dUeXBlLmluZm8pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuV3JpdGVUb0xvZyhcIlNVUFBPUlQ6IFwiICsgbXNnICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIsIGZhbHNlLCBMb2dUeXBlLmluZm8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdyaXRlIGEgcGVyZm9ybWFuY2UgbWVzc2FnZSB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZUd1aVRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgPj0gTG9nZ2VyX0xvZ0xldmVscy5HdWkgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2cobXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBkZXZlbG9wZXIgbWVzc2FnZSB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZURldlRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50ICYmIHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiREVWOiBcIiArIG1zZywgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdyaXRlcyBhIGJhc2ljIGxldmVsIGVudHJ5IHRvIGxvZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWVzc2FnZURpcmVjdGlvblwiPm1lc3NhZ2UgZGlyZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZSAoUklBIGNsaWVudCkuIENhbiBiZSBlaXRoZXIgTWVzc2FnZUVudGVyaW5nIG9yIE1lc3NhZ2VMZWF2aW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdGF0dXNDb2RlXCI+SFRUUCBzdGF0dXMgY29kZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudExlbmd0aFwiPmxlbmd0aCBvZiB0aGUgaHR0cCBtZXNzYWdlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJodHRwSGVhZGVyc1wiPkhUVFAgaGVhZGVyczwvcGFyYW0+XHJcbiAgV3JpdGVCYXNpY1RvTG9nKG1lc3NhZ2VEaXJlY3Rpb246IExvZ2dlcl9NZXNzYWdlRGlyZWN0aW9uLCBjb250ZXh0SUQ6IHN0cmluZywgc2Vzc2lvbkNvdW50ZXI6IG51bWJlciwgY2xpZW50SUQ6IHN0cmluZywgc2VydmVySUQ6IHN0cmluZywgcmVzcG9uc2VUaW1lOiBudW1iZXIsIHN0YXR1c0NvZGU6IHN0cmluZywgaHR0cEhlYWRlcnM6IHN0cmluZywgY29udGVudExlbmd0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA9PT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICBsZXQgdGV4dDogc3RyaW5nID0gaHR0cEhlYWRlcnM7XHJcbiAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTtcclxuICAgICAgdGV4dCA9IE5TdHJpbmcuUmVwbGFjZSh0ZXh0LCBcIlxcclxcblwiLCBcInxcIik7XHJcbiAgICAgIGxldCBhcmdfRTRfMDogc3RyaW5nID0gXCJSSUEsezB9X3sxfSx7Mn0sezN9LHs0fSx7NX0sLSx7Nn0sezd9LHs4fSx7OX0sezEwfSx7MTF9XCI7XHJcbiAgICAgIGxldCBleHByXzNFOiBhbnlbXSA9IG5ldyBBcnJheTxhbnk+KDEyKTtcclxuXHJcbiAgICAgIC8vIFRPRE8gOiBuZWVkIHRvIGNoZWNrIEhvdyB0byBoYW5kbGUgUHJvY2VzcyBjbGFzcy5cclxuICAgICAgLy8gZXhwcl8zRVswXSA9IFByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKS5JZDtcclxuICAgICAgZXhwcl8zRVsxXSA9IFRocmVhZC5DdXJyZW50VGhyZWFkLk1hbmFnZWRUaHJlYWRJZDtcclxuICAgICAgZXhwcl8zRVsyXSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcclxuICAgICAgZXhwcl8zRVszXSA9ICgobWVzc2FnZURpcmVjdGlvbiA9PT0gTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24uTWVzc2FnZUxlYXZpbmcpID8gXCJNU0dMXCIgOiBcIk1TR0VcIik7XHJcbiAgICAgIGV4cHJfM0VbNF0gPSBjb250ZXh0SUQ7XHJcbiAgICAgIGV4cHJfM0VbNV0gPSBzZXNzaW9uQ291bnRlcjtcclxuICAgICAgZXhwcl8zRVs2XSA9IGNsaWVudElEO1xyXG4gICAgICBleHByXzNFWzddID0gc2VydmVySUQ7XHJcbiAgICAgIGV4cHJfM0VbOF0gPSAoKHJlc3BvbnNlVGltZSAhPT0gMCkgPyByZXNwb25zZVRpbWUudG9TdHJpbmcoKSA6IFwiLVwiKTtcclxuICAgICAgbGV0IGFyZ19EM18xOiBudW1iZXIgPSA5O1xyXG4gICAgICBsZXQgYXJnX0QzXzI6IGFueTtcclxuICAgICAgYXJnX0QzXzIgPSBzdGF0dXNDb2RlO1xyXG4gICAgICBleHByXzNFW2FyZ19EM18xXSA9IGFyZ19EM18yO1xyXG4gICAgICBleHByXzNFWzEwXSA9IHRleHQ7XHJcbiAgICAgIGV4cHJfM0VbMTFdID0gY29udGVudExlbmd0aDtcclxuICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgPSBOU3RyaW5nLkZvcm1hdChhcmdfRTRfMCwgZXhwcl8zRSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbGllbnRTZXNzaW9uXCI+VGhlIGNsaWVudFNlc3Npb24gb2JqZWN0IHRvIGJlIGxvZ2dlZDwvcGFyYW0+XHJcbiAgV3JpdGVSZXF1ZXN0SW5mb1RvTG9nKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbywgZXh0cmFNZXNzYWdlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvKSB7XHJcblxyXG4gICAgICAvLyBDaHJvbWUgZGVidWdnZXIgYXV0b21hdGljYWxseSByZWNvbXB1dGVzIGxvZ2dlZCBvYmplY3RzLlxyXG4gICAgICAvLyBIZW5jZSwgY2xvbmUgdGhlIHJlcXVlc3RJbmZvIG9iamVjdCB0byBwcmludCB0aGUgZGV0YWlscyBhdCB0aGUgdGltZSBvZiBsb2dnaW5nXHJcbiAgICAgIGNvbnNvbGUubG9nKGV4dHJhTWVzc2FnZVN0ciwgUmVxdWVzdEluZm8uY2xvbmUocmVxdWVzdEluZm8pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIGEgcmVxdWVzdCBleGNlcHRpb24gYmFzaWMgbGV2ZWwgZW50cnkgdG8gbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlc3Npb25Db3VudGVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbGllbnRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VydmVySURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4XCI+dGhlIGxvZ2dlZCBleGNlcHRpb248L3BhcmFtPlxyXG4gIFdyaXRlQmFzaWNFcnJvclRvTG9nKCk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpO1xyXG5cclxuICAgIC8vIFRPRE8gOiBOZWVkIHRvIGNoZWNrIGhvdyB0byBoYW5kbGUgUHJvY2Vzc1xyXG4gICAgLy8gbGV0IHZhbHVlOiBzdHJpbmcgPSBOU3RyaW5nLkZvcm1hdChcIlJJQSx7MH1fezF9LHsyfSx7M30sezR9LHs1fSwtLHs2fSx7N30sLSwtLC0sezh9IHs5fVwiLCBbXHJcbiAgICAvLyBQcm9jZXNzLkdldEN1cnJlbnRQcm9jZXNzKCkuSWQsIFRocmVhZC5DdXJyZW50VGhyZWFkLk1hbmFnZWRUaHJlYWRJZCwgRGF0ZVRpbWUuVXRjTm93LlRvU3RyaW5nKFwieXl5eS1NTS1kZFRISDptbTpzcy5mZmZmZmZmWlwiKSwgXCJSRVNcIiwgY29udGV4dElELCBzZXNzaW9uQ291bnRlciwgY2xpZW50SUQsIHNlcnZlcklELCBleC5HZXRUeXBlKCksIGV4Lk1lc3NhZ2VcclxuICAgIC8vIF0pO1xyXG4gICAgLy8gTkNvbnNvbGUuV3JpdGVMaW5lKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGUgYW4gZXJyb3IgdG8gdGhlIGxvZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVFcnJvclRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlVG9Mb2coXCJNYWdpY1dlYiBbRVJST1JdOiBcIiArIFN0clV0aWwuZ2V0Q29uc29sZUVyb3JTdHJpbmcobXNnKSwgdHJ1ZSwgTG9nVHlwZS5lcnJvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdyaXRlIGFuIGludGVybmFsIGVycm9yIHRvIHRoZSBsb2cuIEFsc28gcHJpbnRzIHN0YWNrIHRyYWNlIGFsb25nIHdpdGggdGhlIG1lc3NhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlRXhjZXB0aW9uVG9Mb2coZXg6IEV4Y2VwdGlvbik6IHZvaWQ7XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXJyb3IpOiB2b2lkO1xyXG4gIFdyaXRlRXhjZXB0aW9uVG9Mb2coZXg6IEV4Y2VwdGlvbiwgbXNnOiBzdHJpbmcpOiB2b2lkO1xyXG4gIFdyaXRlRXhjZXB0aW9uVG9Mb2cobXNnT3JFeDogYW55LCBtc2c/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChtc2dPckV4IGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nXzIobXNnT3JFeCwgbXNnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKG1zZ09yRXggIT09IG51bGwgfHwgbXNnT3JFeCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikpIHtcclxuICAgICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nXzEobXNnT3JFeCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMyhtc2dPckV4LCBtc2cpO1xyXG4gIH1cclxuXHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVUb0xvZyhcIk1hZ2ljV2ViIFtFUlJPUl06IFwiICsgU3RyVXRpbC5nZXRDb25zb2xlRXJvclN0cmluZyhtc2cpLCB0cnVlLCBMb2dUeXBlLmVycm9yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVFeGNlcHRpb25Ub0xvZ18xKGV4OiBFeGNlcHRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX17Mn17M317NH1cIiwgW1xyXG4gICAgICBleC5HZXRUeXBlKCksIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5TdGFja1RyYWNlLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguTWVzc2FnZVxyXG4gICAgXSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZUV4Y2VwdGlvblRvTG9nXzIoZXg6IEVycm9yLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChtZXNzYWdlKSlcclxuICAgICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfXsxfXsyfVwiLCBbZXguc3RhY2ssIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5tZXNzYWdlXSkpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9ezF9ezJ9ezR9ezV9XCIsIFttZXNzYWdlLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguc3RhY2ssIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5tZXNzYWdlXSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZUV4Y2VwdGlvblRvTG9nXzMoZXg6IEV4Y2VwdGlvbiwgbXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0sIHsxfSA6IHsyfXszfXs0fXs1fVwiLCBbXHJcbiAgICAgIGV4LkdldFR5cGUoKSwgbXNnLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguU3RhY2tUcmFjZSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lk1lc3NhZ2VcclxuICAgIF0pKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gd3JpdGUgYSB3YXJuaW5nIHRvIHRoZSBsb2c8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2coZXg6IEV4Y2VwdGlvbik6IHZvaWQ7XHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2coZXg6IEV4Y2VwdGlvbiwgbXNnOiBzdHJpbmcpOiB2b2lkO1xyXG4gIFdyaXRlV2FybmluZ1RvTG9nKGV4OiBFcnJvcik6IHZvaWQ7XHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2cobXNnT3JFeDogYW55LCBtc2c/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIG1zZ09yRXggIT09IG51bGwpIHtcclxuICAgICAgaWYgKG1zZ09yRXggaW5zdGFuY2VvZiBFeGNlcHRpb24pXHJcbiAgICAgICAgdGhpcy5Xcml0ZVdhcm5pbmdUb0xvZ18xKG1zZ09yRXgpO1xyXG4gICAgICBlbHNlIGlmIChtc2dPckV4IGluc3RhbmNlb2YgRXJyb3IpXHJcbiAgICAgICAgdGhpcy5Xcml0ZVdhcm5pbmdUb0xvZ18yKG1zZ09yRXgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nXzMobXNnT3JFeCwgbXNnKTtcclxuICB9XHJcblxyXG4gIFdyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhcIk1hZ2ljV2ViIFtXQVJOSU5HXTogXCIgKyBtc2csIHRydWUsIExvZ1R5cGUud2FybmluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlV2FybmluZ1RvTG9nXzEoZXg6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coZXguR2V0VHlwZSgpICsgXCIgOiBcIiArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgZXguU3RhY2tUcmFjZSArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgZXguTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlV2FybmluZ1RvTG9nXzIoZXg6IEVycm9yKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfXsxfXsyfVwiLCBbXHJcbiAgICAgIGV4LnN0YWNrLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXgubWVzc2FnZVxyXG4gICAgXSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZVdhcm5pbmdUb0xvZ18zKGV4OiBFeGNlcHRpb24sIG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSwgezF9IDogezJ9ezN9ezR9ezV9XCIsIFtcclxuICAgICAgZXguR2V0VHlwZSgpLCBtc2csIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5TdGFja1RyYWNlLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguTWVzc2FnZVxyXG4gICAgXSkpO1xyXG4gIH1cclxuXHJcbiAgV3JpdGVTdGFja1RyYWNlKHN0YWNrVHJhY2U6IFN0YWNrVHJhY2UsIGZyYW1lc1RvUHJpbnQ6IG51bWJlciwgdHJhY2VUaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRyYWNlVGl0bGUgPT09IG51bGwpIHtcclxuICAgICAgdHJhY2VUaXRsZSA9IFwiU3RhY2sgdHJhY2U6XCI7XHJcbiAgICB9XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRyYWNlVGl0bGUgKyBPU0Vudmlyb25tZW50LkVvbFNlcSk7XHJcbiAgICBsZXQgZnJhbWVzOiBKU1N0YWNrRnJhbWVbXSA9IHN0YWNrVHJhY2UuR2V0RnJhbWVzKCk7XHJcbiAgICBsZXQgYXJyYXk6IEpTU3RhY2tGcmFtZVtdID0gZnJhbWVzO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBzdGFja0ZyYW1lOiBKU1N0YWNrRnJhbWUgPSBhcnJheVtpXTtcclxuICAgICAgZnJhbWVzVG9QcmludCA9IGZyYW1lc1RvUHJpbnQgLSAxO1xyXG5cclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoc3RhY2tGcmFtZS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIGlmIChmcmFtZXNUb1ByaW50ID09PSAwKSB7XHJcbiAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoXCJcXHQuLi4gbW9yZSBzdGFjayBmcmFtZXMgLi4uXFxuXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLldyaXRlVG9Mb2coc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRmx1c2ggdGhlIGxvZyB3cml0ZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBGbHVzaCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcbn1cclxuIl19