@witnet/sdk 1.0.0-beta.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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/package.json +72 -0
  4. package/dist/src/bin/helpers.d.ts +91 -0
  5. package/dist/src/bin/helpers.d.ts.map +1 -0
  6. package/dist/src/bin/helpers.js +816 -0
  7. package/dist/src/index.d.ts +5 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +47 -0
  10. package/dist/src/lib/crypto/account.d.ts +32 -0
  11. package/dist/src/lib/crypto/account.d.ts.map +1 -0
  12. package/dist/src/lib/crypto/account.js +106 -0
  13. package/dist/src/lib/crypto/coinbase.d.ts +10 -0
  14. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
  15. package/dist/src/lib/crypto/coinbase.js +28 -0
  16. package/dist/src/lib/crypto/index.d.ts +8 -0
  17. package/dist/src/lib/crypto/index.d.ts.map +1 -0
  18. package/dist/src/lib/crypto/index.js +30 -0
  19. package/dist/src/lib/crypto/interfaces.d.ts +85 -0
  20. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
  21. package/dist/src/lib/crypto/interfaces.js +3 -0
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
  24. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
  26. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
  27. package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
  30. package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
  33. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
  34. package/dist/src/lib/crypto/payloads.d.ts +57 -0
  35. package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
  36. package/dist/src/lib/crypto/payloads.js +170 -0
  37. package/dist/src/lib/crypto/signer.d.ts +33 -0
  38. package/dist/src/lib/crypto/signer.d.ts.map +1 -0
  39. package/dist/src/lib/crypto/signer.js +194 -0
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
  41. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
  42. package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
  45. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
  48. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
  51. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
  52. package/dist/src/lib/crypto/transmitters.d.ts +47 -0
  53. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
  54. package/dist/src/lib/crypto/transmitters.js +416 -0
  55. package/dist/src/lib/crypto/types.d.ts +161 -0
  56. package/dist/src/lib/crypto/types.d.ts.map +1 -0
  57. package/dist/src/lib/crypto/types.js +273 -0
  58. package/dist/src/lib/crypto/utils.d.ts +21 -0
  59. package/dist/src/lib/crypto/utils.d.ts.map +1 -0
  60. package/dist/src/lib/crypto/utils.js +156 -0
  61. package/dist/src/lib/crypto/wallet.d.ts +120 -0
  62. package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
  63. package/dist/src/lib/crypto/wallet.js +258 -0
  64. package/dist/src/lib/index.d.ts +5 -0
  65. package/dist/src/lib/index.d.ts.map +1 -0
  66. package/dist/src/lib/index.js +44 -0
  67. package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
  68. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
  69. package/dist/src/lib/radon/ccdr/eth.js +272 -0
  70. package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
  71. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
  72. package/dist/src/lib/radon/ccdr/index.js +39 -0
  73. package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
  74. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
  75. package/dist/src/lib/radon/ccdr/wit.js +35 -0
  76. package/dist/src/lib/radon/filters.d.ts +14 -0
  77. package/dist/src/lib/radon/filters.d.ts.map +1 -0
  78. package/dist/src/lib/radon/filters.js +45 -0
  79. package/dist/src/lib/radon/index.d.ts +296 -0
  80. package/dist/src/lib/radon/index.d.ts.map +1 -0
  81. package/dist/src/lib/radon/index.js +707 -0
  82. package/dist/src/lib/radon/reducers.d.ts +29 -0
  83. package/dist/src/lib/radon/reducers.d.ts.map +1 -0
  84. package/dist/src/lib/radon/reducers.js +66 -0
  85. package/dist/src/lib/radon/types.d.ts +521 -0
  86. package/dist/src/lib/radon/types.d.ts.map +1 -0
  87. package/dist/src/lib/radon/types.js +936 -0
  88. package/dist/src/lib/radon/utils.d.ts +53 -0
  89. package/dist/src/lib/radon/utils.d.ts.map +1 -0
  90. package/dist/src/lib/radon/utils.js +153 -0
  91. package/dist/src/lib/rpc/index.d.ts +3 -0
  92. package/dist/src/lib/rpc/index.d.ts.map +1 -0
  93. package/dist/src/lib/rpc/index.js +19 -0
  94. package/dist/src/lib/rpc/nodes.d.ts +40 -0
  95. package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
  96. package/dist/src/lib/rpc/nodes.js +293 -0
  97. package/dist/src/lib/rpc/provider.d.ts +88 -0
  98. package/dist/src/lib/rpc/provider.d.ts.map +1 -0
  99. package/dist/src/lib/rpc/provider.js +336 -0
  100. package/dist/src/lib/rpc/reporter.d.ts +18 -0
  101. package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
  102. package/dist/src/lib/rpc/reporter.js +30 -0
  103. package/dist/src/lib/rpc/types.d.ts +409 -0
  104. package/dist/src/lib/rpc/types.d.ts.map +1 -0
  105. package/dist/src/lib/rpc/types.js +81 -0
  106. package/dist/src/lib/types.d.ts +18 -0
  107. package/dist/src/lib/types.d.ts.map +1 -0
  108. package/dist/src/lib/types.js +7 -0
  109. package/dist/src/lib/utils.d.ts +13 -0
  110. package/dist/src/lib/utils.d.ts.map +1 -0
  111. package/dist/src/lib/utils.js +97 -0
  112. package/dist/witnet/assets/index.d.ts +30 -0
  113. package/dist/witnet/assets/index.d.ts.map +1 -0
  114. package/dist/witnet/assets/index.js +6 -0
  115. package/dist/witnet/assets/modals/index.d.ts +18 -0
  116. package/dist/witnet/assets/modals/index.d.ts.map +1 -0
  117. package/dist/witnet/assets/modals/index.js +21 -0
  118. package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
  119. package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
  120. package/dist/witnet/assets/modals/web3/eth.js +26 -0
  121. package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
  122. package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
  123. package/dist/witnet/assets/modals/web3/wit.js +20 -0
  124. package/dist/witnet/assets/requests.d.ts +11 -0
  125. package/dist/witnet/assets/requests.d.ts.map +1 -0
  126. package/dist/witnet/assets/requests.js +88 -0
  127. package/dist/witnet/witnet.proto.json +1325 -0
  128. package/package.json +72 -0
  129. package/src/bin/cli/history.js +31 -0
  130. package/src/bin/cli/inspect.js +359 -0
  131. package/src/bin/cli/network.js +592 -0
  132. package/src/bin/cli/nodes.js +364 -0
  133. package/src/bin/cli/radon.js +814 -0
  134. package/src/bin/cli/wallet.js +1000 -0
  135. package/src/bin/helpers.js +829 -0
  136. package/src/bin/postinstall.js +9 -0
  137. package/src/bin/toolkit.js +294 -0
  138. package/witnet/assets/_index.js +8 -0
  139. package/witnet/assets/_requests.js +25 -0
  140. package/witnet/assets/_sources.js +36 -0
  141. package/witnet/assets/_templates.js +36 -0
  142. package/witnet/assets/index.js +4 -0
  143. package/witnet/assets/modals/index.js +25 -0
  144. package/witnet/assets/modals/web3/btc.js +0 -0
  145. package/witnet/assets/modals/web3/eth.js +29 -0
  146. package/witnet/assets/modals/web3/sol.js +0 -0
  147. package/witnet/assets/modals/web3/wit.js +23 -0
  148. package/witnet/assets/requests.js +94 -0
  149. package/witnet/witnet.proto.json +1325 -0
@@ -0,0 +1,936 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RadonString = exports.RadonMap = exports.RadonInteger = exports.RadonFloat = exports.RadonBytes = exports.RadonBoolean = exports.RadonArray = exports.RadonAny = exports.RadonScript = exports.RadonOperator = exports.RadonOperators = exports.RadonEncodings = void 0;
37
+ const cbor_1 = require("cbor");
38
+ const helpers = __importStar(require("../../bin/helpers"));
39
+ const Utils = __importStar(require("../utils"));
40
+ var RadonEncodings;
41
+ (function (RadonEncodings) {
42
+ RadonEncodings[RadonEncodings["HexString"] = 0] = "HexString";
43
+ RadonEncodings[RadonEncodings["Base64"] = 1] = "Base64";
44
+ })(RadonEncodings || (exports.RadonEncodings = RadonEncodings = {}));
45
+ var RadonOperators;
46
+ (function (RadonOperators) {
47
+ RadonOperators[RadonOperators["ArrayLength"] = 16] = "ArrayLength";
48
+ RadonOperators[RadonOperators["ArrayFilter"] = 17] = "ArrayFilter";
49
+ RadonOperators[RadonOperators["ArrayJoin"] = 18] = "ArrayJoin";
50
+ RadonOperators[RadonOperators["ArrayGetArray"] = 19] = "ArrayGetArray";
51
+ RadonOperators[RadonOperators["ArrayGetBoolean"] = 20] = "ArrayGetBoolean";
52
+ RadonOperators[RadonOperators["ArrayGetBytes"] = 21] = "ArrayGetBytes";
53
+ RadonOperators[RadonOperators["ArrayGetFloat"] = 22] = "ArrayGetFloat";
54
+ RadonOperators[RadonOperators["ArrayGetInteger"] = 23] = "ArrayGetInteger";
55
+ RadonOperators[RadonOperators["ArrayGetMap"] = 24] = "ArrayGetMap";
56
+ RadonOperators[RadonOperators["ArrayGetString"] = 25] = "ArrayGetString";
57
+ RadonOperators[RadonOperators["ArrayMap"] = 26] = "ArrayMap";
58
+ RadonOperators[RadonOperators["ArrayReduce"] = 27] = "ArrayReduce";
59
+ RadonOperators[RadonOperators["ArraySort"] = 29] = "ArraySort";
60
+ RadonOperators[RadonOperators["ArrayPick"] = 30] = "ArrayPick";
61
+ RadonOperators[RadonOperators["BooleanStringify"] = 32] = "BooleanStringify";
62
+ RadonOperators[RadonOperators["BooleanNegate"] = 34] = "BooleanNegate";
63
+ RadonOperators[RadonOperators["BytesStringify"] = 48] = "BytesStringify";
64
+ RadonOperators[RadonOperators["BytesHash"] = 49] = "BytesHash";
65
+ RadonOperators[RadonOperators["BytesAsInteger"] = 50] = "BytesAsInteger";
66
+ RadonOperators[RadonOperators["BytesLength"] = 52] = "BytesLength";
67
+ RadonOperators[RadonOperators["BytesSlice"] = 60] = "BytesSlice";
68
+ RadonOperators[RadonOperators["FloatAbsolute"] = 80] = "FloatAbsolute";
69
+ RadonOperators[RadonOperators["FloatStringify"] = 81] = "FloatStringify";
70
+ RadonOperators[RadonOperators["FloatCeiling"] = 82] = "FloatCeiling";
71
+ RadonOperators[RadonOperators["FloatGreaterThan"] = 83] = "FloatGreaterThan";
72
+ RadonOperators[RadonOperators["FloatFloor"] = 84] = "FloatFloor";
73
+ RadonOperators[RadonOperators["FloatLessThan"] = 85] = "FloatLessThan";
74
+ RadonOperators[RadonOperators["FloatModule"] = 86] = "FloatModule";
75
+ RadonOperators[RadonOperators["FloatMultiply"] = 87] = "FloatMultiply";
76
+ RadonOperators[RadonOperators["FloatNegate"] = 88] = "FloatNegate";
77
+ RadonOperators[RadonOperators["FloatPower"] = 89] = "FloatPower";
78
+ RadonOperators[RadonOperators["FloatRound"] = 91] = "FloatRound";
79
+ RadonOperators[RadonOperators["FloatTruncate"] = 93] = "FloatTruncate";
80
+ RadonOperators[RadonOperators["IntegerAbsolute"] = 64] = "IntegerAbsolute";
81
+ RadonOperators[RadonOperators["IntegerToFloat"] = 65] = "IntegerToFloat";
82
+ RadonOperators[RadonOperators["IntegerStringify"] = 66] = "IntegerStringify";
83
+ RadonOperators[RadonOperators["IntegerGreaterThan"] = 67] = "IntegerGreaterThan";
84
+ RadonOperators[RadonOperators["IntegerLessThan"] = 68] = "IntegerLessThan";
85
+ RadonOperators[RadonOperators["IntegerModulo"] = 70] = "IntegerModulo";
86
+ RadonOperators[RadonOperators["IntegerMultiply"] = 71] = "IntegerMultiply";
87
+ RadonOperators[RadonOperators["IntegerNegate"] = 72] = "IntegerNegate";
88
+ RadonOperators[RadonOperators["IntegerPower"] = 73] = "IntegerPower";
89
+ RadonOperators[RadonOperators["IntegerToBytes"] = 74] = "IntegerToBytes";
90
+ RadonOperators[RadonOperators["MapStringify"] = 96] = "MapStringify";
91
+ RadonOperators[RadonOperators["MapGetArray"] = 97] = "MapGetArray";
92
+ RadonOperators[RadonOperators["MapGetBoolean"] = 98] = "MapGetBoolean";
93
+ RadonOperators[RadonOperators["MapGetFloat"] = 100] = "MapGetFloat";
94
+ RadonOperators[RadonOperators["MapGetInteger"] = 101] = "MapGetInteger";
95
+ RadonOperators[RadonOperators["MapGetMap"] = 102] = "MapGetMap";
96
+ RadonOperators[RadonOperators["MapGetString"] = 103] = "MapGetString";
97
+ RadonOperators[RadonOperators["MapKeys"] = 104] = "MapKeys";
98
+ RadonOperators[RadonOperators["MapValues"] = 105] = "MapValues";
99
+ RadonOperators[RadonOperators["MapAlter"] = 107] = "MapAlter";
100
+ RadonOperators[RadonOperators["MapPick"] = 110] = "MapPick";
101
+ RadonOperators[RadonOperators["StringAsBoolean"] = 112] = "StringAsBoolean";
102
+ RadonOperators[RadonOperators["StringAsBytes"] = 113] = "StringAsBytes";
103
+ RadonOperators[RadonOperators["StringAsFloat"] = 114] = "StringAsFloat";
104
+ RadonOperators[RadonOperators["StringLength"] = 116] = "StringLength";
105
+ RadonOperators[RadonOperators["StringMatch"] = 117] = "StringMatch";
106
+ RadonOperators[RadonOperators["StringParseJSONArray"] = 118] = "StringParseJSONArray";
107
+ RadonOperators[RadonOperators["StringParseJSONMap"] = 119] = "StringParseJSONMap";
108
+ RadonOperators[RadonOperators["StringParseXMLMap"] = 120] = "StringParseXMLMap";
109
+ RadonOperators[RadonOperators["StringToLowerCase"] = 121] = "StringToLowerCase";
110
+ RadonOperators[RadonOperators["StringToUppserCase"] = 122] = "StringToUppserCase";
111
+ RadonOperators[RadonOperators["StringParseReplace"] = 123] = "StringParseReplace";
112
+ RadonOperators[RadonOperators["StringParseSlice"] = 124] = "StringParseSlice";
113
+ RadonOperators[RadonOperators["StringParseSplit"] = 125] = "StringParseSplit";
114
+ })(RadonOperators || (exports.RadonOperators = RadonOperators = {}));
115
+ class RadonClass {
116
+ constructor(prev) {
117
+ this.prev = prev;
118
+ }
119
+ }
120
+ class RadonOperator extends RadonClass {
121
+ constructor(opcode, params, ops) {
122
+ super(ops);
123
+ this.opcode = opcode;
124
+ this.params = params || [];
125
+ }
126
+ argsCount() {
127
+ let maxCount = 0;
128
+ this.params?.forEach(param => {
129
+ if (typeof param === 'string') {
130
+ const count = helpers.getWildcardsCountFromString(param);
131
+ if (count > maxCount)
132
+ maxCount = count;
133
+ }
134
+ else if (typeof param === 'object' && param instanceof RadonScript) {
135
+ const count = param.argsCount();
136
+ if (count > maxCount)
137
+ maxCount = count;
138
+ }
139
+ });
140
+ return Math.max(maxCount, this.prev?.argsCount() || 0);
141
+ }
142
+ disect(level = 0) {
143
+ const result = this?.prev?.disect(level) || [];
144
+ const operator = RadonOperators[this.opcode];
145
+ const inputType = `Radon${operator.split(/(?=[A-Z])/)[0]}`;
146
+ let radonCall = operator.split(/(?=[A-Z])/).slice(1).join('');
147
+ radonCall = radonCall.charAt(0).toLowerCase() + radonCall.slice(1);
148
+ let args = "";
149
+ let script;
150
+ if (this.params && this.params[0] !== undefined) {
151
+ this.params.map(param => {
152
+ if (typeof param !== 'object' || !(param instanceof RadonScript)) {
153
+ args += (typeof param === 'string' ? `"${param}"` : param.toString()) + ", ";
154
+ }
155
+ else {
156
+ script = param;
157
+ }
158
+ });
159
+ if (script)
160
+ args += "RadonOperator {";
161
+ else
162
+ args = args.slice(0, -2);
163
+ }
164
+ if (script) {
165
+ const outputType = `${script.outputType?.constructor.name || "RadonAny"}`;
166
+ radonCall += `(${args}`;
167
+ result.push([level, inputType, radonCall]);
168
+ result.push(...script.disect(level + 1));
169
+ result.push([level, outputType, "})"]);
170
+ }
171
+ else {
172
+ radonCall += `(${args})`;
173
+ result.push([level, inputType, radonCall]);
174
+ }
175
+ return result;
176
+ }
177
+ encode() {
178
+ let encoded;
179
+ if (this?.params && this.params[0] !== undefined) {
180
+ const args = this.params.map(param => {
181
+ if (typeof param === 'object') {
182
+ if (param instanceof RadonAny) {
183
+ return param.prev?.encode();
184
+ }
185
+ else if (param instanceof RadonOperator) {
186
+ return param.encode();
187
+ }
188
+ else if (param instanceof RadonScript) {
189
+ return param.encode();
190
+ }
191
+ }
192
+ else {
193
+ return param;
194
+ }
195
+ });
196
+ encoded = [this.opcode, ...args];
197
+ }
198
+ else {
199
+ encoded = this.opcode;
200
+ }
201
+ if (this.prev) {
202
+ return [...this.prev.encode(), encoded];
203
+ }
204
+ else {
205
+ return [encoded];
206
+ }
207
+ }
208
+ replaceWildcards(args) {
209
+ if (args.length < this.argsCount()) {
210
+ throw EvalError(`Insufficent args were provided (${args.length} < ${this.argsCount()})`);
211
+ }
212
+ return new RadonOperator(this.opcode, this.params?.map(param => {
213
+ if (typeof param === 'string') {
214
+ return helpers.replaceWildcards(param, args);
215
+ }
216
+ else if (typeof param === 'object' && param instanceof RadonScript) {
217
+ return param.replaceWildcards(...args);
218
+ }
219
+ else {
220
+ return param;
221
+ }
222
+ }), this?.prev?.replaceWildcards(args));
223
+ }
224
+ spliceWildcard(argIndex, argValue) {
225
+ return new RadonOperator(this.opcode, this.params?.map(param => {
226
+ if (typeof param === 'string') {
227
+ return helpers.spliceWildcard(param, argIndex, argValue, this.argsCount());
228
+ }
229
+ else if (typeof param === 'object' && param instanceof RadonScript) {
230
+ return param.spliceWildcard(argIndex, argValue);
231
+ }
232
+ else {
233
+ return param;
234
+ }
235
+ }), this?.prev?.spliceWildcard(argIndex, argValue));
236
+ }
237
+ toString(left = "", indent = 4, level = 0) {
238
+ const lf = left !== "" ? "\n" : "";
239
+ let str = this?.prev?.toString(left, indent, level) || "";
240
+ let methodName = RadonOperators[this.opcode].split(/(?=[A-Z])/).slice(1).join('');
241
+ methodName = methodName.charAt(0).toLowerCase() + methodName.slice(1);
242
+ str += `${left}${" ".repeat(indent * level)}.${methodName}(`;
243
+ if (this.params && this.params[0] !== undefined) {
244
+ this.params.forEach(param => {
245
+ if (typeof param === 'string') {
246
+ str += `"${param}", `;
247
+ }
248
+ else if (typeof param === 'object' && param instanceof RadonScript) {
249
+ str += `${param.toString(left, indent, level + 1)}${left}${" ".repeat(indent * level)}, `;
250
+ }
251
+ else {
252
+ str += param.toString() + ", ";
253
+ }
254
+ });
255
+ str = str.slice(0, -2);
256
+ }
257
+ str += `)${lf}`;
258
+ return str;
259
+ }
260
+ }
261
+ exports.RadonOperator = RadonOperator;
262
+ class RadonScript {
263
+ constructor(output) {
264
+ this.ops = output?.prev;
265
+ const radonTypes = {
266
+ "Array": RadonArray,
267
+ "Boolean": RadonBoolean,
268
+ "Bytes": RadonBytes,
269
+ "Float": RadonFloat,
270
+ "Integer": RadonInteger,
271
+ "Map": RadonMap,
272
+ "String": RadonString,
273
+ };
274
+ let input = output?.prev;
275
+ while (input?.prev)
276
+ input = input?.prev;
277
+ const inputType = Object.entries(radonTypes).find(([prefix, _]) => input && RadonOperators[input.opcode].startsWith(prefix));
278
+ if (inputType && inputType[1])
279
+ this.inputType = new inputType[1]();
280
+ const outputType = Object.values(radonTypes).find(outputType => output instanceof outputType);
281
+ if (outputType)
282
+ this.outputType = new outputType();
283
+ }
284
+ argsCount() {
285
+ return this.ops?.argsCount() || 0;
286
+ }
287
+ disect(level = 0) {
288
+ return this.ops?.disect(level) || [[level, "RadonAny", ""]];
289
+ }
290
+ encode() {
291
+ return this.ops?.encode() || [];
292
+ }
293
+ replaceWildcards(...args) {
294
+ const OutputType = [
295
+ RadonArray,
296
+ RadonBoolean,
297
+ RadonBytes,
298
+ RadonFloat,
299
+ RadonInteger,
300
+ RadonMap,
301
+ RadonString,
302
+ ].find(OutputType => this.outputType instanceof OutputType);
303
+ if (OutputType) {
304
+ return new OutputType(this.ops?.replaceWildcards(args));
305
+ }
306
+ else {
307
+ throw EvalError(`Cannot replace wildcards on empty script`);
308
+ }
309
+ }
310
+ spliceWildcard(argIndex, argValue) {
311
+ const OutputType = [
312
+ RadonArray,
313
+ RadonBoolean,
314
+ RadonBytes,
315
+ RadonFloat,
316
+ RadonInteger,
317
+ RadonMap,
318
+ RadonString,
319
+ ].find(OutputType => this.outputType instanceof OutputType);
320
+ if (OutputType) {
321
+ return new OutputType(this.ops?.spliceWildcard(argIndex, argValue));
322
+ }
323
+ else {
324
+ throw EvalError(`Cannot splice wildcards on empty script`);
325
+ }
326
+ }
327
+ toBytecode() {
328
+ return Utils.toHexString(Object.values(Uint8Array.from((0, cbor_1.encode)(this.encode()))), true);
329
+ }
330
+ toString(left = "", indent = 0, level = 0) {
331
+ const lf = left !== "" ? "\n" : "";
332
+ return `RadonOperator(${this.inputType?.constructor.name || ""})${lf}${this.ops?.toString(left, indent, level + 1)}`;
333
+ }
334
+ }
335
+ exports.RadonScript = RadonScript;
336
+ class RadonAny extends RadonClass {
337
+ _pushOperator(outputType, params) {
338
+ let name;
339
+ try {
340
+ throw new Error();
341
+ }
342
+ catch (err) {
343
+ const result = err;
344
+ name = result.stack?.split(' at ')[2]
345
+ .split(' ')[0]
346
+ .split('.')
347
+ .map(part => helpers.toUpperCamelCase(part))
348
+ .join('')
349
+ .split(/(?=[A-Z])/).slice(1)
350
+ .join('');
351
+ }
352
+ const opcode = RadonOperators[name];
353
+ if (!opcode) {
354
+ throw Error(`Fatal: unknown Radon Operator opcode '${name}'`);
355
+ }
356
+ else {
357
+ return new outputType(new RadonOperator(opcode, [...params], this?.prev));
358
+ }
359
+ }
360
+ }
361
+ exports.RadonAny = RadonAny;
362
+ class RadonArray extends RadonAny {
363
+ /**
364
+ * Discard the items in the input array that make the given `innerScript` to return a `false` value.
365
+ * @param script Filtering script ultimately returning a `RadonBoolean` object.
366
+ * Must accept as input the same data types as the ones of the items being iterated.
367
+ * @returns A `RadonArray` object containing only the items that make the `innerScript` to return a `true` value.
368
+ */
369
+ filter(innerScript) {
370
+ if (!(innerScript instanceof RadonBoolean)) {
371
+ throw new EvalError(`Inner script must fetch a RadonBoolean value`);
372
+ }
373
+ return this._pushOperator((RadonArray), [new RadonScript(innerScript)]);
374
+ }
375
+ /**
376
+ * Fetch the item at the given `index` as a `RadonArray` object.
377
+ * @param index
378
+ */
379
+ getArray(index) {
380
+ return this._pushOperator((RadonArray), [index]);
381
+ }
382
+ /**
383
+ * Fetch the item at the given `index` as a `RadonBoolean` object.
384
+ * @param index
385
+ */
386
+ getBoolean(index) {
387
+ return this._pushOperator(RadonBoolean, [index]);
388
+ }
389
+ /**
390
+ * Fetch the item at the given `index` as a `RadonBytes` object.
391
+ * @param index
392
+ */
393
+ getBytes(index) {
394
+ return this._pushOperator(RadonBytes, [index]);
395
+ }
396
+ /**
397
+ * Fetch the item at the given `index` as a `RadonFloat` object.
398
+ * @param index
399
+ */
400
+ getFloat(index) {
401
+ return this._pushOperator(RadonFloat, [index]);
402
+ }
403
+ /**
404
+ * Fetch the item at the given `index` as a `RadonInteger` object.
405
+ * @param index
406
+ */
407
+ getInteger(index) {
408
+ return this._pushOperator(RadonInteger, [index]);
409
+ }
410
+ /**
411
+ * Fetch the item at the given `index` as a `RadonMap` object.
412
+ * @param index
413
+ */
414
+ getMap(index) {
415
+ return this._pushOperator(RadonMap, [index]);
416
+ }
417
+ /**
418
+ * Fetch the item at the given `index` as a `RadonString` object.
419
+ * @param index
420
+ */
421
+ getString(index) {
422
+ return this._pushOperator(RadonString, [index]);
423
+ }
424
+ /**
425
+ * Join all items of the array into a value of the given type. The array must be homogeneous,
426
+ * all items being of the same type as the outputType`, if specified, or the Array's itemsType otherwise.
427
+ * @param separator Separator to be used when joining strings. When joining RadonMaps, it can be used to settle base schema on resulting object.
428
+ * @param outputType Radon type of the output value.
429
+ */
430
+ join(separator = "", outputType) {
431
+ if (outputType)
432
+ this._pushOperator((RadonArray), [separator]);
433
+ else
434
+ this._pushOperator((RadonArray), [separator]);
435
+ }
436
+ /**
437
+ * Count the number of items.
438
+ * @returns A `RadonInteger` object.
439
+ */
440
+ length() {
441
+ return this._pushOperator(RadonInteger, []);
442
+ }
443
+ /**
444
+ * Map all items in the array with the given `innerScript`.
445
+ * @param innerScript Mapping script returning some `RadonAny` object.
446
+ * Must accept as input the same data type as the one of the items being iterated.
447
+ * @returns A `RadonArray` object containing the mapped values.
448
+ */
449
+ map(innerScript) {
450
+ return this._pushOperator(RadonArray, [innerScript]);
451
+ }
452
+ // public map<OutputItemsType extends RadonAny>(innerScript: RadonOperator<OutputItemsType>) {
453
+ // // todo: check script's input type matches array's items type, if any ??
454
+ // return this._pushOperator(RadonArray<OutputItemsType>, [innerScript])
455
+ // }
456
+ /**
457
+ * Reduce all items in the array into a single value.
458
+ * @param reductor The reductor method to be applied. All array items must be
459
+ * convertable into float values.
460
+ * @returns A `RadonFloat` object.
461
+ */
462
+ reduce(reductor) {
463
+ return this._pushOperator(RadonFloat, [reductor]);
464
+ }
465
+ /**
466
+ * Order the array items based either on the results of applying the given `innerScript` to every item, or on the
467
+ * actual item values (as long as these are either integers or strings).
468
+ * Fails if applied on non-homegenous arrays (i.e. not all items sharing the same `RadonAny`).
469
+ * @param innerScript (Optional) Sorting script returning either a `RadonInteger` or a `RadonString` object.
470
+ * @returns A `RadonArray` object.
471
+ */
472
+ // TODO
473
+ // public sort(innerScript?: RadonOperator<RadonString | RadonInteger>) {
474
+ // return this._pushOperator(RadonArray<ItemsType>, [innerScript])
475
+ // }
476
+ /**
477
+ * Take a selection of items from the input array.
478
+ * @param indexes Indexes of the input items to take into the output array.
479
+ * @return A `RadonArray` object.
480
+ */
481
+ pick(...indexes) {
482
+ if (Array(indexes).length == 0) {
483
+ throw new EvalError(`\x1b[1;33mRadonArray::pick: a non-empty array of numbers must be provided\x1b[0m`);
484
+ }
485
+ return this._pushOperator((RadonArray), [...indexes]);
486
+ }
487
+ }
488
+ exports.RadonArray = RadonArray;
489
+ class RadonBoolean extends RadonAny {
490
+ /**
491
+ * Reverse value.
492
+ * @returns A `RadonBoolean` object.
493
+ */
494
+ negate() {
495
+ return this._pushOperator(RadonBoolean, []);
496
+ }
497
+ /**
498
+ * Cast value into a string.
499
+ * @returns A `RadonString` object.
500
+ */
501
+ stringify() {
502
+ return this._pushOperator(RadonString, []);
503
+ }
504
+ }
505
+ exports.RadonBoolean = RadonBoolean;
506
+ class RadonBytes extends RadonAny {
507
+ /**
508
+ * Convert buffer into (big-endian) integer.
509
+ * @returns A `RadonBytes` object.
510
+ */
511
+ asInteger() {
512
+ return this._pushOperator(RadonInteger, []);
513
+ }
514
+ /**
515
+ * Apply the SHA2-256 hash function.
516
+ * @returns A `RadonBytes` object.
517
+ */
518
+ hash() {
519
+ return this._pushOperator(RadonBytes, []);
520
+ }
521
+ /**
522
+ * Count the number of bytes.
523
+ * @returns A `RadonInteger` object.
524
+ */
525
+ length() {
526
+ return this._pushOperator(RadonInteger, []);
527
+ }
528
+ /**
529
+ * Returns a slice extracted from the input buffer.
530
+ * A `startIndex` of 0 refers to the beginning of the input buffer. If no `endIndex` is provided, it will be assumed
531
+ * the length of the input buffer. Negative values will be relative to the end of the input buffer.
532
+ * @param startIndex Position within input buffer where the output buffer will start.
533
+ * @param endIndex Position within input buffer where the output buffer will end
534
+ * @returns A `RadonBytes` object.
535
+ */
536
+ slice(startIndex = 0, endIndex) {
537
+ return this._pushOperator(RadonBytes, [startIndex, endIndex]);
538
+ }
539
+ /**
540
+ * Convert the input buffer into a string.
541
+ * @param encoding Enum integer value specifying the encoding schema on the output string, standing:
542
+ * 0 -> Hex string (default, if none was specified)
543
+ * 1 -> Base64 string
544
+ * @returns A `RadonString` object.
545
+ */
546
+ stringify(encoding = RadonEncodings.HexString) {
547
+ return this._pushOperator(RadonString, [encoding]);
548
+ }
549
+ }
550
+ exports.RadonBytes = RadonBytes;
551
+ RadonBytes.Encodings = RadonEncodings;
552
+ class RadonFloat extends RadonAny {
553
+ /**
554
+ * Compute the absolute value.
555
+ * @returns A `RadonFloat` object.
556
+ */
557
+ absolute() {
558
+ return this._pushOperator(RadonFloat, []);
559
+ }
560
+ /**
561
+ * Compute the lowest integer greater than or equal to the float value.
562
+ * @returns A `RadonInteger` object.
563
+ */
564
+ ceiling() {
565
+ return this._pushOperator(RadonFloat, []);
566
+ }
567
+ /**
568
+ * Compute the greatest integer less than or equal to the float value.
569
+ * @returns A `RadonInteger` object.
570
+ */
571
+ floor() {
572
+ return this._pushOperator(RadonInteger, []);
573
+ }
574
+ /**
575
+ * Determine if the float value is greater than the given `input`.
576
+ * @param input
577
+ * @returns A `RadonBoolean` object.
578
+ */
579
+ greaterThan(input) {
580
+ return this._pushOperator(RadonBoolean, [input]);
581
+ }
582
+ /**
583
+ * Determine if the float value is less than the given `input`.
584
+ * @param input
585
+ * @returns A `RadonBoolean` object.
586
+ */
587
+ lessThan(input) {
588
+ return this._pushOperator(RadonBoolean, [input]);
589
+ }
590
+ /**
591
+ * Compute the float remainder of dividing the value by the given `integer`.
592
+ * @param integer
593
+ * @returns A `RadonFloat` object.
594
+ */
595
+ modulo(integer) {
596
+ return this._pushOperator(RadonFloat, [integer]);
597
+ }
598
+ /**
599
+ * Multiply the float value by the given `factor`.
600
+ * @param factor
601
+ * @returns A `RadonFloat` object.
602
+ */
603
+ multiply(factor) {
604
+ return this._pushOperator(RadonFloat, [factor]);
605
+ }
606
+ /**
607
+ * Negate the float value.
608
+ * @returns A `RadonFloat` object.
609
+ */
610
+ negate() {
611
+ return this._pushOperator(RadonFloat, []);
612
+ }
613
+ /**
614
+ * Compute the float value raised to the power of given `exponent`
615
+ * @param exponent
616
+ * @returns A `RadonFloat` object.
617
+ */
618
+ power(exponent) {
619
+ return this._pushOperator(RadonFloat, [exponent]);
620
+ }
621
+ /**
622
+ * Round to the closest integer value.
623
+ * @returns A `RadonInteger` object.
624
+ */
625
+ round() {
626
+ return this._pushOperator(RadonInteger, []);
627
+ }
628
+ /**
629
+ * Stringify the float value.
630
+ * @returns A `RadonString` object.
631
+ */
632
+ stringify() {
633
+ return this._pushOperator(RadonString, []);
634
+ }
635
+ /**
636
+ * Take the integer part of the float value.
637
+ * @returns A `RadonInteger` object.
638
+ */
639
+ truncate() {
640
+ return this._pushOperator(RadonInteger, []);
641
+ }
642
+ }
643
+ exports.RadonFloat = RadonFloat;
644
+ class RadonInteger extends RadonAny {
645
+ /**
646
+ * Compute the absolute value.
647
+ * @returns A `RadonInteger` object.
648
+ */
649
+ absolute() {
650
+ return this._pushOperator(RadonInteger, []);
651
+ }
652
+ /**
653
+ * Determine if the integer value is greater than the given `input`.
654
+ * @param input
655
+ * @returns A `RadonBoolean` object.
656
+ */
657
+ greaterThan(input) {
658
+ return this._pushOperator(RadonBoolean, [input]);
659
+ }
660
+ /**
661
+ * Determine if the integer value is less than the given `input`.
662
+ * @param input
663
+ * @returns A `RadonBoolean` object.
664
+ */
665
+ lessThan(input) {
666
+ return this._pushOperator(RadonBoolean, [input]);
667
+ }
668
+ /**
669
+ * Compute the remainder of dividing the value by the given `integer`.
670
+ * @param integer
671
+ * @returns A `RadonFloat` object.
672
+ */
673
+ modulo(integer) {
674
+ return this._pushOperator(RadonInteger, [integer]);
675
+ }
676
+ /**
677
+ * Multiply the value by the given `integer`.
678
+ * @param integer
679
+ * @returns A `RadonInteger` object.
680
+ */
681
+ multiply(integer) {
682
+ return this._pushOperator(RadonInteger, [integer]);
683
+ }
684
+ /**
685
+ * Negate the integer value.
686
+ * @returns A `RadonFloat` object.
687
+ */
688
+ negate() {
689
+ return this._pushOperator(RadonInteger, []);
690
+ }
691
+ /**
692
+ * Compute the value raised to the power of given `exponent`
693
+ * @param exponent
694
+ * @returns A `RadonInteger` object.
695
+ */
696
+ power(exponent) {
697
+ return this._pushOperator(RadonInteger, [exponent]);
698
+ }
699
+ /**
700
+ * Stringify the value.
701
+ * @returns A `RadonString` object.
702
+ */
703
+ stringify() {
704
+ return this._pushOperator(RadonString, []);
705
+ }
706
+ /**
707
+ * Cast into a big-endian bytes buffer.
708
+ * @returns A `RadonBytes` object.
709
+ */
710
+ toBytes() {
711
+ return this._pushOperator(RadonBytes, []);
712
+ }
713
+ /**
714
+ * Cast into a float value.
715
+ * @returns A `RadonFloat` object.
716
+ */
717
+ toFloat() {
718
+ return this._pushOperator(RadonFloat, []);
719
+ }
720
+ }
721
+ exports.RadonInteger = RadonInteger;
722
+ class RadonMap extends RadonAny {
723
+ /**
724
+ * Alter the value of the item(s) identified by `keys`, applying the given `innerScript` to each one of them.
725
+ * @param key
726
+ * @param innerScript
727
+ * @returns The same RadonMap upon which this operator is executed, with the specified item(s) altered
728
+ * by the given `innerScript`.
729
+ */
730
+ // TODO
731
+ // public alter<AlteredOutputType extends RadonAny>(innerScript: RadonOperator<AlteredOutputType>, ...keys: string[]) {
732
+ // return this._pushOperator(RadonMap, [innerScript, ...keys])
733
+ // }
734
+ /**
735
+ * Fetch the array within the specified `key` field.
736
+ * @param key
737
+ * @returns A `RadonArray` object.
738
+ */
739
+ getArray(key, _itemsType) {
740
+ return this._pushOperator((RadonArray), [key]);
741
+ }
742
+ /**
743
+ * Fetch the boolean within the specified `key` field.
744
+ * @param key
745
+ * @returns A `RadonBoolean` object.
746
+ */
747
+ getBoolean(key) {
748
+ return this._pushOperator(RadonBoolean, [key]);
749
+ }
750
+ /**
751
+ * Fetch the float value within the specified `key` field.
752
+ * @param key
753
+ * @returns A `RadonFloat` object.
754
+ */
755
+ getFloat(key) {
756
+ return this._pushOperator(RadonFloat, [key]);
757
+ }
758
+ /**
759
+ * Fetch the integer value within the specified `key` field.
760
+ * @param key
761
+ * @returns A `RadonInteger` object.
762
+ */
763
+ getInteger(key) {
764
+ return this._pushOperator(RadonInteger, [key]);
765
+ }
766
+ /**
767
+ * Fetch the map object within the specified `key` field.
768
+ * @param key
769
+ * @returns A `RadonMap` object.
770
+ */
771
+ getMap(key) {
772
+ return this._pushOperator(RadonMap, [key]);
773
+ }
774
+ /**
775
+ * Fetch the string within the specified `key` field.
776
+ * @param key
777
+ * @returns A `RadonString` object.
778
+ */
779
+ getString(key) {
780
+ return this._pushOperator(RadonString, [key]);
781
+ }
782
+ /**
783
+ * Extract key names of the map into an array of strings.
784
+ * @returns A `RadonArray` object.
785
+ */
786
+ keys() {
787
+ return this._pushOperator((RadonArray), []);
788
+ }
789
+ /**
790
+ * Take a selection of items from the input map. Fails if unexistent items are referred.
791
+ * @param keys Key string of the input items to take into the output map.
792
+ * @return A `RadonMap` object.
793
+ */
794
+ pick(...keys) {
795
+ if (Array(keys).length == 0) {
796
+ throw new EvalError(`\x1b[1;33mRadonMap::pick: a non-empty array of key strings must be provided\x1b[0m`);
797
+ }
798
+ return this._pushOperator(RadonMap, [...keys]);
799
+ }
800
+ /**
801
+ * Extract the map values into an array.
802
+ * @returns A `RadonArray` object.
803
+ */
804
+ values() {
805
+ return this._pushOperator(RadonArray, []);
806
+ }
807
+ /**
808
+ * Stringify input `RadonMap` object into a JSON string.
809
+ * @return A `RadonString` object.
810
+ */
811
+ stringify() {
812
+ return this._pushOperator(RadonString, []);
813
+ }
814
+ }
815
+ exports.RadonMap = RadonMap;
816
+ class RadonString extends RadonAny {
817
+ /**
818
+ * Cast into a boolean value.
819
+ * @returns A `RadonBoolean` object.
820
+ */
821
+ asBoolean() {
822
+ return this._pushOperator(RadonBoolean, []);
823
+ }
824
+ /**
825
+ * Convert the input string into a bytes buffer.
826
+ * @param encoding Enum integer value specifying the encoding schema on the input string, standing:
827
+ * 0 -> Hex string (default, if none was specified)
828
+ * 1 -> Base64 string
829
+ * @returns A `RadonBytes` object.
830
+ */
831
+ asBytes(encoding = RadonEncodings.HexString) {
832
+ return this._pushOperator(RadonBytes, [encoding]);
833
+ }
834
+ /**
835
+ * Cast into a float number.
836
+ * @returns A `RadonFloat` object.
837
+ */
838
+ asFloat() {
839
+ return this._pushOperator(RadonFloat, []);
840
+ }
841
+ /**
842
+ * Count the number of chars.
843
+ * @returns A `RadonInteger` object.
844
+ */
845
+ length() {
846
+ return this._pushOperator(RadonInteger, []);
847
+ }
848
+ /**
849
+ * Replace the string by a value of type `outputType`, determined on whether the string value matches
850
+ * any of the keys within the provided `matchingMap`, or set to a `defaultValue` if no match is found.
851
+ * @param outputType Radon type of the output value.
852
+ * @param matchingMap Map determining the output value depending on the string value.
853
+ * @param defaultValue Value returned if no match is found.
854
+ * @returns
855
+ */
856
+ match(outputType, matchingMap, defaultValue) {
857
+ return this._pushOperator(outputType, [matchingMap, defaultValue]);
858
+ // this._bytecode = [
859
+ // 0x75,
860
+ // matchingMap,
861
+ // defaultValue
862
+ // ]
863
+ // this._method = "match"
864
+ // this._params = `{ ${Object.entries(matchingMap).map((entry: [string, any]) => `\"${entry[0]}\": ${entry[1]}, `)}}, ${defaultValue}`
865
+ // let keys: string = ""
866
+ // Object.keys(matchingMap).map((key: string) => keys += key + ";")
867
+ // return new outputType(this, keys)
868
+ }
869
+ /**
870
+ * Parse input string as an array of JSON items.
871
+ * @param jsonPaths (optional) Array of JSON paths within input `RadonString` from where to fetch items that will be appended to the output `RadonArray`.
872
+ * @returns A `RadonArray` object.
873
+ */
874
+ parseJSONArray(...jsonPaths) {
875
+ return this._pushOperator((RadonArray), [...jsonPaths]);
876
+ }
877
+ /**
878
+ * Parse string as a JSON-encoded map.
879
+ * @param jsonPath (optional) JSON path within input `RadonString` from where to extract the output `RadonMap`.
880
+ * @returns A `RadonMap` object.
881
+ */
882
+ parseJSONMap(jsonPath) {
883
+ return this._pushOperator(RadonMap, [jsonPath]);
884
+ }
885
+ /**
886
+ * Parse string as an XML-encoded map.
887
+ * @returns A `RadonMap` object.
888
+ */
889
+ parseXMLMap() {
890
+ return this._pushOperator(RadonMap, []);
891
+ }
892
+ /**
893
+ * Replace with given `replacement` string, all parts of the input string that match with given regular expression.
894
+ * @param regex Regular expression to be matched.
895
+ * @param replacement Text that will replace all occurences.
896
+ * @returns A `RadonString` object.
897
+ */
898
+ replace(regex = "", replacement = "") {
899
+ return this._pushOperator(RadonString, [regex, replacement]);
900
+ }
901
+ /**
902
+ * Returns a slice extracted from the input string.
903
+ * A `startIndex` of 0 refers to the beginning of the input string. If no `endIndex` is provided, it will be assumed
904
+ * the length of the input string. Negative values will be relative to the end of the input string.
905
+ * @param startIndex Position within input string where the output string will start.
906
+ * @param endIndex Position within input string where the output string will end.
907
+ * @returns A `RadonString` object.
908
+ */
909
+ slice(startIndex = 0, endIndex) {
910
+ return this._pushOperator(RadonString, [startIndex, endIndex]);
911
+ }
912
+ /**
913
+ * Divides input string into an array of substrings,
914
+ * @param regex The string or regular expression to use for splitting.
915
+ * @returns A `RadonArray` object.
916
+ */
917
+ split(regex = "\r") {
918
+ return this._pushOperator((RadonArray), [regex]);
919
+ }
920
+ /**
921
+ * Lower case all characters.
922
+ * @returns A `RadonString` object.
923
+ */
924
+ toLowercase() {
925
+ return this._pushOperator(RadonString, []);
926
+ }
927
+ /**
928
+ * Upper case all characters.
929
+ * @returns A `RadonString` object.
930
+ */
931
+ toUpperCase() {
932
+ return this._pushOperator(RadonString, []);
933
+ }
934
+ }
935
+ exports.RadonString = RadonString;
936
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUEyQztBQUMzQywyREFBNEM7QUFHNUMsZ0RBQWlDO0FBSWpDLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN0Qiw2REFBYSxDQUFBO0lBQ2IsdURBQVUsQ0FBQTtBQUNkLENBQUMsRUFIVyxjQUFjLDhCQUFkLGNBQWMsUUFHekI7QUFFRCxJQUFZLGNBb0VYO0FBcEVELFdBQVksY0FBYztJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQixrRUFBa0IsQ0FBQTtJQUNsQiw4REFBZ0IsQ0FBQTtJQUNoQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixzRUFBb0IsQ0FBQTtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQix3RUFBcUIsQ0FBQTtJQUNyQiw0REFBZSxDQUFBO0lBQ2Ysa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsOERBQWdCLENBQUE7SUFDaEIsNEVBQXVCLENBQUE7SUFDdkIsc0VBQW9CLENBQUE7SUFDcEIsd0VBQXFCLENBQUE7SUFDckIsOERBQWdCLENBQUE7SUFDaEIsd0VBQXFCLENBQUE7SUFDckIsa0VBQWtCLENBQUE7SUFDbEIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsd0VBQXFCLENBQUE7SUFDckIsb0VBQW1CLENBQUE7SUFDbkIsNEVBQXVCLENBQUE7SUFDdkIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsa0VBQWtCLENBQUE7SUFDbEIsc0VBQW9CLENBQUE7SUFDcEIsa0VBQWtCLENBQUE7SUFDbEIsZ0VBQWlCLENBQUE7SUFDakIsZ0VBQWlCLENBQUE7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QUFpQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBZ0IsSUFBSTtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF1QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBMUhELGtDQTBIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuY29kZSBhcyBjYm9yRW5jb2RlIH0gZnJvbSBcImNib3JcIlxyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXHJcblxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJhZG9uUmVkdWNlck9wY29kZXMgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcclxuXHJcbmV4cG9ydCB7IEhleFN0cmluZyBhcyBSYWRvbkJ5dGVjb2RlIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uRW5jb2RpbmdzIHtcclxuICAgIEhleFN0cmluZyA9IDAsXHJcbiAgICBCYXNlNjQgPSAxLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBSYWRvbk9wZXJhdG9ycyB7XHJcbiAgICBBcnJheUxlbmd0aCA9IDB4MTAsXHJcbiAgICBBcnJheUZpbHRlciA9IDB4MTEsXHJcbiAgICBBcnJheUpvaW4gPSAweDEyLFxyXG4gICAgQXJyYXlHZXRBcnJheSA9IDB4MTMsXHJcbiAgICBBcnJheUdldEJvb2xlYW4gPSAweDE0LFxyXG4gICAgQXJyYXlHZXRCeXRlcyA9IDB4MTUsXHJcbiAgICBBcnJheUdldEZsb2F0ID0gMHgxNixcclxuICAgIEFycmF5R2V0SW50ZWdlciA9IDB4MTcsXHJcbiAgICBBcnJheUdldE1hcCA9IDB4MTgsXHJcbiAgICBBcnJheUdldFN0cmluZyA9IDB4MTksXHJcbiAgICBBcnJheU1hcCA9IDB4MWEsXHJcbiAgICBBcnJheVJlZHVjZSA9IDB4MWIsXHJcbiAgICBBcnJheVNvcnQgPSAweDFkLFxyXG4gICAgQXJyYXlQaWNrID0gMHgxZSxcclxuICAgIEJvb2xlYW5TdHJpbmdpZnkgPSAweDIwLFxyXG4gICAgQm9vbGVhbk5lZ2F0ZSA9IDB4MjIsXHJcbiAgICBCeXRlc1N0cmluZ2lmeSA9IDB4MzAsXHJcbiAgICBCeXRlc0hhc2ggPSAweDMxLFxyXG4gICAgQnl0ZXNBc0ludGVnZXIgPSAweDMyLFxyXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxyXG4gICAgQnl0ZXNTbGljZSA9IDB4M2MsXHJcbiAgICBGbG9hdEFic29sdXRlID0gMHg1MCxcclxuICAgIEZsb2F0U3RyaW5naWZ5ID0gMHg1MSxcclxuICAgIEZsb2F0Q2VpbGluZyA9IDB4NTIsXHJcbiAgICBGbG9hdEdyZWF0ZXJUaGFuID0gMHg1MyxcclxuICAgIEZsb2F0Rmxvb3IgPSAweDU0LFxyXG4gICAgRmxvYXRMZXNzVGhhbiA9IDB4NTUsXHJcbiAgICBGbG9hdE1vZHVsZSA9IDB4NTYsXHJcbiAgICBGbG9hdE11bHRpcGx5ID0gMHg1NyxcclxuICAgIEZsb2F0TmVnYXRlID0gMHg1OCxcclxuICAgIEZsb2F0UG93ZXIgPSAweDU5LFxyXG4gICAgRmxvYXRSb3VuZCA9IDB4NWIsXHJcbiAgICBGbG9hdFRydW5jYXRlID0gMHg1ZCxcclxuICAgIEludGVnZXJBYnNvbHV0ZSA9IDB4NDAsXHJcbiAgICBJbnRlZ2VyVG9GbG9hdCA9IDB4NDEsXHJcbiAgICBJbnRlZ2VyU3RyaW5naWZ5ID0gMHg0MixcclxuICAgIEludGVnZXJHcmVhdGVyVGhhbiA9IDB4NDMsXHJcbiAgICBJbnRlZ2VyTGVzc1RoYW4gPSAweDQ0LFxyXG4gICAgSW50ZWdlck1vZHVsbyA9IDB4NDYsXHJcbiAgICBJbnRlZ2VyTXVsdGlwbHkgPSAweDQ3LFxyXG4gICAgSW50ZWdlck5lZ2F0ZSA9IDB4NDgsXHJcbiAgICBJbnRlZ2VyUG93ZXIgPSAweDQ5LFxyXG4gICAgSW50ZWdlclRvQnl0ZXMgPSAweDRhLFxyXG4gICAgTWFwU3RyaW5naWZ5ID0gMHg2MCxcclxuICAgIE1hcEdldEFycmF5ID0gMHg2MSxcclxuICAgIE1hcEdldEJvb2xlYW4gPSAweDYyLFxyXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxyXG4gICAgTWFwR2V0SW50ZWdlciA9IDB4NjUsXHJcbiAgICBNYXBHZXRNYXAgPSAweDY2LFxyXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcclxuICAgIE1hcEtleXMgPSAweDY4LFxyXG4gICAgTWFwVmFsdWVzID0gMHg2OSxcclxuICAgIE1hcEFsdGVyID0gMHg2YixcclxuICAgIE1hcFBpY2sgPSAweDZlLCAgIFxyXG4gICAgU3RyaW5nQXNCb29sZWFuID0gMHg3MCxcclxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxyXG4gICAgU3RyaW5nQXNGbG9hdCA9IDB4NzIsXHJcbiAgICBTdHJpbmdMZW5ndGggPSAweDc0LFxyXG4gICAgU3RyaW5nTWF0Y2ggPSAweDc1LFxyXG4gICAgU3RyaW5nUGFyc2VKU09OQXJyYXkgPSAweDc2LFxyXG4gICAgU3RyaW5nUGFyc2VKU09OTWFwID0gMHg3NyxcclxuICAgIFN0cmluZ1BhcnNlWE1MTWFwID0gMHg3OCxcclxuICAgIFN0cmluZ1RvTG93ZXJDYXNlID0gMHg3OSxcclxuICAgIFN0cmluZ1RvVXBwc2VyQ2FzZSA9IDB4N2EsXHJcbiAgICBTdHJpbmdQYXJzZVJlcGxhY2UgPSAweDdiLFxyXG4gICAgU3RyaW5nUGFyc2VTbGljZSA9IDB4N2MsXHJcbiAgICBTdHJpbmdQYXJzZVNwbGl0ID0gMHg3ZCxcclxufVxyXG5cclxuYWJzdHJhY3QgY2xhc3MgUmFkb25DbGFzcyB7XHJcbiAgICByZWFkb25seSBwcmV2PzogUmFkb25PcGVyYXRvcjtcclxuICAgIGNvbnN0cnVjdG9yKHByZXY/OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2ID0gcHJldlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25PcGVyYXRvciBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcmVhZG9ubHkgb3Bjb2RlOiBSYWRvbk9wZXJhdG9yc1xyXG4gICAgcmVhZG9ubHkgcGFyYW1zPzogYW55W11cclxuICAgIGNvbnN0cnVjdG9yKG9wY29kZTogUmFkb25PcGVyYXRvcnMsIHBhcmFtcz86IGFueVtdLCBvcHM/OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgc3VwZXIob3BzKVxyXG4gICAgICAgIHRoaXMub3Bjb2RlID0gb3Bjb2RlXHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW11cclxuICAgIH1cclxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHsgXHJcbiAgICAgICAgbGV0IG1heENvdW50OiBudW1iZXIgPSAwXHJcbiAgICAgICAgdGhpcy5wYXJhbXM/LmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBoZWxwZXJzLmdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhwYXJhbSlcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSBtYXhDb3VudCA9IGNvdW50XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHBhcmFtLmFyZ3NDb3VudCgpXHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgIG1heENvdW50LFxyXG4gICAgICAgICAgICB0aGlzLnByZXY/LmFyZ3NDb3VudCgpIHx8IDBcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzPy5wcmV2Py5kaXNlY3QobGV2ZWwpIHx8IFtdXHJcbiAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBSYWRvbk9wZXJhdG9yc1t0aGlzLm9wY29kZV1cclxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBgUmFkb24ke29wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKVswXX1gXHJcbiAgICAgICAgbGV0IHJhZG9uQ2FsbCA9IG9wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxyXG4gICAgICAgIHJhZG9uQ2FsbCA9IHJhZG9uQ2FsbC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHJhZG9uQ2FsbC5zbGljZSgxKVxyXG4gICAgICAgIGxldCBhcmdzID0gXCJcIlxyXG4gICAgICAgIGxldCBzY3JpcHRcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5tYXAocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcgfHwgIShwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycgPyAgYFwiJHtwYXJhbX1cImAgOiBwYXJhbS50b1N0cmluZygpKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAoc2NyaXB0KSBhcmdzICs9IFwiUmFkb25PcGVyYXRvciB7XCJcclxuICAgICAgICAgICAgZWxzZSBhcmdzID0gYXJncy5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjcmlwdCkge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gYCR7KHNjcmlwdCBhcyBSYWRvblNjcmlwdCkub3V0cHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlJhZG9uQW55XCJ9YFxyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxyXG4gICAgICAgICAgICByZXN1bHQucHVzaChbbGV2ZWwsIGlucHV0VHlwZSwgcmFkb25DYWxsXSlcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uKHNjcmlwdCBhcyBSYWRvblNjcmlwdCkuZGlzZWN0KGxldmVsICsgMSkpXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9KWBcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10geyBcclxuICAgICAgICBsZXQgZW5jb2RlZFxyXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnByZXY/LmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uT3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5lbmNvZGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVuY29kZWQgPSBbdGhpcy5vcGNvZGUsIC4uLmFyZ3NdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMub3Bjb2RlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzLnByZXYuZW5jb2RlKCksIGVuY29kZWRdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgdGhpcy5hcmdzQ291bnQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYEluc3VmZmljZW50IGFyZ3Mgd2VyZSBwcm92aWRlZCAoJHthcmdzLmxlbmd0aH0gPCAke3RoaXMuYXJnc0NvdW50KCl9KWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsIFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnJlcGxhY2VXaWxkY2FyZHMoLi4uYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgdGhpcz8ucHJldj8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRvbk9wZXJhdG9yKFxyXG4gICAgICAgICAgICB0aGlzLm9wY29kZSxcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXM/Lm1hcChwYXJhbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXJzLnNwbGljZVdpbGRjYXJkKHBhcmFtLCBhcmdJbmRleCwgYXJnVmFsdWUsIHRoaXMuYXJnc0NvdW50KCkpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgdGhpcz8ucHJldj8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gNCwgbGV2ZWwgPSAwKTogc3RyaW5nIHsgXHJcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcclxuICAgICAgICBsZXQgc3RyID0gdGhpcz8ucHJldj8udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCkgfHwgXCJcIlxyXG4gICAgICAgIGxldCBtZXRob2ROYW1lID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxyXG4gICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbWV0aG9kTmFtZS5zbGljZSgxKVxyXG4gICAgICAgIHN0ciArPSBgJHtsZWZ0fSR7XCIgXCIucmVwZWF0KGluZGVudCAqIGxldmVsKX0uJHttZXRob2ROYW1lfShgXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHsgXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYFwiJHtwYXJhbX1cIiwgYFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYCR7cGFyYW0udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCArIDEpfSR7bGVmdH0ke1wiIFwiLnJlcGVhdChpbmRlbnQgKiBsZXZlbCl9LCBgXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSBwYXJhbS50b1N0cmluZygpICsgXCIsIFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RyICs9IGApJHtsZn1gXHJcbiAgICAgICAgcmV0dXJuIHN0clxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TY3JpcHQge1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wcz86IFJhZG9uT3BlcmF0b3I7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRUeXBlPzogUmFkb25Bbnk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0VHlwZT86IFJhZG9uQW55O1xyXG4gICAgY29uc3RydWN0b3IgKG91dHB1dDogUmFkb25BbnkpIHtcclxuICAgICAgICB0aGlzLm9wcyA9IG91dHB1dD8ucHJldjtcclxuICAgICAgICBjb25zdCByYWRvblR5cGVzID0ge1xyXG4gICAgICAgICAgICBcIkFycmF5XCI6IFJhZG9uQXJyYXksXHJcbiAgICAgICAgICAgIFwiQm9vbGVhblwiOiBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFwiQnl0ZXNcIjogUmFkb25CeXRlcyxcclxuICAgICAgICAgICAgXCJGbG9hdFwiOiBSYWRvbkZsb2F0LFxyXG4gICAgICAgICAgICBcIkludGVnZXJcIjogUmFkb25JbnRlZ2VyLFxyXG4gICAgICAgICAgICBcIk1hcFwiOiBSYWRvbk1hcCxcclxuICAgICAgICAgICAgXCJTdHJpbmdcIjogUmFkb25TdHJpbmcsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbnB1dCA9IG91dHB1dD8ucHJldlxyXG4gICAgICAgIHdoaWxlIChpbnB1dD8ucHJldikgaW5wdXQgPSBpbnB1dD8ucHJldlxyXG4gICAgICAgIGNvbnN0IGlucHV0VHlwZSA9IE9iamVjdC5lbnRyaWVzKHJhZG9uVHlwZXMpLmZpbmQoKFtwcmVmaXgsIF9dKSA9PiBpbnB1dCAmJiBSYWRvbk9wZXJhdG9yc1tpbnB1dC5vcGNvZGVdLnN0YXJ0c1dpdGgocHJlZml4KSlcclxuICAgICAgICBpZiAoaW5wdXRUeXBlICYmIGlucHV0VHlwZVsxXSkgdGhpcy5pbnB1dFR5cGUgPSBuZXcgaW5wdXRUeXBlWzFdKClcclxuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gT2JqZWN0LnZhbHVlcyhyYWRvblR5cGVzKS5maW5kKG91dHB1dFR5cGUgPT4gb3V0cHV0IGluc3RhbmNlb2Ygb3V0cHV0VHlwZSk7XHJcbiAgICAgICAgaWYgKG91dHB1dFR5cGUpIHRoaXMub3V0cHV0VHlwZSA9IG5ldyBvdXRwdXRUeXBlKClcclxuICAgIH1cclxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmFyZ3NDb3VudCgpIHx8IDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmRpc2VjdChsZXZlbCkgfHwgW1tsZXZlbCwgXCJSYWRvbkFueVwiLCBcIlwiXV1cclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wcz8uZW5jb2RlKCkgfHwgW107XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcmVwbGFjZVdpbGRjYXJkcyguLi5hcmdzOiBzdHJpbmdbXSk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcz8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCByZXBsYWNlIHdpbGRjYXJkcyBvbiBlbXB0eSBzY3JpcHRgKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25Bbnkge1xyXG4gICAgICAgIGNvbnN0IE91dHB1dFR5cGUgPSBbXHJcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXHJcbiAgICAgICAgICAgIFJhZG9uQm9vbGVhbixcclxuICAgICAgICAgICAgUmFkb25CeXRlcyxcclxuICAgICAgICAgICAgUmFkb25GbG9hdCxcclxuICAgICAgICAgICAgUmFkb25JbnRlZ2VyLFxyXG4gICAgICAgICAgICBSYWRvbk1hcCxcclxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXHJcbiAgICAgICAgXS5maW5kKE91dHB1dFR5cGUgPT4gdGhpcy5vdXRwdXRUeXBlIGluc3RhbmNlb2YgT3V0cHV0VHlwZSk7XHJcbiAgICAgICAgaWYgKE91dHB1dFR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IEV2YWxFcnJvcihgQ2Fubm90IHNwbGljZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBVdGlscy50b0hleFN0cmluZyhPYmplY3QudmFsdWVzKFVpbnQ4QXJyYXkuZnJvbShjYm9yRW5jb2RlKHRoaXMuZW5jb2RlKCkpKSksIHRydWUpXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9TdHJpbmcobGVmdCA9IFwiXCIsIGluZGVudCA9IDAsIGxldmVsID0gMCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcclxuICAgICAgICByZXR1cm4gYFJhZG9uT3BlcmF0b3IoJHt0aGlzLmlucHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlwifSkke2xmfSR7dGhpcy5vcHM/LnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwgKyAxKX1gXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSYWRvbkFueSBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcHJvdGVjdGVkIF9wdXNoT3BlcmF0b3I8T3V0cHV0VHlwZSBleHRlbmRzIFJhZG9uQW55PihcclxuICAgICAgICBvdXRwdXRUeXBlOiB7IG5ldyhvcHM/OiBSYWRvbk9wZXJhdG9yKTogT3V0cHV0VHlwZTsgfSwgXHJcbiAgICAgICAgcGFyYW1zOiBhbnlbXSxcclxuICAgICk6IE91dHB1dFR5cGUge1xyXG4gICAgICAgIGxldCBuYW1lXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IChlcnIgYXMgRXJyb3IpXHJcbiAgICAgICAgICAgIG5hbWUgPSByZXN1bHQuc3RhY2s/LnNwbGl0KCcgYXQgJylbMl1cclxuICAgICAgICAgICAgICAgIC5zcGxpdCgnICcpWzBdXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJy4nKVxyXG4gICAgICAgICAgICAgICAgLm1hcChwYXJ0ID0+IGhlbHBlcnMudG9VcHBlckNhbWVsQ2FzZShwYXJ0KSlcclxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKVxyXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wY29kZSA9IFJhZG9uT3BlcmF0b3JzW25hbWUgYXMga2V5b2YgdHlwZW9mIFJhZG9uT3BlcmF0b3JzXVxyXG4gICAgICAgIGlmICghb3Bjb2RlKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBGYXRhbDogdW5rbm93biBSYWRvbiBPcGVyYXRvciBvcGNvZGUgJyR7bmFtZX0nYClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IG91dHB1dFR5cGUobmV3IFJhZG9uT3BlcmF0b3IoXHJcbiAgICAgICAgICAgICAgICBvcGNvZGUsIFxyXG4gICAgICAgICAgICAgICAgWy4uLnBhcmFtc10sIFxyXG4gICAgICAgICAgICAgICAgdGhpcz8ucHJldlxyXG4gICAgICAgICAgICApKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55PiB7XHJcbiAgICBpdGVtc1R5cGU6IEl0ZW1zVHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQXJyYXk8SXRlbXNUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvbkFueT4gZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIERpc2NhcmQgdGhlIGl0ZW1zIGluIHRoZSBpbnB1dCBhcnJheSB0aGF0IG1ha2UgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYGZhbHNlYCB2YWx1ZS4gXHJcbiAgICAgKiBAcGFyYW0gc2NyaXB0IEZpbHRlcmluZyBzY3JpcHQgdWx0aW1hdGVseSByZXR1cm5pbmcgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKiBNdXN0IGFjY2VwdCBhcyBpbnB1dCB0aGUgc2FtZSBkYXRhIHR5cGVzIGFzIHRoZSBvbmVzIG9mIHRoZSBpdGVtcyBiZWluZyBpdGVyYXRlZC4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyB0aGF0IG1ha2UgdGhlIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYHRydWVgIHZhbHVlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbHRlcihpbm5lclNjcmlwdDogUmFkb25Cb29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCEoaW5uZXJTY3JpcHQgaW5zdGFuY2VvZiBSYWRvbkJvb2xlYW4pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYElubmVyIHNjcmlwdCBtdXN0IGZldGNoIGEgUmFkb25Cb29sZWFuIHZhbHVlYClcclxuICAgICAgICB9IFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbbmV3IFJhZG9uU2NyaXB0KGlubmVyU2NyaXB0KV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFycmF5PFN1Ykl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8U3ViSXRlbXNUeXBlPiwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCb29sZWFuKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Qnl0ZXMoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbnRlZ2VyKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25NYXBgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1hcChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSm9pbiBhbGwgaXRlbXMgb2YgdGhlIGFycmF5IGludG8gYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gVGhlIGFycmF5IG11c3QgYmUgaG9tb2dlbmVvdXMsIFxyXG4gICAgICogYWxsIGl0ZW1zIGJlaW5nIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG91dHB1dFR5cGVgLCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBBcnJheSdzIGl0ZW1zVHlwZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFNlcGFyYXRvciB0byBiZSB1c2VkIHdoZW4gam9pbmluZyBzdHJpbmdzLiBXaGVuIGpvaW5pbmcgUmFkb25NYXBzLCBpdCBjYW4gYmUgdXNlZCB0byBzZXR0bGUgYmFzZSBzY2hlbWEgb24gcmVzdWx0aW5nIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlIFJhZG9uIHR5cGUgb2YgdGhlIG91dHB1dCB2YWx1ZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqb2luPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihzZXBhcmF0b3IgPSBcIlwiLCBvdXRwdXRUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XHJcbiAgICAgICAgaWYgKG91dHB1dFR5cGUpIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PE91dHB1dFR5cGU+LCBbc2VwYXJhdG9yXSlcclxuICAgICAgICBlbHNlIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PEl0ZW1zVHlwZT4sIFtzZXBhcmF0b3JdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGl0ZW1zLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVuZ3RoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWFwIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgTWFwcGluZyBzY3JpcHQgcmV0dXJuaW5nIHNvbWUgYFJhZG9uQW55YCBvYmplY3QuXHJcbiAgICAgKiBNdXN0IGFjY2VwdCBhcyBpbnB1dCB0aGUgc2FtZSBkYXRhIHR5cGUgYXMgdGhlIG9uZSBvZiB0aGUgaXRlbXMgYmVpbmcgaXRlcmF0ZWQuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcHBlZCB2YWx1ZXMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKGlubmVyU2NyaXB0OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgfVxyXG4gICAgLy8gcHVibGljIG1hcDxPdXRwdXRJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8T3V0cHV0SXRlbXNUeXBlPikge1xyXG4gICAgLy8gICAgIC8vIHRvZG86IGNoZWNrIHNjcmlwdCdzIGlucHV0IHR5cGUgbWF0Y2hlcyBhcnJheSdzIGl0ZW1zIHR5cGUsIGlmIGFueSA/P1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgLy8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWR1Y2UgYWxsIGl0ZW1zIGluIHRoZSBhcnJheSBpbnRvIGEgc2luZ2xlIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHJlZHVjdG9yIFRoZSByZWR1Y3RvciBtZXRob2QgdG8gYmUgYXBwbGllZC4gQWxsIGFycmF5IGl0ZW1zIG11c3QgYmUgXHJcbiAgICAgKiBjb252ZXJ0YWJsZSBpbnRvIGZsb2F0IHZhbHVlcy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZHVjZShyZWR1Y3RvcjogUmFkb25SZWR1Y2VyT3Bjb2Rlcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW3JlZHVjdG9yXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3JkZXIgdGhlIGFycmF5IGl0ZW1zIGJhc2VkIGVpdGhlciBvbiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YCB0byBldmVyeSBpdGVtLCBvciBvbiB0aGUgXHJcbiAgICAgKiBhY3R1YWwgaXRlbSB2YWx1ZXMgKGFzIGxvbmcgYXMgdGhlc2UgYXJlIGVpdGhlciBpbnRlZ2VycyBvciBzdHJpbmdzKS5cclxuICAgICAqIEZhaWxzIGlmIGFwcGxpZWQgb24gbm9uLWhvbWVnZW5vdXMgYXJyYXlzIChpLmUuIG5vdCBhbGwgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBgUmFkb25BbnlgKS4gXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgKE9wdGlvbmFsKSBTb3J0aW5nIHNjcmlwdCByZXR1cm5pbmcgZWl0aGVyIGEgYFJhZG9uSW50ZWdlcmAgb3IgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgLy8gVE9ET1xyXG4gICAgLy8gcHVibGljIHNvcnQoaW5uZXJTY3JpcHQ/OiBSYWRvbk9wZXJhdG9yPFJhZG9uU3RyaW5nIHwgUmFkb25JbnRlZ2VyPikge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgLy8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxyXG4gICAgICogQHBhcmFtIGluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgYXJyYXkuIFxyXG4gICAgICogQHJldHVybiBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmluZGV4ZXM6IG51bWJlcltdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGluZGV4ZXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgWy4uLmluZGV4ZXNdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXZlcnNlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQnl0ZXMgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmdzID0gUmFkb25FbmNvZGluZ3M7XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgYnVmZmVyIGludG8gKGJpZy1lbmRpYW4pIGludGVnZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc0ludGVnZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBieXRlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiBcclxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxyXG4gICAgICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgYnVmZmVyIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtzdGFydEluZGV4LCBlbmRJbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBpbnRvIGEgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIG91dHB1dCBzdHJpbmcsIHN0YW5kaW5nOlxyXG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcclxuICAgICAqICAgMSAtPiBCYXNlNjQgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5naWZ5KGVuY29kaW5nID0gUmFkb25FbmNvZGluZ3MuSGV4U3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW2VuY29kaW5nXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uRmxvYXQgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGFic29sdXRlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzb2x1dGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgbG93ZXN0IGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNlaWxpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmxvb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC5cclxuICAgICAqIEBwYXJhbSBpbnB1dCBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXHJcbiAgICAgKiBAcGFyYW0gaW50ZWdlciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZHVsbyhpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbnRlZ2VyXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhlIGZsb2F0IHZhbHVlIGJ5IHRoZSBnaXZlbiBgZmFjdG9yYC5cclxuICAgICAqIEBwYXJhbSBmYWN0b3IgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoZmFjdG9yOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtmYWN0b3JdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGZsb2F0IHZhbHVlLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGdpdmVuIGBleHBvbmVudGBcclxuICAgICAqIEBwYXJhbSBleHBvbmVudFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG93ZXIoZXhwb25lbnQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2V4cG9uZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUm91bmQgdG8gdGhlIGNsb3Nlc3QgaW50ZWdlciB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm91bmQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGFrZSB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBmbG9hdCB2YWx1ZS4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRydW5jYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uSW50ZWdlciBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic29sdXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGludGVnZXIgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLiBcclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxyXG4gICAgICogQHBhcmFtIGludGVnZXIgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGludGVnZXIgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBnaXZlbiBgZXhwb25lbnRgXHJcbiAgICAgKiBAcGFyYW0gZXhwb25lbnRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG93ZXIoZXhwb25lbnQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbZXhwb25lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgdGhlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9GbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIEFsdGVyIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbShzKSBpZGVudGlmaWVkIGJ5IGBrZXlzYCwgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZWFjaCBvbmUgb2YgdGhlbS5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgc2FtZSBSYWRvbk1hcCB1cG9uIHdoaWNoIHRoaXMgb3BlcmF0b3IgaXMgZXhlY3V0ZWQsIHdpdGggdGhlIHNwZWNpZmllZCBpdGVtKHMpIGFsdGVyZWRcclxuICAgICAqIGJ5IHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgLlxyXG4gICAgICovXHJcbiAgICAvLyBUT0RPXHJcbiAgICAvLyBwdWJsaWMgYWx0ZXI8QWx0ZXJlZE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8QWx0ZXJlZE91dHB1dFR5cGU+LCAuLi5rZXlzOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtpbm5lclNjcmlwdCwgLi4ua2V5c10pXHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBhcnJheSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihrZXk6IHN0cmluZywgX2l0ZW1zVHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBmbG9hdCB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEludGVnZXIoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWFwKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtrZXldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHRyYWN0IGtleSBuYW1lcyBvZiB0aGUgbWFwIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgYSBzZWxlY3Rpb24gb2YgaXRlbXMgZnJvbSB0aGUgaW5wdXQgbWFwLiBGYWlscyBpZiB1bmV4aXN0ZW50IGl0ZW1zIGFyZSByZWZlcnJlZC5cclxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXHJcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGtleXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25NYXA6OnBpY2s6IGEgbm9uLWVtcHR5IGFycmF5IG9mIGtleSBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWRcXHgxYlswbWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFsuLi5rZXlzXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3QgdGhlIG1hcCB2YWx1ZXMgaW50byBhbiBhcnJheS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxyXG4gICAgICogQHJldHVybiBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TdHJpbmcgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGJvb2xlYW4gdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzQm9vbGVhbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IHN0cmluZyBpbnRvIGEgYnl0ZXMgYnVmZmVyLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIGlucHV0IHN0cmluZywgc3RhbmRpbmc6XHJcbiAgICAgKiAgIDAgLT4gSGV4IHN0cmluZyAoZGVmYXVsdCwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkKVxyXG4gICAgICogICAxIC0+IEJhc2U2NCBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzQnl0ZXMoZW5jb2RpbmcgPSBSYWRvbkVuY29kaW5ncy5IZXhTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtlbmNvZGluZ10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IG51bWJlci5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzRmxvYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBjaGFycy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2UgdGhlIHN0cmluZyBieSBhIHZhbHVlIG9mIHR5cGUgYG91dHB1dFR5cGVgLCBkZXRlcm1pbmVkIG9uIHdoZXRoZXIgdGhlIHN0cmluZyB2YWx1ZSBtYXRjaGVzIFxyXG4gICAgICogYW55IG9mIHRoZSBrZXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgYG1hdGNoaW5nTWFwYCwgb3Igc2V0IHRvIGEgYGRlZmF1bHRWYWx1ZWAgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXHJcbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxyXG4gICAgICogQHBhcmFtIG1hdGNoaW5nTWFwIE1hcCBkZXRlcm1pbmluZyB0aGUgb3V0cHV0IHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc3RyaW5nIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBWYWx1ZSByZXR1cm5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZC4gXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hdGNoPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uU3RyaW5nPihcclxuICAgICAgICBvdXRwdXRUeXBlOiB7IG5ldyhwcmV2PzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxyXG4gICAgICAgIG1hdGNoaW5nTWFwOiBNYXA8c3RyaW5nLCBhbnk+LCBcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IGFueVxyXG4gICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihvdXRwdXRUeXBlLCBbbWF0Y2hpbmdNYXAsIGRlZmF1bHRWYWx1ZV0pXHJcbiAgICAgICAgLy8gdGhpcy5fYnl0ZWNvZGUgPSBbIFxyXG4gICAgICAgIC8vICAgICAweDc1LCAgXHJcbiAgICAgICAgLy8gICAgIG1hdGNoaW5nTWFwLFxyXG4gICAgICAgIC8vICAgICBkZWZhdWx0VmFsdWVcclxuICAgICAgICAvLyBdXHJcbiAgICAgICAgLy8gdGhpcy5fbWV0aG9kID0gXCJtYXRjaFwiXHJcbiAgICAgICAgLy8gdGhpcy5fcGFyYW1zID0gYHsgJHtPYmplY3QuZW50cmllcyhtYXRjaGluZ01hcCkubWFwKChlbnRyeTogW3N0cmluZywgYW55XSkgPT4gYFxcXCIke2VudHJ5WzBdfVxcXCI6ICR7ZW50cnlbMV19LCBgKX19LCAke2RlZmF1bHRWYWx1ZX1gXHJcbiAgICAgICAgLy8gbGV0IGtleXM6IHN0cmluZyA9IFwiXCJcclxuICAgICAgICAvLyBPYmplY3Qua2V5cyhtYXRjaGluZ01hcCkubWFwKChrZXk6IHN0cmluZykgPT4ga2V5cyArPSBrZXkgKyBcIjtcIilcclxuICAgICAgICAvLyByZXR1cm4gbmV3IG91dHB1dFR5cGUodGhpcywga2V5cylcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2UgaW5wdXQgc3RyaW5nIGFzIGFuIGFycmF5IG9mIEpTT04gaXRlbXMuIFxyXG4gICAgICogQHBhcmFtIGpzb25QYXRocyAob3B0aW9uYWwpIEFycmF5IG9mIEpTT04gcGF0aHMgd2l0aGluIGlucHV0IGBSYWRvblN0cmluZ2AgZnJvbSB3aGVyZSB0byBmZXRjaCBpdGVtcyB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIG91dHB1dCBgUmFkb25BcnJheWAuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VKU09OQXJyYXkoLi4uanNvblBhdGhzOiBzdHJpbmdbXSk6IFJhZG9uQXJyYXk8UmFkb25Bbnk+IHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uQW55PiwgWy4uLmpzb25QYXRoc10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIHN0cmluZyBhcyBhIEpTT04tZW5jb2RlZCBtYXAuIFxyXG4gICAgICogQHBhcmFtIGpzb25QYXRoIChvcHRpb25hbCkgSlNPTiBwYXRoIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZXh0cmFjdCB0aGUgb3V0cHV0IGBSYWRvbk1hcGAuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25NYXBgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZUpTT05NYXAoanNvblBhdGg/OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbanNvblBhdGhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBzdHJpbmcgYXMgYW4gWE1MLWVuY29kZWQgbWFwLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZVhNTE1hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZSB3aXRoIGdpdmVuIGByZXBsYWNlbWVudGAgc3RyaW5nLCBhbGwgcGFydHMgb2YgdGhlIGlucHV0IHN0cmluZyB0aGF0IG1hdGNoIHdpdGggZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiBcclxuICAgICAqIEBwYXJhbSByZWdleCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgbWF0Y2hlZC5cclxuICAgICAqIEBwYXJhbSByZXBsYWNlbWVudCBUZXh0IHRoYXQgd2lsbCByZXBsYWNlIGFsbCBvY2N1cmVuY2VzLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXBsYWNlKHJlZ2V4OiBzdHJpbmcgPSBcIlwiLCByZXBsYWNlbWVudDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtyZWdleCwgcmVwbGFjZW1lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgc2xpY2UgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IHN0cmluZy4gXHJcbiAgICAgKiBBIGBzdGFydEluZGV4YCBvZiAwIHJlZmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuIElmIG5vIGBlbmRJbmRleGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYXNzdW1lZCBcclxuICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmluZy4gTmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHN0YXJ0SW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IHN0cmluZyB3aGVyZSB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIHN0YXJ0LlxyXG4gICAgICogQHBhcmFtIGVuZEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBlbmQuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXZpZGVzIGlucHV0IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN1YnN0cmluZ3MsIFxyXG4gICAgICogQHBhcmFtIHJlZ2V4IFRoZSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uIHRvIHVzZSBmb3Igc3BsaXR0aW5nLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaXQocmVnZXg6IHN0cmluZyA9IFwiXFxyXCIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbcmVnZXhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb3dlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvTG93ZXJjYXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcHBlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvVXBwZXJDYXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcbiJdfQ==