oxygen-cli 1.22.0 → 1.99.0-alpha.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 (232) hide show
  1. package/CHANGELOG.md +0 -50
  2. package/build/core/OxygenCore.js +56 -145
  3. package/build/errors/OxygenError.js +5 -15
  4. package/build/errors/helper.js +45 -49
  5. package/build/index.js +14 -6
  6. package/build/lib/cli-util.js +19 -19
  7. package/build/lib/cli.js +4 -2
  8. package/build/lib/parallel-launcher.js +333 -0
  9. package/build/lib/param-manager.js +66 -47
  10. package/build/lib/util.js +38 -9
  11. package/build/ox_modules/index.js +1 -97
  12. package/build/ox_modules/module-assert.js +19 -9
  13. package/build/ox_modules/module-dns.js +220 -0
  14. package/build/ox_modules/module-http.js +39 -51
  15. package/build/ox_modules/module-shell.js +19 -75
  16. package/build/ox_modules/module-utils.js +1 -108
  17. package/build/ox_modules/utils.js +1 -357
  18. package/build/reporter/FileReporterBase.js +5 -5
  19. package/build/reporter/ReportAggregator.js +127 -4
  20. package/build/runners/WorkerProcess.js +15 -28
  21. package/build/runners/index.js +2 -6
  22. package/build/runners/oxygen/OxygenWorker.js +8 -8
  23. package/build/runners/oxygen/index.js +17 -18
  24. package/build/runners/oxygen/worker.js +10 -8
  25. package/package.json +12 -46
  26. package/build/lib/img-merge.js +0 -163
  27. package/build/ox_modules/module-db.js +0 -146
  28. package/build/ox_modules/module-email.js +0 -212
  29. package/build/ox_modules/module-eyes.js +0 -189
  30. package/build/ox_modules/module-mailinator.js +0 -207
  31. package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
  32. package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
  33. package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
  34. package/build/ox_modules/module-mob/commands/assertText.js +0 -45
  35. package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
  36. package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
  37. package/build/ox_modules/module-mob/commands/back.js +0 -27
  38. package/build/ox_modules/module-mob/commands/clear.js +0 -40
  39. package/build/ox_modules/module-mob/commands/click.js +0 -35
  40. package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
  41. package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
  42. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
  43. package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
  44. package/build/ox_modules/module-mob/commands/debug.js +0 -26
  45. package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
  46. package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
  47. package/build/ox_modules/module-mob/commands/execute.js +0 -32
  48. package/build/ox_modules/module-mob/commands/findElement.js +0 -36
  49. package/build/ox_modules/module-mob/commands/findElements.js +0 -39
  50. package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
  51. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
  52. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
  53. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
  54. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
  55. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
  56. package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
  57. package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
  58. package/build/ox_modules/module-mob/commands/getSource.js +0 -26
  59. package/build/ox_modules/module-mob/commands/getText.js +0 -36
  60. package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
  61. package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
  62. package/build/ox_modules/module-mob/commands/getValue.js +0 -50
  63. package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
  64. package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
  65. package/build/ox_modules/module-mob/commands/index.js +0 -594
  66. package/build/ox_modules/module-mob/commands/installApp.js +0 -28
  67. package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
  68. package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
  69. package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
  70. package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
  71. package/build/ox_modules/module-mob/commands/isExist.js +0 -36
  72. package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
  73. package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
  74. package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
  75. package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
  76. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
  77. package/build/ox_modules/module-mob/commands/open.js +0 -43
  78. package/build/ox_modules/module-mob/commands/pause.js +0 -27
  79. package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
  80. package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
  81. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
  82. package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
  83. package/build/ox_modules/module-mob/commands/select.js +0 -54
  84. package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
  85. package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
  86. package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
  87. package/build/ox_modules/module-mob/commands/setContext.js +0 -28
  88. package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
  89. package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
  90. package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
  91. package/build/ox_modules/module-mob/commands/shake.js +0 -27
  92. package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
  93. package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
  94. package/build/ox_modules/module-mob/commands/swipe.js +0 -58
  95. package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
  96. package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
  97. package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
  98. package/build/ox_modules/module-mob/commands/tap.js +0 -34
  99. package/build/ox_modules/module-mob/commands/type.js +0 -67
  100. package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
  101. package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
  102. package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
  103. package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
  104. package/build/ox_modules/module-mob.js +0 -699
  105. package/build/ox_modules/module-pdf.js +0 -328
  106. package/build/ox_modules/module-proxy.js +0 -324
  107. package/build/ox_modules/module-serial.js +0 -187
  108. package/build/ox_modules/module-soap.js +0 -260
  109. package/build/ox_modules/module-twilio.js +0 -192
  110. package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
  111. package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
  112. package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
  113. package/build/ox_modules/module-web/commands/assertExist.js +0 -28
  114. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
  115. package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
  116. package/build/ox_modules/module-web/commands/assertText.js +0 -45
  117. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
  118. package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
  119. package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
  120. package/build/ox_modules/module-web/commands/assertValue.js +0 -44
  121. package/build/ox_modules/module-web/commands/back.js +0 -27
  122. package/build/ox_modules/module-web/commands/clear.js +0 -41
  123. package/build/ox_modules/module-web/commands/click.js +0 -112
  124. package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
  125. package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
  126. package/build/ox_modules/module-web/commands/debug.js +0 -25
  127. package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
  128. package/build/ox_modules/module-web/commands/deselect.js +0 -34
  129. package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
  130. package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
  131. package/build/ox_modules/module-web/commands/execute.js +0 -36
  132. package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
  133. package/build/ox_modules/module-web/commands/findElement.js +0 -35
  134. package/build/ox_modules/module-web/commands/findElements.js +0 -38
  135. package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
  136. package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
  137. package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
  138. package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
  139. package/build/ox_modules/module-web/commands/getCookies.js +0 -23
  140. package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
  141. package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
  142. package/build/ox_modules/module-web/commands/getHTML.js +0 -30
  143. package/build/ox_modules/module-web/commands/getSource.js +0 -26
  144. package/build/ox_modules/module-web/commands/getText.js +0 -36
  145. package/build/ox_modules/module-web/commands/getTitle.js +0 -22
  146. package/build/ox_modules/module-web/commands/getUrl.js +0 -26
  147. package/build/ox_modules/module-web/commands/getValue.js +0 -43
  148. package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
  149. package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
  150. package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
  151. package/build/ox_modules/module-web/commands/index.js +0 -634
  152. package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
  153. package/build/ox_modules/module-web/commands/isChecked.js +0 -30
  154. package/build/ox_modules/module-web/commands/isExist.js +0 -36
  155. package/build/ox_modules/module-web/commands/isSelected.js +0 -35
  156. package/build/ox_modules/module-web/commands/isVisible.js +0 -36
  157. package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
  158. package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
  159. package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
  160. package/build/ox_modules/module-web/commands/newWindow.js +0 -27
  161. package/build/ox_modules/module-web/commands/open.js +0 -42
  162. package/build/ox_modules/module-web/commands/pause.js +0 -26
  163. package/build/ox_modules/module-web/commands/point.js +0 -37
  164. package/build/ox_modules/module-web/commands/pointJS.js +0 -56
  165. package/build/ox_modules/module-web/commands/refresh.js +0 -26
  166. package/build/ox_modules/module-web/commands/rightClick.js +0 -61
  167. package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
  168. package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
  169. package/build/ox_modules/module-web/commands/select.js +0 -55
  170. package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
  171. package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
  172. package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
  173. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
  174. package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
  175. package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
  176. package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
  177. package/build/ox_modules/module-web/commands/type.js +0 -52
  178. package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
  179. package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
  180. package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
  181. package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
  182. package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
  183. package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
  184. package/build/ox_modules/module-web/commands/waitForText.js +0 -45
  185. package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
  186. package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
  187. package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
  188. package/build/ox_modules/module-web.js +0 -909
  189. package/build/ox_modules/module-win/commands/assertText.js +0 -41
  190. package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
  191. package/build/ox_modules/module-win/commands/assertValue.js +0 -62
  192. package/build/ox_modules/module-win/commands/back.js +0 -21
  193. package/build/ox_modules/module-win/commands/clear.js +0 -34
  194. package/build/ox_modules/module-win/commands/click.js +0 -25
  195. package/build/ox_modules/module-win/commands/clickLong.js +0 -30
  196. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
  197. package/build/ox_modules/module-win/commands/findElement.js +0 -31
  198. package/build/ox_modules/module-win/commands/findElements.js +0 -31
  199. package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
  200. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
  201. package/build/ox_modules/module-win/commands/getLocation.js +0 -26
  202. package/build/ox_modules/module-win/commands/getSource.js +0 -22
  203. package/build/ox_modules/module-win/commands/getText.js +0 -32
  204. package/build/ox_modules/module-win/commands/getValue.js +0 -46
  205. package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
  206. package/build/ox_modules/module-win/commands/index.js +0 -298
  207. package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
  208. package/build/ox_modules/module-win/commands/isChecked.js +0 -26
  209. package/build/ox_modules/module-win/commands/isClickable.js +0 -26
  210. package/build/ox_modules/module-win/commands/isExist.js +0 -32
  211. package/build/ox_modules/module-win/commands/isSelected.js +0 -26
  212. package/build/ox_modules/module-win/commands/isVisible.js +0 -32
  213. package/build/ox_modules/module-win/commands/open.js +0 -24
  214. package/build/ox_modules/module-win/commands/pause.js +0 -23
  215. package/build/ox_modules/module-win/commands/rightClick.js +0 -30
  216. package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
  217. package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
  218. package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
  219. package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
  220. package/build/ox_modules/module-win/commands/tap.js +0 -29
  221. package/build/ox_modules/module-win/commands/type.js +0 -38
  222. package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
  223. package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
  224. package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
  225. package/build/ox_modules/module-win.js +0 -367
  226. package/build/ox_services/service-devtools/submodule-network.js +0 -338
  227. package/build/ox_services/service-devtools.js +0 -83
  228. package/build/runners/cucumber/CucumberEventListener.js +0 -181
  229. package/build/runners/cucumber/CucumberReporter.js +0 -277
  230. package/build/runners/cucumber/CucumberWorker.js +0 -337
  231. package/build/runners/cucumber/index.js +0 -159
  232. package/build/runners/cucumber/worker.js +0 -184
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("source-map-support/register");
9
+
10
+ var _lodash = _interopRequireDefault(require("lodash"));
11
+
12
+ var _child_process = _interopRequireDefault(require("child_process"));
13
+
14
+ var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
15
+
16
+ var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
17
+
18
+ var _helper = _interopRequireDefault(require("../errors/helper"));
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ /*
23
+ * Copyright (C) 2015-present CloudBeat Limited
24
+ *
25
+ * This program is free software: you can redistribute it and/or modify
26
+ * it under the terms of the GNU General Public License as published by
27
+ * the Free Software Foundation, either version 3 of the License, or
28
+ * (at your option) any later version.
29
+ */
30
+
31
+ /**
32
+ * @name dns
33
+ * @description Provides methods for working with DNS
34
+ */
35
+ const MODULE_NAME = 'dns';
36
+
37
+ class DnsModule extends _OxygenModule.default {
38
+ constructor(options, context, rs, logger, modules, services) {
39
+ super(options, context, rs, logger, modules, services); // pre-initialize the module
40
+
41
+ this._isInitialized = true;
42
+ }
43
+ /*
44
+ * @summary Gets module name
45
+ * @function name
46
+ * @return {String} Constant value "http".
47
+ */
48
+
49
+
50
+ get name() {
51
+ return MODULE_NAME;
52
+ }
53
+ /**
54
+ * @summary Performs resolve dns with A type
55
+ * @function resolveA
56
+ * @param {String} server - name or IP address of the name server to query.
57
+ * @param {String} name - name of the resource record that is to be looked up.
58
+ * @param {String} dnssec - dnssec.
59
+ * @return {Object} Response object.
60
+ */
61
+
62
+
63
+ async resolveA(server, name, dnssec = false) {
64
+ const args = ['@' + server, name, 'A'];
65
+
66
+ if (dnssec) {
67
+ args.push('+dnssec');
68
+ }
69
+
70
+ return await this.dig(args);
71
+ }
72
+ /**
73
+ * @summary Performs resolve dns with TXT type
74
+ * @function resolveTXT
75
+ * @param {String} server - name or IP address of the name server to query.
76
+ * @param {String} name - name of the resource record that is to be looked up.
77
+ * @return {Object} Response object.
78
+ */
79
+
80
+
81
+ async resolveTXT(server, name) {
82
+ const args = ['@' + server, name, 'TXT'];
83
+ return await this.dig(args);
84
+ }
85
+ /**
86
+ * @summary Performs resolve dns with CNAME type
87
+ * @function resolveCNAME
88
+ * @param {String} server - name or IP address of the name server to query.
89
+ * @param {String} name - name of the resource record that is to be looked up.
90
+ * @return {Object} Response object.
91
+ */
92
+
93
+
94
+ async resolveCNAME(server, name) {
95
+ const args = ['@' + server, name, 'CNAME'];
96
+ return await this.dig(args);
97
+ }
98
+
99
+ parseType(values = []) {
100
+ const type = values[3].toString().toUpperCase();
101
+
102
+ switch (type) {
103
+ case 'SOA':
104
+ return values.slice(4).toString().replace(/,/g, ' ');
105
+
106
+ case 'MX':
107
+ {
108
+ return {
109
+ priority: values[4],
110
+ server: values[5]
111
+ };
112
+ }
113
+
114
+ case 'RRSIG':
115
+ {
116
+ return values.slice(4).join(' ');
117
+ }
118
+
119
+ case 'TXT':
120
+ {
121
+ return values.slice(4).join(' ').replace(/"/g, '');
122
+ }
123
+
124
+ default:
125
+ return values[values.length - 1];
126
+ }
127
+ }
128
+
129
+ parseSection(values, section) {
130
+ if (section === 'answer' || section === 'additional') {
131
+ return {
132
+ domain: values[0],
133
+ type: values[3],
134
+ ttl: values[1],
135
+ class: values[2],
136
+ value: this.parseType(values)
137
+ };
138
+ }
139
+
140
+ return values;
141
+ }
142
+
143
+ parse(output = '') {
144
+ const regex = /(;; )([^\s]+)( SECTION:)/g;
145
+ const result = {};
146
+ const data = output.split(/\r?\n/);
147
+ let section = 'header';
148
+
149
+ if (data.length < 6) {
150
+ let msg = data[data.length - 2];
151
+
152
+ if (!msg || msg.length <= 1) {
153
+ msg = output;
154
+ }
155
+
156
+ throw new Error(msg);
157
+ }
158
+
159
+ data.forEach((line, i) => {
160
+ let m;
161
+ let changed = false;
162
+
163
+ if (i && !line) {
164
+ section = '';
165
+ } else {
166
+ do {
167
+ m = regex.exec(line);
168
+
169
+ if (m) {
170
+ changed = true;
171
+ section = m[2].toLowerCase();
172
+ }
173
+ } while (m);
174
+ }
175
+
176
+ if (section && section === 'answer') {
177
+ if (!result[section]) result[section] = [];
178
+
179
+ if (!changed && line) {
180
+ if (section === 'header') result[section].push(this.parseSection(_lodash.default.compact(line.split(/\t/)), section));else result[section].push(this.parseSection(_lodash.default.compact(line.split(/\s+/g)), section));
181
+ }
182
+ }
183
+ });
184
+ return {
185
+ error: null,
186
+ records: result['answer']
187
+ };
188
+ }
189
+
190
+ dig(args = [], options = {}) {
191
+ const digCMD = options.dig || 'dig';
192
+ return new Promise((resolve, reject) => {
193
+ const process = _child_process.default.spawn(digCMD, args);
194
+
195
+ let shellOutput = '';
196
+ process.stdout.on('data', chunk => {
197
+ shellOutput += chunk;
198
+ });
199
+ process.stdout.on('error', e => {
200
+ reject(new _OxygenError.default(_helper.default.errorCode.DNS_ERROR, e.message));
201
+ });
202
+ process.on('error', e => {
203
+ reject(new _OxygenError.default(_helper.default.errorCode.DNS_ERROR, e.message));
204
+ });
205
+ process.stdout.on('end', () => {
206
+ try {
207
+ const result = this.parse(shellOutput);
208
+ result.shellOutput = shellOutput;
209
+ resolve(result);
210
+ } catch (e) {
211
+ reject(new _OxygenError.default(_helper.default.errorCode.DNS_ERROR, e.message));
212
+ }
213
+ });
214
+ });
215
+ }
216
+
217
+ }
218
+
219
+ exports.default = DnsModule;
220
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1kbnMuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJEbnNNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJyZXNvbHZlQSIsInNlcnZlciIsImRuc3NlYyIsImFyZ3MiLCJwdXNoIiwiZGlnIiwicmVzb2x2ZVRYVCIsInJlc29sdmVDTkFNRSIsInBhcnNlVHlwZSIsInZhbHVlcyIsInR5cGUiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJyZXBsYWNlIiwicHJpb3JpdHkiLCJqb2luIiwibGVuZ3RoIiwicGFyc2VTZWN0aW9uIiwic2VjdGlvbiIsImRvbWFpbiIsInR0bCIsImNsYXNzIiwidmFsdWUiLCJwYXJzZSIsIm91dHB1dCIsInJlZ2V4IiwicmVzdWx0IiwiZGF0YSIsInNwbGl0IiwibXNnIiwiRXJyb3IiLCJmb3JFYWNoIiwibGluZSIsImkiLCJtIiwiY2hhbmdlZCIsImV4ZWMiLCJ0b0xvd2VyQ2FzZSIsIl8iLCJjb21wYWN0IiwiZXJyb3IiLCJyZWNvcmRzIiwiZGlnQ01EIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9jZXNzIiwiY2hpbGQiLCJzcGF3biIsInNoZWxsT3V0cHV0Iiwic3Rkb3V0Iiwib24iLCJjaHVuayIsImUiLCJPeEVycm9yIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJETlNfRVJST1IiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFjQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQWxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsV0FBVyxHQUFHLEtBQXBCOztBQU9lLE1B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QVJEO0FBU0gsS0F6Qk0sQ0FBUDtBQTBCSDs7QUFoSytDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgZG5zXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggRE5TXHJcbiAqL1xyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdkbnMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgY2hpbGQgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEbnNNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcblxyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cclxuICAgICAqL1xyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgcmVzb2x2ZSBkbnMgd2l0aCBBIHR5cGVcclxuICAgICAqIEBmdW5jdGlvbiByZXNvbHZlQVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNlcnZlciAtIG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgbmFtZSBzZXJ2ZXIgdG8gcXVlcnkuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIG5hbWUgb2YgdGhlIHJlc291cmNlIHJlY29yZCB0aGF0IGlzIHRvIGJlIGxvb2tlZCB1cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkbnNzZWMgLSBkbnNzZWMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVzb2x2ZUEoc2VydmVyLCBuYW1lLCBkbnNzZWMgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbJ0AnK3NlcnZlciwgbmFtZSwgJ0EnXTtcclxuXHJcbiAgICAgICAgaWYgKGRuc3NlYykge1xyXG4gICAgICAgICAgICBhcmdzLnB1c2goJytkbnNzZWMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRpZyhhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIHJlc29sdmUgZG5zIHdpdGggVFhUIHR5cGVcclxuICAgICAqIEBmdW5jdGlvbiByZXNvbHZlVFhUXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmVyIC0gbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBuYW1lIHNlcnZlciB0byBxdWVyeS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gbmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVjb3JkIHRoYXQgaXMgdG8gYmUgbG9va2VkIHVwLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc29sdmVUWFQoc2VydmVyLCBuYW1lKSB7XHJcbiAgICAgICAgY29uc3QgYXJncyA9IFsnQCcrc2VydmVyLCBuYW1lLCAnVFhUJ107XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGlnKGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgcmVzb2x2ZSBkbnMgd2l0aCBDTkFNRSB0eXBlXHJcbiAgICAgKiBAZnVuY3Rpb24gcmVzb2x2ZUNOQU1FXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmVyIC0gbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBuYW1lIHNlcnZlciB0byBxdWVyeS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gbmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVjb3JkIHRoYXQgaXMgdG8gYmUgbG9va2VkIHVwLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc29sdmVDTkFNRShzZXJ2ZXIsIG5hbWUpIHtcclxuICAgICAgICBjb25zdCBhcmdzID0gWydAJytzZXJ2ZXIsIG5hbWUsICdDTkFNRSddO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRpZyhhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZVR5cGUgKHZhbHVlcyA9IFtdKSB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbHVlc1szXS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ1NPQSc6IHJldHVybiB2YWx1ZXMuc2xpY2UoNCkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcgJyk7XHJcbiAgICAgICAgICAgIGNhc2UgJ01YJzoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJpb3JpdHk6IHZhbHVlc1s0XSwgc2VydmVyOiB2YWx1ZXNbNV0gfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdSUlNJRyc6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuc2xpY2UoNCkuam9pbignICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ1RYVCc6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuc2xpY2UoNCkuam9pbignICcpLnJlcGxhY2UoL1wiL2csICcnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VTZWN0aW9uICh2YWx1ZXMsIHNlY3Rpb24pIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHNlY3Rpb24gPT09ICdhbnN3ZXInIHx8XHJcbiAgICAgICAgICAgIHNlY3Rpb24gPT09ICdhZGRpdGlvbmFsJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9tYWluOiB2YWx1ZXNbMF0sXHJcbiAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZXNbM10sXHJcbiAgICAgICAgICAgICAgICB0dGw6IHZhbHVlc1sxXSxcclxuICAgICAgICAgICAgICAgIGNsYXNzOiB2YWx1ZXNbMl0sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVR5cGUodmFsdWVzKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZSAob3V0cHV0ID0gJycpIHtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oOzsgKShbXlxcc10rKSggU0VDVElPTjopL2c7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IG91dHB1dC5zcGxpdCgvXFxyP1xcbi8pO1xyXG4gICAgICAgIGxldCBzZWN0aW9uID0gJ2hlYWRlcic7XHJcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNikge1xyXG4gICAgICAgICAgICBsZXQgbXNnID0gZGF0YVtkYXRhLmxlbmd0aCAtIDJdO1xyXG4gICAgICAgICAgICBpZiAoIW1zZyB8fCBtc2cubGVuZ3RoIDw9IDEpIHtcclxuICAgICAgICAgICAgICAgIG1zZyA9IG91dHB1dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChsaW5lLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBtO1xyXG4gICAgICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoaSAmJiAhbGluZSkge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9ICcnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgIG0gPSByZWdleC5leGVjKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0gbVsyXS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VjdGlvbiAmJiBzZWN0aW9uID09PSAnYW5zd2VyJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbc2VjdGlvbl0pIHJlc3VsdFtzZWN0aW9uXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmIGxpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicpIHJlc3VsdFtzZWN0aW9uXS5wdXNoKHRoaXMucGFyc2VTZWN0aW9uKF8uY29tcGFjdChsaW5lLnNwbGl0KC9cXHQvKSksIHNlY3Rpb24pKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHJlc3VsdFtzZWN0aW9uXS5wdXNoKHRoaXMucGFyc2VTZWN0aW9uKF8uY29tcGFjdChsaW5lLnNwbGl0KC9cXHMrL2cpKSwgc2VjdGlvbikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXHJcbiAgICAgICAgICAgIHJlY29yZHM6IHJlc3VsdFsnYW5zd2VyJ11cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGRpZyAoYXJncyA9IFtdLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBkaWdDTUQgPSBvcHRpb25zLmRpZyB8fCAnZGlnJztcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzID0gY2hpbGQuc3Bhd24oZGlnQ01ELCBhcmdzKTtcclxuICAgICAgICAgICAgbGV0IHNoZWxsT3V0cHV0ID0gJyc7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5vbignZGF0YScsIChjaHVuaykgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2hlbGxPdXRwdXQgKz0gY2h1bms7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQub24oJ2Vycm9yJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuRE5TX0VSUk9SLCBlLm1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNzLm9uKCdlcnJvcicsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkROU19FUlJPUiwgZS5tZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQub24oJ2VuZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZShzaGVsbE91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNoZWxsT3V0cHV0ID0gc2hlbGxPdXRwdXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuRE5TX0VSUk9SLCBlLm1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iXX0=
@@ -33,18 +33,18 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
33
33
  * @description Provides methods for working with HTTP(S)
34
34
  */
35
35
  const MODULE_NAME = 'http';
36
- const RESPONSE_TIMEOUT = 1000 * 60; // in ms
36
+ const RESPONSE_TIMEOUT = 1000 * 30; // in ms
37
37
 
38
38
  const DAFAULT_HTTP2 = false;
39
39
  const DEFAULT_HTTP_OPTIONS = {
40
40
  decompress: true,
41
- responseType: 'text',
41
+ responseType: 'json',
42
42
  timeout: {
43
- lookup: 1000,
44
- connect: 500,
45
- secureConnect: 500,
46
- socket: 100000,
47
- send: 100000,
43
+ lookup: 100,
44
+ connect: 50,
45
+ secureConnect: 50,
46
+ socket: 10000,
47
+ send: 10000,
48
48
  response: RESPONSE_TIMEOUT
49
49
  },
50
50
  http2: DAFAULT_HTTP2,
@@ -122,8 +122,8 @@ class HttpModule extends _OxygenModule.default {
122
122
 
123
123
  bootstrap();
124
124
  global.GLOBAL_AGENT.HTTP_PROXY = url;
125
- } else {
126
- global.GLOBAL_AGENT.HTTP_PROXY = false;
125
+ } else if (this._agent) {
126
+ delete this._agent;
127
127
  }
128
128
  }
129
129
  /**
@@ -152,11 +152,23 @@ class HttpModule extends _OxygenModule.default {
152
152
 
153
153
 
154
154
  async get(url, headers) {
155
+ var hd = {
156
+ Connection: 'keep-alive'
157
+ };
158
+
159
+ if (headers) {
160
+ hd = headers;
161
+
162
+ if (!headers.connection && !headers.Connection) {
163
+ hd.Connection = 'keep-alive';
164
+ }
165
+ }
166
+
155
167
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
156
168
  ...(this._userHttpOptions || {}),
157
169
  url: url,
158
170
  method: 'GET',
159
- headers: headers || {}
171
+ headers: hd
160
172
  };
161
173
  return await this._httpRequestSync(httpOpts);
162
174
  }
@@ -171,14 +183,12 @@ class HttpModule extends _OxygenModule.default {
171
183
 
172
184
 
173
185
  async post(url, data, headers) {
174
- const resolvedData = this._resolveData(data);
175
-
176
186
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
177
187
  ...(this._userHttpOptions || {}),
178
188
  url: url,
179
189
  method: 'POST',
180
- headers: headers || {},
181
- ...resolvedData
190
+ body: data,
191
+ headers: headers || {}
182
192
  };
183
193
  return await this._httpRequestSync(httpOpts);
184
194
  }
@@ -193,14 +203,12 @@ class HttpModule extends _OxygenModule.default {
193
203
 
194
204
 
195
205
  async put(url, data, headers) {
196
- const resolvedData = this._resolveData(data);
197
-
198
206
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
199
207
  ...(this._userHttpOptions || {}),
200
208
  url: url,
201
209
  method: 'PUT',
202
- headers: headers || {},
203
- ...resolvedData
210
+ body: data,
211
+ headers: headers || {}
204
212
  };
205
213
  return await this._httpRequestSync(httpOpts);
206
214
  }
@@ -215,14 +223,12 @@ class HttpModule extends _OxygenModule.default {
215
223
 
216
224
 
217
225
  async patch(url, data, headers) {
218
- const resolvedData = this._resolveData(data);
219
-
220
226
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
221
227
  ...(this._userHttpOptions || {}),
222
228
  url: url,
223
229
  method: 'PATCH',
224
- headers: headers || {},
225
- ...resolvedData
230
+ body: data,
231
+ headers: headers || {}
226
232
  };
227
233
  return await this._httpRequestSync(httpOpts);
228
234
  }
@@ -231,20 +237,16 @@ class HttpModule extends _OxygenModule.default {
231
237
  * @function delete
232
238
  * @param {String} url - URL.
233
239
  * @param {Object=} headers - HTTP headers.
234
- * @param {Object} data - Data.
235
240
  * @return {Object} Response object.
236
241
  */
237
242
 
238
243
 
239
- async delete(url, headers, data) {
240
- const resolvedData = this._resolveData(data);
241
-
244
+ async delete(url, headers) {
242
245
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
243
246
  ...(this._userHttpOptions || {}),
244
247
  url: url,
245
248
  method: 'DELETE',
246
- headers: headers || {},
247
- ...resolvedData
249
+ headers: headers || {}
248
250
  };
249
251
  return await this._httpRequestSync(httpOpts);
250
252
  }
@@ -414,23 +416,13 @@ class HttpModule extends _OxygenModule.default {
414
416
  global._lastTransactionName = name;
415
417
  }
416
418
 
417
- _resolveData(data) {
418
- const dataResolver = {};
419
-
420
- if (data instanceof Object) {
421
- _utils.default.assertCircular(data);
422
-
423
- dataResolver.json = data;
424
- } else {
425
- dataResolver.body = data;
426
- }
427
-
428
- return dataResolver;
429
- }
430
-
431
419
  async _httpRequestSync(httpOpts) {
432
420
  let result;
433
421
 
422
+ if (this._agent) {
423
+ httpOpts.agent = this._agent;
424
+ }
425
+
434
426
  try {
435
427
  result = await (0, _got.default)(httpOpts);
436
428
 
@@ -444,7 +436,7 @@ class HttpModule extends _OxygenModule.default {
444
436
  decomp.on('data', data => {
445
437
  result.body = data.toString();
446
438
 
447
- if (result.headers['content-type'].includes('application/json')) {
439
+ if (result.headers['content-type'] === 'application/json') {
448
440
  try {
449
441
  result.body = JSON.parse(result.body);
450
442
  } catch (e) {// if parsing fails just return the original string
@@ -455,13 +447,6 @@ class HttpModule extends _OxygenModule.default {
455
447
  });
456
448
  });
457
449
  })();
458
- } else {
459
- if (result.headers['content-type'].includes('application/json')) {
460
- try {
461
- result.body = JSON.parse(result.body);
462
- } catch (e) {// if parsing fails just return the original string
463
- }
464
- }
465
450
  }
466
451
  } catch (e) {
467
452
  result = e;
@@ -469,6 +454,9 @@ class HttpModule extends _OxygenModule.default {
469
454
 
470
455
 
471
456
  this._lastResponse = result;
457
+ /*if (result instanceof Error && this.options && !this.options.httpAutoThrowError) {
458
+ throw new OxError(errHelper.errorCode.HTTP_ERROR, result.message);
459
+ }*/
472
460
 
473
461
  if (result instanceof Error) {
474
462
  result = {
@@ -504,4 +492,4 @@ class HttpModule extends _OxygenModule.default {
504
492
  }
505
493
 
506
494
  exports.default = HttpModule;
507
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJzZXRPcHRpb25zIiwib3B0cyIsImRlZmxhdGVSYXciLCJzZXRQcm94eSIsInVybCIsImJvb3RzdHJhcCIsInJlcXVpcmUiLCJwYXJzZSIsInBhcnNlZFVybCIsImhvc3RuYW1lIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIkhUVFBfRVJST1IiLCJwb3J0IiwicHJvdG9jb2wiLCJnbG9iYWwiLCJHTE9CQUxfQUdFTlQiLCJIVFRQX1BST1hZIiwiZ2V0IiwiaGVhZGVycyIsImh0dHBPcHRzIiwibWV0aG9kIiwiX2h0dHBSZXF1ZXN0U3luYyIsInBvc3QiLCJkYXRhIiwicmVzb2x2ZWREYXRhIiwiX3Jlc29sdmVEYXRhIiwicHV0IiwicGF0Y2giLCJkZWxldGUiLCJnZXRSZXNwb25zZSIsImdldFJlc3BvbnNlQm9keSIsImJvZHkiLCJnZXRSZXNwb25zZUhlYWRlcnMiLCJnZXRSZXNwb25zZVVybCIsImFzc2VydFRleHQiLCJwYXR0ZXJuIiwiQVNTRVJUX0VSUk9SIiwicmVzcENvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwibW9kVXRpbHMiLCJtYXRjaFBhdHRlcm4iLCJhc3NlcnRSZXNwb25zZVRpbWUiLCJtYXhUaW1lIiwiRXJyb3IiLCJhc3NlcnRIZWFkZXIiLCJoZWFkZXJOYW1lIiwiaGVhZGVyVmFsdWVQYXR0ZXJuIiwibGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhY3R1YWxIZWFkZXJWYWx1ZSIsImFzc2VydENvb2tpZSIsImNvb2tpZU5hbWUiLCJjb29raWVWYWx1ZVBhdHRlcm4iLCJhc3NlcnRTdGF0dXMiLCJjb2RlTGlzdCIsIkFycmF5IiwiaXNBcnJheSIsInN0YXR1c0NvZGUiLCJpbmNsdWRlcyIsImFzc2VydFN0YXR1c09rIiwidHJhbnNhY3Rpb24iLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImRhdGFSZXNvbHZlciIsIk9iamVjdCIsImFzc2VydENpcmN1bGFyIiwianNvbiIsInJlc3VsdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidG9TdHJpbmciLCJlIiwiZXJyb3JNZXNzYWdlIiwibWVzc2FnZSIsInN0YXR1c01lc3NhZ2UiLCJyYXdCb2R5IiwiaHR0cFZlcnNpb24iLCJ1cGdyYWRlIiwidGltaW5ncyIsInJlcXVlc3RVcmwiLCJyZWRpcmVjdFVybHMiLCJpc0Zyb21DYWNoZSIsImlwIiwicmV0cnlDb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBYUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQU9BLE1BQU1BLFdBQVcsR0FBRyxNQUFwQjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLE9BQU8sRUFBaEMsQyxDQUFzQzs7QUFDdEMsTUFBTUMsYUFBYSxHQUFHLEtBQXRC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QUFNLENBQUNxQixFQVpOO0FBYUxDLFFBQUFBLFVBQVUsRUFBRXRCLE1BQU0sQ0FBQ3NCLFVBYmQ7QUFjTDFELFFBQUFBLElBQUksRUFBRW9DLE1BQU0sQ0FBQ3BDO0FBZFIsT0FBVDtBQWdCSDs7QUFFRCxXQUFPb0MsTUFBUDtBQUNIOztBQTFaZ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBodHRwXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggSFRUUChTKVxyXG4gKi9cclxuaW1wb3J0IGdvdCBmcm9tICdnb3QnO1xyXG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnaHR0cCc7XHJcbmNvbnN0IFJFU1BPTlNFX1RJTUVPVVQgPSAxMDAwICogNjA7ICAgLy8gaW4gbXNcclxuY29uc3QgREFGQVVMVF9IVFRQMiA9IGZhbHNlO1xyXG5jb25zdCBERUZBVUxUX0hUVFBfT1BUSU9OUyA9IHtcclxuICAgIGRlY29tcHJlc3M6IHRydWUsXHJcbiAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgIHRpbWVvdXQ6IHtcclxuICAgICAgICBsb29rdXA6IDEwMDAsXHJcbiAgICAgICAgY29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNlY3VyZUNvbm5lY3Q6IDUwMCxcclxuICAgICAgICBzb2NrZXQ6IDEwMDAwMCxcclxuICAgICAgICBzZW5kOiAxMDAwMDAsXHJcbiAgICAgICAgcmVzcG9uc2U6IFJFU1BPTlNFX1RJTUVPVVRcclxuICAgIH0sXHJcbiAgICBodHRwMjogREFGQVVMVF9IVFRQMixcclxuICAgIGh0dHBzOiB7XHJcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIGRuc0xvb2t1cElwVmVyc2lvbjogJ2lwdjQnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwTW9kdWxlIGV4dGVuZHMgT3h5Z2VuTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMuX2Fsd2F5c0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzb2x2ZURhdGEoZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFSZXNvbHZlciA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBtb2RVdGlscy5hc3NlcnRDaXJjdWxhcihkYXRhKTtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmpzb24gPSBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhUmVzb2x2ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cykge1xyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdvdChodHRwT3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29tcCA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzWydjb250ZW50LXR5cGUnXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzWydjb250ZW50LXR5cGUnXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzdG9yZSBsYXN0IHJlc3BvbnNlIHRvIGFsbG93IGZ1cnRoZXIgYXNzZXJ0aW9ucyBhbmQgdmFsaWRhdGlvbnNcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c0NvZGUgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c01lc3NhZ2UgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcmF3Qm9keTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnJhd0JvZHkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLmJvZHkgOiBudWxsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufSJdfQ==
495
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJzZXRPcHRpb25zIiwib3B0cyIsImRlZmxhdGVSYXciLCJzZXRQcm94eSIsInVybCIsImJvb3RzdHJhcCIsInJlcXVpcmUiLCJwYXJzZSIsInBhcnNlZFVybCIsImhvc3RuYW1lIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIkhUVFBfRVJST1IiLCJwb3J0IiwicHJvdG9jb2wiLCJnbG9iYWwiLCJHTE9CQUxfQUdFTlQiLCJIVFRQX1BST1hZIiwiX2FnZW50IiwiZ2V0IiwiaGVhZGVycyIsImhkIiwiQ29ubmVjdGlvbiIsImNvbm5lY3Rpb24iLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsImJvZHkiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiZ2V0UmVzcG9uc2VIZWFkZXJzIiwiZ2V0UmVzcG9uc2VVcmwiLCJhc3NlcnRUZXh0IiwicGF0dGVybiIsIkFTU0VSVF9FUlJPUiIsInJlc3BDb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1vZFV0aWxzIiwibWF0Y2hQYXR0ZXJuIiwiYXNzZXJ0UmVzcG9uc2VUaW1lIiwibWF4VGltZSIsIkVycm9yIiwiYXNzZXJ0SGVhZGVyIiwiaGVhZGVyTmFtZSIsImhlYWRlclZhbHVlUGF0dGVybiIsImxlbmd0aCIsInRvTG93ZXJDYXNlIiwiYWN0dWFsSGVhZGVyVmFsdWUiLCJhc3NlcnRDb29raWUiLCJjb29raWVOYW1lIiwiY29va2llVmFsdWVQYXR0ZXJuIiwiYXNzZXJ0U3RhdHVzIiwiY29kZUxpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJzdGF0dXNDb2RlIiwiaW5jbHVkZXMiLCJhc3NlcnRTdGF0dXNPayIsInRyYW5zYWN0aW9uIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJyZXN1bHQiLCJhZ2VudCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidG9TdHJpbmciLCJlIiwiZXJyb3JNZXNzYWdlIiwibWVzc2FnZSIsInN0YXR1c01lc3NhZ2UiLCJyYXdCb2R5IiwiaHR0cFZlcnNpb24iLCJ1cGdyYWRlIiwidGltaW5ncyIsInJlcXVlc3RVcmwiLCJyZWRpcmVjdFVybHMiLCJpc0Zyb21DYWNoZSIsImlwIiwicmV0cnlDb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBYUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQU9BLE1BQU1BLFdBQVcsR0FBRyxNQUFwQjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLE9BQU8sRUFBaEMsQyxDQUFzQzs7QUFDdEMsTUFBTUMsYUFBYSxHQUFHLEtBQXRCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUc7QUFDekJD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TUFBTSxDQUFDZ0IsV0FEZjtBQUVMOUQsUUFBQUEsT0FBTyxFQUFFOEMsTUFBTSxDQUFDOUMsT0FGWDtBQUdMK0QsUUFBQUEsT0FBTyxFQUFFakIsTUFBTSxDQUFDaUIsT0FIWDtBQUlMaEYsUUFBQUEsR0FBRyxFQUFFK0QsTUFBTSxDQUFDL0QsR0FKUDtBQUtMc0IsUUFBQUEsTUFBTSxFQUFFeUMsTUFBTSxDQUFDekMsTUFMVjtBQU1Mb0MsUUFBQUEsVUFBVSxFQUFFSyxNQUFNLENBQUNMLFVBTmQ7QUFPTG1CLFFBQUFBLGFBQWEsRUFBRWQsTUFBTSxDQUFDYyxhQVBqQjtBQVFMSSxRQUFBQSxPQUFPLEVBQUVsQixNQUFNLENBQUNrQixPQVJYO0FBU0xDLFFBQUFBLFVBQVUsRUFBRW5CLE1BQU0sQ0FBQ21CLFVBVGQ7QUFVTEMsUUFBQUEsWUFBWSxFQUFFcEIsTUFBTSxDQUFDb0IsWUFWaEI7QUFXTEMsUUFBQUEsV0FBVyxFQUFFckIsTUFBTSxDQUFDcUIsV0FYZjtBQVlMQyxRQUFBQSxFQUFFLEVBQUV0QixNQUFNLENBQUNzQixFQVpOO0FBYUxDLFFBQUFBLFVBQVUsRUFBRXZCLE1BQU0sQ0FBQ3VCLFVBYmQ7QUFjTDVELFFBQUFBLElBQUksRUFBRXFDLE1BQU0sQ0FBQ3JDO0FBZFIsT0FBVDtBQWdCSDs7QUFFRCxXQUFPcUMsTUFBUDtBQUNIOztBQTdZZ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBodHRwXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggSFRUUChTKVxyXG4gKi9cclxuaW1wb3J0IGdvdCBmcm9tICdnb3QnO1xyXG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnaHR0cCc7XHJcbmNvbnN0IFJFU1BPTlNFX1RJTUVPVVQgPSAxMDAwICogMzA7ICAgLy8gaW4gbXNcclxuY29uc3QgREFGQVVMVF9IVFRQMiA9IGZhbHNlO1xyXG5jb25zdCBERUZBVUxUX0hUVFBfT1BUSU9OUyA9IHtcclxuICAgIGRlY29tcHJlc3M6IHRydWUsXHJcbiAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgIHRpbWVvdXQ6IHtcclxuICAgICAgICBsb29rdXA6IDEwMCxcclxuICAgICAgICBjb25uZWN0OiA1MCxcclxuICAgICAgICBzZWN1cmVDb25uZWN0OiA1MCxcclxuICAgICAgICBzb2NrZXQ6IDEwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwLFxyXG4gICAgICAgIHJlc3BvbnNlOiBSRVNQT05TRV9USU1FT1VUXHJcbiAgICB9LFxyXG4gICAgaHR0cDI6IERBRkFVTFRfSFRUUDIsXHJcbiAgICBodHRwczoge1xyXG4gICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICBkbnNMb29rdXBJcFZlcnNpb246ICdpcHY0J1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSHR0cE1vZHVsZSBleHRlbmRzIE94eWdlbk1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLl9hbHdheXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9iYXNlVXJsID0gbnVsbDtcclxuICAgICAgICB0aGlzLl91c2VySHR0cE9wdGlvbnMgPSB7fTtcclxuICAgICAgICAvLyBwcmUtaW5pdGlhbGl6ZSB0aGUgbW9kdWxlXHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIEBzdW1tYXJ5IEdldHMgbW9kdWxlIG5hbWVcclxuICAgICAqIEBmdW5jdGlvbiBuYW1lXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IENvbnN0YW50IHZhbHVlIFwiaHR0cFwiLlxyXG4gICAgICovXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHVzZXIgZGVmaW5lZCBIVFRQIG9wdGlvbnMgKHN1Y2ggYXMgcHJveHksIGRlY29tcHJlc3MgYW5kIGV0Yy4pXHJcbiAgICAgKiBAZnVuY3Rpb24gc2V0T3B0aW9uc1xyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBIVFRQIHJlcXVlc3Qgb3B0aW9ucyBvYmplY3QsIHNlZSBbUmVxdWVzdCBPcHRpb25zXShodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2dvdC9ibG9iL21haW4vZG9jdW1lbnRhdGlvbi8yLW9wdGlvbnMubWQpLiBcclxuICAgICAqIEluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIGxpc3RlZCBpbiB0aGUgbGlua2VkIGRvY3VtZW50LCAnZGVmbGF0ZVJhdycgb3B0aW9uIGNhbiBiZSB1c2VkIHdoZW4gc2VydmVyIHJldHVybnMgRGVmbGF0ZS1jb21wcmVzc2VkIHN0cmVhbSB3aXRob3V0IGhlYWRlcnMuXHJcbiAgICAgKi9cclxuICAgIHNldE9wdGlvbnMob3B0cykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucyA9IG9wdHM7XHJcbiAgICAgICAgaWYgKG9wdHMuZGVmbGF0ZVJhdykge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VySHR0cE9wdGlvbnMuZGVjb21wcmVzcyA9IGZhbHNlOyAgICAgLy8gZGVjb21wcmVzcz10cnVlIGluIGRlZmF1bHQgb3B0aW9ucyBzbyB3ZSBvdmVycmlkZSBpdFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgcHJveHkgdXJsIHRvIGJlIHVzZWQgZm9yIGNvbm5lY3Rpb25zIHdpdGggdGhlIHNlcnZpY2UuXHJcbiAgICAgKiBAZnVuY3Rpb24gc2V0UHJveHlcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBQcm94eSBzZXJ2ZXIgVVJMLiBOb3QgcGFzc2luZyB0aGlzIGFyZ3VtZW50IHdpbGwgcmVzZXQgdGhlIHByb3h5IHNldHRpbmdzLlxyXG4gICAgICovXHJcbiAgICBzZXRQcm94eSh1cmwpIHtcclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgICAgIGJvb3RzdHJhcFxyXG4gICAgICAgICAgICB9ID0gcmVxdWlyZSgnZ2xvYmFsLWFnZW50Jyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB7IHBhcnNlIH0gPSByZXF1aXJlKCd1cmwnKTtcclxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gcGFyc2UodXJsKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLmhvc3RuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkhUVFBfRVJST1IsICdIb3N0bmFtZSBpbiB1bmRlZmluZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5wb3J0KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkhUVFBfRVJST1IsICdQb3J0IGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnByb3RvY29sKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkhUVFBfRVJST1IsICdQcm90b2NvbCBpbiB1bmRlZmluZWQnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYm9vdHN0cmFwKCk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IHVybDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2FnZW50KSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9hZ2VudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIEdFVFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiAvLyBCYXNpYyB1c2FnZSBleGFtcGxlOlxyXG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoXHJcbiAgICAgKiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9veHlnZW5ocS9veHlnZW4taWRlL3JlbGVhc2VzJywgXHJcbiAgICAgKiB7XHJcbiAgICAgKiAgICdBY2NlcHQtRW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZScsXHJcbiAgICAgKiAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQ7IHJ2Ojg2LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvODYuMCdcclxuICAgICAqIH0pO1xyXG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgKlxyXG4gICAgICogLy8gSWYgc2VydmVyIHJldHVybnMgRGVmbGF0ZS1jb21wcmVzc2VkIHN0cmVhbSB3aXRob3V0IGhlYWRlcnMsIGBkZWZsYXRlUmF3YCBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIHRoZSBjb250ZW50LlxyXG4gICAgICogaHR0cC5zZXRPcHRpb25zKHtcclxuICAgICAqICAgZGVmbGF0ZVJhdzogdHJ1ZVxyXG4gICAgICogfSk7XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldCgnaHR0cHM6Ly9GT08uQkFSJyk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0KHVybCwgaGVhZGVycykge1xyXG5cclxuICAgICAgICB2YXIgaGQ9eyBDb25uZWN0aW9uOiAna2VlcC1hbGl2ZSd9O1xyXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIGhkID0gaGVhZGVycztcclxuICAgICAgICAgICAgaWYgKCFoZWFkZXJzLmNvbm5lY3Rpb24gJiYgIWhlYWRlcnMuQ29ubmVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGQuQ29ubmVjdGlvbiA9ICdrZWVwLWFsaXZlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBPU1RcclxuICAgICAqIEBmdW5jdGlvbiBwb3N0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBvc3QodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgYm9keTogZGF0YSxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBVVFxyXG4gICAgICogQGZ1bmN0aW9uIHB1dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwdXQodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUEFUQ0hcclxuICAgICAqIEBmdW5jdGlvbiBwYXRjaFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwYXRjaCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgYm9keTogZGF0YSxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIERFTEVURVxyXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkZWxldGUodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBvYmplY3RcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZVxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2UgYm9keVxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlQm9keVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBib2R5LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZUJvZHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZSAmJiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA/IHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgaGVhZGVyc1xyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlSGVhZGVyc1xyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZUhlYWRlcnMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgVVJMXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VVcmxcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgVVJMLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS51cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRUZXh0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiAtIFBhdHRlcm4gdG8gYXNzZXJ0LlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRUZXh0KHBhdHRlcm4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdSZXNwb25zZSBib2R5IGlzIGVtcHR5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3BDb250ZW50ID0gdHlwZW9mIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID09PSAnc3RyaW5nJyA/IHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5IDogSlNPTi5zdHJpbmdpZnkodGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKHJlc3BDb250ZW50LCBwYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgcmVzcG9uc2UgY29udGVudCB0byBtYXRjaDogXCIke3BhdHRlcm59XCIgYnV0IGdvdDogXCIke3Jlc3BDb250ZW50fVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHJlc3BvbnNlIHRpbWVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZVRpbWVcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lIC0gTWF4aW11bSByZXNwb25zZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0UmVzcG9uc2VUaW1lKG1heFRpbWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgaGVhZGVyIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRIZWFkZXJcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJOYW1lIC0gQSBIVFRQIGhlYWRlciBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBoZWFkZXJWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGhlYWRlciB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVQYXR0ZXJuID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghaGVhZGVyTmFtZSB8fCB0eXBlb2YgaGVhZGVyTmFtZSAhPT0gJ3N0cmluZycgfHwgaGVhZGVyTmFtZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlYWRlck5hbWUgPSBoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xyXG4gICAgICAgIGlmICghaGVhZGVyc1toZWFkZXJOYW1lXSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgJ0V4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHRvIGJlIHByZXNlbnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVhZGVyVmFsdWVQYXR0ZXJuICYmIHR5cGVvZiBoZWFkZXJWYWx1ZVBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbEhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFtb2RVdGlscy5tYXRjaFBhdHRlcm4oYWN0dWFsSGVhZGVyVmFsdWUsIGhlYWRlclZhbHVlUGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdmFsdWUgdG8gbWF0Y2g6IFwiJHtoZWFkZXJWYWx1ZVBhdHRlcm59XCIgYnV0IGdvdDogXCIke2FjdHVhbEhlYWRlclZhbHVlfVwiYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBjb29raWUgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydENvb2tpZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvb2tpZU5hbWUgLSBBIEhUVFAgY29va2llIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNvb2tpZVZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgY29va2llIHZhbHVlIHBhdHRlcm4uXHJcbiAgICAgKi9cclxuICAgIGFzc2VydENvb2tpZShjb29raWVOYW1lLCBjb29raWVWYWx1ZVBhdHRlcm4pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHRoZSBsYXN0IEhUVFAgcmVzcG9uc2UncyBzdGF0dXMgY29kZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c1xyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8QXJyYXl9IGNvZGVMaXN0IC0gQSBzaW5nbGUgc3RhdHVzIGNvZGUgb3IgYSBsaXN0IG9mIGNvZGVzLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRTdGF0dXMoY29kZUxpc3QpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSB8fCAhY29kZUxpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB3ZSBnb3QgYSBzaW5nbGUgdmFsdWUsIHRoZW4gY29udmVydCBpdCB0byBhbiBhcnJheVxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2RlTGlzdCkpIHtcclxuICAgICAgICAgICAgY29kZUxpc3QgPSBbY29kZUxpc3RdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gdGhpcy5fbGFzdFJlc3BvbnNlLnN0YXR1c0NvZGU7XHJcbiAgICAgICAgaWYgKCFjb2RlTGlzdC5pbmNsdWRlcyhzdGF0dXNDb2RlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgc3RhdHVzIHRvIGJlOiBcIiR7Y29kZUxpc3R9XCIgYnV0IGdvdDogXCIke3N0YXR1c0NvZGV9XCJgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgSFRUUCAyMDAgT0sgc3RhdHVzXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzT2tcclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0U3RhdHVzKDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmVcclxuICAgICAqICAgICAgICAgICAgICB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpIHtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fYWdlbnQpIHtcclxuICAgICAgICAgICAgaHR0cE9wdHMuYWdlbnQgPSB0aGlzLl9hZ2VudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdvdChodHRwT3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29tcCA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHN0b3JlIGxhc3QgcmVzcG9uc2UgdG8gYWxsb3cgZnVydGhlciBhc3NlcnRpb25zIGFuZCB2YWxpZGF0aW9uc1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IHJlc3VsdDtcclxuXHJcbiAgICAgICAgLyppZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgJiYgdGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuaHR0cEF1dG9UaHJvd0Vycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgcmVzdWx0Lm1lc3NhZ2UpO1xyXG4gICAgICAgIH0qL1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5oZWFkZXJzIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNDb2RlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNNZXNzYWdlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHJhd0JvZHk6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5yYXdCb2R5IDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5ib2R5IDogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGh0dHBWZXJzaW9uOiByZXN1bHQuaHR0cFZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQuaGVhZGVycyxcclxuICAgICAgICAgICAgICAgIHVwZ3JhZGU6IHJlc3VsdC51cGdyYWRlLFxyXG4gICAgICAgICAgICAgICAgdXJsOiByZXN1bHQudXJsLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiByZXN1bHQubWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1c0NvZGUsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQuc3RhdHVzTWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHRpbWluZ3M6IHJlc3VsdC50aW1pbmdzLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdFVybDogcmVzdWx0LnJlcXVlc3RVcmwsXHJcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVybHM6IHJlc3VsdC5yZWRpcmVjdFVybHMsXHJcbiAgICAgICAgICAgICAgICBpc0Zyb21DYWNoZTogcmVzdWx0LmlzRnJvbUNhY2hlLFxyXG4gICAgICAgICAgICAgICAgaXA6IHJlc3VsdC5pcCxcclxuICAgICAgICAgICAgICAgIHJldHJ5Q291bnQ6IHJlc3VsdC5yZXRyeUNvdW50LFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LmJvZHlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuIl19