@magic-xpa/utils 4.800.0 → 4.801.0-dev000.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) 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/esm2020/src/SyncExecutionHelper.mjs +26 -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} +5 -6
  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/src/Logger.d.ts +2 -2
  35. package/bundles/magic-xpa-utils.umd.js +0 -5271
  36. package/bundles/magic-xpa-utils.umd.js.map +0 -1
  37. package/bundles/magic-xpa-utils.umd.min.js +0 -2
  38. package/bundles/magic-xpa-utils.umd.min.js.map +0 -1
  39. package/esm2015/src/Logger.js +0 -217
  40. package/esm2015/src/StrUtil.js +0 -457
  41. package/esm2015/src/SyncExecutionHelper.js +0 -26
  42. 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, internalLogSync, 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(contextID, sessionCounter, clientID, serverID, ex) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdXRpbHMvc3JjL0xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUcsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQyxNQUFNLENBQU4sSUFBWSxPQUlYO0FBSkQsV0FBWSxPQUFPO0lBQ2pCLHFDQUFRLENBQUE7SUFDUiwyQ0FBTyxDQUFBO0lBQ1AsdUNBQUssQ0FBQTtBQUNQLENBQUMsRUFKVyxPQUFPLEtBQVAsT0FBTyxRQUlsQjtBQU9ELE1BQU0sT0FBTyxNQUFNO0lBb1ZqQjtRQWxWQSxhQUFRLEdBQXFCLENBQUMsQ0FBQztRQUsvQixlQUFVLEdBQVksS0FBSyxDQUFDO0lBOFU1QixDQUFDO0lBNVVELE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBYTtRQUMvQixNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxLQUFLLFFBQVE7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtZQUM1QixNQUFNLENB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QUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25ELElBQUksVUFBVSxHQUFpQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsYUFBYSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFFbEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUU1QyxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUU7Z0JBQ3ZCLGFBQWEsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDdEQsTUFBTTthQUNQO1NBQ0Y7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBS0QsS0FBSztJQUVMLENBQUM7O0FBalZNLGVBQVEsR0FBVyxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xvZ2dlcl9Mb2dMZXZlbHMsIExvZ2dlcl9NZXNzYWdlRGlyZWN0aW9ufSBmcm9tIFwiLi9lbnVtc1wiO1xyXG5pbXBvcnQge0RhdGVUaW1lLCBEZWJ1ZywgRXhjZXB0aW9uLCBOU3RyaW5nLCBTdGFja1RyYWNlLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWR9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge09TRW52aXJvbm1lbnR9IGZyb20gXCIuL1BsYXRmb3JtVXRpbHNcIjtcclxuaW1wb3J0IHtEYXRlVGltZVV0aWxzfSBmcm9tIFwiLi9EYXRlVGltZVV0aWxzXCI7XHJcbmltcG9ydCB7WE1MQ29uc3RhbnRzfSBmcm9tIFwiLi9YTUxDb25zdGFudHNcIjtcclxuaW1wb3J0ICogYXMgSlNTdGFja1RyYWNlIGZyb20gJ3N0YWNrdHJhY2UtanMnO1xyXG5pbXBvcnQge2lzTnVsbE9yVW5kZWZpbmVkfSBmcm9tIFwidXRpbFwiO1xyXG5pbXBvcnQgSlNTdGFja0ZyYW1lID0gSlNTdGFja1RyYWNlLlN0YWNrRnJhbWU7XHJcbmltcG9ydCB7UmVxdWVzdEluZm99IGZyb20gXCIuL1JlcXVlc3RJbmZvXCI7XHJcbmltcG9ydCB7IFN0clV0aWwgfSBmcm9tIFwiLi9TdHJVdGlsXCI7XHJcblxyXG5leHBvcnQgZW51bSBMb2dUeXBlIHtcclxuICBpbmZvID0gMSxcclxuICB3YXJuaW5nLFxyXG4gIGVycm9yXHJcbn1cclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBMb2dnZXIgY2xhc3Mgd2lsbCB0YWtlIGNhcmUgb2YgY2xpZW50IHNpZGUgbG9nZ2luZyAuIEl0IHdpbGwgY2hlY2sgZm9yIHZhcmlvdXMgbG9nIGxldmVscyBhbmQgYWNjb3JkaW5nbHkgd2lsbCB3cml0ZSBtZXNzYWdlcyBpbiBsb2cgZmlsZS5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy9AZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcclxuICBzdGF0aWMgaW5zdGFuY2U6IExvZ2dlciA9IG51bGw7XHJcbiAgTG9nTGV2ZWw6IExvZ2dlcl9Mb2dMZXZlbHMgPSAwOyAvLyBJbnRlcm5hbExvZ0xldmVsXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV2hpbGUgd3JpdGluZyB0aGUgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIGZpbGUgcGxheSB0aGUgYmVlcC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNob3VsZEJlZXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIHNldCBJbnN0YW5jZSh2YWx1ZTogTG9nZ2VyKSB7XHJcbiAgICBMb2dnZXIuaW5zdGFuY2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogTG9nZ2VyIHtcclxuICAgIGlmIChMb2dnZXIuaW5zdGFuY2UgPT09IG51bGwpIHtcclxuICAgICAgTG9nZ2VyLmluc3RhbmNlID0gbmV3IExvZ2dlcigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIExvZ2dlci5pbnN0YW5jZTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgbG9nZ2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsb2dMZXZlbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW50ZXJuYWxMb2dTeW5jXCI+PC9wYXJhbT5cclxuICBJbml0aWFsaXplKGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzLCBpbnRlcm5hbExvZ1N5bmM6IHN0cmluZywgc2hvdWxkQmVlcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gbGV0IGxvZ1N5bmM6IExvZ1N5bmNNb2RlICA9IExvZ1N5bmNNb2RlLlNlc3Npb247XHJcbiAgICAgIHRoaXMuTG9nTGV2ZWwgPSBsb2dMZXZlbDtcclxuICAgICAgdGhpcy5TaG91bGRCZWVwID0gc2hvdWxkQmVlcDtcclxuXHJcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudFxyXG4vLyAgIFN0cmluZyBzdHJMb2dTeW5jID0gaW50ZXJuYWxMb2dTeW5jO1xyXG4vLyAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RyTG9nU3luYykpXHJcbi8vIHtcclxuLy8gICBpZiAoc3RyTG9nU3luYy5TdGFydHNXaXRoKFwiTVwiLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSkpXHJcbi8vICAgbG9nU3luYyA9IExvZ1N5bmNNb2RlLk1lc3NhZ2U7XHJcbi8vICAgZWxzZSBpZiAoc3RyTG9nU3luYy5TdGFydHNXaXRoKFwiRlwiLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSkpXHJcbi8vICAgbG9nU3luYyA9IExvZ1N5bmNNb2RlLkZsdXNoO1xyXG4vLyB9XHJcbi8vXHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLldyaXRlRGV2VG9Mb2coXCJDbGllbnRNYW5hZ2VyLmluaXQoKTogXCIgKyBlLk1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsb2dMZXZlbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuXHJcbiAgU2hvdWxkTG9nKGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzKTogYm9vbGVhbjtcclxuICBTaG91bGRMb2coKTogYm9vbGVhbjtcclxuICBTaG91bGRMb2cobG9nTGV2ZWw/OiBMb2dnZXJfTG9nTGV2ZWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgcmV0dXJuIHRoaXMuU2hvdWxkTG9nXzAobG9nTGV2ZWwpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5TaG91bGRMb2dfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTaG91bGRMb2dfMChsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuTG9nTGV2ZWwgPT09IGxvZ0xldmVsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTaG91bGRMb2dfMSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkxvZ0xldmVsID4gTG9nZ2VyX0xvZ0xldmVscy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgU2hvdWxkTG9nU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLlNob3VsZExvZ0V4dGVuZGVkU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlcikpICYmIHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgfVxyXG5cclxuICBTaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlck1lc3NhZ2VzKSB8fCBMb2dnZXIuSW5zdGFuY2UuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuU3VwcG9ydCkgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSkgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVuSWZOZWNlc3NhcnlcIj5vcGVuIHRoZSBsb2cgZmlsZSBpZiBub3Qgb3BlbmVkIHlldDwvcGFyYW0+XHJcblxyXG4gIFdyaXRlVG9Mb2cobXNnOiBzdHJpbmcsIG9wZW5JZk5lY2Vzc2FyeTogYm9vbGVhbiwgbG9nVHlwZTogTG9nVHlwZSA9IExvZ1R5cGUuaW5mbyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID4gTG9nZ2VyX0xvZ0xldmVscy5Ob25lIHx8IG9wZW5JZk5lY2Vzc2FyeSkge1xyXG4gICAgICBtc2cgPSBOU3RyaW5nLkZvcm1hdChcInswfSB7MX1cIiwgKHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpID8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpIDogRGF0ZVRpbWVVdGlscy5Ub1N0cmluZyhEYXRlVGltZS5Ob3csIFhNTENvbnN0YW50cy5FUlJPUl9MT0dfVElNRV9GT1JNQVQsIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpO1xyXG5cclxuICAgICAgc3dpdGNoIChsb2dUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBMb2dUeXBlLmVycm9yOlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMb2dUeXBlLndhcm5pbmc6XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdyaXRlIGEgc2VydmVyIGFjY2VzcyB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVNlcnZlclRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRMb2dTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSkge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXJ2ZXIsIFRocmVhZD17MH06IFwiLCBUaHJlYWQuQ3VycmVudFRocmVhZC5NYW5hZ2VkVGhyZWFkSWQpICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBzZXJ2ZXIgYWNjZXNzIHRvIHRoZSBsb2csIGluY2x1ZGluZyB0aGUgY29udGVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhcIlNlcnZlciM6IFwiICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZSBhIFFDIG1lc3NhZ2UgdG8gdGhlIGxvZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVN1cHBvcnRUb0xvZyhtc2c6IHN0cmluZywgc2tpcExpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLlN1cHBvcnQgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICBpZiAoc2tpcExpbmUpIHtcclxuICAgICAgICB0aGlzLldyaXRlVG9Mb2coXCJTVVBQT1JUOiBcIiArIG1zZywgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiU1VQUE9SVDogXCIgKyBtc2cgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIiwgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBwZXJmb3JtYW5jZSBtZXNzYWdlIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlR3VpVG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLkd1aSAmJiB0aGlzLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhtc2csIGZhbHNlLCBMb2dUeXBlLmluZm8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3cml0ZSBhIGRldmVsb3BlciBtZXNzYWdlIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlRGV2VG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID49IExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coXCJERVY6IFwiICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIGEgYmFzaWMgbGV2ZWwgZW50cnkgdG8gbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZXNzYWdlRGlyZWN0aW9uXCI+bWVzc2FnZSBkaXJlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlIChSSUEgY2xpZW50KS4gQ2FuIGJlIGVpdGhlciBNZXNzYWdlRW50ZXJpbmcgb3IgTWVzc2FnZUxlYXZpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0YXR1c0NvZGVcIj5IVFRQIHN0YXR1cyBjb2RlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50TGVuZ3RoXCI+bGVuZ3RoIG9mIHRoZSBodHRwIG1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImh0dHBIZWFkZXJzXCI+SFRUUCBoZWFkZXJzPC9wYXJhbT5cclxuICBXcml0ZUJhc2ljVG9Mb2cobWVzc2FnZURpcmVjdGlvbjogTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24sIGNvbnRleHRJRDogc3RyaW5nLCBzZXNzaW9uQ291bnRlcjogbnVtYmVyLCBjbGllbnRJRDogc3RyaW5nLCBzZXJ2ZXJJRDogc3RyaW5nLCByZXNwb25zZVRpbWU6IG51bWJlciwgc3RhdHVzQ29kZTogc3RyaW5nLCBodHRwSGVhZGVyczogc3RyaW5nLCBjb250ZW50TGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBodHRwSGVhZGVycztcclxuICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xyXG4gICAgICB0ZXh0ID0gTlN0cmluZy5SZXBsYWNlKHRleHQsIFwiXFxyXFxuXCIsIFwifFwiKTtcclxuICAgICAgbGV0IGFyZ19FNF8wOiBzdHJpbmcgPSBcIlJJQSx7MH1fezF9LHsyfSx7M30sezR9LHs1fSwtLHs2fSx7N30sezh9LHs5fSx7MTB9LHsxMX1cIjtcclxuICAgICAgbGV0IGV4cHJfM0U6IGFueVtdID0gbmV3IEFycmF5PGFueT4oMTIpO1xyXG5cclxuICAgICAgLy8gVE9ETyA6IG5lZWQgdG8gY2hlY2sgSG93IHRvIGhhbmRsZSBQcm9jZXNzIGNsYXNzLlxyXG4gICAgICAvLyBleHByXzNFWzBdID0gUHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLklkO1xyXG4gICAgICBleHByXzNFWzFdID0gVGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkO1xyXG4gICAgICBleHByXzNFWzJdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgICBleHByXzNFWzNdID0gKChtZXNzYWdlRGlyZWN0aW9uID09PSBMb2dnZXJfTWVzc2FnZURpcmVjdGlvbi5NZXNzYWdlTGVhdmluZykgPyBcIk1TR0xcIiA6IFwiTVNHRVwiKTtcclxuICAgICAgZXhwcl8zRVs0XSA9IGNvbnRleHRJRDtcclxuICAgICAgZXhwcl8zRVs1XSA9IHNlc3Npb25Db3VudGVyO1xyXG4gICAgICBleHByXzNFWzZdID0gY2xpZW50SUQ7XHJcbiAgICAgIGV4cHJfM0VbN10gPSBzZXJ2ZXJJRDtcclxuICAgICAgZXhwcl8zRVs4XSA9ICgocmVzcG9uc2VUaW1lICE9PSAwKSA/IHJlc3BvbnNlVGltZS50b1N0cmluZygpIDogXCItXCIpO1xyXG4gICAgICBsZXQgYXJnX0QzXzE6IG51bWJlciA9IDk7XHJcbiAgICAgIGxldCBhcmdfRDNfMjogYW55O1xyXG4gICAgICBhcmdfRDNfMiA9IHN0YXR1c0NvZGU7XHJcbiAgICAgIGV4cHJfM0VbYXJnX0QzXzFdID0gYXJnX0QzXzI7XHJcbiAgICAgIGV4cHJfM0VbMTBdID0gdGV4dDtcclxuICAgICAgZXhwcl8zRVsxMV0gPSBjb250ZW50TGVuZ3RoO1xyXG4gICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRm9ybWF0KGFyZ19FNF8wLCBleHByXzNFKTtcclxuICAgICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsaWVudFNlc3Npb25cIj5UaGUgY2xpZW50U2Vzc2lvbiBvYmplY3QgdG8gYmUgbG9nZ2VkPC9wYXJhbT5cclxuICBXcml0ZVJlcXVlc3RJbmZvVG9Mb2cocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvLCBleHRyYU1lc3NhZ2VTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuUmVxdWVzdEluZm8pIHtcclxuXHJcbiAgICAgIC8vIENocm9tZSBkZWJ1Z2dlciBhdXRvbWF0aWNhbGx5IHJlY29tcHV0ZXMgbG9nZ2VkIG9iamVjdHMuXHJcbiAgICAgIC8vIEhlbmNlLCBjbG9uZSB0aGUgcmVxdWVzdEluZm8gb2JqZWN0IHRvIHByaW50IHRoZSBkZXRhaWxzIGF0IHRoZSB0aW1lIG9mIGxvZ2dpbmdcclxuICAgICAgY29uc29sZS5sb2coZXh0cmFNZXNzYWdlU3RyLCBSZXF1ZXN0SW5mby5jbG9uZShyZXF1ZXN0SW5mbykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgYSByZXF1ZXN0IGV4Y2VwdGlvbiBiYXNpYyBsZXZlbCBlbnRyeSB0byBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvbkNvdW50ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsaWVudElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXJ2ZXJJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhcIj50aGUgbG9nZ2VkIGV4Y2VwdGlvbjwvcGFyYW0+XHJcbiAgV3JpdGVCYXNpY0Vycm9yVG9Mb2coY29udGV4dElEOiBzdHJpbmcsIHNlc3Npb25Db3VudGVyOiBudW1iZXIsIGNsaWVudElEOiBzdHJpbmcsIHNlcnZlcklEOiBzdHJpbmcsIGV4OiBFeGNlcHRpb24pOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKTtcclxuXHJcbiAgICAvLyBUT0RPIDogTmVlZCB0byBjaGVjayBob3cgdG8gaGFuZGxlIFByb2Nlc3NcclxuICAgIC8vIGxldCB2YWx1ZTogc3RyaW5nID0gTlN0cmluZy5Gb3JtYXQoXCJSSUEsezB9X3sxfSx7Mn0sezN9LHs0fSx7NX0sLSx7Nn0sezd9LC0sLSwtLHs4fSB7OX1cIiwgW1xyXG4gICAgLy8gUHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLklkLCBUaHJlYWQuQ3VycmVudFRocmVhZC5NYW5hZ2VkVGhyZWFkSWQsIERhdGVUaW1lLlV0Y05vdy5Ub1N0cmluZyhcInl5eXktTU0tZGRUSEg6bW06c3MuZmZmZmZmZlpcIiksIFwiUkVTXCIsIGNvbnRleHRJRCwgc2Vzc2lvbkNvdW50ZXIsIGNsaWVudElELCBzZXJ2ZXJJRCwgZXguR2V0VHlwZSgpLCBleC5NZXNzYWdlXHJcbiAgICAvLyBdKTtcclxuICAgIC8vIE5Db25zb2xlLldyaXRlTGluZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdyaXRlIGFuIGVycm9yIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlRXJyb3JUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZVRvTG9nKFwiTWFnaWNXZWIgW0VSUk9SXTogXCIgKyBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKG1zZyksIHRydWUsIExvZ1R5cGUuZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZSBhbiBpbnRlcm5hbCBlcnJvciB0byB0aGUgbG9nLiBBbHNvIHByaW50cyBzdGFjayB0cmFjZSBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nKGV4OiBFeGNlcHRpb24pOiB2b2lkO1xyXG4gIFdyaXRlRXhjZXB0aW9uVG9Mb2coZXg6IEVycm9yKTogdm9pZDtcclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nKGV4OiBFeGNlcHRpb24sIG1zZzogc3RyaW5nKTogdm9pZDtcclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nKG1zZ09yRXg6IGFueSwgbXNnPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAobXNnT3JFeCBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ18yKG1zZ09yRXgsIG1zZyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChtc2dPckV4ICE9PSBudWxsIHx8IG1zZ09yRXggaW5zdGFuY2VvZiBFeGNlcHRpb24pKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ18xKG1zZ09yRXgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nXzMobXNnT3JFeCwgbXNnKTtcclxuICB9XHJcblxyXG4gIFdyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlVG9Mb2coXCJNYWdpY1dlYiBbRVJST1JdOiBcIiArIFN0clV0aWwuZ2V0Q29uc29sZUVyb3JTdHJpbmcobXNnKSwgdHJ1ZSwgTG9nVHlwZS5lcnJvcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMShleDogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9IDogezF9ezJ9ezN9ezR9XCIsIFtcclxuICAgICAgZXguR2V0VHlwZSgpLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguU3RhY2tUcmFjZSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lk1lc3NhZ2VcclxuICAgIF0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVFeGNlcHRpb25Ub0xvZ18yKGV4OiBFcnJvciwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQobWVzc2FnZSkpXHJcbiAgICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH17MX17Mn1cIiwgW2V4LnN0YWNrLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXgubWVzc2FnZV0pKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfXsxfXsyfXs0fXs1fVwiLCBbbWVzc2FnZSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LnN0YWNrLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXgubWVzc2FnZV0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVFeGNlcHRpb25Ub0xvZ18zKGV4OiBFeGNlcHRpb24sIG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9LCB7MX0gOiB7Mn17M317NH17NX1cIiwgW1xyXG4gICAgICBleC5HZXRUeXBlKCksIG1zZywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHdyaXRlIGEgd2FybmluZyB0byB0aGUgbG9nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlV2FybmluZ1RvTG9nKGV4OiBFeGNlcHRpb24pOiB2b2lkO1xyXG4gIFdyaXRlV2FybmluZ1RvTG9nKGV4OiBFeGNlcHRpb24sIG1zZzogc3RyaW5nKTogdm9pZDtcclxuICBXcml0ZVdhcm5pbmdUb0xvZyhleDogRXJyb3IpOiB2b2lkO1xyXG4gIFdyaXRlV2FybmluZ1RvTG9nKG1zZ09yRXg6IGFueSwgbXNnPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBtc2dPckV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChtc2dPckV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKVxyXG4gICAgICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dfMShtc2dPckV4KTtcclxuICAgICAgZWxzZSBpZiAobXNnT3JFeCBpbnN0YW5jZW9mIEVycm9yKVxyXG4gICAgICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dfMihtc2dPckV4KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5Xcml0ZVdhcm5pbmdUb0xvZ18zKG1zZ09yRXgsIG1zZyk7XHJcbiAgfVxyXG5cclxuICBXcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coXCJNYWdpY1dlYiBbV0FSTklOR106IFwiICsgbXNnLCB0cnVlLCBMb2dUeXBlLndhcm5pbmcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZVdhcm5pbmdUb0xvZ18xKGV4OiBFeGNlcHRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKGV4LkdldFR5cGUoKSArIFwiIDogXCIgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIGV4LlN0YWNrVHJhY2UgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIGV4Lk1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZVdhcm5pbmdUb0xvZ18yKGV4OiBFcnJvcik6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH17MX17Mn1cIiwgW1xyXG4gICAgICBleC5zdGFjaywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lm1lc3NhZ2VcclxuICAgIF0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVXYXJuaW5nVG9Mb2dfMyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0sIHsxfSA6IHsyfXszfXs0fXs1fVwiLCBbXHJcbiAgICAgIGV4LkdldFR5cGUoKSwgbXNnLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguU3RhY2tUcmFjZSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lk1lc3NhZ2VcclxuICAgIF0pKTtcclxuICB9XHJcblxyXG4gIFdyaXRlU3RhY2tUcmFjZShzdGFja1RyYWNlOiBTdGFja1RyYWNlLCBmcmFtZXNUb1ByaW50OiBudW1iZXIsIHRyYWNlVGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0cmFjZVRpdGxlID09PSBudWxsKSB7XHJcbiAgICAgIHRyYWNlVGl0bGUgPSBcIlN0YWNrIHRyYWNlOlwiO1xyXG4gICAgfVxyXG4gICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih0cmFjZVRpdGxlICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEpO1xyXG4gICAgbGV0IGZyYW1lczogSlNTdGFja0ZyYW1lW10gPSBzdGFja1RyYWNlLkdldEZyYW1lcygpO1xyXG4gICAgbGV0IGFycmF5OiBKU1N0YWNrRnJhbWVbXSA9IGZyYW1lcztcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgc3RhY2tGcmFtZTogSlNTdGFja0ZyYW1lID0gYXJyYXlbaV07XHJcbiAgICAgIGZyYW1lc1RvUHJpbnQgPSBmcmFtZXNUb1ByaW50IC0gMTtcclxuXHJcbiAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHN0YWNrRnJhbWUudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAoZnJhbWVzVG9QcmludCA9PT0gMCkge1xyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKFwiXFx0Li4uIG1vcmUgc3RhY2sgZnJhbWVzIC4uLlxcblwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5Xcml0ZVRvTG9nKHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZsdXNoIHRoZSBsb2cgd3JpdGVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgRmx1c2goKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG59XHJcbiJdfQ==