tedious-fabric 1.0.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 (304) hide show
  1. package/CLAUDE.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +67 -0
  4. package/appveyor.yml +67 -0
  5. package/eslint.config.mjs +314 -0
  6. package/lib/all-headers.d.ts +2 -0
  7. package/lib/all-headers.js +24 -0
  8. package/lib/all-headers.js.map +1 -0
  9. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +82 -0
  10. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -0
  11. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +55 -0
  12. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -0
  13. package/lib/always-encrypted/cek-entry.d.ts +11 -0
  14. package/lib/always-encrypted/cek-entry.js +42 -0
  15. package/lib/always-encrypted/cek-entry.js.map +1 -0
  16. package/lib/always-encrypted/get-parameter-encryption-metadata.js +90 -0
  17. package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -0
  18. package/lib/always-encrypted/key-crypto.js +94 -0
  19. package/lib/always-encrypted/key-crypto.js.map +1 -0
  20. package/lib/always-encrypted/keystore-provider-azure-key-vault.d.ts +21 -0
  21. package/lib/always-encrypted/keystore-provider-azure-key-vault.js +247 -0
  22. package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -0
  23. package/lib/always-encrypted/symmetric-key-cache.js +36 -0
  24. package/lib/always-encrypted/symmetric-key-cache.js.map +1 -0
  25. package/lib/always-encrypted/symmetric-key.js +25 -0
  26. package/lib/always-encrypted/symmetric-key.js.map +1 -0
  27. package/lib/always-encrypted/types.d.ts +73 -0
  28. package/lib/always-encrypted/types.js +61 -0
  29. package/lib/always-encrypted/types.js.map +1 -0
  30. package/lib/always-encrypted/utils.js +23 -0
  31. package/lib/always-encrypted/utils.js.map +1 -0
  32. package/lib/bulk-load-payload.d.ts +8 -0
  33. package/lib/bulk-load-payload.js +23 -0
  34. package/lib/bulk-load-payload.js.map +1 -0
  35. package/lib/bulk-load.d.ts +275 -0
  36. package/lib/bulk-load.js +515 -0
  37. package/lib/bulk-load.js.map +1 -0
  38. package/lib/collation.d.ts +28 -0
  39. package/lib/collation.js +348 -0
  40. package/lib/collation.js.map +1 -0
  41. package/lib/connection.d.ts +1309 -0
  42. package/lib/connection.js +2732 -0
  43. package/lib/connection.js.map +1 -0
  44. package/lib/connector.d.ts +18 -0
  45. package/lib/connector.js +142 -0
  46. package/lib/connector.js.map +1 -0
  47. package/lib/data-type.d.ts +554 -0
  48. package/lib/data-type.js +428 -0
  49. package/lib/data-type.js.map +1 -0
  50. package/lib/data-types/bigint.d.ts +3 -0
  51. package/lib/data-types/bigint.js +53 -0
  52. package/lib/data-types/bigint.js.map +1 -0
  53. package/lib/data-types/binary.d.ts +5 -0
  54. package/lib/data-types/binary.js +67 -0
  55. package/lib/data-types/binary.js.map +1 -0
  56. package/lib/data-types/bit.d.ts +3 -0
  57. package/lib/data-types/bit.js +46 -0
  58. package/lib/data-types/bit.js.map +1 -0
  59. package/lib/data-types/bitn.d.ts +3 -0
  60. package/lib/data-types/bitn.js +29 -0
  61. package/lib/data-types/bitn.js.map +1 -0
  62. package/lib/data-types/char.d.ts +5 -0
  63. package/lib/data-types/char.js +86 -0
  64. package/lib/data-types/char.js.map +1 -0
  65. package/lib/data-types/date.d.ts +3 -0
  66. package/lib/data-types/date.js +72 -0
  67. package/lib/data-types/date.js.map +1 -0
  68. package/lib/data-types/datetime.d.ts +3 -0
  69. package/lib/data-types/datetime.js +93 -0
  70. package/lib/data-types/datetime.js.map +1 -0
  71. package/lib/data-types/datetime2.d.ts +5 -0
  72. package/lib/data-types/datetime2.js +118 -0
  73. package/lib/data-types/datetime2.js.map +1 -0
  74. package/lib/data-types/datetimen.d.ts +3 -0
  75. package/lib/data-types/datetimen.js +29 -0
  76. package/lib/data-types/datetimen.js.map +1 -0
  77. package/lib/data-types/datetimeoffset.d.ts +5 -0
  78. package/lib/data-types/datetimeoffset.js +111 -0
  79. package/lib/data-types/datetimeoffset.js.map +1 -0
  80. package/lib/data-types/decimal.d.ts +6 -0
  81. package/lib/data-types/decimal.js +107 -0
  82. package/lib/data-types/decimal.js.map +1 -0
  83. package/lib/data-types/decimaln.d.ts +3 -0
  84. package/lib/data-types/decimaln.js +29 -0
  85. package/lib/data-types/decimaln.js.map +1 -0
  86. package/lib/data-types/float.d.ts +3 -0
  87. package/lib/data-types/float.js +47 -0
  88. package/lib/data-types/float.js.map +1 -0
  89. package/lib/data-types/floatn.d.ts +3 -0
  90. package/lib/data-types/floatn.js +29 -0
  91. package/lib/data-types/floatn.js.map +1 -0
  92. package/lib/data-types/image.d.ts +3 -0
  93. package/lib/data-types/image.js +56 -0
  94. package/lib/data-types/image.js.map +1 -0
  95. package/lib/data-types/int.d.ts +3 -0
  96. package/lib/data-types/int.js +53 -0
  97. package/lib/data-types/int.js.map +1 -0
  98. package/lib/data-types/intn.d.ts +3 -0
  99. package/lib/data-types/intn.js +29 -0
  100. package/lib/data-types/intn.js.map +1 -0
  101. package/lib/data-types/money.d.ts +3 -0
  102. package/lib/data-types/money.js +59 -0
  103. package/lib/data-types/money.js.map +1 -0
  104. package/lib/data-types/moneyn.d.ts +3 -0
  105. package/lib/data-types/moneyn.js +29 -0
  106. package/lib/data-types/moneyn.js.map +1 -0
  107. package/lib/data-types/nchar.d.ts +5 -0
  108. package/lib/data-types/nchar.js +100 -0
  109. package/lib/data-types/nchar.js.map +1 -0
  110. package/lib/data-types/ntext.d.ts +3 -0
  111. package/lib/data-types/ntext.js +60 -0
  112. package/lib/data-types/ntext.js.map +1 -0
  113. package/lib/data-types/null.d.ts +3 -0
  114. package/lib/data-types/null.js +29 -0
  115. package/lib/data-types/null.js.map +1 -0
  116. package/lib/data-types/numeric.d.ts +6 -0
  117. package/lib/data-types/numeric.js +106 -0
  118. package/lib/data-types/numeric.js.map +1 -0
  119. package/lib/data-types/numericn.d.ts +3 -0
  120. package/lib/data-types/numericn.js +29 -0
  121. package/lib/data-types/numericn.js.map +1 -0
  122. package/lib/data-types/nvarchar.d.ts +5 -0
  123. package/lib/data-types/nvarchar.js +133 -0
  124. package/lib/data-types/nvarchar.js.map +1 -0
  125. package/lib/data-types/real.d.ts +3 -0
  126. package/lib/data-types/real.js +48 -0
  127. package/lib/data-types/real.js.map +1 -0
  128. package/lib/data-types/smalldatetime.d.ts +3 -0
  129. package/lib/data-types/smalldatetime.js +83 -0
  130. package/lib/data-types/smalldatetime.js.map +1 -0
  131. package/lib/data-types/smallint.d.ts +3 -0
  132. package/lib/data-types/smallint.js +53 -0
  133. package/lib/data-types/smallint.js.map +1 -0
  134. package/lib/data-types/smallmoney.d.ts +3 -0
  135. package/lib/data-types/smallmoney.js +51 -0
  136. package/lib/data-types/smallmoney.js.map +1 -0
  137. package/lib/data-types/sql-variant.d.ts +3 -0
  138. package/lib/data-types/sql-variant.js +29 -0
  139. package/lib/data-types/sql-variant.js.map +1 -0
  140. package/lib/data-types/text.d.ts +3 -0
  141. package/lib/data-types/text.js +69 -0
  142. package/lib/data-types/text.js.map +1 -0
  143. package/lib/data-types/time.d.ts +3 -0
  144. package/lib/data-types/time.js +96 -0
  145. package/lib/data-types/time.js.map +1 -0
  146. package/lib/data-types/tinyint.d.ts +3 -0
  147. package/lib/data-types/tinyint.js +53 -0
  148. package/lib/data-types/tinyint.js.map +1 -0
  149. package/lib/data-types/tvp.d.ts +3 -0
  150. package/lib/data-types/tvp.js +117 -0
  151. package/lib/data-types/tvp.js.map +1 -0
  152. package/lib/data-types/udt.d.ts +3 -0
  153. package/lib/data-types/udt.js +29 -0
  154. package/lib/data-types/udt.js.map +1 -0
  155. package/lib/data-types/uniqueidentifier.d.ts +3 -0
  156. package/lib/data-types/uniqueidentifier.js +50 -0
  157. package/lib/data-types/uniqueidentifier.js.map +1 -0
  158. package/lib/data-types/varbinary.d.ts +5 -0
  159. package/lib/data-types/varbinary.js +119 -0
  160. package/lib/data-types/varbinary.js.map +1 -0
  161. package/lib/data-types/varchar.d.ts +5 -0
  162. package/lib/data-types/varchar.js +112 -0
  163. package/lib/data-types/varchar.js.map +1 -0
  164. package/lib/data-types/xml.d.ts +3 -0
  165. package/lib/data-types/xml.js +29 -0
  166. package/lib/data-types/xml.js.map +1 -0
  167. package/lib/debug.d.ts +25 -0
  168. package/lib/debug.js +66 -0
  169. package/lib/debug.js.map +1 -0
  170. package/lib/errors.d.ts +17 -0
  171. package/lib/errors.js +23 -0
  172. package/lib/errors.js.map +1 -0
  173. package/lib/guid-parser.d.ts +3 -0
  174. package/lib/guid-parser.js +30 -0
  175. package/lib/guid-parser.js.map +1 -0
  176. package/lib/incoming-message-stream.d.ts +19 -0
  177. package/lib/incoming-message-stream.js +97 -0
  178. package/lib/incoming-message-stream.js.map +1 -0
  179. package/lib/instance-lookup.d.ts +13 -0
  180. package/lib/instance-lookup.js +91 -0
  181. package/lib/instance-lookup.js.map +1 -0
  182. package/lib/library.d.ts +1 -0
  183. package/lib/library.js +8 -0
  184. package/lib/library.js.map +1 -0
  185. package/lib/login7-payload.d.ts +51 -0
  186. package/lib/login7-payload.js +408 -0
  187. package/lib/login7-payload.js.map +1 -0
  188. package/lib/message-io.d.ts +28 -0
  189. package/lib/message-io.js +152 -0
  190. package/lib/message-io.js.map +1 -0
  191. package/lib/message.d.ts +11 -0
  192. package/lib/message.js +21 -0
  193. package/lib/message.js.map +1 -0
  194. package/lib/metadata-parser.d.ts +48 -0
  195. package/lib/metadata-parser.js +380 -0
  196. package/lib/metadata-parser.js.map +1 -0
  197. package/lib/ntlm-payload.d.ts +23 -0
  198. package/lib/ntlm-payload.js +135 -0
  199. package/lib/ntlm-payload.js.map +1 -0
  200. package/lib/ntlm.d.ts +4 -0
  201. package/lib/ntlm.js +72 -0
  202. package/lib/ntlm.js.map +1 -0
  203. package/lib/outgoing-message-stream.d.ts +15 -0
  204. package/lib/outgoing-message-stream.js +81 -0
  205. package/lib/outgoing-message-stream.js.map +1 -0
  206. package/lib/packet.d.ts +33 -0
  207. package/lib/packet.js +191 -0
  208. package/lib/packet.js.map +1 -0
  209. package/lib/prelogin-payload.d.ts +67 -0
  210. package/lib/prelogin-payload.js +228 -0
  211. package/lib/prelogin-payload.js.map +1 -0
  212. package/lib/request.d.ts +370 -0
  213. package/lib/request.js +387 -0
  214. package/lib/request.js.map +1 -0
  215. package/lib/rpcrequest-payload.d.ts +16 -0
  216. package/lib/rpcrequest-payload.js +109 -0
  217. package/lib/rpcrequest-payload.js.map +1 -0
  218. package/lib/sender.d.ts +5 -0
  219. package/lib/sender.js +78 -0
  220. package/lib/sender.js.map +1 -0
  221. package/lib/special-stored-procedure.d.ts +18 -0
  222. package/lib/special-stored-procedure.js +26 -0
  223. package/lib/special-stored-procedure.js.map +1 -0
  224. package/lib/sqlbatch-payload.d.ts +13 -0
  225. package/lib/sqlbatch-payload.js +34 -0
  226. package/lib/sqlbatch-payload.js.map +1 -0
  227. package/lib/tds-versions.d.ts +6 -0
  228. package/lib/tds-versions.js +19 -0
  229. package/lib/tds-versions.js.map +1 -0
  230. package/lib/tedious.d.ts +13 -0
  231. package/lib/tedious.js +73 -0
  232. package/lib/tedious.js.map +1 -0
  233. package/lib/token/colmetadata-token-parser.d.ts +12 -0
  234. package/lib/token/colmetadata-token-parser.js +124 -0
  235. package/lib/token/colmetadata-token-parser.js.map +1 -0
  236. package/lib/token/done-token-parser.d.ts +6 -0
  237. package/lib/token/done-token-parser.js +76 -0
  238. package/lib/token/done-token-parser.js.map +1 -0
  239. package/lib/token/env-change-token-parser.d.ts +5 -0
  240. package/lib/token/env-change-token-parser.js +190 -0
  241. package/lib/token/env-change-token-parser.js.map +1 -0
  242. package/lib/token/feature-ext-ack-parser.d.ts +5 -0
  243. package/lib/token/feature-ext-ack-parser.js +52 -0
  244. package/lib/token/feature-ext-ack-parser.js.map +1 -0
  245. package/lib/token/fedauth-info-parser.d.ts +5 -0
  246. package/lib/token/fedauth-info-parser.js +62 -0
  247. package/lib/token/fedauth-info-parser.js.map +1 -0
  248. package/lib/token/handler.d.ts +136 -0
  249. package/lib/token/handler.js +445 -0
  250. package/lib/token/handler.js.map +1 -0
  251. package/lib/token/helpers.d.ts +28 -0
  252. package/lib/token/helpers.js +205 -0
  253. package/lib/token/helpers.js.map +1 -0
  254. package/lib/token/infoerror-token-parser.d.ts +5 -0
  255. package/lib/token/infoerror-token-parser.js +80 -0
  256. package/lib/token/infoerror-token-parser.js.map +1 -0
  257. package/lib/token/loginack-token-parser.d.ts +5 -0
  258. package/lib/token/loginack-token-parser.js +75 -0
  259. package/lib/token/loginack-token-parser.js.map +1 -0
  260. package/lib/token/nbcrow-token-parser.d.ts +4 -0
  261. package/lib/token/nbcrow-token-parser.js +103 -0
  262. package/lib/token/nbcrow-token-parser.js.map +1 -0
  263. package/lib/token/order-token-parser.d.ts +5 -0
  264. package/lib/token/order-token-parser.js +34 -0
  265. package/lib/token/order-token-parser.js.map +1 -0
  266. package/lib/token/returnstatus-token-parser.d.ts +5 -0
  267. package/lib/token/returnstatus-token-parser.js +21 -0
  268. package/lib/token/returnstatus-token-parser.js.map +1 -0
  269. package/lib/token/returnvalue-token-parser.d.ts +4 -0
  270. package/lib/token/returnvalue-token-parser.js +93 -0
  271. package/lib/token/returnvalue-token-parser.js.map +1 -0
  272. package/lib/token/row-token-parser.d.ts +4 -0
  273. package/lib/token/row-token-parser.js +76 -0
  274. package/lib/token/row-token-parser.js.map +1 -0
  275. package/lib/token/sspi-token-parser.d.ts +5 -0
  276. package/lib/token/sspi-token-parser.js +42 -0
  277. package/lib/token/sspi-token-parser.js.map +1 -0
  278. package/lib/token/stream-parser.d.ts +34 -0
  279. package/lib/token/stream-parser.js +341 -0
  280. package/lib/token/stream-parser.js.map +1 -0
  281. package/lib/token/token-stream-parser.d.ts +15 -0
  282. package/lib/token/token-stream-parser.js +36 -0
  283. package/lib/token/token-stream-parser.js.map +1 -0
  284. package/lib/token/token.d.ts +312 -0
  285. package/lib/token/token.js +328 -0
  286. package/lib/token/token.js.map +1 -0
  287. package/lib/tracking-buffer/writable-tracking-buffer.d.ts +47 -0
  288. package/lib/tracking-buffer/writable-tracking-buffer.js +249 -0
  289. package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -0
  290. package/lib/transaction.d.ts +39 -0
  291. package/lib/transaction.js +137 -0
  292. package/lib/transaction.js.map +1 -0
  293. package/lib/transient-error-lookup.d.ts +3 -0
  294. package/lib/transient-error-lookup.js +19 -0
  295. package/lib/transient-error-lookup.js.map +1 -0
  296. package/lib/value-parser.d.ts +7 -0
  297. package/lib/value-parser.js +813 -0
  298. package/lib/value-parser.js.map +1 -0
  299. package/package.json +145 -0
  300. package/pull_request_template.md +9 -0
  301. package/tsconfig.build-types.json +15 -0
  302. package/tsconfig.json +30 -0
  303. package/types/js-md4.d.ts +7 -0
  304. package/types/native-duplexpair.d.ts +12 -0
@@ -0,0 +1,813 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isPLPStream = isPLPStream;
7
+ exports.readPLPStream = readPLPStream;
8
+ exports.readValue = readValue;
9
+ var _metadataParser = require("./metadata-parser");
10
+ var _dataType = require("./data-type");
11
+ var _iconvLite = _interopRequireDefault(require("iconv-lite"));
12
+ var _sprintfJs = require("sprintf-js");
13
+ var _guidParser = require("./guid-parser");
14
+ var _helpers = require("./token/helpers");
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ const NULL = (1 << 16) - 1;
17
+ const MAX = (1 << 16) - 1;
18
+ const THREE_AND_A_THIRD = 3 + 1 / 3;
19
+ const MONEY_DIVISOR = 10000;
20
+ const PLP_NULL = 0xFFFFFFFFFFFFFFFFn;
21
+ const UNKNOWN_PLP_LEN = 0xFFFFFFFFFFFFFFFEn;
22
+ const DEFAULT_ENCODING = 'utf8';
23
+ function readTinyInt(buf, offset) {
24
+ return (0, _helpers.readUInt8)(buf, offset);
25
+ }
26
+ function readSmallInt(buf, offset) {
27
+ return (0, _helpers.readInt16LE)(buf, offset);
28
+ }
29
+ function readInt(buf, offset) {
30
+ return (0, _helpers.readInt32LE)(buf, offset);
31
+ }
32
+ function readBigInt(buf, offset) {
33
+ let value;
34
+ ({
35
+ offset,
36
+ value
37
+ } = (0, _helpers.readBigInt64LE)(buf, offset));
38
+ return new _helpers.Result(value.toString(), offset);
39
+ }
40
+ function readReal(buf, offset) {
41
+ return (0, _helpers.readFloatLE)(buf, offset);
42
+ }
43
+ function readFloat(buf, offset) {
44
+ return (0, _helpers.readDoubleLE)(buf, offset);
45
+ }
46
+ function readSmallMoney(buf, offset) {
47
+ let value;
48
+ ({
49
+ offset,
50
+ value
51
+ } = (0, _helpers.readInt32LE)(buf, offset));
52
+ return new _helpers.Result(value / MONEY_DIVISOR, offset);
53
+ }
54
+ function readMoney(buf, offset) {
55
+ let high;
56
+ ({
57
+ offset,
58
+ value: high
59
+ } = (0, _helpers.readInt32LE)(buf, offset));
60
+ let low;
61
+ ({
62
+ offset,
63
+ value: low
64
+ } = (0, _helpers.readUInt32LE)(buf, offset));
65
+ return new _helpers.Result((low + 0x100000000 * high) / MONEY_DIVISOR, offset);
66
+ }
67
+ function readBit(buf, offset) {
68
+ let value;
69
+ ({
70
+ offset,
71
+ value
72
+ } = (0, _helpers.readUInt8)(buf, offset));
73
+ return new _helpers.Result(!!value, offset);
74
+ }
75
+ function readValue(buf, offset, metadata, options) {
76
+ const type = metadata.type;
77
+ switch (type.name) {
78
+ case 'Null':
79
+ return new _helpers.Result(null, offset);
80
+ case 'TinyInt':
81
+ {
82
+ return readTinyInt(buf, offset);
83
+ }
84
+ case 'SmallInt':
85
+ {
86
+ return readSmallInt(buf, offset);
87
+ }
88
+ case 'Int':
89
+ {
90
+ return readInt(buf, offset);
91
+ }
92
+ case 'BigInt':
93
+ {
94
+ return readBigInt(buf, offset);
95
+ }
96
+ case 'IntN':
97
+ {
98
+ let dataLength;
99
+ ({
100
+ offset,
101
+ value: dataLength
102
+ } = (0, _helpers.readUInt8)(buf, offset));
103
+ switch (dataLength) {
104
+ case 0:
105
+ return new _helpers.Result(null, offset);
106
+ case 1:
107
+ return readTinyInt(buf, offset);
108
+ case 2:
109
+ return readSmallInt(buf, offset);
110
+ case 4:
111
+ return readInt(buf, offset);
112
+ case 8:
113
+ return readBigInt(buf, offset);
114
+ default:
115
+ throw new Error('Unsupported dataLength ' + dataLength + ' for IntN');
116
+ }
117
+ }
118
+ case 'Real':
119
+ {
120
+ return readReal(buf, offset);
121
+ }
122
+ case 'Float':
123
+ {
124
+ return readFloat(buf, offset);
125
+ }
126
+ case 'FloatN':
127
+ {
128
+ let dataLength;
129
+ ({
130
+ offset,
131
+ value: dataLength
132
+ } = (0, _helpers.readUInt8)(buf, offset));
133
+ switch (dataLength) {
134
+ case 0:
135
+ return new _helpers.Result(null, offset);
136
+ case 4:
137
+ return readReal(buf, offset);
138
+ case 8:
139
+ return readFloat(buf, offset);
140
+ default:
141
+ throw new Error('Unsupported dataLength ' + dataLength + ' for FloatN');
142
+ }
143
+ }
144
+ case 'SmallMoney':
145
+ {
146
+ return readSmallMoney(buf, offset);
147
+ }
148
+ case 'Money':
149
+ return readMoney(buf, offset);
150
+ case 'MoneyN':
151
+ {
152
+ let dataLength;
153
+ ({
154
+ offset,
155
+ value: dataLength
156
+ } = (0, _helpers.readUInt8)(buf, offset));
157
+ switch (dataLength) {
158
+ case 0:
159
+ return new _helpers.Result(null, offset);
160
+ case 4:
161
+ return readSmallMoney(buf, offset);
162
+ case 8:
163
+ return readMoney(buf, offset);
164
+ default:
165
+ throw new Error('Unsupported dataLength ' + dataLength + ' for MoneyN');
166
+ }
167
+ }
168
+ case 'Bit':
169
+ {
170
+ return readBit(buf, offset);
171
+ }
172
+ case 'BitN':
173
+ {
174
+ let dataLength;
175
+ ({
176
+ offset,
177
+ value: dataLength
178
+ } = (0, _helpers.readUInt8)(buf, offset));
179
+ switch (dataLength) {
180
+ case 0:
181
+ return new _helpers.Result(null, offset);
182
+ case 1:
183
+ return readBit(buf, offset);
184
+ default:
185
+ throw new Error('Unsupported dataLength ' + dataLength + ' for BitN');
186
+ }
187
+ }
188
+ case 'VarChar':
189
+ case 'Char':
190
+ {
191
+ const codepage = metadata.collation.codepage;
192
+ let dataLength;
193
+ ({
194
+ offset,
195
+ value: dataLength
196
+ } = (0, _helpers.readUInt16LE)(buf, offset));
197
+ if (dataLength === NULL) {
198
+ return new _helpers.Result(null, offset);
199
+ }
200
+ return readChars(buf, offset, dataLength, codepage);
201
+ }
202
+ case 'NVarChar':
203
+ case 'NChar':
204
+ {
205
+ let dataLength;
206
+ ({
207
+ offset,
208
+ value: dataLength
209
+ } = (0, _helpers.readUInt16LE)(buf, offset));
210
+ if (dataLength === NULL) {
211
+ return new _helpers.Result(null, offset);
212
+ }
213
+ return readNChars(buf, offset, dataLength);
214
+ }
215
+ case 'VarBinary':
216
+ case 'Binary':
217
+ {
218
+ let dataLength;
219
+ ({
220
+ offset,
221
+ value: dataLength
222
+ } = (0, _helpers.readUInt16LE)(buf, offset));
223
+ if (dataLength === NULL) {
224
+ return new _helpers.Result(null, offset);
225
+ }
226
+ return readBinary(buf, offset, dataLength);
227
+ }
228
+ case 'Text':
229
+ {
230
+ let textPointerLength;
231
+ ({
232
+ offset,
233
+ value: textPointerLength
234
+ } = (0, _helpers.readUInt8)(buf, offset));
235
+ if (textPointerLength === 0) {
236
+ return new _helpers.Result(null, offset);
237
+ }
238
+
239
+ // Textpointer
240
+ ({
241
+ offset
242
+ } = readBinary(buf, offset, textPointerLength));
243
+
244
+ // Timestamp
245
+ ({
246
+ offset
247
+ } = readBinary(buf, offset, 8));
248
+ let dataLength;
249
+ ({
250
+ offset,
251
+ value: dataLength
252
+ } = (0, _helpers.readUInt32LE)(buf, offset));
253
+ return readChars(buf, offset, dataLength, metadata.collation.codepage);
254
+ }
255
+ case 'NText':
256
+ {
257
+ let textPointerLength;
258
+ ({
259
+ offset,
260
+ value: textPointerLength
261
+ } = (0, _helpers.readUInt8)(buf, offset));
262
+ if (textPointerLength === 0) {
263
+ return new _helpers.Result(null, offset);
264
+ }
265
+
266
+ // Textpointer
267
+ ({
268
+ offset
269
+ } = readBinary(buf, offset, textPointerLength));
270
+
271
+ // Timestamp
272
+ ({
273
+ offset
274
+ } = readBinary(buf, offset, 8));
275
+ let dataLength;
276
+ ({
277
+ offset,
278
+ value: dataLength
279
+ } = (0, _helpers.readUInt32LE)(buf, offset));
280
+ return readNChars(buf, offset, dataLength);
281
+ }
282
+ case 'Image':
283
+ {
284
+ let textPointerLength;
285
+ ({
286
+ offset,
287
+ value: textPointerLength
288
+ } = (0, _helpers.readUInt8)(buf, offset));
289
+ if (textPointerLength === 0) {
290
+ return new _helpers.Result(null, offset);
291
+ }
292
+
293
+ // Textpointer
294
+ ({
295
+ offset
296
+ } = readBinary(buf, offset, textPointerLength));
297
+
298
+ // Timestamp
299
+ ({
300
+ offset
301
+ } = readBinary(buf, offset, 8));
302
+ let dataLength;
303
+ ({
304
+ offset,
305
+ value: dataLength
306
+ } = (0, _helpers.readUInt32LE)(buf, offset));
307
+ return readBinary(buf, offset, dataLength);
308
+ }
309
+ case 'SmallDateTime':
310
+ {
311
+ return readSmallDateTime(buf, offset, options.useUTC);
312
+ }
313
+ case 'DateTime':
314
+ {
315
+ return readDateTime(buf, offset, options.useUTC);
316
+ }
317
+ case 'DateTimeN':
318
+ {
319
+ let dataLength;
320
+ ({
321
+ offset,
322
+ value: dataLength
323
+ } = (0, _helpers.readUInt8)(buf, offset));
324
+ switch (dataLength) {
325
+ case 0:
326
+ return new _helpers.Result(null, offset);
327
+ case 4:
328
+ return readSmallDateTime(buf, offset, options.useUTC);
329
+ case 8:
330
+ return readDateTime(buf, offset, options.useUTC);
331
+ default:
332
+ throw new Error('Unsupported dataLength ' + dataLength + ' for DateTimeN');
333
+ }
334
+ }
335
+ case 'Time':
336
+ {
337
+ let dataLength;
338
+ ({
339
+ offset,
340
+ value: dataLength
341
+ } = (0, _helpers.readUInt8)(buf, offset));
342
+ if (dataLength === 0) {
343
+ return new _helpers.Result(null, offset);
344
+ }
345
+ return readTime(buf, offset, dataLength, metadata.scale, options.useUTC);
346
+ }
347
+ case 'Date':
348
+ {
349
+ let dataLength;
350
+ ({
351
+ offset,
352
+ value: dataLength
353
+ } = (0, _helpers.readUInt8)(buf, offset));
354
+ if (dataLength === 0) {
355
+ return new _helpers.Result(null, offset);
356
+ }
357
+ return readDate(buf, offset, options.useUTC);
358
+ }
359
+ case 'DateTime2':
360
+ {
361
+ let dataLength;
362
+ ({
363
+ offset,
364
+ value: dataLength
365
+ } = (0, _helpers.readUInt8)(buf, offset));
366
+ if (dataLength === 0) {
367
+ return new _helpers.Result(null, offset);
368
+ }
369
+ return readDateTime2(buf, offset, dataLength, metadata.scale, options.useUTC);
370
+ }
371
+ case 'DateTimeOffset':
372
+ {
373
+ let dataLength;
374
+ ({
375
+ offset,
376
+ value: dataLength
377
+ } = (0, _helpers.readUInt8)(buf, offset));
378
+ if (dataLength === 0) {
379
+ return new _helpers.Result(null, offset);
380
+ }
381
+ return readDateTimeOffset(buf, offset, dataLength, metadata.scale);
382
+ }
383
+ case 'NumericN':
384
+ case 'DecimalN':
385
+ {
386
+ let dataLength;
387
+ ({
388
+ offset,
389
+ value: dataLength
390
+ } = (0, _helpers.readUInt8)(buf, offset));
391
+ if (dataLength === 0) {
392
+ return new _helpers.Result(null, offset);
393
+ }
394
+ return readNumeric(buf, offset, dataLength, metadata.precision, metadata.scale);
395
+ }
396
+ case 'UniqueIdentifier':
397
+ {
398
+ let dataLength;
399
+ ({
400
+ offset,
401
+ value: dataLength
402
+ } = (0, _helpers.readUInt8)(buf, offset));
403
+ switch (dataLength) {
404
+ case 0:
405
+ return new _helpers.Result(null, offset);
406
+ case 0x10:
407
+ return readUniqueIdentifier(buf, offset, options);
408
+ default:
409
+ throw new Error((0, _sprintfJs.sprintf)('Unsupported guid size %d', dataLength - 1));
410
+ }
411
+ }
412
+ case 'Variant':
413
+ {
414
+ let dataLength;
415
+ ({
416
+ offset,
417
+ value: dataLength
418
+ } = (0, _helpers.readUInt32LE)(buf, offset));
419
+ if (dataLength === 0) {
420
+ return new _helpers.Result(null, offset);
421
+ }
422
+ return readVariant(buf, offset, options, dataLength);
423
+ }
424
+ default:
425
+ {
426
+ throw new Error('Invalid type!');
427
+ }
428
+ }
429
+ }
430
+ function isPLPStream(metadata) {
431
+ switch (metadata.type.name) {
432
+ case 'VarChar':
433
+ case 'NVarChar':
434
+ case 'VarBinary':
435
+ {
436
+ return metadata.dataLength === MAX;
437
+ }
438
+ case 'Xml':
439
+ {
440
+ return true;
441
+ }
442
+ case 'UDT':
443
+ {
444
+ return true;
445
+ }
446
+ }
447
+ }
448
+ function readUniqueIdentifier(buf, offset, options) {
449
+ let data;
450
+ ({
451
+ value: data,
452
+ offset
453
+ } = readBinary(buf, offset, 0x10));
454
+ return new _helpers.Result(options.lowerCaseGuids ? (0, _guidParser.bufferToLowerCaseGuid)(data) : (0, _guidParser.bufferToUpperCaseGuid)(data), offset);
455
+ }
456
+ function readNumeric(buf, offset, dataLength, _precision, scale) {
457
+ let sign;
458
+ ({
459
+ offset,
460
+ value: sign
461
+ } = (0, _helpers.readUInt8)(buf, offset));
462
+ sign = sign === 1 ? 1 : -1;
463
+ let value;
464
+ if (dataLength === 5) {
465
+ ({
466
+ offset,
467
+ value
468
+ } = (0, _helpers.readUInt32LE)(buf, offset));
469
+ } else if (dataLength === 9) {
470
+ ({
471
+ offset,
472
+ value
473
+ } = (0, _helpers.readUNumeric64LE)(buf, offset));
474
+ } else if (dataLength === 13) {
475
+ ({
476
+ offset,
477
+ value
478
+ } = (0, _helpers.readUNumeric96LE)(buf, offset));
479
+ } else if (dataLength === 17) {
480
+ ({
481
+ offset,
482
+ value
483
+ } = (0, _helpers.readUNumeric128LE)(buf, offset));
484
+ } else {
485
+ throw new Error((0, _sprintfJs.sprintf)('Unsupported numeric dataLength %d', dataLength));
486
+ }
487
+ return new _helpers.Result(value * sign / Math.pow(10, scale), offset);
488
+ }
489
+ function readVariant(buf, offset, options, dataLength) {
490
+ let baseType;
491
+ ({
492
+ value: baseType,
493
+ offset
494
+ } = (0, _helpers.readUInt8)(buf, offset));
495
+ const type = _dataType.TYPE[baseType];
496
+ let propBytes;
497
+ ({
498
+ value: propBytes,
499
+ offset
500
+ } = (0, _helpers.readUInt8)(buf, offset));
501
+ dataLength = dataLength - propBytes - 2;
502
+ switch (type.name) {
503
+ case 'UniqueIdentifier':
504
+ return readUniqueIdentifier(buf, offset, options);
505
+ case 'Bit':
506
+ return readBit(buf, offset);
507
+ case 'TinyInt':
508
+ return readTinyInt(buf, offset);
509
+ case 'SmallInt':
510
+ return readSmallInt(buf, offset);
511
+ case 'Int':
512
+ return readInt(buf, offset);
513
+ case 'BigInt':
514
+ return readBigInt(buf, offset);
515
+ case 'SmallDateTime':
516
+ return readSmallDateTime(buf, offset, options.useUTC);
517
+ case 'DateTime':
518
+ return readDateTime(buf, offset, options.useUTC);
519
+ case 'Real':
520
+ return readReal(buf, offset);
521
+ case 'Float':
522
+ return readFloat(buf, offset);
523
+ case 'SmallMoney':
524
+ return readSmallMoney(buf, offset);
525
+ case 'Money':
526
+ return readMoney(buf, offset);
527
+ case 'Date':
528
+ return readDate(buf, offset, options.useUTC);
529
+ case 'Time':
530
+ {
531
+ let scale;
532
+ ({
533
+ value: scale,
534
+ offset
535
+ } = (0, _helpers.readUInt8)(buf, offset));
536
+ return readTime(buf, offset, dataLength, scale, options.useUTC);
537
+ }
538
+ case 'DateTime2':
539
+ {
540
+ let scale;
541
+ ({
542
+ value: scale,
543
+ offset
544
+ } = (0, _helpers.readUInt8)(buf, offset));
545
+ return readDateTime2(buf, offset, dataLength, scale, options.useUTC);
546
+ }
547
+ case 'DateTimeOffset':
548
+ {
549
+ let scale;
550
+ ({
551
+ value: scale,
552
+ offset
553
+ } = (0, _helpers.readUInt8)(buf, offset));
554
+ return readDateTimeOffset(buf, offset, dataLength, scale);
555
+ }
556
+ case 'VarBinary':
557
+ case 'Binary':
558
+ {
559
+ // maxLength (unused?)
560
+ ({
561
+ offset
562
+ } = (0, _helpers.readUInt16LE)(buf, offset));
563
+ return readBinary(buf, offset, dataLength);
564
+ }
565
+ case 'NumericN':
566
+ case 'DecimalN':
567
+ {
568
+ let precision;
569
+ ({
570
+ value: precision,
571
+ offset
572
+ } = (0, _helpers.readUInt8)(buf, offset));
573
+ let scale;
574
+ ({
575
+ value: scale,
576
+ offset
577
+ } = (0, _helpers.readUInt8)(buf, offset));
578
+ return readNumeric(buf, offset, dataLength, precision, scale);
579
+ }
580
+ case 'VarChar':
581
+ case 'Char':
582
+ {
583
+ // maxLength (unused?)
584
+ ({
585
+ offset
586
+ } = (0, _helpers.readUInt16LE)(buf, offset));
587
+ let collation;
588
+ ({
589
+ value: collation,
590
+ offset
591
+ } = (0, _metadataParser.readCollation)(buf, offset));
592
+ return readChars(buf, offset, dataLength, collation.codepage);
593
+ }
594
+ case 'NVarChar':
595
+ case 'NChar':
596
+ {
597
+ // maxLength (unused?)
598
+ ({
599
+ offset
600
+ } = (0, _helpers.readUInt16LE)(buf, offset));
601
+
602
+ // collation (unused?)
603
+ ({
604
+ offset
605
+ } = (0, _metadataParser.readCollation)(buf, offset));
606
+ return readNChars(buf, offset, dataLength);
607
+ }
608
+ default:
609
+ throw new Error('Invalid type!');
610
+ }
611
+ }
612
+ function readBinary(buf, offset, dataLength) {
613
+ if (buf.length < offset + dataLength) {
614
+ throw new _helpers.NotEnoughDataError(offset + dataLength);
615
+ }
616
+ return new _helpers.Result(buf.slice(offset, offset + dataLength), offset + dataLength);
617
+ }
618
+ function readChars(buf, offset, dataLength, codepage) {
619
+ if (buf.length < offset + dataLength) {
620
+ throw new _helpers.NotEnoughDataError(offset + dataLength);
621
+ }
622
+ return new _helpers.Result(_iconvLite.default.decode(buf.slice(offset, offset + dataLength), codepage ?? DEFAULT_ENCODING), offset + dataLength);
623
+ }
624
+ function readNChars(buf, offset, dataLength) {
625
+ if (buf.length < offset + dataLength) {
626
+ throw new _helpers.NotEnoughDataError(offset + dataLength);
627
+ }
628
+ return new _helpers.Result(buf.toString('ucs2', offset, offset + dataLength), offset + dataLength);
629
+ }
630
+ async function readPLPStream(parser) {
631
+ while (parser.buffer.length < parser.position + 8) {
632
+ await parser.waitForChunk();
633
+ }
634
+ const expectedLength = parser.buffer.readBigUInt64LE(parser.position);
635
+ parser.position += 8;
636
+ if (expectedLength === PLP_NULL) {
637
+ return null;
638
+ }
639
+ const chunks = [];
640
+ let currentLength = 0;
641
+ while (true) {
642
+ while (parser.buffer.length < parser.position + 4) {
643
+ await parser.waitForChunk();
644
+ }
645
+ const chunkLength = parser.buffer.readUInt32LE(parser.position);
646
+ parser.position += 4;
647
+ if (!chunkLength) {
648
+ break;
649
+ }
650
+ while (parser.buffer.length < parser.position + chunkLength) {
651
+ await parser.waitForChunk();
652
+ }
653
+ chunks.push(parser.buffer.slice(parser.position, parser.position + chunkLength));
654
+ parser.position += chunkLength;
655
+ currentLength += chunkLength;
656
+ }
657
+ if (expectedLength !== UNKNOWN_PLP_LEN) {
658
+ if (currentLength !== Number(expectedLength)) {
659
+ throw new Error('Partially Length-prefixed Bytes unmatched lengths : expected ' + expectedLength + ', but got ' + currentLength + ' bytes');
660
+ }
661
+ }
662
+ return chunks;
663
+ }
664
+ function readSmallDateTime(buf, offset, useUTC) {
665
+ let days;
666
+ ({
667
+ offset,
668
+ value: days
669
+ } = (0, _helpers.readUInt16LE)(buf, offset));
670
+ let minutes;
671
+ ({
672
+ offset,
673
+ value: minutes
674
+ } = (0, _helpers.readUInt16LE)(buf, offset));
675
+ let value;
676
+ if (useUTC) {
677
+ value = new Date(Date.UTC(1900, 0, 1 + days, 0, minutes));
678
+ } else {
679
+ value = new Date(1900, 0, 1 + days, 0, minutes);
680
+ }
681
+ return new _helpers.Result(value, offset);
682
+ }
683
+ function readDateTime(buf, offset, useUTC) {
684
+ let days;
685
+ ({
686
+ offset,
687
+ value: days
688
+ } = (0, _helpers.readInt32LE)(buf, offset));
689
+ let threeHundredthsOfSecond;
690
+ ({
691
+ offset,
692
+ value: threeHundredthsOfSecond
693
+ } = (0, _helpers.readInt32LE)(buf, offset));
694
+ const milliseconds = Math.round(threeHundredthsOfSecond * THREE_AND_A_THIRD);
695
+ let value;
696
+ if (useUTC) {
697
+ value = new Date(Date.UTC(1900, 0, 1 + days, 0, 0, 0, milliseconds));
698
+ } else {
699
+ value = new Date(1900, 0, 1 + days, 0, 0, 0, milliseconds);
700
+ }
701
+ return new _helpers.Result(value, offset);
702
+ }
703
+ function readTime(buf, offset, dataLength, scale, useUTC) {
704
+ let value;
705
+ switch (dataLength) {
706
+ case 3:
707
+ {
708
+ ({
709
+ value,
710
+ offset
711
+ } = (0, _helpers.readUInt24LE)(buf, offset));
712
+ break;
713
+ }
714
+ case 4:
715
+ {
716
+ ({
717
+ value,
718
+ offset
719
+ } = (0, _helpers.readUInt32LE)(buf, offset));
720
+ break;
721
+ }
722
+ case 5:
723
+ {
724
+ ({
725
+ value,
726
+ offset
727
+ } = (0, _helpers.readUInt40LE)(buf, offset));
728
+ break;
729
+ }
730
+ default:
731
+ {
732
+ throw new Error('unreachable');
733
+ }
734
+ }
735
+ if (scale < 7) {
736
+ for (let i = scale; i < 7; i++) {
737
+ value *= 10;
738
+ }
739
+ }
740
+ let date;
741
+ if (useUTC) {
742
+ date = new Date(Date.UTC(1970, 0, 1, 0, 0, 0, value / 10000));
743
+ } else {
744
+ date = new Date(1970, 0, 1, 0, 0, 0, value / 10000);
745
+ }
746
+ Object.defineProperty(date, 'nanosecondsDelta', {
747
+ enumerable: false,
748
+ value: value % 10000 / Math.pow(10, 7)
749
+ });
750
+ return new _helpers.Result(date, offset);
751
+ }
752
+ function readDate(buf, offset, useUTC) {
753
+ let days;
754
+ ({
755
+ offset,
756
+ value: days
757
+ } = (0, _helpers.readUInt24LE)(buf, offset));
758
+ if (useUTC) {
759
+ return new _helpers.Result(new Date(Date.UTC(2000, 0, days - 730118)), offset);
760
+ } else {
761
+ return new _helpers.Result(new Date(2000, 0, days - 730118), offset);
762
+ }
763
+ }
764
+ function readDateTime2(buf, offset, dataLength, scale, useUTC) {
765
+ let time;
766
+ ({
767
+ offset,
768
+ value: time
769
+ } = readTime(buf, offset, dataLength - 3, scale, useUTC));
770
+ let days;
771
+ ({
772
+ offset,
773
+ value: days
774
+ } = (0, _helpers.readUInt24LE)(buf, offset));
775
+ let date;
776
+ if (useUTC) {
777
+ date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
778
+ } else {
779
+ date = new Date(2000, 0, days - 730118, time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
780
+ }
781
+ Object.defineProperty(date, 'nanosecondsDelta', {
782
+ enumerable: false,
783
+ value: time.nanosecondsDelta
784
+ });
785
+ return new _helpers.Result(date, offset);
786
+ }
787
+ function readDateTimeOffset(buf, offset, dataLength, scale) {
788
+ let time;
789
+ ({
790
+ offset,
791
+ value: time
792
+ } = readTime(buf, offset, dataLength - 5, scale, true));
793
+ let days;
794
+ ({
795
+ offset,
796
+ value: days
797
+ } = (0, _helpers.readUInt24LE)(buf, offset));
798
+
799
+ // time offset?
800
+ ({
801
+ offset
802
+ } = (0, _helpers.readUInt16LE)(buf, offset));
803
+ const date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
804
+ Object.defineProperty(date, 'nanosecondsDelta', {
805
+ enumerable: false,
806
+ value: time.nanosecondsDelta
807
+ });
808
+ return new _helpers.Result(date, offset);
809
+ }
810
+ module.exports.readValue = readValue;
811
+ module.exports.isPLPStream = isPLPStream;
812
+ module.exports.readPLPStream = readPLPStream;
813
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX2RhdGFUeXBlIiwiX2ljb252TGl0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3ByaW50ZkpzIiwiX2d1aWRQYXJzZXIiLCJfaGVscGVycyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk5VTEwiLCJNQVgiLCJUSFJFRV9BTkRfQV9USElSRCIsIk1PTkVZX0RJVklTT1IiLCJQTFBfTlVMTCIsIlVOS05PV05fUExQX0xFTiIsIkRFRkFVTFRfRU5DT0RJTkciLCJyZWFkVGlueUludCIsImJ1ZiIsIm9mZnNldCIsInJlYWRVSW50OCIsInJlYWRTbWFsbEludCIsInJlYWRJbnQxNkxFIiwicmVhZEludCIsInJlYWRJbnQzMkxFIiwicmVhZEJpZ0ludCIsInZhbHVlIiwicmVhZEJpZ0ludDY0TEUiLCJSZXN1bHQiLCJ0b1N0cmluZyIsInJlYWRSZWFsIiwicmVhZEZsb2F0TEUiLCJyZWFkRmxvYXQiLCJyZWFkRG91YmxlTEUiLCJyZWFkU21hbGxNb25leSIsInJlYWRNb25leSIsImhpZ2giLCJsb3ciLCJyZWFkVUludDMyTEUiLCJyZWFkQml0IiwicmVhZFZhbHVlIiwibWV0YWRhdGEiLCJvcHRpb25zIiwidHlwZSIsIm5hbWUiLCJkYXRhTGVuZ3RoIiwiRXJyb3IiLCJjb2RlcGFnZSIsImNvbGxhdGlvbiIsInJlYWRVSW50MTZMRSIsInJlYWRDaGFycyIsInJlYWROQ2hhcnMiLCJyZWFkQmluYXJ5IiwidGV4dFBvaW50ZXJMZW5ndGgiLCJyZWFkU21hbGxEYXRlVGltZSIsInVzZVVUQyIsInJlYWREYXRlVGltZSIsInJlYWRUaW1lIiwic2NhbGUiLCJyZWFkRGF0ZSIsInJlYWREYXRlVGltZTIiLCJyZWFkRGF0ZVRpbWVPZmZzZXQiLCJyZWFkTnVtZXJpYyIsInByZWNpc2lvbiIsInJlYWRVbmlxdWVJZGVudGlmaWVyIiwic3ByaW50ZiIsInJlYWRWYXJpYW50IiwiaXNQTFBTdHJlYW0iLCJkYXRhIiwibG93ZXJDYXNlR3VpZHMiLCJidWZmZXJUb0xvd2VyQ2FzZUd1aWQiLCJidWZmZXJUb1VwcGVyQ2FzZUd1aWQiLCJfcHJlY2lzaW9uIiwic2lnbiIsInJlYWRVTnVtZXJpYzY0TEUiLCJyZWFkVU51bWVyaWM5NkxFIiwicmVhZFVOdW1lcmljMTI4TEUiLCJNYXRoIiwicG93IiwiYmFzZVR5cGUiLCJUWVBFIiwicHJvcEJ5dGVzIiwicmVhZENvbGxhdGlvbiIsImxlbmd0aCIsIk5vdEVub3VnaERhdGFFcnJvciIsInNsaWNlIiwiaWNvbnYiLCJkZWNvZGUiLCJyZWFkUExQU3RyZWFtIiwicGFyc2VyIiwiYnVmZmVyIiwicG9zaXRpb24iLCJ3YWl0Rm9yQ2h1bmsiLCJleHBlY3RlZExlbmd0aCIsInJlYWRCaWdVSW50NjRMRSIsImNodW5rcyIsImN1cnJlbnRMZW5ndGgiLCJjaHVua0xlbmd0aCIsInB1c2giLCJOdW1iZXIiLCJkYXlzIiwibWludXRlcyIsIkRhdGUiLCJVVEMiLCJ0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCIsIm1pbGxpc2Vjb25kcyIsInJvdW5kIiwicmVhZFVJbnQyNExFIiwicmVhZFVJbnQ0MExFIiwiaSIsImRhdGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm5hbm9zZWNvbmRzRGVsdGEiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3ZhbHVlLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFyc2VyLCB7IHR5cGUgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vdG9rZW4vc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyB0eXBlIE1ldGFkYXRhLCByZWFkQ29sbGF0aW9uIH0gZnJvbSAnLi9tZXRhZGF0YS1wYXJzZXInO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vZGF0YS10eXBlJztcblxuaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ3NwcmludGYtanMnO1xuaW1wb3J0IHsgYnVmZmVyVG9Mb3dlckNhc2VHdWlkLCBidWZmZXJUb1VwcGVyQ2FzZUd1aWQgfSBmcm9tICcuL2d1aWQtcGFyc2VyJztcbmltcG9ydCB7IE5vdEVub3VnaERhdGFFcnJvciwgUmVzdWx0LCByZWFkQmlnSW50NjRMRSwgcmVhZERvdWJsZUxFLCByZWFkRmxvYXRMRSwgcmVhZEludDE2TEUsIHJlYWRJbnQzMkxFLCByZWFkVUludDE2TEUsIHJlYWRVSW50MzJMRSwgcmVhZFVJbnQ4LCByZWFkVUludDI0TEUsIHJlYWRVSW50NDBMRSwgcmVhZFVOdW1lcmljNjRMRSwgcmVhZFVOdW1lcmljOTZMRSwgcmVhZFVOdW1lcmljMTI4TEUgfSBmcm9tICcuL3Rva2VuL2hlbHBlcnMnO1xuXG5jb25zdCBOVUxMID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IE1BWCA9ICgxIDw8IDE2KSAtIDE7XG5jb25zdCBUSFJFRV9BTkRfQV9USElSRCA9IDMgKyAoMSAvIDMpO1xuY29uc3QgTU9ORVlfRElWSVNPUiA9IDEwMDAwO1xuY29uc3QgUExQX05VTEwgPSAweEZGRkZGRkZGRkZGRkZGRkZuO1xuY29uc3QgVU5LTk9XTl9QTFBfTEVOID0gMHhGRkZGRkZGRkZGRkZGRkZFbjtcbmNvbnN0IERFRkFVTFRfRU5DT0RJTkcgPSAndXRmOCc7XG5cbmZ1bmN0aW9uIHJlYWRUaW55SW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWRVSW50OChidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbEludChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkSW50MTZMRShidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkQmlnSW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxzdHJpbmc+IHtcbiAgbGV0IHZhbHVlO1xuICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkQmlnSW50NjRMRShidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLnRvU3RyaW5nKCksIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRSZWFsKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWRGbG9hdExFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWREb3VibGVMRShidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbE1vbmV5KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgbGV0IHZhbHVlO1xuICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlIC8gTU9ORVlfRElWSVNPUiwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZE1vbmV5KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgbGV0IGhpZ2g7XG4gICh7IG9mZnNldCwgdmFsdWU6IGhpZ2ggfSA9IHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IGxvdztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogbG93IH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdCgobG93ICsgKDB4MTAwMDAwMDAwICogaGlnaCkpIC8gTU9ORVlfRElWSVNPUiwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEJpdChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KCEhdmFsdWUsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYWx1ZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSwgb3B0aW9uczogUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDx1bmtub3duPiB7XG4gIGNvbnN0IHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG4gIHN3aXRjaCAodHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnTnVsbCc6XG4gICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnVGlueUludCc6IHtcbiAgICAgIHJldHVybiByZWFkVGlueUludChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnU21hbGxJbnQnOiB7XG4gICAgICByZXR1cm4gcmVhZFNtYWxsSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdJbnQnOiB7XG4gICAgICByZXR1cm4gcmVhZEludChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnQmlnSW50Jzoge1xuICAgICAgcmV0dXJuIHJlYWRCaWdJbnQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ludE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiByZWFkVGlueUludChidWYsIG9mZnNldCk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiByZWFkSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJldHVybiByZWFkQmlnSW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEludE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdSZWFsJzoge1xuICAgICAgcmV0dXJuIHJlYWRSZWFsKGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdGbG9hdCc6IHtcbiAgICAgIHJldHVybiByZWFkRmxvYXQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0Zsb2F0Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRSZWFsKGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJldHVybiByZWFkRmxvYXQoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRmxvYXROJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnU21hbGxNb25leSc6IHtcbiAgICAgIHJldHVybiByZWFkU21hbGxNb25leShidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnTW9uZXknOlxuICAgICAgcmV0dXJuIHJlYWRNb25leShidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdNb25leU4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxNb25leShidWYsIG9mZnNldCk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gcmVhZE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIE1vbmV5TicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ0JpdCc6IHtcbiAgICAgIHJldHVybiByZWFkQml0KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdCaXROJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gcmVhZEJpdChidWYsIG9mZnNldCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBCaXROJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQ2hhcic6XG4gICAgY2FzZSAnQ2hhcic6IHtcbiAgICAgIGNvbnN0IGNvZGVwYWdlID0gbWV0YWRhdGEuY29sbGF0aW9uIS5jb2RlcGFnZSE7XG5cbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIGNvZGVwYWdlKTtcbiAgICB9XG5cbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnTkNoYXInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gTlVMTCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZE5DaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gTlVMTCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVGV4dCc6IHtcbiAgICAgIGxldCB0ZXh0UG9pbnRlckxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHRleHRQb2ludGVyTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKHRleHRQb2ludGVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRleHRwb2ludGVyXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIHRleHRQb2ludGVyTGVuZ3RoKSk7XG5cbiAgICAgIC8vIFRpbWVzdGFtcFxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCA4KSk7XG5cbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLmNvbGxhdGlvbiEuY29kZXBhZ2UhKTtcbiAgICB9XG5cbiAgICBjYXNlICdOVGV4dCc6IHtcbiAgICAgIGxldCB0ZXh0UG9pbnRlckxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHRleHRQb2ludGVyTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKHRleHRQb2ludGVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRleHRwb2ludGVyXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIHRleHRQb2ludGVyTGVuZ3RoKSk7XG5cbiAgICAgIC8vIFRpbWVzdGFtcFxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCA4KSk7XG5cbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkTkNoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdJbWFnZSc6IHtcbiAgICAgIGxldCB0ZXh0UG9pbnRlckxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHRleHRQb2ludGVyTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKHRleHRQb2ludGVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRleHRwb2ludGVyXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIHRleHRQb2ludGVyTGVuZ3RoKSk7XG5cbiAgICAgIC8vIFRpbWVzdGFtcFxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCA4KSk7XG5cbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbERhdGVUaW1lJzoge1xuICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZVRpbWUnOiB7XG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZVRpbWVOJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIERhdGVUaW1lTicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1RpbWUnOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZFRpbWUoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLnNjYWxlISwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGUnOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZERhdGUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZTInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lMihidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZVRpbWVPZmZzZXQnOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lT2Zmc2V0KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5zY2FsZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ051bWVyaWNOJzpcbiAgICBjYXNlICdEZWNpbWFsTic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkTnVtZXJpYyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEucHJlY2lzaW9uISwgbWV0YWRhdGEuc2NhbGUhKTtcbiAgICB9XG5cbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgMHgxMDpcbiAgICAgICAgICByZXR1cm4gcmVhZFVuaXF1ZUlkZW50aWZpZXIoYnVmLCBvZmZzZXQsIG9wdGlvbnMpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGd1aWQgc2l6ZSAlZCcsIGRhdGFMZW5ndGghIC0gMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1ZhcmlhbnQnOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZFZhcmlhbnQoYnVmLCBvZmZzZXQsIG9wdGlvbnMsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlIScpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BMUFN0cmVhbShtZXRhZGF0YTogTWV0YWRhdGEpIHtcbiAgc3dpdGNoIChtZXRhZGF0YS50eXBlLm5hbWUpIHtcbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnVmFyQmluYXJ5Jzoge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmRhdGFMZW5ndGggPT09IE1BWDtcbiAgICB9XG5cbiAgICBjYXNlICdYbWwnOiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjYXNlICdVRFQnOiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFVuaXF1ZUlkZW50aWZpZXIoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PHN0cmluZz4ge1xuICBsZXQgZGF0YTtcbiAgKHsgdmFsdWU6IGRhdGEsIG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgMHgxMCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KG9wdGlvbnMubG93ZXJDYXNlR3VpZHMgPyBidWZmZXJUb0xvd2VyQ2FzZUd1aWQoZGF0YSkgOiBidWZmZXJUb1VwcGVyQ2FzZUd1aWQoZGF0YSksIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWROdW1lcmljKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBfcHJlY2lzaW9uOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIGxldCBzaWduO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBzaWduIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBzaWduID0gc2lnbiA9PT0gMSA/IDEgOiAtMTtcblxuICBsZXQgdmFsdWU7XG4gIGlmIChkYXRhTGVuZ3RoID09PSA1KSB7XG4gICAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gOSkge1xuICAgICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVTnVtZXJpYzY0TEUoYnVmLCBvZmZzZXQpKTtcbiAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID09PSAxMykge1xuICAgICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVTnVtZXJpYzk2TEUoYnVmLCBvZmZzZXQpKTtcbiAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID09PSAxNykge1xuICAgICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVTnVtZXJpYzEyOExFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIG51bWVyaWMgZGF0YUxlbmd0aCAlZCcsIGRhdGFMZW5ndGgpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KCh2YWx1ZSAqIHNpZ24pIC8gTWF0aC5wb3coMTAsIHNjYWxlKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhcmlhbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBkYXRhTGVuZ3RoOiBudW1iZXIpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICBsZXQgYmFzZVR5cGU7XG4gICh7IHZhbHVlOiBiYXNlVHlwZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCB0eXBlID0gVFlQRVtiYXNlVHlwZV07XG5cbiAgbGV0IHByb3BCeXRlcztcbiAgKHsgdmFsdWU6IHByb3BCeXRlcywgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBkYXRhTGVuZ3RoID0gZGF0YUxlbmd0aCAtIHByb3BCeXRlcyAtIDI7XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihidWYsIG9mZnNldCwgb3B0aW9ucyk7XG5cbiAgICBjYXNlICdCaXQnOlxuICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnVGlueUludCc6XG4gICAgICByZXR1cm4gcmVhZFRpbnlJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnU21hbGxJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbEludChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnQmlnSW50JzpcbiAgICAgIHJldHVybiByZWFkQmlnSW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdSZWFsJzpcbiAgICAgIHJldHVybiByZWFkUmVhbChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdGbG9hdCc6XG4gICAgICByZXR1cm4gcmVhZEZsb2F0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsTW9uZXknOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ01vbmV5JzpcbiAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gcmVhZERhdGUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcblxuICAgIGNhc2UgJ1RpbWUnOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZTInOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUyKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0Jzoge1xuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgdmFsdWU6IHNjYWxlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lT2Zmc2V0KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzoge1xuICAgICAgbGV0IHByZWNpc2lvbjtcbiAgICAgICh7IHZhbHVlOiBwcmVjaXNpb24sIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IHZhbHVlOiBzY2FsZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROdW1lcmljKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzoge1xuICAgICAgLy8gbWF4TGVuZ3RoICh1bnVzZWQ/KVxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IGNvbGxhdGlvbjtcbiAgICAgICh7IHZhbHVlOiBjb2xsYXRpb24sIG9mZnNldCB9ID0gcmVhZENvbGxhdGlvbihidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZENoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBjb2xsYXRpb24uY29kZXBhZ2UhKTtcbiAgICB9XG5cbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnTkNoYXInOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICAvLyBjb2xsYXRpb24gKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZSEnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkQmluYXJ5KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKTogUmVzdWx0PEJ1ZmZlcj4ge1xuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGRhdGFMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGRhdGFMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZWFkQ2hhcnMoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNvZGVwYWdlOiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgZGF0YUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdChpY29udi5kZWNvZGUoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIGNvZGVwYWdlID8/IERFRkFVTFRfRU5DT0RJTkcpLCBvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmVhZE5DaGFycyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlcik6IFJlc3VsdDxzdHJpbmc+IHtcbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi50b1N0cmluZygndWNzMicsIG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUExQU3RyZWFtKHBhcnNlcjogUGFyc2VyKTogUHJvbWlzZTxudWxsIHwgQnVmZmVyW10+IHtcbiAgd2hpbGUgKHBhcnNlci5idWZmZXIubGVuZ3RoIDwgcGFyc2VyLnBvc2l0aW9uICsgOCkge1xuICAgIGF3YWl0IHBhcnNlci53YWl0Rm9yQ2h1bmsoKTtcbiAgfVxuXG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gcGFyc2VyLmJ1ZmZlci5yZWFkQmlnVUludDY0TEUocGFyc2VyLnBvc2l0aW9uKTtcbiAgcGFyc2VyLnBvc2l0aW9uICs9IDg7XG5cbiAgaWYgKGV4cGVjdGVkTGVuZ3RoID09PSBQTFBfTlVMTCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICBsZXQgY3VycmVudExlbmd0aCA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB3aGlsZSAocGFyc2VyLmJ1ZmZlci5sZW5ndGggPCBwYXJzZXIucG9zaXRpb24gKyA0KSB7XG4gICAgICBhd2FpdCBwYXJzZXIud2FpdEZvckNodW5rKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2h1bmtMZW5ndGggPSBwYXJzZXIuYnVmZmVyLnJlYWRVSW50MzJMRShwYXJzZXIucG9zaXRpb24pO1xuICAgIHBhcnNlci5wb3NpdGlvbiArPSA0O1xuXG4gICAgaWYgKCFjaHVua0xlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd2hpbGUgKHBhcnNlci5idWZmZXIubGVuZ3RoIDwgcGFyc2VyLnBvc2l0aW9uICsgY2h1bmtMZW5ndGgpIHtcbiAgICAgIGF3YWl0IHBhcnNlci53YWl0Rm9yQ2h1bmsoKTtcbiAgICB9XG5cbiAgICBjaHVua3MucHVzaChwYXJzZXIuYnVmZmVyLnNsaWNlKHBhcnNlci5wb3NpdGlvbiwgcGFyc2VyLnBvc2l0aW9uICsgY2h1bmtMZW5ndGgpKTtcbiAgICBwYXJzZXIucG9zaXRpb24gKz0gY2h1bmtMZW5ndGg7XG4gICAgY3VycmVudExlbmd0aCArPSBjaHVua0xlbmd0aDtcbiAgfVxuXG4gIGlmIChleHBlY3RlZExlbmd0aCAhPT0gVU5LTk9XTl9QTFBfTEVOKSB7XG4gICAgaWYgKGN1cnJlbnRMZW5ndGggIT09IE51bWJlcihleHBlY3RlZExlbmd0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFydGlhbGx5IExlbmd0aC1wcmVmaXhlZCBCeXRlcyB1bm1hdGNoZWQgbGVuZ3RocyA6IGV4cGVjdGVkICcgKyBleHBlY3RlZExlbmd0aCArICcsIGJ1dCBnb3QgJyArIGN1cnJlbnRMZW5ndGggKyAnIGJ5dGVzJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNodW5rcztcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsRGF0ZVRpbWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZT4ge1xuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IG1pbnV0ZXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IG1pbnV0ZXMgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCB2YWx1ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIHZhbHVlID0gbmV3IERhdGUoRGF0ZS5VVEMoMTkwMCwgMCwgMSArIGRheXMsIDAsIG1pbnV0ZXMpKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCBtaW51dGVzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZT4ge1xuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQ7XG4gICh7IG9mZnNldCwgdmFsdWU6IHRocmVlSHVuZHJlZHRoc09mU2Vjb25kIH0gPSByZWFkSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE1hdGgucm91bmQodGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQgKiBUSFJFRV9BTkRfQV9USElSRCk7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTAwLCAwLCAxICsgZGF5cywgMCwgMCwgMCwgbWlsbGlzZWNvbmRzKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxICsgZGF5cywgMCwgMCwgMCwgbWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5pbnRlcmZhY2UgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhIGV4dGVuZHMgRGF0ZSB7XG4gIG5hbm9zZWNvbmRzRGVsdGE6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gcmVhZFRpbWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE+IHtcbiAgbGV0IHZhbHVlO1xuXG4gIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgIGNhc2UgMzoge1xuICAgICAgKHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQyNExFKGJ1Ziwgb2Zmc2V0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIDQ6IHtcbiAgICAgICh7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSA1OiB7XG4gICAgICAoeyB2YWx1ZSwgb2Zmc2V0IH0gPSByZWFkVUludDQwTEUoYnVmLCBvZmZzZXQpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5yZWFjaGFibGUnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NhbGUgPCA3KSB7XG4gICAgZm9yIChsZXQgaSA9IHNjYWxlOyBpIDwgNzsgaSsrKSB7XG4gICAgICB2YWx1ZSAqPSAxMDtcbiAgICB9XG4gIH1cblxuICBsZXQgZGF0ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTcwLCAwLCAxLCAwLCAwLCAwLCB2YWx1ZSAvIDEwMDAwKSkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICB9IGVsc2Uge1xuICAgIGRhdGUgPSBuZXcgRGF0ZSgxOTcwLCAwLCAxLCAwLCAwLCAwLCB2YWx1ZSAvIDEwMDAwKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiAodmFsdWUgJSAxMDAwMCkgLyBNYXRoLnBvdygxMCwgNylcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoZGF0ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZERhdGUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZT4ge1xuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZFVJbnQyNExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgaWYgKHVzZVVUQykge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpKSwgb2Zmc2V0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFJlc3VsdChuZXcgRGF0ZSgyMDAwLCAwLCBkYXlzIC0gNzMwMTE4KSwgb2Zmc2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUyKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhPiB7XG4gIGxldCB0aW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0aW1lIH0gPSByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCAtIDMsIHNjYWxlLCB1c2VVVEMpKTtcblxuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZFVJbnQyNExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IGRhdGU7XG4gIGlmICh1c2VVVEMpIHtcbiAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgMCwgMCwgMCwgK3RpbWUpKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgsIHRpbWUuZ2V0SG91cnMoKSwgdGltZS5nZXRNaW51dGVzKCksIHRpbWUuZ2V0U2Vjb25kcygpLCB0aW1lLmdldE1pbGxpc2Vjb25kcygpKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiB0aW1lLm5hbm9zZWNvbmRzRGVsdGFcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoZGF0ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZERhdGVUaW1lT2Zmc2V0KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogUmVzdWx0PERhdGVXaXRoTmFub3NlY29uZHNEZWx0YT4ge1xuICBsZXQgdGltZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGltZSB9ID0gcmVhZFRpbWUoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGggLSA1LCBzY2FsZSwgdHJ1ZSkpO1xuXG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcblxuICAvLyB0aW1lIG9mZnNldD9cbiAgKHsgb2Zmc2V0IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgMCwgMCwgMCwgK3RpbWUpKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCAnbmFub3NlY29uZHNEZWx0YScsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogdGltZS5uYW5vc2Vjb25kc0RlbHRhXG4gIH0pO1xuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5yZWFkVmFsdWUgPSByZWFkVmFsdWU7XG5tb2R1bGUuZXhwb3J0cy5pc1BMUFN0cmVhbSA9IGlzUExQU3RyZWFtO1xubW9kdWxlLmV4cG9ydHMucmVhZFBMUFN0cmVhbSA9IHJlYWRQTFBTdHJlYW07XG5cbmV4cG9ydCB7IHJlYWRWYWx1ZSwgaXNQTFBTdHJlYW0sIHJlYWRQTFBTdHJlYW0gfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQSxJQUFBQSxlQUFBLEdBQUFDLE9BQUE7QUFDQSxJ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