@witnet/sdk 1.1.3 → 1.2.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.
- package/.env_witnet +13 -1
- package/dist/package.json +31 -24
- package/dist/src/bin/helpers.d.ts +59 -49
- package/dist/src/bin/helpers.d.ts.map +1 -1
- package/dist/src/bin/helpers.js +228 -229
- package/dist/src/index.d.ts +3 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -47
- package/dist/src/lib/crypto/account.d.ts +3 -3
- package/dist/src/lib/crypto/account.d.ts.map +1 -1
- package/dist/src/lib/crypto/account.js +31 -25
- package/dist/src/lib/crypto/coinbase.d.ts +4 -4
- package/dist/src/lib/crypto/coinbase.d.ts.map +1 -1
- package/dist/src/lib/crypto/coinbase.js +8 -13
- package/dist/src/lib/crypto/index.d.ts +7 -7
- package/dist/src/lib/crypto/index.d.ts.map +1 -1
- package/dist/src/lib/crypto/index.js +7 -30
- package/dist/src/lib/crypto/interfaces.d.ts +5 -5
- package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
- package/dist/src/lib/crypto/interfaces.js +2 -3
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +5 -5
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +107 -95
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts +3 -4
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/StakePayload.js +81 -71
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +4 -5
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/UnstakePayload.js +36 -43
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +3 -4
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +46 -48
- package/dist/src/lib/crypto/payloads.d.ts +5 -5
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads.js +44 -45
- package/dist/src/lib/crypto/signer.d.ts +3 -3
- package/dist/src/lib/crypto/signer.d.ts.map +1 -1
- package/dist/src/lib/crypto/signer.js +45 -88
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +6 -6
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/DataRequests.js +6 -10
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +5 -5
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/StakeDeposits.js +7 -11
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +6 -7
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +9 -13
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +5 -5
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/ValueTransfers.js +6 -10
- package/dist/src/lib/crypto/transmitters.d.ts +6 -6
- package/dist/src/lib/crypto/transmitters.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters.js +88 -76
- package/dist/src/lib/crypto/types.d.ts +1 -2
- package/dist/src/lib/crypto/types.d.ts.map +1 -1
- package/dist/src/lib/crypto/types.js +71 -67
- package/dist/src/lib/crypto/utils.d.ts +5 -5
- package/dist/src/lib/crypto/utils.d.ts.map +1 -1
- package/dist/src/lib/crypto/utils.js +48 -66
- package/dist/src/lib/crypto/wallet.d.ts +3 -3
- package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
- package/dist/src/lib/crypto/wallet.js +72 -89
- package/dist/src/lib/index.d.ts +5 -4
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +6 -44
- package/dist/src/lib/radon/ccdr/eth.d.ts +1 -1
- package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -1
- package/dist/src/lib/radon/ccdr/eth.js +95 -83
- package/dist/src/lib/radon/ccdr/index.d.ts +2 -2
- package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -1
- package/dist/src/lib/radon/ccdr/index.js +3 -39
- package/dist/src/lib/radon/ccdr/wit.d.ts +2 -2
- package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -1
- package/dist/src/lib/radon/ccdr/wit.js +17 -19
- package/dist/src/lib/radon/filters.d.ts.map +1 -1
- package/dist/src/lib/radon/filters.js +23 -19
- package/dist/src/lib/radon/index.d.ts +10 -11
- package/dist/src/lib/radon/index.d.ts.map +1 -1
- package/dist/src/lib/radon/index.js +205 -187
- package/dist/src/lib/radon/reducers.d.ts +2 -2
- package/dist/src/lib/radon/reducers.d.ts.map +1 -1
- package/dist/src/lib/radon/reducers.js +48 -34
- package/dist/src/lib/radon/types.d.ts +2 -2
- package/dist/src/lib/radon/types.d.ts.map +1 -1
- package/dist/src/lib/radon/types.js +80 -110
- package/dist/src/lib/radon/utils.d.ts +3 -3
- package/dist/src/lib/radon/utils.d.ts.map +1 -1
- package/dist/src/lib/radon/utils.js +49 -52
- package/dist/src/lib/rest/kermit.d.ts +20 -0
- package/dist/src/lib/rest/kermit.d.ts.map +1 -0
- package/dist/src/lib/rest/kermit.js +68 -0
- package/dist/src/lib/rest/types.d.ts +5 -0
- package/dist/src/lib/rest/types.d.ts.map +1 -0
- package/dist/src/lib/rest/types.js +2 -0
- package/dist/src/lib/rpc/index.d.ts +2 -2
- package/dist/src/lib/rpc/index.d.ts.map +1 -1
- package/dist/src/lib/rpc/index.js +3 -19
- package/dist/src/lib/rpc/nodes.d.ts +13 -13
- package/dist/src/lib/rpc/nodes.d.ts.map +1 -1
- package/dist/src/lib/rpc/nodes.js +69 -98
- package/dist/src/lib/rpc/provider.d.ts +4 -4
- package/dist/src/lib/rpc/provider.d.ts.map +1 -1
- package/dist/src/lib/rpc/provider.js +111 -125
- package/dist/src/lib/rpc/types.d.ts +2 -2
- package/dist/src/lib/rpc/types.d.ts.map +1 -1
- package/dist/src/lib/rpc/types.js +13 -16
- package/dist/src/lib/types.d.ts +5 -4
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/types.js +3 -9
- package/dist/src/lib/utils.d.ts +5 -5
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +40 -99
- package/dist/witnet/assets/index.cjs +6 -0
- package/dist/witnet/assets/index.d.cts +29 -0
- package/dist/witnet/assets/index.d.cts.map +1 -0
- package/dist/witnet/assets/modals/index.cjs +9 -0
- package/dist/witnet/assets/modals/index.d.cts +16 -0
- package/dist/witnet/assets/modals/index.d.cts.map +1 -0
- package/dist/witnet/assets/modals/web3/eth.cjs +23 -0
- package/dist/witnet/assets/modals/web3/eth.d.cts +4 -0
- package/dist/witnet/assets/modals/web3/eth.d.cts.map +1 -0
- package/dist/witnet/assets/modals/web3/ipfs.cjs +18 -0
- package/dist/witnet/assets/modals/web3/ipfs.d.cts +3 -0
- package/dist/witnet/assets/modals/web3/ipfs.d.cts.map +1 -0
- package/dist/witnet/assets/modals/web3/wit.cjs +24 -0
- package/dist/witnet/assets/modals/web3/wit.d.cts +3 -0
- package/dist/witnet/assets/modals/web3/wit.d.cts.map +1 -0
- package/dist/witnet/assets/requests.cjs +43 -0
- package/dist/witnet/assets/requests.d.cts +10 -0
- package/dist/witnet/assets/requests.d.cts.map +1 -0
- package/package.json +31 -24
- package/src/bin/bots/watcher.cjs +354 -0
- package/src/bin/cli/history.cjs +31 -0
- package/src/bin/cli/inspect.js +545 -471
- package/src/bin/cli/network.js +658 -557
- package/src/bin/cli/nodes.js +392 -332
- package/src/bin/cli/radon.js +1071 -844
- package/src/bin/cli/wallet.js +1317 -1074
- package/src/bin/helpers.js +969 -868
- package/src/bin/index.js +329 -0
- package/witnet/assets/_index.cjs +5 -0
- package/witnet/assets/_requests.cjs +25 -0
- package/witnet/assets/_sources.cjs +36 -0
- package/witnet/assets/_templates.cjs +36 -0
- package/witnet/assets/index.cjs +4 -0
- package/witnet/assets/modals/index.cjs +7 -0
- package/witnet/assets/modals/web3/eth.cjs +27 -0
- package/witnet/assets/modals/web3/ipfs.cjs +22 -0
- package/witnet/assets/modals/web3/wit.cjs +28 -0
- package/witnet/assets/requests.cjs +49 -0
- package/witnet/witnet copy.proto +457 -0
- package/witnet/witnet.proto +456 -0
- package/witnet/witnet_toolkit-1.6.7-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-1.7.1-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.0-rc.7-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.2-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.21-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.7-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.8-x86_64-pc-windows-msvc.exe +0 -0
- package/dist/witnet/assets/index.d.ts +0 -29
- package/dist/witnet/assets/index.d.ts.map +0 -1
- package/dist/witnet/assets/index.js +0 -6
- package/dist/witnet/assets/modals/index.d.ts +0 -16
- package/dist/witnet/assets/modals/index.d.ts.map +0 -1
- package/dist/witnet/assets/modals/index.js +0 -11
- package/dist/witnet/assets/modals/web3/eth.d.ts +0 -5
- package/dist/witnet/assets/modals/web3/eth.d.ts.map +0 -1
- package/dist/witnet/assets/modals/web3/eth.js +0 -26
- package/dist/witnet/assets/modals/web3/ipfs.d.ts +0 -4
- package/dist/witnet/assets/modals/web3/ipfs.d.ts.map +0 -1
- package/dist/witnet/assets/modals/web3/ipfs.js +0 -18
- package/dist/witnet/assets/modals/web3/wit.d.ts +0 -4
- package/dist/witnet/assets/modals/web3/wit.d.ts.map +0 -1
- package/dist/witnet/assets/modals/web3/wit.js +0 -17
- package/dist/witnet/assets/requests.d.ts +0 -11
- package/dist/witnet/assets/requests.d.ts.map +0 -1
- package/dist/witnet/assets/requests.js +0 -43
- package/src/bin/cli/history.js +0 -31
- package/src/bin/postinstall.js +0 -9
- package/src/bin/toolkit.js +0 -290
- package/witnet/assets/_index.js +0 -8
- package/witnet/assets/_requests.js +0 -25
- package/witnet/assets/_sources.js +0 -36
- package/witnet/assets/_templates.js +0 -36
- package/witnet/assets/index.js +0 -4
- package/witnet/assets/modals/index.js +0 -9
- package/witnet/assets/modals/web3/eth.js +0 -29
- package/witnet/assets/modals/web3/ipfs.js +0 -22
- package/witnet/assets/modals/web3/wit.js +0 -21
- package/witnet/assets/requests.js +0 -49
- /package/witnet/assets/modals/web3/{btc.js → btc.cjs} +0 -0
- /package/witnet/assets/modals/web3/{sol.js → sol.cjs} +0 -0
|
@@ -1,57 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.types = exports.retrievals = exports.reducers = exports.filters = exports.RadonRetrieval = exports.RadonModal = exports.RadonTemplate = exports.RadonRequest = void 0;
|
|
40
|
-
exports.RadonRequestFromAssets = RadonRequestFromAssets;
|
|
41
|
-
exports.RadonScript = RadonScript;
|
|
42
|
-
const cbor_1 = require("cbor");
|
|
43
|
-
const graphql_query_compress_1 = __importDefault(require("graphql-query-compress"));
|
|
44
|
-
const protoBuf = require("protobufjs").Root.fromJSON(require("../../../witnet/witnet.proto.json"));
|
|
45
|
-
const RADRequest = protoBuf.lookupType("RADRequest");
|
|
46
|
-
const helpers_1 = require("../../bin/helpers");
|
|
47
|
-
const utils_1 = require("../crypto/utils");
|
|
48
|
-
const utils_2 = require("./utils");
|
|
49
|
-
const filters_1 = require("./filters");
|
|
50
|
-
const reducers_1 = require("./reducers");
|
|
51
|
-
const types_1 = require("./types");
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import cbor from "cbor";
|
|
3
|
+
import graphQlCompress from "graphql-query-compress";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
import protobuf from "protobufjs";
|
|
6
|
+
const { Root: ProtoRoot } = protobuf;
|
|
7
|
+
const protoRoot = ProtoRoot.fromJSON(require("../../../witnet/witnet.proto.json"));
|
|
8
|
+
const RADRequest = protoRoot.lookupType("RADRequest");
|
|
9
|
+
import { execRadonBytecode, fromHexString, getWildcardsCountFromString, isHexString, isWildcard, parseURL, replaceWildcards, spliceWildcard, toHexString, toUtf8Array, utf8ArrayToStr, } from "../../bin/helpers.js";
|
|
10
|
+
import { sha256 } from "../crypto/utils.js";
|
|
11
|
+
import { Opcodes as Filters, RadonFilter } from "./filters.js";
|
|
12
|
+
import { RadonReducer, Opcodes as Reducers } from "./reducers.js";
|
|
13
|
+
import { RadonArray as _RadonArray, RadonBoolean as _RadonBoolean, RadonBytes as _RadonBytes, RadonEncodings as _RadonEncodings, RadonFloat as _RadonFloat, RadonInteger as _RadonInteger, RadonMap as _RadonMap, RadonScript as _RadonScript, RadonString as _RadonString, } from "./types.js";
|
|
14
|
+
import { parseRadonScript } from "./utils.js";
|
|
52
15
|
class RadonArtifact {
|
|
16
|
+
sources;
|
|
17
|
+
sourcesReducer;
|
|
18
|
+
witnessReducer;
|
|
53
19
|
constructor(specs) {
|
|
54
|
-
if (!specs.sources ||
|
|
20
|
+
if (!specs.sources ||
|
|
21
|
+
!Array.isArray(specs.sources) ||
|
|
22
|
+
specs.sources.length === 0) {
|
|
55
23
|
throw TypeError("RadonArtifact: cannot build if no retrievals are passed");
|
|
56
24
|
}
|
|
57
25
|
specs.sources?.forEach((retrieval, index) => {
|
|
@@ -67,12 +35,14 @@ class RadonArtifact {
|
|
|
67
35
|
this.witnessReducer = specs.witnessReducer;
|
|
68
36
|
}
|
|
69
37
|
opsCount() {
|
|
70
|
-
return (this.sources
|
|
71
|
-
|
|
72
|
-
|
|
38
|
+
return ((this.sources
|
|
39
|
+
?.map((retrieval) => retrieval.opsCount())
|
|
40
|
+
.reduce((sum, a) => sum + a) || 0) +
|
|
41
|
+
this.sourcesReducer?.opsCount() +
|
|
42
|
+
this.witnessReducer?.opsCount());
|
|
73
43
|
}
|
|
74
44
|
}
|
|
75
|
-
class RadonRequest extends RadonArtifact {
|
|
45
|
+
export class RadonRequest extends RadonArtifact {
|
|
76
46
|
/**
|
|
77
47
|
* Decodes a RadonRequest artifact out from a Protobuf-serialized bytecode.
|
|
78
48
|
* @param bytecode Radon request bytecode.
|
|
@@ -80,8 +50,8 @@ class RadonRequest extends RadonArtifact {
|
|
|
80
50
|
*/
|
|
81
51
|
static fromBytecode(bytecode) {
|
|
82
52
|
let buffer;
|
|
83
|
-
if (
|
|
84
|
-
buffer =
|
|
53
|
+
if (isHexString(bytecode)) {
|
|
54
|
+
buffer = fromHexString(bytecode);
|
|
85
55
|
}
|
|
86
56
|
else if (bytecode instanceof Uint8Array) {
|
|
87
57
|
buffer = Buffer.from(bytecode);
|
|
@@ -109,37 +79,41 @@ class RadonRequest extends RadonArtifact {
|
|
|
109
79
|
if (retrieval?.headers) {
|
|
110
80
|
specs.headers = Object.fromEntries(retrieval.headers.map((stringPair) => [
|
|
111
81
|
stringPair.left,
|
|
112
|
-
stringPair.right
|
|
82
|
+
stringPair.right,
|
|
113
83
|
]));
|
|
114
84
|
}
|
|
115
85
|
if (retrieval?.body && retrieval.body.length > 0) {
|
|
116
|
-
specs.body =
|
|
86
|
+
specs.body = utf8ArrayToStr(Object.values(retrieval.body));
|
|
117
87
|
}
|
|
118
88
|
if (retrieval?.script)
|
|
119
|
-
specs.script =
|
|
89
|
+
specs.script = parseRadonScript(toHexString(retrieval.script));
|
|
120
90
|
specs.method = retrieval.kind;
|
|
121
91
|
return new RadonRetrieval(specs);
|
|
122
92
|
});
|
|
123
93
|
const decodeFilter = (f) => {
|
|
124
94
|
if (f?.args && f.args.length > 0)
|
|
125
|
-
return new
|
|
95
|
+
return new RadonFilter(f.op, cbor.decode(Uint8Array.from(f.args)));
|
|
126
96
|
else
|
|
127
|
-
return new
|
|
97
|
+
return new RadonFilter(f.op);
|
|
128
98
|
};
|
|
129
99
|
return new RadonRequest({
|
|
130
100
|
sources,
|
|
131
|
-
sourcesReducer: new
|
|
132
|
-
witnessReducer: new
|
|
101
|
+
sourcesReducer: new RadonReducer(obj.aggregate.reducer, obj.aggregate.filters?.map(decodeFilter)),
|
|
102
|
+
witnessReducer: new RadonReducer(obj.tally.reducer, obj.tally.filters?.map(decodeFilter)),
|
|
133
103
|
});
|
|
134
104
|
}
|
|
135
105
|
constructor(specs) {
|
|
136
|
-
const sources = Array.isArray(specs.sources)
|
|
106
|
+
const sources = Array.isArray(specs.sources)
|
|
107
|
+
? specs.sources
|
|
108
|
+
: [specs.sources];
|
|
137
109
|
super({
|
|
138
110
|
sources,
|
|
139
111
|
sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
|
|
140
112
|
witnessReducer: specs?.witnessReducer || reducers.Mode(),
|
|
141
113
|
});
|
|
142
|
-
|
|
114
|
+
const argsCount = sources
|
|
115
|
+
.map((retrieval) => retrieval.argsCount)
|
|
116
|
+
.reduce((prev, curr) => prev + curr);
|
|
143
117
|
if (argsCount > 0) {
|
|
144
118
|
throw TypeError("RadonRequest: parameterized retrievals were passed");
|
|
145
119
|
}
|
|
@@ -152,28 +126,28 @@ class RadonRequest extends RadonArtifact {
|
|
|
152
126
|
}
|
|
153
127
|
else {
|
|
154
128
|
const message = RADRequest.fromObject(payload);
|
|
155
|
-
return RADRequest.encode(message).finish();
|
|
129
|
+
return Buffer.from(RADRequest.encode(message).finish());
|
|
156
130
|
}
|
|
157
131
|
}
|
|
158
132
|
async execDryRun(verbose = false) {
|
|
159
|
-
return (await
|
|
133
|
+
return (await execRadonBytecode(this.toBytecode(), "--json", verbose ? "--verbose" : "")).trim();
|
|
160
134
|
}
|
|
161
135
|
get dataType() {
|
|
162
|
-
return
|
|
136
|
+
return this.sources[0].method === retrievals.Methods.RNG
|
|
163
137
|
? "RadonBytes"
|
|
164
|
-
:
|
|
138
|
+
: this.sources?.[0]?.script?.outputType
|
|
165
139
|
? this.sources[0].script.outputType.constructor.name
|
|
166
|
-
: "RadonAny"
|
|
140
|
+
: "RadonAny";
|
|
167
141
|
}
|
|
168
142
|
get radHash() {
|
|
169
|
-
return
|
|
143
|
+
return toHexString(sha256(this._encode()), false);
|
|
170
144
|
}
|
|
171
145
|
toBytecode() {
|
|
172
|
-
return
|
|
146
|
+
return toHexString(this._encode()); //encodeRADRequest(this.toProtobuf()), true)
|
|
173
147
|
}
|
|
174
148
|
toJSON(humanize) {
|
|
175
149
|
return {
|
|
176
|
-
retrieve: this.sources.map(retrieval => retrieval.toJSON(humanize)),
|
|
150
|
+
retrieve: this.sources.map((retrieval) => retrieval.toJSON(humanize)),
|
|
177
151
|
aggregate: this.sourcesReducer.toJSON(humanize),
|
|
178
152
|
tally: this.witnessReducer.toJSON(humanize),
|
|
179
153
|
...(humanize ? {} : { time_lock: 0 }),
|
|
@@ -182,7 +156,7 @@ class RadonRequest extends RadonArtifact {
|
|
|
182
156
|
toProtobuf() {
|
|
183
157
|
return {
|
|
184
158
|
//timeLock: 0,
|
|
185
|
-
retrieve: this.sources.map(retrieval => retrieval.toProtobuf()),
|
|
159
|
+
retrieve: this.sources.map((retrieval) => retrieval.toProtobuf()),
|
|
186
160
|
aggregate: this.sourcesReducer.toProtobuf(),
|
|
187
161
|
tally: this.witnessReducer.toProtobuf(),
|
|
188
162
|
};
|
|
@@ -191,12 +165,11 @@ class RadonRequest extends RadonArtifact {
|
|
|
191
165
|
return this.toBytecode().slice(2).length / 2;
|
|
192
166
|
}
|
|
193
167
|
}
|
|
194
|
-
|
|
195
|
-
function RadonRequestFromAssets(specs) {
|
|
168
|
+
export function RadonRequestFromAssets(specs) {
|
|
196
169
|
const sources = [];
|
|
197
170
|
const dict = retrievals.fromRadonAssets(specs.assets);
|
|
198
171
|
// const args: string[][] = []
|
|
199
|
-
Object.keys(specs.argsMap).forEach(key => {
|
|
172
|
+
Object.keys(specs.argsMap).forEach((key) => {
|
|
200
173
|
const retrieval = dict[key];
|
|
201
174
|
const args = specs.argsMap[key];
|
|
202
175
|
if (retrieval.argsCount > 0) {
|
|
@@ -211,29 +184,39 @@ function RadonRequestFromAssets(specs) {
|
|
|
211
184
|
sources.push(retrieval);
|
|
212
185
|
}
|
|
213
186
|
});
|
|
214
|
-
return new RadonRequest({
|
|
187
|
+
return new RadonRequest({
|
|
188
|
+
sources,
|
|
189
|
+
sourcesReducer: specs?.sourcesReducer,
|
|
190
|
+
witnessReducer: specs?.witnessReducer,
|
|
191
|
+
});
|
|
215
192
|
}
|
|
216
|
-
|
|
217
|
-
function RadonScript(inputType) {
|
|
193
|
+
export function RadonScript(inputType) {
|
|
218
194
|
if (!inputType)
|
|
219
195
|
throw TypeError("Input Radon data type must be specified when declaring a new Radon script.");
|
|
220
196
|
return new inputType();
|
|
221
197
|
}
|
|
222
|
-
class RadonTemplate extends RadonArtifact {
|
|
198
|
+
export class RadonTemplate extends RadonArtifact {
|
|
199
|
+
_argsCount;
|
|
200
|
+
homogeneous;
|
|
201
|
+
samples;
|
|
223
202
|
constructor(specs, samples) {
|
|
224
|
-
const sources = Array.isArray(specs.sources)
|
|
203
|
+
const sources = Array.isArray(specs.sources)
|
|
204
|
+
? specs.sources
|
|
205
|
+
: [specs.sources];
|
|
225
206
|
super({
|
|
226
207
|
sources,
|
|
227
208
|
sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
|
|
228
209
|
witnessReducer: specs?.witnessReducer || reducers.Mode(),
|
|
229
210
|
});
|
|
230
|
-
this._argsCount = sources
|
|
231
|
-
|
|
211
|
+
this._argsCount = sources
|
|
212
|
+
.map((retrieval) => retrieval?.argsCount)
|
|
213
|
+
.reduce((prev, curr) => Math.max(prev, curr), 0);
|
|
214
|
+
if (this._argsCount === 0) {
|
|
232
215
|
throw TypeError("RadonTemplate: no parameterized retrievals were passed");
|
|
233
216
|
}
|
|
234
|
-
this.homogeneous = !sources.find(retrieval => retrieval.argsCount !== this._argsCount);
|
|
217
|
+
this.homogeneous = !sources.find((retrieval) => retrieval.argsCount !== this._argsCount);
|
|
235
218
|
if (samples) {
|
|
236
|
-
Object.keys(samples).forEach(sample => {
|
|
219
|
+
Object.keys(samples).forEach((sample) => {
|
|
237
220
|
let sampleArgs = Object(samples)[sample];
|
|
238
221
|
if (typeof sampleArgs === "string") {
|
|
239
222
|
sampleArgs = [sampleArgs];
|
|
@@ -243,7 +226,7 @@ class RadonTemplate extends RadonArtifact {
|
|
|
243
226
|
Object(samples)[sample] = Array(sources.length).fill(sampleArgs);
|
|
244
227
|
sampleArgs = Object(samples)[sample];
|
|
245
228
|
}
|
|
246
|
-
else if (sampleArgs?.length
|
|
229
|
+
else if (sampleArgs?.length !== sources.length) {
|
|
247
230
|
throw TypeError(`RadonTemplate: arguments mismatch in sample "${sample}": ${sampleArgs?.length} samples given vs. ${sources.length} expected`);
|
|
248
231
|
}
|
|
249
232
|
sampleArgs?.forEach((subargs, index) => {
|
|
@@ -262,7 +245,7 @@ class RadonTemplate extends RadonArtifact {
|
|
|
262
245
|
buildRadonRequest(args) {
|
|
263
246
|
const sources = [];
|
|
264
247
|
if (this.homogeneous) {
|
|
265
|
-
// args can be either any, string[] or string[0][]
|
|
248
|
+
// args can be either any, string[] or string[0][]
|
|
266
249
|
if (Array.isArray(args) && args[0] && Array.isArray(args[0])) {
|
|
267
250
|
if (args.length > 1) {
|
|
268
251
|
throw new TypeError(`RadonTemplate: homogeneous template: args vector dimension ${args.length} > 1.`);
|
|
@@ -272,14 +255,15 @@ class RadonTemplate extends RadonArtifact {
|
|
|
272
255
|
else if (Array.isArray(args) && args.length !== this.argsCount) {
|
|
273
256
|
throw new TypeError(`RadonTemplate: homogenous template: missing ${this.argsCount - args.length} out of ${args.length} parameters.`);
|
|
274
257
|
}
|
|
275
|
-
this.sources.forEach(retrieval => sources.push(retrieval.foldArgs(args)));
|
|
258
|
+
this.sources.forEach((retrieval) => sources.push(retrieval.foldArgs(args)));
|
|
276
259
|
}
|
|
277
260
|
else {
|
|
278
261
|
if (!Array.isArray(args) || args.length !== this.sources.length) {
|
|
279
262
|
throw new TypeError(`RadonTemplate: args vector dimension ${args.length} != ${this.sources.length}`);
|
|
280
263
|
}
|
|
281
264
|
this.sources.forEach((retrieval, index) => {
|
|
282
|
-
if (Array.isArray(args[index]) &&
|
|
265
|
+
if (Array.isArray(args[index]) &&
|
|
266
|
+
retrieval.argsCount !== args[index].length) {
|
|
283
267
|
throw new TypeError(`RadonTemplate: retrieval #${index + 1}: mismatching args count: ${args[index].length} != ${retrieval.argsCount} ([${args[index]})]`);
|
|
284
268
|
}
|
|
285
269
|
sources.push(retrieval.foldArgs(args[index]));
|
|
@@ -292,8 +276,8 @@ class RadonTemplate extends RadonArtifact {
|
|
|
292
276
|
});
|
|
293
277
|
}
|
|
294
278
|
}
|
|
295
|
-
|
|
296
|
-
|
|
279
|
+
export class RadonModal extends RadonTemplate {
|
|
280
|
+
_providers;
|
|
297
281
|
constructor(specs) {
|
|
298
282
|
if (!specs.retrieval.isModal()) {
|
|
299
283
|
throw TypeError("RadonModal: no modal retrieval was passed.");
|
|
@@ -311,8 +295,10 @@ class RadonModal extends RadonTemplate {
|
|
|
311
295
|
}
|
|
312
296
|
}
|
|
313
297
|
get argsCount() {
|
|
314
|
-
const _providersArgsCount = Math.max(...this.providers.map(url =>
|
|
315
|
-
return _providersArgsCount > 0
|
|
298
|
+
const _providersArgsCount = Math.max(...this.providers.map((url) => getWildcardsCountFromString(url)));
|
|
299
|
+
return _providersArgsCount > 0
|
|
300
|
+
? Math.max(this._argsCount, _providersArgsCount)
|
|
301
|
+
: this._argsCount;
|
|
316
302
|
}
|
|
317
303
|
get providers() {
|
|
318
304
|
return this._providers;
|
|
@@ -325,9 +311,9 @@ class RadonModal extends RadonTemplate {
|
|
|
325
311
|
throw new TypeError(`RadonModal: no providers were previously settled.`);
|
|
326
312
|
}
|
|
327
313
|
const template = this.buildRadonTemplate(this.providers);
|
|
328
|
-
return
|
|
314
|
+
return template.homogeneous
|
|
329
315
|
? template.buildRadonRequest(args)
|
|
330
|
-
: template.buildRadonRequest(template.sources.map(source => args.slice(0, source.argsCount)))
|
|
316
|
+
: template.buildRadonRequest(template.sources.map((source) => args.slice(0, source.argsCount)));
|
|
331
317
|
}
|
|
332
318
|
buildRadonTemplate(providers) {
|
|
333
319
|
if (!providers) {
|
|
@@ -346,8 +332,8 @@ class RadonModal extends RadonTemplate {
|
|
|
346
332
|
});
|
|
347
333
|
}
|
|
348
334
|
_checkProviders(providers) {
|
|
349
|
-
providers.forEach(provider => {
|
|
350
|
-
const [schema
|
|
335
|
+
providers.forEach((provider) => {
|
|
336
|
+
const [schema] = parseURL(provider);
|
|
351
337
|
if (!schema.startsWith("http://") && !schema.startsWith("https://")) {
|
|
352
338
|
throw TypeError(`RadonModal: invalid provider: ${provider}`);
|
|
353
339
|
}
|
|
@@ -355,23 +341,35 @@ class RadonModal extends RadonTemplate {
|
|
|
355
341
|
return providers;
|
|
356
342
|
}
|
|
357
343
|
}
|
|
358
|
-
|
|
359
|
-
|
|
344
|
+
export class RadonRetrieval {
|
|
345
|
+
argsKeys;
|
|
346
|
+
argsCount;
|
|
347
|
+
method;
|
|
348
|
+
authority;
|
|
349
|
+
body;
|
|
350
|
+
headers;
|
|
351
|
+
path;
|
|
352
|
+
query;
|
|
353
|
+
schema;
|
|
354
|
+
script;
|
|
355
|
+
url;
|
|
356
|
+
samples;
|
|
360
357
|
constructor(specs, samples) {
|
|
361
|
-
if (specs.method === retrievals.Methods.RNG &&
|
|
358
|
+
if (specs.method === retrievals.Methods.RNG &&
|
|
359
|
+
(specs?.url || specs?.headers?.size || specs?.body)) {
|
|
362
360
|
throw TypeError("RadonRetrieval: RNG accepts no URLs or headers");
|
|
363
361
|
// } else if (!specs?.url && (method == Methods.HttpPost || method == Methods.HttpGet)) {
|
|
364
362
|
// throw TypeError("RadonRetrieval: URL must be specified");
|
|
365
363
|
}
|
|
366
|
-
else if (specs?.body && specs.method
|
|
364
|
+
else if (specs?.body && specs.method === retrievals.Methods.HttpGet) {
|
|
367
365
|
throw TypeError("RadonRetrieval: body cannot be specified in HTTP-GET queries");
|
|
368
366
|
}
|
|
369
367
|
this.method = specs.method;
|
|
370
368
|
if (specs?.url) {
|
|
371
369
|
this.url = specs.url;
|
|
372
|
-
if (!
|
|
370
|
+
if (!isWildcard(specs.url)) {
|
|
373
371
|
try {
|
|
374
|
-
|
|
372
|
+
const parts = parseURL(specs.url);
|
|
375
373
|
this.schema = parts[0];
|
|
376
374
|
if (parts[1] !== "")
|
|
377
375
|
this.authority = parts[1];
|
|
@@ -383,21 +381,21 @@ class RadonRetrieval {
|
|
|
383
381
|
catch { }
|
|
384
382
|
}
|
|
385
383
|
}
|
|
386
|
-
else if (specs.method === retrievals.Methods.HttpGet
|
|
387
|
-
|
|
388
|
-
|
|
384
|
+
else if (specs.method === retrievals.Methods.HttpGet ||
|
|
385
|
+
specs.method === retrievals.Methods.HttpPost ||
|
|
386
|
+
specs.method === retrievals.Methods.HttpHead) {
|
|
389
387
|
this.url = "\\0\\";
|
|
390
388
|
}
|
|
391
389
|
if (specs?.headers) {
|
|
392
|
-
if (typeof specs.headers !==
|
|
390
|
+
if (typeof specs.headers !== "object" || Array.isArray(specs.headers)) {
|
|
393
391
|
throw new TypeError("RadonRetrieval: HTTP headers must be of type Record<string, string>");
|
|
394
392
|
}
|
|
395
393
|
this.headers = specs?.headers;
|
|
396
394
|
}
|
|
397
395
|
this.body = specs?.body;
|
|
398
396
|
if (specs?.script)
|
|
399
|
-
this.script = new
|
|
400
|
-
this.argsCount = Math.max(
|
|
397
|
+
this.script = new _RadonScript(specs?.script);
|
|
398
|
+
this.argsCount = Math.max(getWildcardsCountFromString(this?.url), getWildcardsCountFromString(this?.body), ...(Object.keys(this?.headers || {}).map((key) => getWildcardsCountFromString(key)) ?? []), ...(Object.values(this?.headers || {}).map((value) => getWildcardsCountFromString(value)) ?? []), this.script?.argsCount() || 0);
|
|
401
399
|
if (samples && this.argsCount === 0) {
|
|
402
400
|
throw new TypeError("RadonRetrieval: passed samples to non-parameterized retrieval.");
|
|
403
401
|
}
|
|
@@ -413,7 +411,8 @@ class RadonRetrieval {
|
|
|
413
411
|
}
|
|
414
412
|
}
|
|
415
413
|
isModal() {
|
|
416
|
-
return this.method !== retrievals.Methods.RNG &&
|
|
414
|
+
return (this.method !== retrievals.Methods.RNG &&
|
|
415
|
+
(!this.url || this.url === "\\0\\"));
|
|
417
416
|
}
|
|
418
417
|
isParameterized() {
|
|
419
418
|
return this.argsCount > 0;
|
|
@@ -433,12 +432,12 @@ class RadonRetrieval {
|
|
|
433
432
|
}
|
|
434
433
|
params.push(...args);
|
|
435
434
|
}
|
|
436
|
-
else if (typeof args ===
|
|
435
|
+
else if (typeof args === "object") {
|
|
437
436
|
if (!this.argsKeys) {
|
|
438
437
|
throw new TypeError(`RadonRetrieval: unexpected args map: undefined args keys.`);
|
|
439
438
|
}
|
|
440
439
|
else {
|
|
441
|
-
this.argsKeys.forEach(key => {
|
|
440
|
+
this.argsKeys.forEach((key) => {
|
|
442
441
|
if (!args[key]) {
|
|
443
442
|
throw new TypeError(`RadonRetrieval: missing value for parameter "${key}".`);
|
|
444
443
|
}
|
|
@@ -451,11 +450,11 @@ class RadonRetrieval {
|
|
|
451
450
|
}
|
|
452
451
|
return new RadonRetrieval({
|
|
453
452
|
method: this.method,
|
|
454
|
-
url:
|
|
455
|
-
body:
|
|
453
|
+
url: replaceWildcards(this.url, params),
|
|
454
|
+
body: replaceWildcards(this.body, params),
|
|
456
455
|
headers: Object.fromEntries(Object.entries(this.headers || {}).map(([key, value]) => [
|
|
457
|
-
|
|
458
|
-
|
|
456
|
+
replaceWildcards(key, params),
|
|
457
|
+
replaceWildcards(value, params),
|
|
459
458
|
])),
|
|
460
459
|
script: this.script?.replaceWildcards(...params),
|
|
461
460
|
});
|
|
@@ -467,7 +466,7 @@ class RadonRetrieval {
|
|
|
467
466
|
spawnRetrievals(...values) {
|
|
468
467
|
const _spawned = [];
|
|
469
468
|
if (this.isModal()) {
|
|
470
|
-
values.forEach(url => {
|
|
469
|
+
values.forEach((url) => {
|
|
471
470
|
_spawned.push(new RadonRetrieval({
|
|
472
471
|
argsKeys: this.argsKeys,
|
|
473
472
|
body: this.body,
|
|
@@ -479,17 +478,17 @@ class RadonRetrieval {
|
|
|
479
478
|
});
|
|
480
479
|
}
|
|
481
480
|
else {
|
|
482
|
-
if (this.argsCount
|
|
481
|
+
if (this.argsCount === 0) {
|
|
483
482
|
throw new TypeError(`RadonRetrieval: cannot spawn from unparameterized retrieval`);
|
|
484
483
|
}
|
|
485
|
-
values.forEach(value => {
|
|
484
|
+
values.forEach((value) => {
|
|
486
485
|
_spawned.push(new RadonRetrieval({
|
|
487
486
|
method: this.method,
|
|
488
|
-
url:
|
|
489
|
-
body:
|
|
487
|
+
url: spliceWildcard(this.url, 0, value, this.argsCount),
|
|
488
|
+
body: spliceWildcard(this.body, 0, value, this.argsCount),
|
|
490
489
|
headers: Object.fromEntries(Object.entries(this.headers || {}).map(([headerKey, headerValue]) => [
|
|
491
|
-
|
|
492
|
-
|
|
490
|
+
spliceWildcard(headerKey, 0, value, this.argsCount),
|
|
491
|
+
spliceWildcard(headerValue, 0, value, this.argsCount),
|
|
493
492
|
])),
|
|
494
493
|
script: this.script?.spliceWildcard(0, value),
|
|
495
494
|
argsKeys: this.argsKeys?.slice(1),
|
|
@@ -500,8 +499,8 @@ class RadonRetrieval {
|
|
|
500
499
|
}
|
|
501
500
|
toJSON(humanize) {
|
|
502
501
|
const kind = ["", "HTTP-GET", "RNG", "HTTP-POST", "HTTP-HEAD"];
|
|
503
|
-
|
|
504
|
-
kind: kind[this.method] // humanize ? Methods[this.method] : this.method,
|
|
502
|
+
const json = {
|
|
503
|
+
kind: kind[this.method], // humanize ? Methods[this.method] : this.method,
|
|
505
504
|
};
|
|
506
505
|
if (this.url)
|
|
507
506
|
json.url = this.url;
|
|
@@ -509,18 +508,20 @@ class RadonRetrieval {
|
|
|
509
508
|
json.headers = Object.entries(this.headers);
|
|
510
509
|
}
|
|
511
510
|
if (this.body) {
|
|
512
|
-
if (typeof this.body ===
|
|
513
|
-
json.body = humanize ? this.body :
|
|
511
|
+
if (typeof this.body === "string") {
|
|
512
|
+
json.body = humanize ? this.body : toUtf8Array(this.body);
|
|
514
513
|
}
|
|
515
514
|
else {
|
|
516
515
|
json.body = this.body;
|
|
517
516
|
}
|
|
518
517
|
}
|
|
519
|
-
json.script = humanize
|
|
518
|
+
json.script = humanize
|
|
519
|
+
? this.script?.toString()
|
|
520
|
+
: Array.from(fromHexString(this.script?.toBytecode() || "0x80"));
|
|
520
521
|
return json;
|
|
521
522
|
}
|
|
522
523
|
toProtobuf() {
|
|
523
|
-
|
|
524
|
+
const protobuf = {
|
|
524
525
|
kind: this.method,
|
|
525
526
|
};
|
|
526
527
|
if (this.url)
|
|
@@ -534,50 +535,71 @@ class RadonRetrieval {
|
|
|
534
535
|
});
|
|
535
536
|
}
|
|
536
537
|
if (this.body) {
|
|
537
|
-
const utf8Array =
|
|
538
|
+
const utf8Array = toUtf8Array(this.body);
|
|
538
539
|
protobuf.body = utf8Array;
|
|
539
540
|
}
|
|
540
|
-
protobuf.script = Object.values(Uint8Array.from(
|
|
541
|
+
protobuf.script = Object.values(Uint8Array.from(cbor.encode(this.script?.encode() || [])));
|
|
541
542
|
return protobuf;
|
|
542
543
|
}
|
|
543
544
|
opsCount() {
|
|
544
545
|
return this._countOps(this.script?.encode() || []);
|
|
545
546
|
}
|
|
546
547
|
_countOps(items) {
|
|
547
|
-
return items.length > 0
|
|
548
|
+
return items.length > 0
|
|
549
|
+
? items
|
|
550
|
+
.map((item) => (Array.isArray(item) ? this._countOps(item) : 1))
|
|
551
|
+
.reduce((sum, a) => sum + a)
|
|
552
|
+
: 0;
|
|
548
553
|
}
|
|
549
554
|
}
|
|
550
|
-
|
|
551
|
-
var filters;
|
|
555
|
+
export var filters;
|
|
552
556
|
(function (filters) {
|
|
553
|
-
filters.Opcodes =
|
|
554
|
-
filters.Class =
|
|
555
|
-
function Mode() {
|
|
557
|
+
filters.Opcodes = Filters;
|
|
558
|
+
filters.Class = RadonFilter;
|
|
559
|
+
function Mode() {
|
|
560
|
+
return new RadonFilter(Filters.Mode);
|
|
561
|
+
}
|
|
556
562
|
filters.Mode = Mode;
|
|
557
|
-
function Stdev(stdev) {
|
|
563
|
+
function Stdev(stdev) {
|
|
564
|
+
return new RadonFilter(Filters.StandardDeviation, stdev);
|
|
565
|
+
}
|
|
558
566
|
filters.Stdev = Stdev;
|
|
559
|
-
})(filters || (
|
|
560
|
-
var reducers;
|
|
567
|
+
})(filters || (filters = {}));
|
|
568
|
+
export var reducers;
|
|
561
569
|
(function (reducers) {
|
|
562
|
-
reducers.Opcodes =
|
|
563
|
-
reducers.Class =
|
|
564
|
-
function Mode(...filters) {
|
|
570
|
+
reducers.Opcodes = Reducers;
|
|
571
|
+
reducers.Class = RadonReducer;
|
|
572
|
+
function Mode(...filters) {
|
|
573
|
+
return new RadonReducer(Reducers.Mode, filters);
|
|
574
|
+
}
|
|
565
575
|
reducers.Mode = Mode;
|
|
566
|
-
function Mean(...filters) {
|
|
576
|
+
function Mean(...filters) {
|
|
577
|
+
return new RadonReducer(Reducers.MeanAverage, filters);
|
|
578
|
+
}
|
|
567
579
|
reducers.Mean = Mean;
|
|
568
|
-
function Median(...filters) {
|
|
580
|
+
function Median(...filters) {
|
|
581
|
+
return new RadonReducer(Reducers.MedianAverage, filters);
|
|
582
|
+
}
|
|
569
583
|
reducers.Median = Median;
|
|
570
|
-
function Stdev(...filters) {
|
|
584
|
+
function Stdev(...filters) {
|
|
585
|
+
return new RadonReducer(Reducers.StandardDeviation, filters);
|
|
586
|
+
}
|
|
571
587
|
reducers.Stdev = Stdev;
|
|
572
|
-
function ConcatHash(...filters) {
|
|
588
|
+
function ConcatHash(...filters) {
|
|
589
|
+
return new RadonReducer(Reducers.ConcatenateAndHash, filters);
|
|
590
|
+
}
|
|
573
591
|
reducers.ConcatHash = ConcatHash;
|
|
574
|
-
function PriceAggregate() {
|
|
592
|
+
function PriceAggregate() {
|
|
593
|
+
return new RadonReducer(Reducers.MeanAverage, [filters.Stdev(1.4)]);
|
|
594
|
+
}
|
|
575
595
|
reducers.PriceAggregate = PriceAggregate;
|
|
576
|
-
function PriceTally() {
|
|
596
|
+
function PriceTally() {
|
|
597
|
+
return new RadonReducer(Reducers.MeanAverage, [filters.Stdev(2.5)]);
|
|
598
|
+
}
|
|
577
599
|
reducers.PriceTally = PriceTally;
|
|
578
|
-
})(reducers || (
|
|
579
|
-
|
|
580
|
-
var retrievals;
|
|
600
|
+
})(reducers || (reducers = {}));
|
|
601
|
+
import * as ccdr from "./ccdr/index.js";
|
|
602
|
+
export var retrievals;
|
|
581
603
|
(function (retrievals) {
|
|
582
604
|
retrievals.rpc = ccdr;
|
|
583
605
|
function fromRadonAssets(assets) {
|
|
@@ -596,20 +618,20 @@ var retrievals;
|
|
|
596
618
|
* Creates a Witnet randomness data source object.
|
|
597
619
|
* @param script (Optional) Radon Script to apply to the random seed proposed by every single witness,
|
|
598
620
|
* before aggregation.
|
|
599
|
-
|
|
621
|
+
**/
|
|
600
622
|
function RNG(script) {
|
|
601
623
|
const retrieval = new RadonRetrieval({ method: Methods.RNG, script });
|
|
602
|
-
if (retrieval?.script &&
|
|
624
|
+
if (retrieval?.script &&
|
|
625
|
+
retrieval?.script?.inputType?.constructor.name !== "RadonBytes") {
|
|
603
626
|
throw new TypeError("RNG scripts require [RadonBytes] as input type");
|
|
604
627
|
}
|
|
605
628
|
return retrieval;
|
|
606
629
|
}
|
|
607
630
|
retrievals.RNG = RNG;
|
|
608
|
-
;
|
|
609
631
|
/**
|
|
610
632
|
* Creates a HTTP/GET data retrieval object.
|
|
611
633
|
* @param specs Radon Retrieval specs.
|
|
612
|
-
|
|
634
|
+
**/
|
|
613
635
|
function HttpGet(specs) {
|
|
614
636
|
return new RadonRetrieval({
|
|
615
637
|
method: Methods.HttpGet,
|
|
@@ -620,11 +642,10 @@ var retrievals;
|
|
|
620
642
|
}, specs?.samples);
|
|
621
643
|
}
|
|
622
644
|
retrievals.HttpGet = HttpGet;
|
|
623
|
-
;
|
|
624
645
|
/**
|
|
625
646
|
* Creates a HTTP/HEAD data retrieval object.
|
|
626
647
|
* @param specs Radon Retrieval specs.
|
|
627
|
-
|
|
648
|
+
**/
|
|
628
649
|
function HttpHead(specs) {
|
|
629
650
|
return new RadonRetrieval({
|
|
630
651
|
method: Methods.HttpHead,
|
|
@@ -635,11 +656,10 @@ var retrievals;
|
|
|
635
656
|
}, specs?.samples);
|
|
636
657
|
}
|
|
637
658
|
retrievals.HttpHead = HttpHead;
|
|
638
|
-
;
|
|
639
659
|
/**
|
|
640
660
|
* Creates a HTTP/POST data retrieval object.
|
|
641
661
|
* @param specs Radon Retrieval specs.
|
|
642
|
-
|
|
662
|
+
**/
|
|
643
663
|
function HttpPost(specs) {
|
|
644
664
|
return new RadonRetrieval({
|
|
645
665
|
method: Methods.HttpPost,
|
|
@@ -651,27 +671,25 @@ var retrievals;
|
|
|
651
671
|
}, specs?.samples);
|
|
652
672
|
}
|
|
653
673
|
retrievals.HttpPost = HttpPost;
|
|
654
|
-
;
|
|
655
674
|
/**
|
|
656
675
|
* Creates a GraphQL-query data source object.
|
|
657
676
|
* @param specs Radon Retrieval specs.
|
|
658
|
-
|
|
677
|
+
**/
|
|
659
678
|
function GraphQLQuery(specs) {
|
|
660
679
|
return new RadonRetrieval({
|
|
661
680
|
method: Methods.HttpPost,
|
|
662
681
|
url: specs.url,
|
|
663
|
-
body: `{
|
|
682
|
+
body: `{"query":"${graphQlCompress(specs.query).replaceAll('"', '\\"')}"}`,
|
|
664
683
|
headers: { "Content-Type": "application/json;charset=UTF-8" },
|
|
665
684
|
script: specs?.script,
|
|
666
685
|
argsKeys: specs?.argsKeys,
|
|
667
686
|
}, specs?.samples);
|
|
668
687
|
}
|
|
669
688
|
retrievals.GraphQLQuery = GraphQLQuery;
|
|
670
|
-
;
|
|
671
689
|
/**
|
|
672
690
|
* Creates a JSON-RPC data retrieval object.
|
|
673
691
|
* @param specs Radon Retrieval specs.
|
|
674
|
-
|
|
692
|
+
**/
|
|
675
693
|
function JsonRPC(specs) {
|
|
676
694
|
return new RadonRetrieval({
|
|
677
695
|
method: retrievals.Methods.HttpPost,
|
|
@@ -680,52 +698,52 @@ var retrievals;
|
|
|
680
698
|
method: specs.rpc.method,
|
|
681
699
|
params: specs.rpc?.params,
|
|
682
700
|
id: 1,
|
|
683
|
-
}).replaceAll(
|
|
701
|
+
}).replaceAll("\\\\", "\\"),
|
|
684
702
|
headers: { "Content-Type": "application/json;charset=UTF-8" },
|
|
685
703
|
script: specs?.script,
|
|
686
704
|
argsKeys: specs?.argsKeys,
|
|
687
705
|
}, specs?.samples);
|
|
688
706
|
}
|
|
689
707
|
retrievals.JsonRPC = JsonRPC;
|
|
690
|
-
})(retrievals || (
|
|
691
|
-
var types;
|
|
708
|
+
})(retrievals || (retrievals = {}));
|
|
709
|
+
export var types;
|
|
692
710
|
(function (types) {
|
|
693
|
-
types.RadonArray =
|
|
694
|
-
types.RadonBoolean =
|
|
695
|
-
types.RadonBytes =
|
|
696
|
-
types.RadonFloat =
|
|
697
|
-
types.RadonInteger =
|
|
698
|
-
types.RadonMap =
|
|
699
|
-
types.RadonScript =
|
|
700
|
-
types.RadonString =
|
|
701
|
-
types.RadonEncodings =
|
|
702
|
-
})(types || (
|
|
711
|
+
types.RadonArray = _RadonArray;
|
|
712
|
+
types.RadonBoolean = _RadonBoolean;
|
|
713
|
+
types.RadonBytes = _RadonBytes;
|
|
714
|
+
types.RadonFloat = _RadonFloat;
|
|
715
|
+
types.RadonInteger = _RadonInteger;
|
|
716
|
+
types.RadonMap = _RadonMap;
|
|
717
|
+
types.RadonScript = _RadonScript;
|
|
718
|
+
types.RadonString = _RadonString;
|
|
719
|
+
types.RadonEncodings = _RadonEncodings;
|
|
720
|
+
})(types || (types = {}));
|
|
703
721
|
function proxyHandler(t) {
|
|
704
722
|
return {
|
|
705
723
|
get(target, prop) {
|
|
706
|
-
|
|
724
|
+
const found = target[prop] ?? findKeyInObject(target, prop);
|
|
707
725
|
// if (!found) {
|
|
708
726
|
// throw EvalError(`['${prop}'] was not found in dictionary`)
|
|
709
|
-
// } else
|
|
727
|
+
// } else
|
|
710
728
|
if (found && !(found instanceof t)) {
|
|
711
729
|
throw TypeError(`['${prop}'] was found with type ${found?.constructor?.name} instead of ${t.name}!`);
|
|
712
730
|
}
|
|
713
731
|
return found;
|
|
714
|
-
}
|
|
732
|
+
},
|
|
715
733
|
};
|
|
716
734
|
}
|
|
717
735
|
function findKeyInObject(dict, tag) {
|
|
718
736
|
for (const key in dict) {
|
|
719
|
-
if (typeof dict[key] ===
|
|
737
|
+
if (typeof dict[key] === "object") {
|
|
720
738
|
if (key === tag) {
|
|
721
739
|
return dict[key];
|
|
722
740
|
}
|
|
723
741
|
else {
|
|
724
|
-
|
|
742
|
+
const found = findKeyInObject(dict[key], tag);
|
|
725
743
|
if (found)
|
|
726
744
|
return found;
|
|
727
745
|
}
|
|
728
746
|
}
|
|
729
747
|
}
|
|
730
748
|
}
|
|
731
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRNQSx3REF1QkM7QUFFRCxrQ0FHQztBQXhPRCwrQkFHYTtBQUNiLG9GQUFvRDtBQUVwRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFBO0FBQ2xHLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUE7QUFFcEQsK0NBWTBCO0FBRTFCLDJDQUF3QztBQUN4QyxtQ0FBMEM7QUFDMUMsdUNBQTJEO0FBQzNELHlDQUE4RDtBQUU5RCxtQ0FVZ0I7QUFJaEIsTUFBTSxhQUFhO0lBTWpCLFlBQVksS0FJWDtRQUNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixLQUFLLGVBQWUsQ0FBQyxDQUFBO1lBQ3BFLENBQUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxZQUFZLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sU0FBUyxDQUFDLDZCQUE2QixLQUFLLGdCQUFn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QUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgZGVjb2RlIGFzIGNib3JEZWNvZGUsXHJcbiAgZW5jb2RlIGFzIGNib3JFbmNvZGUsXHJcbn0gZnJvbSAnY2JvcidcclxuaW1wb3J0IGdyYXBoUWxDb21wcmVzcyBmcm9tICdncmFwaHFsLXF1ZXJ5LWNvbXByZXNzJ1xyXG5cclxuY29uc3QgcHJvdG9CdWYgPSByZXF1aXJlKFwicHJvdG9idWZqc1wiKS5Sb290LmZyb21KU09OKHJlcXVpcmUoXCIuLi8uLi8uLi93aXRuZXQvd2l0bmV0LnByb3RvLmpzb25cIikpXHJcbmNvbnN0IFJBRFJlcXVlc3QgPSBwcm90b0J1Zi5sb29rdXBUeXBlKFwiUkFEUmVxdWVzdFwiKVxyXG5cclxuaW1wb3J0IHtcclxuICBleGVjUmFkb25CeXRlY29kZSxcclxuICBmcm9tSGV4U3RyaW5nLFxyXG4gIGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyxcclxuICBpc0hleFN0cmluZyxcclxuICBpc1dpbGRjYXJkLFxyXG4gIHBhcnNlVVJMLFxyXG4gIHJlcGxhY2VXaWxkY2FyZHMsXHJcbiAgc3BsaWNlV2lsZGNhcmQsXHJcbiAgdG9IZXhTdHJpbmcsXHJcbiAgdG9VdGY4QXJyYXksXHJcbiAgdXRmOEFycmF5VG9TdHIsXHJcbn0gZnJvbSBcIi4uLy4uL2Jpbi9oZWxwZXJzXCJcclxuXHJcbmltcG9ydCB7IHNoYTI1NiB9IGZyb20gXCIuLi9jcnlwdG8vdXRpbHNcIlxyXG5pbXBvcnQgeyBwYXJzZVJhZG9uU2NyaXB0IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIEZpbHRlcnMsIFJhZG9uRmlsdGVyIH0gZnJvbSAnLi9maWx0ZXJzJ1xyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJlZHVjZXJzLCBSYWRvblJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgeyBSYWRvbkFueSwgUmFkb25TdHJpbmcsIFJhZG9uT3BlcmF0b3IgfSBmcm9tICcuL3R5cGVzJ1xyXG5pbXBvcnQge1xyXG4gIFJhZG9uQXJyYXkgYXMgX1JhZG9uQXJyYXksXHJcbiAgUmFkb25Cb29sZWFuIGFzIF9SYWRvbkJvb2xlYW4sXHJcbiAgUmFkb25CeXRlcyBhcyBfUmFkb25CeXRlcyxcclxuICBSYWRvbkZsb2F0IGFzIF9SYWRvbkZsb2F0LFxyXG4gIFJhZG9uSW50ZWdlciBhcyBfUmFkb25JbnRlZ2VyLFxyXG4gIFJhZG9uTWFwIGFzIF9SYWRvbk1hcCxcclxuICBSYWRvblN0cmluZyBhcyBfUmFkb25TdHJpbmcsXHJcbiAgUmFkb25TY3JpcHQgYXMgX1JhZG9uU2NyaXB0LFxyXG4gIFJhZG9uRW5jb2RpbmdzIGFzIF9SYWRvbkVuY29kaW5ncyxcclxufSBmcm9tICcuL3R5cGVzJ1xyXG5cclxudHlwZSBBcmdzID0gc3RyaW5nW10gfCBzdHJpbmdbXVtdO1xyXG5cclxuY2xhc3MgUmFkb25BcnRpZmFjdCB7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdO1xyXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VzUmVkdWNlcjogUmFkb25SZWR1Y2VyO1xyXG4gIHB1YmxpYyByZWFkb25seSB3aXRuZXNzUmVkdWNlcjogUmFkb25SZWR1Y2VyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcGVjczoge1xyXG4gICAgc291cmNlczogUmFkb25SZXRyaWV2YWxbXSxcclxuICAgIHNvdXJjZXNSZWR1Y2VyOiBSYWRvblJlZHVjZXIsXHJcbiAgICB3aXRuZXNzUmVkdWNlcjogUmFkb25SZWR1Y2VyLFxyXG4gIH0pIHtcclxuICAgIGlmICghc3BlY3Muc291cmNlcyB8fCAhQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKSB8fCBzcGVjcy5zb3VyY2VzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uQXJ0aWZhY3Q6IGNhbm5vdCBidWlsZCBpZiBubyByZXRyaWV2YWxzIGFyZSBwYXNzZWRcIilcclxuICAgIH1cclxuICAgIHNwZWNzLnNvdXJjZXM/LmZvckVhY2goKHJldHJpZXZhbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKHJldHJpZXZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBSYWRvbkFydGlmYWN0OiByZXRyaWV2YWwgIyR7aW5kZXh9IGlzIHVuZGVmaW5lZGApXHJcbiAgICAgIH0gZWxzZSBpZiAoIShyZXRyaWV2YWwgaW5zdGFuY2VvZiBSYWRvblJldHJpZXZhbCkpIHtcclxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFJhZG9uQXJ0aWZhY3Q6IHJldHJpZXZhbCAjJHtpbmRleH06IGludmFsaWQgdHlwZWApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICB0aGlzLnNvdXJjZXMgPSBzcGVjcy5zb3VyY2VzO1xyXG4gICAgdGhpcy5zb3VyY2VzUmVkdWNlciA9IHNwZWNzLnNvdXJjZXNSZWR1Y2VyO1xyXG4gICAgdGhpcy53aXRuZXNzUmVkdWNlciA9IHNwZWNzLndpdG5lc3NSZWR1Y2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuc291cmNlcz8ubWFwKHJldHJpZXZhbCA9PiByZXRyaWV2YWwub3BzQ291bnQoKSkucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEpIHx8IDApXHJcbiAgICAgICsgdGhpcy5zb3VyY2VzUmVkdWNlcj8ub3BzQ291bnQoKVxyXG4gICAgICArIHRoaXMud2l0bmVzc1JlZHVjZXI/Lm9wc0NvdW50KClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvblJlcXVlc3QgZXh0ZW5kcyBSYWRvbkFydGlmYWN0IHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVjb2RlcyBhIFJhZG9uUmVxdWVzdCBhcnRpZmFjdCBvdXQgZnJvbSBhIFByb3RvYnVmLXNlcmlhbGl6ZWQgYnl0ZWNvZGUuXHJcbiAgICogQHBhcmFtIGJ5dGVjb2RlIFJhZG9uIHJlcXVlc3QgYnl0ZWNvZGUuXHJcbiAgICogQHJldHVybnMgUmFkb25SZXF1ZXN0IG9iamVjdC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGZyb21CeXRlY29kZShieXRlY29kZTogYW55KSB7XHJcbiAgICBsZXQgYnVmZmVyXHJcbiAgICBpZiAoaXNIZXhTdHJpbmcoYnl0ZWNvZGUpKSB7XHJcbiAgICAgIGJ1ZmZlciA9IGZyb21IZXhTdHJpbmcoYnl0ZWNvZGUpXHJcbiAgICB9IGVsc2UgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG4gICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShieXRlY29kZSlcclxuICAgIH0gZWxzZSBpZiAoYnl0ZWNvZGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcclxuICAgICAgYnVmZmVyID0gYnl0ZWNvZGVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmVxdWVzdDogdW5zdXBwb3J0ZWQgYnl0ZWNvZGUgZm9ybWF0OiAke2J5dGVjb2RlfWApXHJcbiAgICB9XHJcbiAgICBjb25zdCBvYmo6IGFueSA9IFJBRFJlcXVlc3QuZGVjb2RlKGJ1ZmZlcilcclxuICAgIHJldHVybiBSYWRvblJlcXVlc3QuZnJvbVByb3RvYnVmKG9iailcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlY29kZXMgYSBSYWRvblJlcXVlc3QgYXJ0aWZhY3Qgb3V0IGZyb20gYSBQcm90b2J1ZiBvYmplY3QuXHJcbiAgICogQHBhcmFtIG9iaiBQcm90b2J1ZiBvYmplY3QuXHJcbiAgICogQHJldHVybnMgUmFkb25SZXF1ZXN0IG9iamVjdC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGZyb21Qcm90b2J1ZihvYmo6IGFueSkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IG9iai5yZXRyaWV2ZS5tYXAoKHJldHJpZXZhbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHNwZWNzOiBhbnkgPSB7fVxyXG4gICAgICBpZiAocmV0cmlldmFsPy51cmwpIHsgc3BlY3MudXJsID0gcmV0cmlldmFsLnVybCB9XHJcbiAgICAgIGlmIChyZXRyaWV2YWw/LmhlYWRlcnMpIHtcclxuICAgICAgICBzcGVjcy5oZWFkZXJzID0gT2JqZWN0LmZyb21FbnRyaWVzKHJldHJpZXZhbC5oZWFkZXJzLm1hcCgoc3RyaW5nUGFpcjogYW55KSA9PiBbXHJcbiAgICAgICAgICBzdHJpbmdQYWlyLmxlZnQsXHJcbiAgICAgICAgICBzdHJpbmdQYWlyLnJpZ2h0XHJcbiAgICAgICAgXSkpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJldHJpZXZhbD8uYm9keSAmJiByZXRyaWV2YWwuYm9keS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc3BlY3MuYm9keSA9IHV0ZjhBcnJheVRvU3RyKE9iamVjdC52YWx1ZXMocmV0cmlldmFsLmJvZHkpKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXRyaWV2YWw/LnNjcmlwdCkgc3BlY3Muc2NyaXB0ID0gcGFyc2VSYWRvblNjcmlwdCh0b0hleFN0cmluZyhyZXRyaWV2YWwuc2NyaXB0KSlcclxuICAgICAgc3BlY3MubWV0aG9kID0gcmV0cmlldmFsLmtpbmRcclxuICAgICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChzcGVjcylcclxuICAgIH0pXHJcbiAgICBjb25zdCBkZWNvZGVGaWx0ZXIgPSAoZjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChmPy5hcmdzICYmIGYuYXJncy5sZW5ndGggPiAwKSByZXR1cm4gbmV3IFJhZG9uRmlsdGVyKGYub3AsIGNib3JEZWNvZGUoVWludDhBcnJheS5mcm9tKGYuYXJncykpKVxyXG4gICAgICBlbHNlIHJldHVybiBuZXcgUmFkb25GaWx0ZXIoZi5vcCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJhZG9uUmVxdWVzdCh7XHJcbiAgICAgIHNvdXJjZXMsXHJcbiAgICAgIHNvdXJjZXNSZWR1Y2VyOiBuZXcgUmFkb25SZWR1Y2VyKG9iai5hZ2dyZWdhdGUucmVkdWNlciwgb2JqLmFnZ3JlZ2F0ZS5maWx0ZXJzPy5tYXAoZGVjb2RlRmlsdGVyKSksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBuZXcgUmFkb25SZWR1Y2VyKG9iai50YWxseS5yZWR1Y2VyLCBvYmoudGFsbHkuZmlsdGVycz8ubWFwKGRlY29kZUZpbHRlcikpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Ioc3BlY3M6IHtcclxuICAgIHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXSxcclxuICAgIHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gICAgd2l0bmVzc1JlZHVjZXI/OiBSYWRvblJlZHVjZXIsXHJcbiAgfSkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoc3BlY3Muc291cmNlcykgPyBzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10gOiBbc3BlY3Muc291cmNlc11cclxuICAgIHN1cGVyKHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBzcGVjcz8ud2l0bmVzc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG4gICAgfSlcclxuICAgIGxldCBhcmdzQ291bnQgPSBzb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLmFyZ3NDb3VudCkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VycilcclxuICAgIGlmIChhcmdzQ291bnQgPiAwKSB7XHJcbiAgICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmVxdWVzdDogcGFyYW1ldGVyaXplZCByZXRyaWV2YWxzIHdlcmUgcGFzc2VkXCIpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2VuY29kZSgpOiBCdWZmZXIge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudG9Qcm90b2J1ZigpXHJcbiAgICBjb25zdCBlcnJNc2cgPSBSQURSZXF1ZXN0LnZlcmlmeShwYXlsb2FkKVxyXG4gICAgaWYgKGVyck1zZykge1xyXG4gICAgICB0aHJvdyBFcnJvcihlcnJNc2cpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IFJBRFJlcXVlc3QuZnJvbU9iamVjdChwYXlsb2FkKTtcclxuICAgICAgcmV0dXJuIFJBRFJlcXVlc3QuZW5jb2RlKG1lc3NhZ2UpLmZpbmlzaCgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZXhlY0RyeVJ1bih2ZXJib3NlID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIChhd2FpdCBleGVjUmFkb25CeXRlY29kZSh0aGlzLnRvQnl0ZWNvZGUoKSwgJy0tanNvbicsIHZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnKSkudHJpbSgpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IHN0cmluZyAge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zb3VyY2VzWzBdLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLlJORyBcclxuICAgICAgICA/IFwiUmFkb25CeXRlc1wiXHJcbiAgICAgICAgOiAodGhpcy5zb3VyY2VzICYmIHRoaXMuc291cmNlc1swXSAmJiB0aGlzLnNvdXJjZXNbMF0uc2NyaXB0ICYmIHRoaXMuc291cmNlc1swXS5zY3JpcHQub3V0cHV0VHlwZVxyXG4gICAgICAgICAgPyB0aGlzLnNvdXJjZXNbMF0uc2NyaXB0Lm91dHB1dFR5cGUuY29uc3RydWN0b3IubmFtZSBcclxuICAgICAgICAgIDogXCJSYWRvbkFueVwiXHJcbiAgICAgICAgKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCByYWRIYXNoKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdG9IZXhTdHJpbmcoc2hhMjU2KHRoaXMuX2VuY29kZSgpKSwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRvSGV4U3RyaW5nKHRoaXMuX2VuY29kZSgpKS8vZW5jb2RlUkFEUmVxdWVzdCh0aGlzLnRvUHJvdG9idWYoKSksIHRydWUpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9KU09OKGh1bWFuaXplPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXRyaWV2ZTogdGhpcy5zb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLnRvSlNPTihodW1hbml6ZSkpLFxyXG4gICAgICBhZ2dyZWdhdGU6IHRoaXMuc291cmNlc1JlZHVjZXIudG9KU09OKGh1bWFuaXplKSxcclxuICAgICAgdGFsbHk6IHRoaXMud2l0bmVzc1JlZHVjZXIudG9KU09OKGh1bWFuaXplKSxcclxuICAgICAgLi4uKGh1bWFuaXplID8ge30gOiB7IHRpbWVfbG9jazogMCB9KSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1Byb3RvYnVmKCk6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvL3RpbWVMb2NrOiAwLFxyXG4gICAgICByZXRyaWV2ZTogdGhpcy5zb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLnRvUHJvdG9idWYoKSksXHJcbiAgICAgIGFnZ3JlZ2F0ZTogdGhpcy5zb3VyY2VzUmVkdWNlci50b1Byb3RvYnVmKCksXHJcbiAgICAgIHRhbGx5OiB0aGlzLndpdG5lc3NSZWR1Y2VyLnRvUHJvdG9idWYoKSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB3ZWlnaHQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRvQnl0ZWNvZGUoKS5zbGljZSgyKS5sZW5ndGggLyAyO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFJhZG9uUmVxdWVzdEZyb21Bc3NldHMoc3BlY3M6IHtcclxuICBhc3NldHM6IE9iamVjdCxcclxuICBhcmdzTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnkgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sIFxyXG4gIHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG59KTogUmFkb25SZXF1ZXN0IHtcclxuICBjb25zdCBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICBjb25zdCBkaWN0ID0gcmV0cmlldmFscy5mcm9tUmFkb25Bc3NldHMoc3BlY3MuYXNzZXRzKVxyXG4gIC8vIGNvbnN0IGFyZ3M6IHN0cmluZ1tdW10gPSBbXVxyXG4gIE9iamVjdC5rZXlzKHNwZWNzLmFyZ3NNYXApLmZvckVhY2goa2V5ID0+IHtcclxuICAgIGNvbnN0IHJldHJpZXZhbDogUmFkb25SZXRyaWV2YWwgPSBkaWN0W2tleV0gXHJcbiAgICBjb25zdCBhcmdzID0gKHNwZWNzLmFyZ3NNYXAgYXMgYW55KVtrZXldXHJcbiAgICBpZiAocmV0cmlldmFsLmFyZ3NDb3VudCA+IDApIHtcclxuICAgICAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDwgcmV0cmlldmFsLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgSW5zdWZmaWNpZW50IGFyZ3MgcGFzc2VkIHRvIHJldHJpZXZhbCBuYW1lZCBhcyAnJHtrZXl9JzogJHthcmdzLmxlbmd0aH0gPCAke3JldHJpZXZhbC5hcmdzQ291bnR9YClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3MpKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsKVxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIG5ldyBSYWRvblJlcXVlc3QoeyBzb3VyY2VzLCBzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyLCB3aXRuZXNzUmVkdWNlcjogc3BlY3M/LndpdG5lc3NSZWR1Y2VyIH0pXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmFkb25TY3JpcHQ8SW5wdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvblN0cmluZz4oaW5wdXRUeXBlOiB7IG5ldyhvcHM/OiBSYWRvbk9wZXJhdG9yKTogSW5wdXRUeXBlOyB9KTogSW5wdXRUeXBlIHtcclxuICBpZiAoIWlucHV0VHlwZSkgdGhyb3cgVHlwZUVycm9yKFwiSW5wdXQgUmFkb24gZGF0YSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZGVjbGFyaW5nIGEgbmV3IFJhZG9uIHNjcmlwdC5cIilcclxuICByZXR1cm4gbmV3IGlucHV0VHlwZSgpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25UZW1wbGF0ZSBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cclxuICBwcm90ZWN0ZWQgX2FyZ3NDb3VudDogbnVtYmVyO1xyXG4gIFxyXG4gIHB1YmxpYyByZWFkb25seSBob21vZ2VuZW91czogYm9vbGVhbjtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIEFyZ3M+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHNwZWNzOiB7XHJcbiAgICAgIHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXSxcclxuICAgICAgc291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gICAgfSxcclxuICAgIHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBBcmdzPlxyXG4gICkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoc3BlY3Muc291cmNlcykgPyBzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10gOiBbc3BlY3Muc291cmNlc11cclxuICAgIHN1cGVyKHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBzcGVjcz8ud2l0bmVzc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG4gICAgfSlcclxuICAgIHRoaXMuX2FyZ3NDb3VudCA9IHNvdXJjZXMubWFwKHJldHJpZXZhbCA9PiByZXRyaWV2YWw/LmFyZ3NDb3VudCkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLm1heChwcmV2LCBjdXJyKSwgMClcclxuICAgIGlmICh0aGlzLl9hcmdzQ291bnQgPT0gMCkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblRlbXBsYXRlOiBubyBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMgd2VyZSBwYXNzZWRcIilcclxuICAgIH1cclxuICAgIHRoaXMuaG9tb2dlbmVvdXMgPSAhc291cmNlcy5maW5kKHJldHJpZXZhbCA9PiByZXRyaWV2YWwuYXJnc0NvdW50ICE9PSB0aGlzLl9hcmdzQ291bnQpXHJcbiAgICBpZiAoc2FtcGxlcykge1xyXG4gICAgICBPYmplY3Qua2V5cyhzYW1wbGVzKS5mb3JFYWNoKHNhbXBsZSA9PiB7XHJcbiAgICAgICAgbGV0IHNhbXBsZUFyZ3M6IEFyZ3MgPSBPYmplY3Qoc2FtcGxlcylbc2FtcGxlXVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlQXJncyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgc2FtcGxlQXJncyA9IFtzYW1wbGVBcmdzXVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2FtcGxlQXJncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2FtcGxlQXJnc1swXSkpIHtcclxuICAgICAgICAgICAgT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV0gPSBBcnJheShzb3VyY2VzLmxlbmd0aCkuZmlsbChzYW1wbGVBcmdzKVxyXG4gICAgICAgICAgICBzYW1wbGVBcmdzID0gT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlQXJncz8ubGVuZ3RoICE9IHNvdXJjZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogYXJndW1lbnRzIG1pc21hdGNoIGluIHNhbXBsZSBcIiR7c2FtcGxlfVwiOiAke3NhbXBsZUFyZ3M/Lmxlbmd0aH0gc2FtcGxlcyBnaXZlbiB2cy4gJHtzb3VyY2VzLmxlbmd0aH0gZXhwZWN0ZWRgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2FtcGxlQXJncz8uZm9yRWFjaCgoc3ViYXJncywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHN1YmFyZ3MubGVuZ3RoIDwgc291cmNlc1tpbmRleF0uYXJnc0NvdW50KSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBcXHgxYlsxOzMzbVJhZG9uUmVxdWVzdFRlbXBsYXRlOiBhcmd1bWVudHMgbWlzbWF0Y2ggaW4gdGVzdCBcXHgxYlsxOzMxbScke3NhbXBsZX0nXFx4MWJbMTszM206IFxceDFiWzE7MzdtUmV0cmlldmFsICMke2luZGV4fVxceDFiWzE7MzNtOiAke3N1YmFyZ3M/Lmxlbmd0aH0gcGFyYW1ldGVycyBnaXZlbiB2cy4gJHtzb3VyY2VzW2luZGV4XS5hcmdzQ291bnR9IGV4cGVjdGVkXFx4MWJbMG1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5zYW1wbGVzID0gc2FtcGxlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hcmdzQ291bnRcclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFJhZG9uUmVxdWVzdChhcmdzOiBhbnkgfCBhbnlbXSB8IHN0cmluZ1tdIHwgc3RyaW5nW11bXSk6IFJhZG9uUmVxdWVzdCB7XHJcbiAgICBjb25zdCBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICAgIGlmICh0aGlzLmhvbW9nZW5lb3VzKSB7XHJcbiAgICAgIC8vIGFyZ3MgY2FuIGJlIGVpdGhlciBhbnksIHN0cmluZ1tdIG9yIHN0cmluZ1swXVtdIFxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzWzBdICYmIEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcclxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSAge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogaG9tb2dlbmVvdXMgdGVtcGxhdGU6IGFyZ3MgdmVjdG9yIGRpbWVuc2lvbiAke2FyZ3MubGVuZ3RofSA+IDEuYClcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJncyA9IGFyZ3NbMF1cclxuICAgICAgICBcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MubGVuZ3RoICE9PSB0aGlzLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgICBgUmFkb25UZW1wbGF0ZTogaG9tb2dlbm91cyB0ZW1wbGF0ZTogbWlzc2luZyAke3RoaXMuYXJnc0NvdW50IC0gYXJncy5sZW5ndGh9IG91dCBvZiAke2FyZ3MubGVuZ3RofSBwYXJhbWV0ZXJzLmBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKHJldHJpZXZhbCA9PiBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3MpKSlcclxuICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoICE9PSB0aGlzLnNvdXJjZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogYXJncyB2ZWN0b3IgZGltZW5zaW9uICR7YXJncy5sZW5ndGh9ICE9ICR7dGhpcy5zb3VyY2VzLmxlbmd0aH1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKChyZXRyaWV2YWwsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1tpbmRleF0pICYmIHJldHJpZXZhbC5hcmdzQ291bnQgIT09IGFyZ3NbaW5kZXhdLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICAgICAgYFJhZG9uVGVtcGxhdGU6IHJldHJpZXZhbCAjJHtcclxuICAgICAgICAgICAgICBpbmRleCArIDFcclxuICAgICAgICAgICAgfTogbWlzbWF0Y2hpbmcgYXJncyBjb3VudDogJHtcclxuICAgICAgICAgICAgICBhcmdzW2luZGV4XS5sZW5ndGhcclxuICAgICAgICAgICAgfSAhPSAke1xyXG4gICAgICAgICAgICAgIHJldHJpZXZhbC5hcmdzQ291bnRcclxuICAgICAgICAgICAgfSAoWyR7YXJnc1tpbmRleF19KV1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3NbaW5kZXhdKSlcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmFkb25SZXF1ZXN0KHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHRoaXMuc291cmNlc1JlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiB0aGlzLndpdG5lc3NSZWR1Y2VyLFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbk1vZGFsIGV4dGVuZHMgUmFkb25UZW1wbGF0ZSB7XHJcblxyXG4gIHByb3RlY3RlZCBfcHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcGVjczoge1xyXG4gICAgcHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPixcclxuICAgIHJldHJpZXZhbDogUmFkb25SZXRyaWV2YWwsXHJcbiAgICBzb3VyY2VzUmVkdWNlcj86IFJhZG9uUmVkdWNlcixcclxuICAgIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gIH0pIHtcclxuICAgIGlmICghc3BlY3MucmV0cmlldmFsLmlzTW9kYWwoKSkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvbk1vZGFsOiBubyBtb2RhbCByZXRyaWV2YWwgd2FzIHBhc3NlZC5cIilcclxuICAgIH1cclxuICAgIHN1cGVyKFxyXG4gICAgICB7XHJcbiAgICAgICAgc291cmNlczogW3NwZWNzLnJldHJpZXZhbF0sXHJcbiAgICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgICAgd2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIH0sIFxyXG4gICAgICBzcGVjcy5yZXRyaWV2YWw/LnNhbXBsZXNcclxuICAgIClcclxuICAgIGlmIChzcGVjcz8ucHJvdmlkZXJzKSB7XHJcbiAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKHNwZWNzLnByb3ZpZGVycylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IFtdXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFyZ3NDb3VudCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgX3Byb3ZpZGVyc0FyZ3NDb3VudCA9IE1hdGgubWF4KC4uLnRoaXMucHJvdmlkZXJzLm1hcCh1cmwgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHVybCkpKVxyXG4gICAgcmV0dXJuIF9wcm92aWRlcnNBcmdzQ291bnQgPiAwID8gTWF0aC5tYXgodGhpcy5fYXJnc0NvdW50LCBfcHJvdmlkZXJzQXJnc0NvdW50KSA6IHRoaXMuX2FyZ3NDb3VudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcHJvdmlkZXJzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3ZpZGVyc1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBwcm92aWRlcnMocHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLl9wcm92aWRlcnMgPSB0aGlzLl9jaGVja1Byb3ZpZGVycyhwcm92aWRlcnMpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRSYWRvblJlcXVlc3QoYXJncz86IGFueSB8IHN0cmluZ1tdKTogUmFkb25SZXF1ZXN0IHtcclxuICAgIGlmICh0aGlzLnByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogbm8gcHJvdmlkZXJzIHdlcmUgcHJldmlvdXNseSBzZXR0bGVkLmApXHJcbiAgICB9XHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuYnVpbGRSYWRvblRlbXBsYXRlKHRoaXMucHJvdmlkZXJzKVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGVtcGxhdGUuaG9tb2dlbmVvdXNcclxuICAgICAgICA/IHRlbXBsYXRlLmJ1aWxkUmFkb25SZXF1ZXN0KGFyZ3MpXHJcbiAgICAgICAgOiB0ZW1wbGF0ZS5idWlsZFJhZG9uUmVxdWVzdCh0ZW1wbGF0ZS5zb3VyY2VzLm1hcChzb3VyY2UgPT4gYXJncy5zbGljZSgwLCBzb3VyY2UuYXJnc0NvdW50KSkpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRSYWRvblRlbXBsYXRlKHByb3ZpZGVycz86IEFycmF5PHN0cmluZz4pOiBSYWRvblRlbXBsYXRlIHtcclxuICAgIGlmICghcHJvdmlkZXJzKSB7XHJcbiAgICAgIHByb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKFsgLi4udGhpcy5fcHJvdmlkZXJzIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm92aWRlcnMgPSB0aGlzLl9jaGVja1Byb3ZpZGVycyhbIC4uLnByb3ZpZGVycyBdKVxyXG4gICAgfVxyXG4gICAgaWYgKCFwcm92aWRlcnMgfHwgcHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvbk1vZGFsOiBubyBwcm92aWRlcnMgd2VyZSBzcGVjaWZpZWQuYClcclxuICAgIH0gXHJcbiAgICByZXR1cm4gbmV3IFJhZG9uVGVtcGxhdGUoe1xyXG4gICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXNbMF0uc3Bhd25SZXRyaWV2YWxzKC4uLnByb3ZpZGVycyksXHJcbiAgICAgIHNvdXJjZXNSZWR1Y2VyOiB0aGlzLnNvdXJjZXNSZWR1Y2VyLFxyXG4gICAgICB3aXRuZXNzUmVkdWNlcjogdGhpcy53aXRuZXNzUmVkdWNlcixcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBfY2hlY2tQcm92aWRlcnMocHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciA9PiB7XHJcbiAgICAgIGNvbnN0IFtzY2hlbWEsXSA9IHBhcnNlVVJMKHByb3ZpZGVyKVxyXG4gICAgICBpZiAoIXNjaGVtYS5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSAmJiAhc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogaW52YWxpZCBwcm92aWRlcjogJHtwcm92aWRlcn1gKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByb3ZpZGVyc1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmV0cmlldmFsIHtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGFyZ3NLZXlzPzogQXJyYXk8c3RyaW5nPjtcclxuICBwdWJsaWMgcmVhZG9ubHkgYXJnc0NvdW50OiBudW1iZXI7XHJcbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZDogcmV0cmlldmFscy5NZXRob2RzO1xyXG4gIHB1YmxpYyByZWFkb25seSBhdXRob3JpdHk/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk/OiBhbnk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIHB1YmxpYyByZWFkb25seSBwYXRoPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBxdWVyeT86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBzY3JpcHQ/OiBfUmFkb25TY3JpcHQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgc3BlY3M6IHtcclxuICAgICAgbWV0aG9kOiByZXRyaWV2YWxzLk1ldGhvZHMsXHJcbiAgICAgIHVybD86IHN0cmluZyxcclxuICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgICAgIGJvZHk/OiBhbnksXHJcbiAgICAgIHNjcmlwdD86IFJhZG9uQW55LFxyXG4gICAgICBhcmdzS2V5cz86IEFycmF5PHN0cmluZz4sXHJcbiAgICB9LCBcclxuICAgIHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cclxuICApIHtcclxuICAgIGlmIChzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5STkcgJiYgKHNwZWNzPy51cmwgfHwgc3BlY3M/LmhlYWRlcnM/LnNpemUgfHwgc3BlY3M/LmJvZHkpKSB7XHJcbiAgICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBSTkcgYWNjZXB0cyBubyBVUkxzIG9yIGhlYWRlcnNcIik7XHJcbiAgICAgIC8vIH0gZWxzZSBpZiAoIXNwZWNzPy51cmwgJiYgKG1ldGhvZCA9PSBNZXRob2RzLkh0dHBQb3N0IHx8IG1ldGhvZCA9PSBNZXRob2RzLkh0dHBHZXQpKSB7XHJcbiAgICAgIC8vICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogVVJMIG11c3QgYmUgc3BlY2lmaWVkXCIpO1xyXG4gICAgfSBlbHNlIGlmIChzcGVjcz8uYm9keSAmJiBzcGVjcy5tZXRob2QgPT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBHZXQpIHtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiUmFkb25SZXRyaWV2YWw6IGJvZHkgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBIVFRQLUdFVCBxdWVyaWVzXCIpXHJcbiAgICB9XHJcbiAgICB0aGlzLm1ldGhvZCA9IHNwZWNzLm1ldGhvZFxyXG4gICAgaWYgKHNwZWNzPy51cmwpIHtcclxuICAgICAgdGhpcy51cmwgPSBzcGVjcy51cmxcclxuICAgICAgaWYgKCFpc1dpbGRjYXJkKHNwZWNzLnVybCkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IHBhcnRzID0gcGFyc2VVUkwoc3BlY3MudXJsKVxyXG4gICAgICAgICAgdGhpcy5zY2hlbWEgPSBwYXJ0c1swXVxyXG4gICAgICAgICAgaWYgKHBhcnRzWzFdICE9PSBcIlwiKSB0aGlzLmF1dGhvcml0eSA9IHBhcnRzWzFdXHJcbiAgICAgICAgICBpZiAocGFydHNbMl0gIT09IFwiXCIpIHRoaXMucGF0aCA9IHBhcnRzWzJdXHJcbiAgICAgICAgICBpZiAocGFydHNbM10gIT09IFwiXCIpIHRoaXMucXVlcnkgPSBwYXJ0c1szXVxyXG4gICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBHZXRcclxuICAgICAgICB8fCBzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCBcclxuICAgICAgICB8fCBzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwSGVhZFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudXJsID0gXCJcXFxcMFxcXFxcIlxyXG4gICAgfVxyXG4gICAgaWYgKHNwZWNzPy5oZWFkZXJzKSB7XHJcbiAgICAgIGlmICh0eXBlb2Ygc3BlY3MuaGVhZGVycyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShzcGVjcy5oZWFkZXJzKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogSFRUUCBoZWFkZXJzIG11c3QgYmUgb2YgdHlwZSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XCIpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oZWFkZXJzID0gc3BlY3M/LmhlYWRlcnNcclxuICAgIH1cclxuICAgIHRoaXMuYm9keSA9IHNwZWNzPy5ib2R5XHJcbiAgICBpZiAoc3BlY3M/LnNjcmlwdCkgdGhpcy5zY3JpcHQgPSBuZXcgX1JhZG9uU2NyaXB0KHNwZWNzPy5zY3JpcHQpXHJcbiAgICB0aGlzLmFyZ3NDb3VudCA9IE1hdGgubWF4KFxyXG4gICAgICBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcodGhpcz8udXJsKSxcclxuICAgICAgZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHRoaXM/LmJvZHkpLFxyXG4gICAgICAuLi5PYmplY3Qua2V5cyh0aGlzPy5oZWFkZXJzIHx8IHt9KS5tYXAoa2V5ID0+IGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhrZXkpKSA/PyBbXSxcclxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzPy5oZWFkZXJzIHx8IHt9KS5tYXAodmFsdWUgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHZhbHVlKSkgPz8gW10sXHJcbiAgICAgIHRoaXMuc2NyaXB0Py5hcmdzQ291bnQoKSB8fCAwLFxyXG4gICAgKVxyXG4gICAgaWYgKHNhbXBsZXMgJiYgdGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBwYXNzZWQgc2FtcGxlcyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWwuXCIpXHJcbiAgICB9XHJcbiAgICB0aGlzLnNhbXBsZXMgPSBzYW1wbGVzXHJcbiAgICBpZiAoc3BlY3M/LmFyZ3NLZXlzKSB7XHJcbiAgICAgIGlmICh0aGlzLmFyZ3NDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogcGFzc2VkIGFyZ3Mga2V5cyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWxcIilcclxuICAgICAgfSBlbHNlIGlmIChzcGVjcy5hcmdzS2V5cy5sZW5ndGggIT09IHRoaXMuYXJnc0NvdW50KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXRyaWV2YWw6IHBhc3NlZCBpbnZhbGlkIG51bWJlciBvZiBhcmdzIGtleXM6ICR7c3BlY3MuYXJnc0tleXMubGVuZ3RofSAhPSAke3RoaXMuYXJnc0NvdW50fWApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hcmdzS2V5cyA9IHNwZWNzLmFyZ3NLZXlzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1ldGhvZCAhPT0gcmV0cmlldmFscy5NZXRob2RzLlJORyAmJiAoIXRoaXMudXJsIHx8IHRoaXMudXJsID09PSBcIlxcXFwwXFxcXFwiKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzUGFyYW1ldGVyaXplZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFyZ3NDb3VudCA+IDBcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgUmFkb24gUmV0cmlldmFsIGJ5IG9yZGVybHkgcmVwbGFjaW5nIGluZGV4ZWQgd2lsZGNhcmRzIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cclxuICAgKiBGYWlscyBpZiBub3QgcGFyYW1ldGVyaXplZCwgb2YgaWYgcGFzc2luZyB0b28gbWFueSBwYXJhbWV0ZXJzLiBcclxuICAgKi9cclxuICBwdWJsaWMgZm9sZEFyZ3MoYXJnczogYW55IHwgc3RyaW5nW10pOiBSYWRvblJldHJpZXZhbCB7XHJcbiAgICBpZiAodGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMvL3Rocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBjYW5ub3QgZm9sZCB1bnBhcmFtZXRlcml6ZWQgcmV0cmlldmFsYClcclxuICAgIH0gXHJcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gW11cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XHJcbiAgICAgIGlmICgoYXJncyBhcyBhbnlbXSkubGVuZ3RoID4gdGhpcy5hcmdzQ291bnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvblJldHJpZXZhbDogdG9vIG1heSBhcmdzIHBhc3NlZDogJHthcmdzLmxlbmd0aH0gPiAke3RoaXMuYXJnc0NvdW50fWApXHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zLnB1c2goLi4uYXJncyBhcyBzdHJpbmdbXSlcclxuICAgIFxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKCF0aGlzLmFyZ3NLZXlzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXRyaWV2YWw6IHVuZXhwZWN0ZWQgYXJncyBtYXA6IHVuZGVmaW5lZCBhcmdzIGtleXMuYClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFyZ3NLZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGlmICghYXJnc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBtaXNzaW5nIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIi5gKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcGFyYW1zLnB1c2goYXJnc1trZXldIGFzIHN0cmluZylcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGFyZ3MgYXMgc3RyaW5nKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXHJcbiAgICAgIHVybDogcmVwbGFjZVdpbGRjYXJkcyh0aGlzLnVybCwgcGFyYW1zKSxcclxuICAgICAgYm9keTogcmVwbGFjZVdpbGRjYXJkcyh0aGlzLmJvZHksIHBhcmFtcyksXHJcbiAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMgfHwge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXHJcbiAgICAgICAgcmVwbGFjZVdpbGRjYXJkcyhrZXksIHBhcmFtcyksXHJcbiAgICAgICAgcmVwbGFjZVdpbGRjYXJkcyh2YWx1ZSwgcGFyYW1zKSxcclxuICAgICAgXSkpLFxyXG4gICAgICBzY3JpcHQ6IHRoaXMuc2NyaXB0Py5yZXBsYWNlV2lsZGNhcmRzKC4uLnBhcmFtcyksXHJcbiAgICB9KVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBDcmVhdGVzIG9uZSBvciBtb3JlIGNsb25lcyBvZiB0aGlzIHJldHJpZXZhbCwgaW4gd2hpY2ggdGhlIGluZGV4LTAgd2lsZGNhcmRcclxuICAgKiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiB2YWx1ZXMuIEZhaWxzIGlmIHRoZSByZXRyaWV2YWwgaXMgbm90IHBhcmFtZXRlcml6ZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNwYXduUmV0cmlldmFscyguLi52YWx1ZXM6IHN0cmluZ1tdKTogUmFkb25SZXRyaWV2YWxbXSB7XHJcbiAgICBjb25zdCBfc3Bhd25lZDogUmFkb25SZXRyaWV2YWxbXSA9IFtdXHJcbiAgICBpZiAodGhpcy5pc01vZGFsKCkpIHtcclxuICAgICAgdmFsdWVzLmZvckVhY2godXJsID0+IHtcclxuICAgICAgICBfc3Bhd25lZC5wdXNoKG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgICBhcmdzS2V5czogdGhpcy5hcmdzS2V5cyxcclxuICAgICAgICAgIGJvZHk6IHRoaXMuYm9keSxcclxuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcclxuICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXHJcbiAgICAgICAgICBzY3JpcHQ6IHRoaXMuc2NyaXB0Py5jbG9uZSgpLFxyXG4gICAgICAgICAgdXJsLFxyXG4gICAgICAgIH0pKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuYXJnc0NvdW50ID09IDApIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvblJldHJpZXZhbDogY2Fubm90IHNwYXduIGZyb20gdW5wYXJhbWV0ZXJpemVkIHJldHJpZXZhbGApO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICBfc3Bhd25lZC5wdXNoKG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxyXG4gICAgICAgICAgdXJsOiBzcGxpY2VXaWxkY2FyZCh0aGlzLnVybCwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICAgIGJvZHk6IHNwbGljZVdpbGRjYXJkKHRoaXMuYm9keSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMgfHwge30pLm1hcCgoW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdKSA9PiBbXHJcbiAgICAgICAgICAgIHNwbGljZVdpbGRjYXJkKGhlYWRlcktleSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICAgICAgc3BsaWNlV2lsZGNhcmQoaGVhZGVyVmFsdWUsIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcbiAgICAgICAgICBdKSksXHJcbiAgICAgICAgICBzY3JpcHQ6IHRoaXMuc2NyaXB0Py5zcGxpY2VXaWxkY2FyZCgwLCB2YWx1ZSksXHJcbiAgICAgICAgICBhcmdzS2V5czogdGhpcy5hcmdzS2V5cz8uc2xpY2UoMSksXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gX3NwYXduZWRcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b0pTT04oaHVtYW5pemU/OiBib29sZWFuKTogYW55IHtcclxuICAgIGNvbnN0IGtpbmQgPSBbXCJcIiwgXCJIVFRQLUdFVFwiLCBcIlJOR1wiLCBcIkhUVFAtUE9TVFwiLCBcIkhUVFAtSEVBRFwiXVxyXG4gICAgbGV0IGpzb246IGFueSA9IHtcclxuICAgICAga2luZDoga2luZFt0aGlzLm1ldGhvZF0gLy8gaHVtYW5pemUgPyBNZXRob2RzW3RoaXMubWV0aG9kXSA6IHRoaXMubWV0aG9kLFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudXJsKSBqc29uLnVybCA9IHRoaXMudXJsXHJcbiAgICBpZiAodGhpcy5oZWFkZXJzKSB7XHJcbiAgICAgIGpzb24uaGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ib2R5KSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGpzb24uYm9keSA9IGh1bWFuaXplID8gdGhpcy5ib2R5IDogdG9VdGY4QXJyYXkodGhpcy5ib2R5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGpzb24uYm9keSA9IHRoaXMuYm9keVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBqc29uLnNjcmlwdCA9IGh1bWFuaXplID8gdGhpcy5zY3JpcHQ/LnRvU3RyaW5nKCkgOiBBcnJheS5mcm9tKGZyb21IZXhTdHJpbmcodGhpcy5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCAnMHg4MCcpKVxyXG4gICAgcmV0dXJuIGpzb25cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1Byb3RvYnVmKCk6IGFueSB7XHJcbiAgICBsZXQgcHJvdG9idWY6IGFueSA9IHtcclxuICAgICAga2luZDogdGhpcy5tZXRob2QsXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy51cmwpIHByb3RvYnVmLnVybCA9IHRoaXMudXJsXHJcbiAgICBpZiAodGhpcy5oZWFkZXJzKSB7XHJcbiAgICAgIHByb3RvYnVmLmhlYWRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMpLm1hcCgoW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxlZnQ6IGhlYWRlcktleSxcclxuICAgICAgICAgIHJpZ2h0OiBoZWFkZXJWYWx1ZSxcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ib2R5KSB7XHJcbiAgICAgIGNvbnN0IHV0ZjhBcnJheSA9IHRvVXRmOEFycmF5KHRoaXMuYm9keSlcclxuICAgICAgcHJvdG9idWYuYm9keSA9IHV0ZjhBcnJheVxyXG4gICAgfVxyXG4gICAgcHJvdG9idWYuc2NyaXB0ID0gT2JqZWN0LnZhbHVlcyhVaW50OEFycmF5LmZyb20oY2JvckVuY29kZSh0aGlzLnNjcmlwdD8uZW5jb2RlKCkgfHwgW10pKSlcclxuICAgIHJldHVybiBwcm90b2J1ZlxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wc0NvdW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRPcHModGhpcy5zY3JpcHQ/LmVuY29kZSgpIHx8IFtdKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jb3VudE9wcyhpdGVtczogYW55W10pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA+IDAgPyBpdGVtcy5tYXAoaXRlbSA9PiBBcnJheS5pc0FycmF5KGl0ZW0pID8gdGhpcy5fY291bnRPcHMoaXRlbSkgOiAxKS5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYSkgOiAwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIGZpbHRlcnMge1xyXG4gIGV4cG9ydCBjb25zdCBPcGNvZGVzID0gRmlsdGVyc1xyXG4gIGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uRmlsdGVyXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1vZGUoKSB7IHJldHVybiBuZXcgUmFkb25GaWx0ZXIoRmlsdGVycy5Nb2RlKTsgfVxyXG4gIGV4cG9ydCBmdW5jdGlvbiBTdGRldihzdGRldjogbnVtYmVyKSB7IHJldHVybiBuZXcgUmFkb25GaWx0ZXIoRmlsdGVycy5TdGFuZGFyZERldmlhdGlvbiwgc3RkZXYpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgcmVkdWNlcnMge1xyXG4gIGV4cG9ydCBjb25zdCBPcGNvZGVzID0gUmVkdWNlcnNcclxuICBleHBvcnQgY29uc3QgQ2xhc3MgPSBSYWRvblJlZHVjZXJcclxuICBleHBvcnQgZnVuY3Rpb24gTW9kZSguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1vZGUsIGZpbHRlcnMpOyB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1lYW4oLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gTWVkaWFuKC4uLmZpbHRlcnM6IFJhZG9uRmlsdGVyW10pIHsgcmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVkaWFuQXZlcmFnZSwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gU3RkZXYoLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5TdGFuZGFyZERldmlhdGlvbiwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gQ29uY2F0SGFzaCguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLkNvbmNhdGVuYXRlQW5kSGFzaCwgZmlsdGVycyk7IH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIFByaWNlQWdncmVnYXRlKCkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgW2ZpbHRlcnMuU3RkZXYoMS40KV0pOyB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIFByaWNlVGFsbHkoKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1lYW5BdmVyYWdlLCBbZmlsdGVycy5TdGRldigyLjUpXSk7IH1cclxufVxyXG5cclxuaW1wb3J0ICogYXMgY2NkciBmcm9tICcuL2NjZHInXHJcbmV4cG9ydCBuYW1lc3BhY2UgcmV0cmlldmFscyB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBycGMgPSBjY2RyO1xyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZnJvbVJhZG9uQXNzZXRzKGFzc2V0czogT2JqZWN0KTogUmVjb3JkPHN0cmluZywgUmFkb25SZXRyaWV2YWw+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoYXNzZXRzLCBwcm94eUhhbmRsZXIoUmFkb25SZXRyaWV2YWwpKVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gTWV0aG9kcyB7XHJcbiAgICBOb25lID0gMHgwLFxyXG4gICAgSHR0cEdldCA9IDB4MDEsXHJcbiAgICBIdHRwSGVhZCA9IDB4MDQsXHJcbiAgICBIdHRwUG9zdCA9IDB4MDMsXHJcbiAgICBSTkcgPSAweDAyLFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIFdpdG5ldCByYW5kb21uZXNzIGRhdGEgc291cmNlIG9iamVjdC5cclxuICAgKiBAcGFyYW0gc2NyaXB0IChPcHRpb25hbCkgUmFkb24gU2NyaXB0IHRvIGFwcGx5IHRvIHRoZSByYW5kb20gc2VlZCBwcm9wb3NlZCBieSBldmVyeSBzaW5nbGUgd2l0bmVzcywgXHJcbiAgICogYmVmb3JlIGFnZ3JlZ2F0aW9uLlxyXG4gICoqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBSTkcoc2NyaXB0PzogUmFkb25BbnkpIHtcclxuICAgIGNvbnN0IHJldHJpZXZhbCA9IG5ldyBSYWRvblJldHJpZXZhbCh7IG1ldGhvZDogTWV0aG9kcy5STkcsIHNjcmlwdCB9KTtcclxuICAgIGlmIChyZXRyaWV2YWw/LnNjcmlwdCAmJiByZXRyaWV2YWw/LnNjcmlwdD8uaW5wdXRUeXBlPy5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIlJhZG9uQnl0ZXNcIikge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUk5HIHNjcmlwdHMgcmVxdWlyZSBbUmFkb25CeXRlc10gYXMgaW5wdXQgdHlwZVwiKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldHJpZXZhbFxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL0dFVCBkYXRhIHJldHJpZXZhbCBvYmplY3QuXHJcbiAgICogQHBhcmFtIHNwZWNzIFJhZG9uIFJldHJpZXZhbCBzcGVjcy5cclxuICAqKi9cclxuICBleHBvcnQgZnVuY3Rpb24gSHR0cEdldChzcGVjczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgVVJMLlxyXG4gICAgICovXHJcbiAgICB1cmw/OiBzdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb25TY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHNjcmlwdD86IFJhZG9uQW55LFxyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpLlxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgbWV0aG9kOiBNZXRob2RzLkh0dHBHZXQsIFxyXG4gICAgICAgIHVybDogc3BlY3M/LnVybCxcclxuICAgICAgICBoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXMsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL0hFQUQgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkKHNwZWNzOiB7XHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBVUkxcclxuICAgICAqL1xyXG4gICAgdXJsPzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgbWV0aG9kOiBNZXRob2RzLkh0dHBIZWFkLFxyXG4gICAgICAgIHVybDogc3BlY3M/LnVybCxcclxuICAgICAgICBoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXMsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL1BPU1QgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEh0dHBQb3N0KHNwZWNzOiB7XHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBVUkxcclxuICAgICAqL1xyXG4gICAgdXJsPzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgYm9keVxyXG4gICAgICovXHJcbiAgICBib2R5Pzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IE1ldGhvZHMuSHR0cFBvc3QsXHJcbiAgICAgICAgdXJsOiBzcGVjcz8udXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IHNwZWNzPy5oZWFkZXJzLFxyXG4gICAgICAgIGJvZHk6IHNwZWNzPy5ib2R5LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlcyxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIEdyYXBoUUwtcXVlcnkgZGF0YSBzb3VyY2Ugb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEdyYXBoUUxRdWVyeShzcGVjczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHcmFwaFFMIFVSTCBlbmRwb2ludFxyXG4gICAgICovXHJcbiAgICB1cmw/OiBzdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIEdyYXBoUUwgcXVlcnlcclxuICAgICAqL1xyXG4gICAgcXVlcnk6IHN0cmluZyxcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IE1ldGhvZHMuSHR0cFBvc3QsXHJcbiAgICAgICAgdXJsOiBzcGVjcy51cmwsXHJcbiAgICAgICAgYm9keTogYHtcXFwicXVlcnlcXFwiOlxcXCIke2dyYXBoUWxDb21wcmVzcyhzcGVjcy5xdWVyeSkucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJyl9XFxcIn1gLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlc1xyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgSlNPTi1SUEMgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEpzb25SUEMoc3BlY3MgOiB7XHJcbiAgICAvKipcclxuICAgICAqIEpTT04tUlBDIG1ldGhvZCBhbmQgcGFyYW1ldGVycy5cclxuICAgICAqL1xyXG4gICAgcnBjOiB7IG1ldGhvZDogc3RyaW5nLCBwYXJhbXM/OiBhbnkgfSxcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXHJcbiAgICAgICAgICAgIG1ldGhvZDogc3BlY3MucnBjLm1ldGhvZCxcclxuICAgICAgICAgICAgcGFyYW1zOiBzcGVjcy5ycGM/LnBhcmFtcyxcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgfSkucmVwbGFjZUFsbCgnXFxcXFxcXFwnLCAnXFxcXCcpLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IG5hbWVzcGFjZSB0eXBlcyB7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uQXJyYXkgPSBfUmFkb25BcnJheTtcclxuICBleHBvcnQgY29uc3QgUmFkb25Cb29sZWFuID0gX1JhZG9uQm9vbGVhbjtcclxuICBleHBvcnQgY29uc3QgUmFkb25CeXRlcyA9IF9SYWRvbkJ5dGVzO1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvbkZsb2F0ID0gX1JhZG9uRmxvYXQ7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uSW50ZWdlciA9IF9SYWRvbkludGVnZXI7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uTWFwID0gX1JhZG9uTWFwO1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvblNjcmlwdCA9IF9SYWRvblNjcmlwdDtcclxuICBleHBvcnQgY29uc3QgUmFkb25TdHJpbmcgPSBfUmFkb25TdHJpbmc7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uRW5jb2RpbmdzID0gX1JhZG9uRW5jb2RpbmdzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm94eUhhbmRsZXI8VD4odDogeyBuZXcoc3BlY3M6IGFueSk6IFQ7IH0pIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGZvdW5kID0gdGFyZ2V0W3Byb3BdID8/IGZpbmRLZXlJbk9iamVjdCh0YXJnZXQsIHByb3ApXHJcbiAgICAgICAgICAgIC8vIGlmICghZm91bmQpIHtcclxuICAgICAgICAgICAgLy8gICAgIHRocm93IEV2YWxFcnJvcihgWycke3Byb3B9J10gd2FzIG5vdCBmb3VuZCBpbiBkaWN0aW9uYXJ5YClcclxuICAgICAgICAgICAgLy8gfSBlbHNlIFxyXG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgIShmb3VuZCBpbnN0YW5jZW9mIHQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFsnJHtwcm9wfSddIHdhcyBmb3VuZCB3aXRoIHR5cGUgJHtmb3VuZD8uY29uc3RydWN0b3I/Lm5hbWV9IGluc3RlYWQgb2YgJHt0Lm5hbWV9IWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZvdW5kXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmplY3QoZGljdDogYW55LCB0YWc6IHN0cmluZykge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGljdCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGljdFtrZXldID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB0YWcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkaWN0W2tleV1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZDogYW55ID0gZmluZEtleUluT2JqZWN0KGRpY3Rba2V5XSwgdGFnKVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIl19
|
|
749
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRS9DLE9BQU8sUUFBUSxNQUFNLFlBQVksQ0FBQztBQUVsQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUNyQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUNuQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FDNUMsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFdEQsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsMkJBQTJCLEVBQzNCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsV0FBVyxFQUNYLFdBQVcsRUFDWCxjQUFjLEdBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxJQUFJLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ04sVUFBVSxJQUFJLFdBQVcsRUFDekIsWUFBWSxJQUFJLGFBQWEsRUFDN0IsVUFBVSxJQUFJLFdBQVcsRUFDekIsY0FB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b2R1bGVcIjtcclxuaW1wb3J0IGNib3IgZnJvbSBcImNib3JcIjtcclxuaW1wb3J0IGdyYXBoUWxDb21wcmVzcyBmcm9tIFwiZ3JhcGhxbC1xdWVyeS1jb21wcmVzc1wiO1xyXG5cclxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcclxuXHJcbmltcG9ydCBwcm90b2J1ZiBmcm9tIFwicHJvdG9idWZqc1wiO1xyXG5cclxuY29uc3QgeyBSb290OiBQcm90b1Jvb3QgfSA9IHByb3RvYnVmO1xyXG5jb25zdCBwcm90b1Jvb3QgPSBQcm90b1Jvb3QuZnJvbUpTT04oXHJcblx0cmVxdWlyZShcIi4uLy4uLy4uL3dpdG5ldC93aXRuZXQucHJvdG8uanNvblwiKSxcclxuKTtcclxuY29uc3QgUkFEUmVxdWVzdCA9IHByb3RvUm9vdC5sb29rdXBUeXBlKFwiUkFEUmVxdWVzdFwiKTtcclxuXHJcbmltcG9ydCB7XHJcblx0ZXhlY1JhZG9uQnl0ZWNvZGUsXHJcblx0ZnJvbUhleFN0cmluZyxcclxuXHRnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcsXHJcblx0aXNIZXhTdHJpbmcsXHJcblx0aXNXaWxkY2FyZCxcclxuXHRwYXJzZVVSTCxcclxuXHRyZXBsYWNlV2lsZGNhcmRzLFxyXG5cdHNwbGljZVdpbGRjYXJkLFxyXG5cdHRvSGV4U3RyaW5nLFxyXG5cdHRvVXRmOEFycmF5LFxyXG5cdHV0ZjhBcnJheVRvU3RyLFxyXG59IGZyb20gXCIuLi8uLi9iaW4vaGVscGVycy5qc1wiO1xyXG5cclxuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSBcIi4uL2NyeXB0by91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIEZpbHRlcnMsIFJhZG9uRmlsdGVyIH0gZnJvbSBcIi4vZmlsdGVycy5qc1wiO1xyXG5pbXBvcnQgeyBSYWRvblJlZHVjZXIsIE9wY29kZXMgYXMgUmVkdWNlcnMgfSBmcm9tIFwiLi9yZWR1Y2Vycy5qc1wiO1xyXG5pbXBvcnQge1xyXG5cdFJhZG9uQXJyYXkgYXMgX1JhZG9uQXJyYXksXHJcblx0UmFkb25Cb29sZWFuIGFzIF9SYWRvbkJvb2xlYW4sXHJcblx0UmFkb25CeXRlcyBhcyBfUmFkb25CeXRlcyxcclxuXHRSYWRvbkVuY29kaW5ncyBhcyBfUmFkb25FbmNvZGluZ3MsXHJcblx0UmFkb25GbG9hdCBhcyBfUmFkb25GbG9hdCxcclxuXHRSYWRvbkludGVnZXIgYXMgX1JhZG9uSW50ZWdlcixcclxuXHRSYWRvbk1hcCBhcyBfUmFkb25NYXAsXHJcblx0UmFkb25TY3JpcHQgYXMgX1JhZG9uU2NyaXB0LFxyXG5cdFJhZG9uU3RyaW5nIGFzIF9SYWRvblN0cmluZyxcclxuXHR0eXBlIFJhZG9uQW55LFxyXG5cdHR5cGUgUmFkb25PcGVyYXRvcixcclxuXHR0eXBlIFJhZG9uU3RyaW5nLFxyXG59IGZyb20gXCIuL3R5cGVzLmpzXCI7XHJcbmltcG9ydCB7IHBhcnNlUmFkb25TY3JpcHQgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xyXG5cclxudHlwZSBBcmdzID0gc3RyaW5nW10gfCBzdHJpbmdbXVtdO1xyXG5cclxuY2xhc3MgUmFkb25BcnRpZmFjdCB7XHJcblx0cHVibGljIHJlYWRvbmx5IHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsW107XHJcblx0cHVibGljIHJlYWRvbmx5IHNvdXJjZXNSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblx0cHVibGljIHJlYWRvbmx5IHdpdG5lc3NSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHNwZWNzOiB7XHJcblx0XHRzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdO1xyXG5cdFx0c291cmNlc1JlZHVjZXI6IFJhZG9uUmVkdWNlcjtcclxuXHRcdHdpdG5lc3NSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblx0fSkge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQhc3BlY3Muc291cmNlcyB8fFxyXG5cdFx0XHQhQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKSB8fFxyXG5cdFx0XHRzcGVjcy5zb3VyY2VzLmxlbmd0aCA9PT0gMFxyXG5cdFx0KSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcIlJhZG9uQXJ0aWZhY3Q6IGNhbm5vdCBidWlsZCBpZiBubyByZXRyaWV2YWxzIGFyZSBwYXNzZWRcIixcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHNwZWNzLnNvdXJjZXM/LmZvckVhY2goKHJldHJpZXZhbCwgaW5kZXgpID0+IHtcclxuXHRcdFx0aWYgKHJldHJpZXZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKGBSYWRvbkFydGlmYWN0OiByZXRyaWV2YWwgIyR7aW5kZXh9IGlzIHVuZGVmaW5lZGApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCEocmV0cmlldmFsIGluc3RhbmNlb2YgUmFkb25SZXRyaWV2YWwpKSB7XHJcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKGBSYWRvbkFydGlmYWN0OiByZXRyaWV2YWwgIyR7aW5kZXh9OiBpbnZhbGlkIHR5cGVgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnNvdXJjZXMgPSBzcGVjcy5zb3VyY2VzO1xyXG5cdFx0dGhpcy5zb3VyY2VzUmVkdWNlciA9IHNwZWNzLnNvdXJjZXNSZWR1Y2VyO1xyXG5cdFx0dGhpcy53aXRuZXNzUmVkdWNlciA9IHNwZWNzLndpdG5lc3NSZWR1Y2VyO1xyXG5cdH1cclxuXHJcblx0cHVibGljIG9wc0NvdW50KCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHQodGhpcy5zb3VyY2VzXHJcblx0XHRcdFx0Py5tYXAoKHJldHJpZXZhbCkgPT4gcmV0cmlldmFsLm9wc0NvdW50KCkpXHJcblx0XHRcdFx0LnJlZHVjZSgoc3VtLCBhKSA9PiBzdW0gKyBhKSB8fCAwKSArXHJcblx0XHRcdHRoaXMuc291cmNlc1JlZHVjZXI/Lm9wc0NvdW50KCkgK1xyXG5cdFx0XHR0aGlzLndpdG5lc3NSZWR1Y2VyPy5vcHNDb3VudCgpXHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmVxdWVzdCBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cdC8qKlxyXG5cdCAqIERlY29kZXMgYSBSYWRvblJlcXVlc3QgYXJ0aWZhY3Qgb3V0IGZyb20gYSBQcm90b2J1Zi1zZXJpYWxpemVkIGJ5dGVjb2RlLlxyXG5cdCAqIEBwYXJhbSBieXRlY29kZSBSYWRvbiByZXF1ZXN0IGJ5dGVjb2RlLlxyXG5cdCAqIEByZXR1cm5zIFJhZG9uUmVxdWVzdCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHN0YXRpYyBmcm9tQnl0ZWNvZGUoYnl0ZWNvZGU6IGFueSkge1xyXG5cdFx0bGV0IGJ1ZmZlcjtcclxuXHRcdGlmIChpc0hleFN0cmluZyhieXRlY29kZSkpIHtcclxuXHRcdFx0YnVmZmVyID0gZnJvbUhleFN0cmluZyhieXRlY29kZSk7XHJcblx0XHR9IGVsc2UgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG5cdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShieXRlY29kZSk7XHJcblx0XHR9IGVsc2UgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgQnVmZmVyKSB7XHJcblx0XHRcdGJ1ZmZlciA9IGJ5dGVjb2RlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRgUmFkb25SZXF1ZXN0OiB1bnN1cHBvcnRlZCBieXRlY29kZSBmb3JtYXQ6ICR7Ynl0ZWNvZGV9YCxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG9iajogYW55ID0gUkFEUmVxdWVzdC5kZWNvZGUoYnVmZmVyKTtcclxuXHRcdHJldHVybiBSYWRvblJlcXVlc3QuZnJvbVByb3RvYnVmKG9iaik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWNvZGVzIGEgUmFkb25SZXF1ZXN0IGFydGlmYWN0IG91dCBmcm9tIGEgUHJvdG9idWYgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBvYmogUHJvdG9idWYgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm5zIFJhZG9uUmVxdWVzdCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHN0YXRpYyBmcm9tUHJvdG9idWYob2JqOiBhbnkpIHtcclxuXHRcdGNvbnN0IHNvdXJjZXMgPSBvYmoucmV0cmlldmUubWFwKChyZXRyaWV2YWw6IGFueSkgPT4ge1xyXG5cdFx0XHRjb25zdCBzcGVjczogYW55ID0ge307XHJcblx0XHRcdGlmIChyZXRyaWV2YWw/LnVybCkge1xyXG5cdFx0XHRcdHNwZWNzLnVybCA9IHJldHJpZXZhbC51cmw7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHJldHJpZXZhbD8uaGVhZGVycykge1xyXG5cdFx0XHRcdHNwZWNzLmhlYWRlcnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXHJcblx0XHRcdFx0XHRyZXRyaWV2YWwuaGVhZGVycy5tYXAoKHN0cmluZ1BhaXI6IGFueSkgPT4gW1xyXG5cdFx0XHRcdFx0XHRzdHJpbmdQYWlyLmxlZnQsXHJcblx0XHRcdFx0XHRcdHN0cmluZ1BhaXIucmlnaHQsXHJcblx0XHRcdFx0XHRdKSxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChyZXRyaWV2YWw/LmJvZHkgJiYgcmV0cmlldmFsLmJvZHkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHNwZWNzLmJvZHkgPSB1dGY4QXJyYXlUb1N0cihPYmplY3QudmFsdWVzKHJldHJpZXZhbC5ib2R5KSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHJldHJpZXZhbD8uc2NyaXB0KVxyXG5cdFx0XHRcdHNwZWNzLnNjcmlwdCA9IHBhcnNlUmFkb25TY3JpcHQodG9IZXhTdHJpbmcocmV0cmlldmFsLnNjcmlwdCkpO1xyXG5cdFx0XHRzcGVjcy5tZXRob2QgPSByZXRyaWV2YWwua2luZDtcclxuXHRcdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChzcGVjcyk7XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGRlY29kZUZpbHRlciA9IChmOiBhbnkpID0+IHtcclxuXHRcdFx0aWYgKGY/LmFyZ3MgJiYgZi5hcmdzLmxlbmd0aCA+IDApXHJcblx0XHRcdFx0cmV0dXJuIG5ldyBSYWRvbkZpbHRlcihmLm9wLCBjYm9yLmRlY29kZShVaW50OEFycmF5LmZyb20oZi5hcmdzKSkpO1xyXG5cdFx0XHRlbHNlIHJldHVybiBuZXcgUmFkb25GaWx0ZXIoZi5vcCk7XHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlcXVlc3Qoe1xyXG5cdFx0XHRzb3VyY2VzLFxyXG5cdFx0XHRzb3VyY2VzUmVkdWNlcjogbmV3IFJhZG9uUmVkdWNlcihcclxuXHRcdFx0XHRvYmouYWdncmVnYXRlLnJlZHVjZXIsXHJcblx0XHRcdFx0b2JqLmFnZ3JlZ2F0ZS5maWx0ZXJzPy5tYXAoZGVjb2RlRmlsdGVyKSxcclxuXHRcdFx0KSxcclxuXHRcdFx0d2l0bmVzc1JlZHVjZXI6IG5ldyBSYWRvblJlZHVjZXIoXHJcblx0XHRcdFx0b2JqLnRhbGx5LnJlZHVjZXIsXHJcblx0XHRcdFx0b2JqLnRhbGx5LmZpbHRlcnM/Lm1hcChkZWNvZGVGaWx0ZXIpLFxyXG5cdFx0XHQpLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3RvcihzcGVjczoge1xyXG5cdFx0c291cmNlczogUmFkb25SZXRyaWV2YWwgfCBSYWRvblJldHJpZXZhbFtdO1xyXG5cdFx0c291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXI7XHJcblx0XHR3aXRuZXNzUmVkdWNlcj86IFJhZG9uUmVkdWNlcjtcclxuXHR9KSB7XHJcblx0XHRjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKVxyXG5cdFx0XHQ/IChzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10pXHJcblx0XHRcdDogW3NwZWNzLnNvdXJjZXNdO1xyXG5cdFx0c3VwZXIoe1xyXG5cdFx0XHRzb3VyY2VzLFxyXG5cdFx0XHRzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyIHx8IHJlZHVjZXJzLk1vZGUoKSxcclxuXHRcdFx0d2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGFyZ3NDb3VudCA9IHNvdXJjZXNcclxuXHRcdFx0Lm1hcCgocmV0cmlldmFsKSA9PiByZXRyaWV2YWwuYXJnc0NvdW50KVxyXG5cdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3Vycik7XHJcblx0XHRpZiAoYXJnc0NvdW50ID4gMCkge1xyXG5cdFx0XHR0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblJlcXVlc3Q6IHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscyB3ZXJlIHBhc3NlZFwiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfZW5jb2RlKCk6IEJ1ZmZlciB7XHJcblx0XHRjb25zdCBwYXlsb2FkID0gdGhpcy50b1Byb3RvYnVmKCk7XHJcblx0XHRjb25zdCBlcnJNc2cgPSBSQURSZXF1ZXN0LnZlcmlmeShwYXlsb2FkKTtcclxuXHRcdGlmIChlcnJNc2cpIHtcclxuXHRcdFx0dGhyb3cgRXJyb3IoZXJyTXNnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBSQURSZXF1ZXN0LmZyb21PYmplY3QocGF5bG9hZCk7XHJcblx0XHRcdHJldHVybiBCdWZmZXIuZnJvbShSQURSZXF1ZXN0LmVuY29kZShtZXNzYWdlKS5maW5pc2goKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgZXhlY0RyeVJ1bih2ZXJib3NlID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0YXdhaXQgZXhlY1JhZG9uQnl0ZWNvZGUoXHJcblx0XHRcdFx0dGhpcy50b0J5dGVjb2RlKCksXHJcblx0XHRcdFx0XCItLWpzb25cIixcclxuXHRcdFx0XHR2ZXJib3NlID8gXCItLXZlcmJvc2VcIiA6IFwiXCIsXHJcblx0XHRcdClcclxuXHRcdCkudHJpbSgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBkYXRhVHlwZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1swXS5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5STkdcclxuXHRcdFx0PyBcIlJhZG9uQnl0ZXNcIlxyXG5cdFx0XHQ6IHRoaXMuc291cmNlcz8uWzBdPy5zY3JpcHQ/Lm91dHB1dFR5cGVcclxuXHRcdFx0XHQ/IHRoaXMuc291cmNlc1swXS5zY3JpcHQub3V0cHV0VHlwZS5jb25zdHJ1Y3Rvci5uYW1lXHJcblx0XHRcdFx0OiBcIlJhZG9uQW55XCI7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHJhZEhhc2goKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0b0hleFN0cmluZyhzaGEyNTYodGhpcy5fZW5jb2RlKCkpLCBmYWxzZSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRvSGV4U3RyaW5nKHRoaXMuX2VuY29kZSgpKTsgLy9lbmNvZGVSQURSZXF1ZXN0KHRoaXMudG9Qcm90b2J1ZigpKSwgdHJ1ZSlcclxuXHR9XHJcblxyXG5cdHB1YmxpYyB0b0pTT04oaHVtYW5pemU/OiBib29sZWFuKTogYW55IHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHJldHJpZXZlOiB0aGlzLnNvdXJjZXMubWFwKChyZXRyaWV2YWwpID0+IHJldHJpZXZhbC50b0pTT04oaHVtYW5pemUpKSxcclxuXHRcdFx0YWdncmVnYXRlOiB0aGlzLnNvdXJjZXNSZWR1Y2VyLnRvSlNPTihodW1hbml6ZSksXHJcblx0XHRcdHRhbGx5OiB0aGlzLndpdG5lc3NSZWR1Y2VyLnRvSlNPTihodW1hbml6ZSksXHJcblx0XHRcdC4uLihodW1hbml6ZSA/IHt9IDogeyB0aW1lX2xvY2s6IDAgfSksXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHVibGljIHRvUHJvdG9idWYoKTogYW55IHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdC8vdGltZUxvY2s6IDAsXHJcblx0XHRcdHJldHJpZXZlOiB0aGlzLnNvdXJjZXMubWFwKChyZXRyaWV2YWwpID0+IHJldHJpZXZhbC50b1Byb3RvYnVmKCkpLFxyXG5cdFx0XHRhZ2dyZWdhdGU6IHRoaXMuc291cmNlc1JlZHVjZXIudG9Qcm90b2J1ZigpLFxyXG5cdFx0XHR0YWxseTogdGhpcy53aXRuZXNzUmVkdWNlci50b1Byb3RvYnVmKCksXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHVibGljIHdlaWdodCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMudG9CeXRlY29kZSgpLnNsaWNlKDIpLmxlbmd0aCAvIDI7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmFkb25SZXF1ZXN0RnJvbUFzc2V0cyhzcGVjczoge1xyXG5cdGFzc2V0czogT2JqZWN0O1xyXG5cdGFyZ3NNYXA6IFJlY29yZDxzdHJpbmcsIGFueSB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPjtcclxuXHRzb3VyY2VzUmVkdWNlcj86IFJhZG9uUmVkdWNlcjtcclxuXHR3aXRuZXNzUmVkdWNlcj86IFJhZG9uUmVkdWNlcjtcclxufSk6IFJhZG9uUmVxdWVzdCB7XHJcblx0Y29uc3Qgc291cmNlczogUmFkb25SZXRyaWV2YWxbXSA9IFtdO1xyXG5cdGNvbnN0IGRpY3QgPSByZXRyaWV2YWxzLmZyb21SYWRvbkFzc2V0cyhzcGVjcy5hc3NldHMpO1xyXG5cdC8vIGNvbnN0IGFyZ3M6IHN0cmluZ1tdW10gPSBbXVxyXG5cdE9iamVjdC5rZXlzKHNwZWNzLmFyZ3NNYXApLmZvckVhY2goKGtleSkgPT4ge1xyXG5cdFx0Y29uc3QgcmV0cmlldmFsOiBSYWRvblJldHJpZXZhbCA9IGRpY3Rba2V5XTtcclxuXHRcdGNvbnN0IGFyZ3MgPSAoc3BlY3MuYXJnc01hcCBhcyBhbnkpW2tleV07XHJcblx0XHRpZiAocmV0cmlldmFsLmFyZ3NDb3VudCA+IDApIHtcclxuXHRcdFx0aWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDwgcmV0cmlldmFsLmFyZ3NDb3VudCkge1xyXG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcdGBJbnN1ZmZpY2llbnQgYXJncyBwYXNzZWQgdG8gcmV0cmlldmFsIG5hbWVkIGFzICcke2tleX0nOiAke2FyZ3MubGVuZ3RofSA8ICR7cmV0cmlldmFsLmFyZ3NDb3VudH1gLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c291cmNlcy5wdXNoKHJldHJpZXZhbC5mb2xkQXJncyhhcmdzKSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNvdXJjZXMucHVzaChyZXRyaWV2YWwpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiBuZXcgUmFkb25SZXF1ZXN0KHtcclxuXHRcdHNvdXJjZXMsXHJcblx0XHRzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyLFxyXG5cdFx0d2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlcixcclxuXHR9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFJhZG9uU2NyaXB0PFxyXG5cdElucHV0VHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25TdHJpbmcsXHJcbj4oaW5wdXRUeXBlOiB7IG5ldyAob3BzPzogUmFkb25PcGVyYXRvcik6IElucHV0VHlwZSB9KTogSW5wdXRUeXBlIHtcclxuXHRpZiAoIWlucHV0VHlwZSlcclxuXHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XCJJbnB1dCBSYWRvbiBkYXRhIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBkZWNsYXJpbmcgYSBuZXcgUmFkb24gc2NyaXB0LlwiLFxyXG5cdFx0KTtcclxuXHRyZXR1cm4gbmV3IGlucHV0VHlwZSgpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25UZW1wbGF0ZSBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cdHByb3RlY3RlZCBfYXJnc0NvdW50OiBudW1iZXI7XHJcblxyXG5cdHB1YmxpYyByZWFkb25seSBob21vZ2VuZW91czogYm9vbGVhbjtcclxuXHRwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIEFyZ3M+O1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHNwZWNzOiB7XHJcblx0XHRcdHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXTtcclxuXHRcdFx0c291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXI7XHJcblx0XHRcdHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyO1xyXG5cdFx0fSxcclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBBcmdzPixcclxuXHQpIHtcclxuXHRcdGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KHNwZWNzLnNvdXJjZXMpXHJcblx0XHRcdD8gKHNwZWNzLnNvdXJjZXMgYXMgUmFkb25SZXRyaWV2YWxbXSlcclxuXHRcdFx0OiBbc3BlY3Muc291cmNlc107XHJcblx0XHRzdXBlcih7XHJcblx0XHRcdHNvdXJjZXMsXHJcblx0XHRcdHNvdXJjZXNSZWR1Y2VyOiBzcGVjcz8uc291cmNlc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG5cdFx0XHR3aXRuZXNzUmVkdWNlcjogc3BlY3M/LndpdG5lc3NSZWR1Y2VyIHx8IHJlZHVjZXJzLk1vZGUoKSxcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5fYXJnc0NvdW50ID0gc291cmNlc1xyXG5cdFx0XHQubWFwKChyZXRyaWV2YWwpID0+IHJldHJpZXZhbD8uYXJnc0NvdW50KVxyXG5cdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLm1heChwcmV2LCBjdXJyKSwgMCk7XHJcblx0XHRpZiAodGhpcy5fYXJnc0NvdW50ID09PSAwKSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcIlJhZG9uVGVtcGxhdGU6IG5vIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscyB3ZXJlIHBhc3NlZFwiKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuaG9tb2dlbmVvdXMgPSAhc291cmNlcy5maW5kKFxyXG5cdFx0XHQocmV0cmlldmFsKSA9PiByZXRyaWV2YWwuYXJnc0NvdW50ICE9PSB0aGlzLl9hcmdzQ291bnQsXHJcblx0XHQpO1xyXG5cdFx0aWYgKHNhbXBsZXMpIHtcclxuXHRcdFx0T2JqZWN0LmtleXMoc2FtcGxlcykuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XHJcblx0XHRcdFx0bGV0IHNhbXBsZUFyZ3M6IEFyZ3MgPSBPYmplY3Qoc2FtcGxlcylbc2FtcGxlXTtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHNhbXBsZUFyZ3MgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRcdHNhbXBsZUFyZ3MgPSBbc2FtcGxlQXJnc107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChzYW1wbGVBcmdzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShzYW1wbGVBcmdzWzBdKSkge1xyXG5cdFx0XHRcdFx0XHRPYmplY3Qoc2FtcGxlcylbc2FtcGxlXSA9IEFycmF5KHNvdXJjZXMubGVuZ3RoKS5maWxsKHNhbXBsZUFyZ3MpO1xyXG5cdFx0XHRcdFx0XHRzYW1wbGVBcmdzID0gT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV07XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNhbXBsZUFyZ3M/Lmxlbmd0aCAhPT0gc291cmNlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdGBSYWRvblRlbXBsYXRlOiBhcmd1bWVudHMgbWlzbWF0Y2ggaW4gc2FtcGxlIFwiJHtzYW1wbGV9XCI6ICR7c2FtcGxlQXJncz8ubGVuZ3RofSBzYW1wbGVzIGdpdmVuIHZzLiAke3NvdXJjZXMubGVuZ3RofSBleHBlY3RlZGAsXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRzYW1wbGVBcmdzPy5mb3JFYWNoKChzdWJhcmdzLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoc3ViYXJncy5sZW5ndGggPCBzb3VyY2VzW2luZGV4XS5hcmdzQ291bnQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRgXFx4MWJbMTszM21SYWRvblJlcXVlc3RUZW1wbGF0ZTogYXJndW1lbnRzIG1pc21hdGNoIGluIHRlc3QgXFx4MWJbMTszMW0nJHtzYW1wbGV9J1xceDFiWzE7MzNtOiBcXHgxYlsxOzM3bVJldHJpZXZhbCAjJHtpbmRleH1cXHgxYlsxOzMzbTogJHtzdWJhcmdzPy5sZW5ndGh9IHBhcmFtZXRlcnMgZ2l2ZW4gdnMuICR7c291cmNlc1tpbmRleF0uYXJnc0NvdW50fSBleHBlY3RlZFxceDFiWzBtYCxcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLnNhbXBsZXMgPSBzYW1wbGVzO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLl9hcmdzQ291bnQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYnVpbGRSYWRvblJlcXVlc3QoXHJcblx0XHRhcmdzOiBhbnkgfCBhbnlbXSB8IHN0cmluZ1tdIHwgc3RyaW5nW11bXSxcclxuXHQpOiBSYWRvblJlcXVlc3Qge1xyXG5cdFx0Y29uc3Qgc291cmNlczogUmFkb25SZXRyaWV2YWxbXSA9IFtdO1xyXG5cdFx0aWYgKHRoaXMuaG9tb2dlbmVvdXMpIHtcclxuXHRcdFx0Ly8gYXJncyBjYW4gYmUgZWl0aGVyIGFueSwgc3RyaW5nW10gb3Igc3RyaW5nWzBdW11cclxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJnc1swXSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XHJcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoID4gMSkge1xyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcdFx0YFJhZG9uVGVtcGxhdGU6IGhvbW9nZW5lb3VzIHRlbXBsYXRlOiBhcmdzIHZlY3RvciBkaW1lbnNpb24gJHthcmdzLmxlbmd0aH0gPiAxLmAsXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRhcmdzID0gYXJnc1swXTtcclxuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MubGVuZ3RoICE9PSB0aGlzLmFyZ3NDb3VudCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgUmFkb25UZW1wbGF0ZTogaG9tb2dlbm91cyB0ZW1wbGF0ZTogbWlzc2luZyAke3RoaXMuYXJnc0NvdW50IC0gYXJncy5sZW5ndGh9IG91dCBvZiAke2FyZ3MubGVuZ3RofSBwYXJhbWV0ZXJzLmAsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNvdXJjZXMuZm9yRWFjaCgocmV0cmlldmFsKSA9PlxyXG5cdFx0XHRcdHNvdXJjZXMucHVzaChyZXRyaWV2YWwuZm9sZEFyZ3MoYXJncykpLFxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoICE9PSB0aGlzLnNvdXJjZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcdGBSYWRvblRlbXBsYXRlOiBhcmdzIHZlY3RvciBkaW1lbnNpb24gJHthcmdzLmxlbmd0aH0gIT0gJHt0aGlzLnNvdXJjZXMubGVuZ3RofWAsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNvdXJjZXMuZm9yRWFjaCgocmV0cmlldmFsLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdEFycmF5LmlzQXJyYXkoYXJnc1tpbmRleF0pICYmXHJcblx0XHRcdFx0XHRyZXRyaWV2YWwuYXJnc0NvdW50ICE9PSBhcmdzW2luZGV4XS5sZW5ndGhcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRcdGBSYWRvblRlbXBsYXRlOiByZXRyaWV2YWwgIyR7aW5kZXggKyAxfTogbWlzbWF0Y2hpbmcgYXJncyBjb3VudDogJHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzW2luZGV4XS5sZW5ndGhcclxuXHRcdFx0XHRcdFx0fSAhPSAke3JldHJpZXZhbC5hcmdzQ291bnR9IChbJHthcmdzW2luZGV4XX0pXWAsXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3NbaW5kZXhdKSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlcXVlc3Qoe1xyXG5cdFx0XHRzb3VyY2VzLFxyXG5cdFx0XHRzb3VyY2VzUmVkdWNlcjogdGhpcy5zb3VyY2VzUmVkdWNlcixcclxuXHRcdFx0d2l0bmVzc1JlZHVjZXI6IHRoaXMud2l0bmVzc1JlZHVjZXIsXHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbk1vZGFsIGV4dGVuZHMgUmFkb25UZW1wbGF0ZSB7XHJcblx0cHJvdGVjdGVkIF9wcm92aWRlcnM6IEFycmF5PHN0cmluZz47XHJcblxyXG5cdGNvbnN0cnVjdG9yKHNwZWNzOiB7XHJcblx0XHRwcm92aWRlcnM/OiBBcnJheTxzdHJpbmc+O1xyXG5cdFx0cmV0cmlldmFsOiBSYWRvblJldHJpZXZhbDtcclxuXHRcdHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyO1xyXG5cdFx0d2l0bmVzc1JlZHVjZXI/OiBSYWRvblJlZHVjZXI7XHJcblx0fSkge1xyXG5cdFx0aWYgKCFzcGVjcy5yZXRyaWV2YWwuaXNNb2RhbCgpKSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcIlJhZG9uTW9kYWw6IG5vIG1vZGFsIHJldHJpZXZhbCB3YXMgcGFzc2VkLlwiKTtcclxuXHRcdH1cclxuXHRcdHN1cGVyKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0c291cmNlczogW3NwZWNzLnJldHJpZXZhbF0sXHJcblx0XHRcdFx0c291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcblx0XHRcdFx0d2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcblx0XHRcdH0sXHJcblx0XHRcdHNwZWNzLnJldHJpZXZhbD8uc2FtcGxlcyxcclxuXHRcdCk7XHJcblx0XHRpZiAoc3BlY3M/LnByb3ZpZGVycykge1xyXG5cdFx0XHR0aGlzLl9wcm92aWRlcnMgPSB0aGlzLl9jaGVja1Byb3ZpZGVycyhzcGVjcy5wcm92aWRlcnMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5fcHJvdmlkZXJzID0gW107XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IGFyZ3NDb3VudCgpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgX3Byb3ZpZGVyc0FyZ3NDb3VudCA9IE1hdGgubWF4KFxyXG5cdFx0XHQuLi50aGlzLnByb3ZpZGVycy5tYXAoKHVybCkgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHVybCkpLFxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBfcHJvdmlkZXJzQXJnc0NvdW50ID4gMFxyXG5cdFx0XHQ/IE1hdGgubWF4KHRoaXMuX2FyZ3NDb3VudCwgX3Byb3ZpZGVyc0FyZ3NDb3VudClcclxuXHRcdFx0OiB0aGlzLl9hcmdzQ291bnQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHByb3ZpZGVycygpOiBBcnJheTxzdHJpbmc+IHtcclxuXHRcdHJldHVybiB0aGlzLl9wcm92aWRlcnM7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc2V0IHByb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PHN0cmluZz4pIHtcclxuXHRcdHRoaXMuX3Byb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKHByb3ZpZGVycyk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYnVpbGRSYWRvblJlcXVlc3QoYXJncz86IGFueSB8IHN0cmluZ1tdKTogUmFkb25SZXF1ZXN0IHtcclxuXHRcdGlmICh0aGlzLnByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogbm8gcHJvdmlkZXJzIHdlcmUgcHJldmlvdXNseSBzZXR0bGVkLmApO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgdGVtcGxhdGUgPSB0aGlzLmJ1aWxkUmFkb25UZW1wbGF0ZSh0aGlzLnByb3ZpZGVycyk7XHJcblx0XHRyZXR1cm4gdGVtcGxhdGUuaG9tb2dlbmVvdXNcclxuXHRcdFx0PyB0ZW1wbGF0ZS5idWlsZFJhZG9uUmVxdWVzdChhcmdzKVxyXG5cdFx0XHQ6IHRlbXBsYXRlLmJ1aWxkUmFkb25SZXF1ZXN0KFxyXG5cdFx0XHRcdFx0dGVtcGxhdGUuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gYXJncy5zbGljZSgwLCBzb3VyY2UuYXJnc0NvdW50KSksXHJcblx0XHRcdFx0KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBidWlsZFJhZG9uVGVtcGxhdGUocHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPik6IFJhZG9uVGVtcGxhdGUge1xyXG5cdFx0aWYgKCFwcm92aWRlcnMpIHtcclxuXHRcdFx0cHJvdmlkZXJzID0gdGhpcy5fY2hlY2tQcm92aWRlcnMoWy4uLnRoaXMuX3Byb3ZpZGVyc10pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHJvdmlkZXJzID0gdGhpcy5fY2hlY2tQcm92aWRlcnMoWy4uLnByb3ZpZGVyc10pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFwcm92aWRlcnMgfHwgcHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvbk1vZGFsOiBubyBwcm92aWRlcnMgd2VyZSBzcGVjaWZpZWQuYCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uVGVtcGxhdGUoe1xyXG5cdFx0XHRzb3VyY2VzOiB0aGlzLnNvdXJjZXNbMF0uc3Bhd25SZXRyaWV2YWxzKC4uLnByb3ZpZGVycyksXHJcblx0XHRcdHNvdXJjZXNSZWR1Y2VyOiB0aGlzLnNvdXJjZXNSZWR1Y2VyLFxyXG5cdFx0XHR3aXRuZXNzUmVkdWNlcjogdGhpcy53aXRuZXNzUmVkdWNlcixcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0X2NoZWNrUHJvdmlkZXJzKHByb3ZpZGVyczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xyXG5cdFx0cHJvdmlkZXJzLmZvckVhY2goKHByb3ZpZGVyKSA9PiB7XHJcblx0XHRcdGNvbnN0IFtzY2hlbWFdID0gcGFyc2VVUkwocHJvdmlkZXIpO1xyXG5cdFx0XHRpZiAoIXNjaGVtYS5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSAmJiAhc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xyXG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogaW52YWxpZCBwcm92aWRlcjogJHtwcm92aWRlcn1gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gcHJvdmlkZXJzO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmV0cmlldmFsIHtcclxuXHRwdWJsaWMgcmVhZG9ubHkgYXJnc0tleXM/OiBBcnJheTxzdHJpbmc+O1xyXG5cdHB1YmxpYyByZWFkb25seSBhcmdzQ291bnQ6IG51bWJlcjtcclxuXHRwdWJsaWMgcmVhZG9ubHkgbWV0aG9kOiByZXRyaWV2YWxzLk1ldGhvZHM7XHJcblx0cHVibGljIHJlYWRvbmx5IGF1dGhvcml0eT86IHN0cmluZztcclxuXHRwdWJsaWMgcmVhZG9ubHkgYm9keT86IGFueTtcclxuXHRwdWJsaWMgcmVhZG9ubHkgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcblx0cHVibGljIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XHJcblx0cHVibGljIHJlYWRvbmx5IHF1ZXJ5Pzogc3RyaW5nO1xyXG5cdHB1YmxpYyByZWFkb25seSBzY2hlbWE/OiBzdHJpbmc7XHJcblx0cHVibGljIHJlYWRvbmx5IHNjcmlwdD86IF9SYWRvblNjcmlwdDtcclxuXHRwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xyXG5cclxuXHRwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRzcGVjczoge1xyXG5cdFx0XHRtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcztcclxuXHRcdFx0dXJsPzogc3RyaW5nO1xyXG5cdFx0XHRoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuXHRcdFx0Ym9keT86IGFueTtcclxuXHRcdFx0c2NyaXB0PzogUmFkb25Bbnk7XHJcblx0XHRcdGFyZ3NLZXlzPzogQXJyYXk8c3RyaW5nPjtcclxuXHRcdH0sXHJcblx0XHRzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG5cdCkge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5STkcgJiZcclxuXHRcdFx0KHNwZWNzPy51cmwgfHwgc3BlY3M/LmhlYWRlcnM/LnNpemUgfHwgc3BlY3M/LmJvZHkpXHJcblx0XHQpIHtcclxuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiUmFkb25SZXRyaWV2YWw6IFJORyBhY2NlcHRzIG5vIFVSTHMgb3IgaGVhZGVyc1wiKTtcclxuXHRcdFx0Ly8gfSBlbHNlIGlmICghc3BlY3M/LnVybCAmJiAobWV0aG9kID09IE1ldGhvZHMuSHR0cFBvc3QgfHwgbWV0aG9kID09IE1ldGhvZHMuSHR0cEdldCkpIHtcclxuXHRcdFx0Ly8gICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBVUkwgbXVzdCBiZSBzcGVjaWZpZWRcIik7XHJcblx0XHR9IGVsc2UgaWYgKHNwZWNzPy5ib2R5ICYmIHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBHZXQpIHtcclxuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFwiUmFkb25SZXRyaWV2YWw6IGJvZHkgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBIVFRQLUdFVCBxdWVyaWVzXCIsXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLm1ldGhvZCA9IHNwZWNzLm1ldGhvZDtcclxuXHRcdGlmIChzcGVjcz8udXJsKSB7XHJcblx0XHRcdHRoaXMudXJsID0gc3BlY3MudXJsO1xyXG5cdFx0XHRpZiAoIWlzV2lsZGNhcmQoc3BlY3MudXJsKSkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRjb25zdCBwYXJ0cyA9IHBhcnNlVVJMKHNwZWNzLnVybCk7XHJcblx0XHRcdFx0XHR0aGlzLnNjaGVtYSA9IHBhcnRzWzBdO1xyXG5cdFx0XHRcdFx0aWYgKHBhcnRzWzFdICE9PSBcIlwiKSB0aGlzLmF1dGhvcml0eSA9IHBhcnRzWzFdO1xyXG5cdFx0XHRcdFx0aWYgKHBhcnRzWzJdICE9PSBcIlwiKSB0aGlzLnBhdGggPSBwYXJ0c1syXTtcclxuXHRcdFx0XHRcdGlmIChwYXJ0c1szXSAhPT0gXCJcIikgdGhpcy5xdWVyeSA9IHBhcnRzWzNdO1xyXG5cdFx0XHRcdH0gY2F0Y2gge31cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3BlY3MubWV0aG9kID09PSByZXRyaWV2YWxzLk1ldGhvZHMuSHR0cEdldCB8fFxyXG5cdFx0XHRzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCB8fFxyXG5cdFx0XHRzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwSGVhZFxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMudXJsID0gXCJcXFxcMFxcXFxcIjtcclxuXHRcdH1cclxuXHRcdGlmIChzcGVjcz8uaGVhZGVycykge1xyXG5cdFx0XHRpZiAodHlwZW9mIHNwZWNzLmhlYWRlcnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzcGVjcy5oZWFkZXJzKSkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRcIlJhZG9uUmV0cmlldmFsOiBIVFRQIGhlYWRlcnMgbXVzdCBiZSBvZiB0eXBlIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cIixcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaGVhZGVycyA9IHNwZWNzPy5oZWFkZXJzO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5ib2R5ID0gc3BlY3M/LmJvZHk7XHJcblx0XHRpZiAoc3BlY3M/LnNjcmlwdCkgdGhpcy5zY3JpcHQgPSBuZXcgX1JhZG9uU2NyaXB0KHNwZWNzPy5zY3JpcHQpO1xyXG5cdFx0dGhpcy5hcmdzQ291bnQgPSBNYXRoLm1heChcclxuXHRcdFx0Z2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHRoaXM/LnVybCksXHJcblx0XHRcdGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyh0aGlzPy5ib2R5KSxcclxuXHRcdFx0Li4uKE9iamVjdC5rZXlzKHRoaXM/LmhlYWRlcnMgfHwge30pLm1hcCgoa2V5KSA9PlxyXG5cdFx0XHRcdGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhrZXkpLFxyXG5cdFx0XHQpID8/IFtdKSxcclxuXHRcdFx0Li4uKE9iamVjdC52YWx1ZXModGhpcz8uaGVhZGVycyB8fCB7fSkubWFwKCh2YWx1ZSkgPT5cclxuXHRcdFx0XHRnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcodmFsdWUpLFxyXG5cdFx0XHQpID8/IFtdKSxcclxuXHRcdFx0dGhpcy5zY3JpcHQ/LmFyZ3NDb3VudCgpIHx8IDAsXHJcblx0XHQpO1xyXG5cdFx0aWYgKHNhbXBsZXMgJiYgdGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcIlJhZG9uUmV0cmlldmFsOiBwYXNzZWQgc2FtcGxlcyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWwuXCIsXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnNhbXBsZXMgPSBzYW1wbGVzO1xyXG5cdFx0aWYgKHNwZWNzPy5hcmdzS2V5cykge1xyXG5cdFx0XHRpZiAodGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0XCJSYWRvblJldHJpZXZhbDogcGFzc2VkIGFyZ3Mga2V5cyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWxcIixcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHNwZWNzLmFyZ3NLZXlzLmxlbmd0aCAhPT0gdGhpcy5hcmdzQ291bnQpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0YFJhZG9uUmV0cmlldmFsOiBwYXNzZWQgaW52YWxpZCBudW1iZXIgb2YgYXJncyBrZXlzOiAke3NwZWNzLmFyZ3NLZXlzLmxlbmd0aH0gIT0gJHt0aGlzLmFyZ3NDb3VudH1gLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5hcmdzS2V5cyA9IHNwZWNzLmFyZ3NLZXlzO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGlzTW9kYWwoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHR0aGlzLm1ldGhvZCAhPT0gcmV0cmlldmFscy5NZXRob2RzLlJORyAmJlxyXG5cdFx0XHQoIXRoaXMudXJsIHx8IHRoaXMudXJsID09PSBcIlxcXFwwXFxcXFwiKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBpc1BhcmFtZXRlcml6ZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5hcmdzQ291bnQgPiAwO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBSYWRvbiBSZXRyaWV2YWwgYnkgb3JkZXJseSByZXBsYWNpbmcgaW5kZXhlZCB3aWxkY2FyZHMgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLlxyXG5cdCAqIEZhaWxzIGlmIG5vdCBwYXJhbWV0ZXJpemVkLCBvZiBpZiBwYXNzaW5nIHRvbyBtYW55IHBhcmFtZXRlcnMuXHJcblx0ICovXHJcblx0cHVibGljIGZvbGRBcmdzKGFyZ3M6IGFueSB8IHN0cmluZ1tdKTogUmFkb25SZXRyaWV2YWwge1xyXG5cdFx0aWYgKHRoaXMuYXJnc0NvdW50ID09PSAwKSB7XHJcblx0XHRcdHJldHVybiB0aGlzOyAvL3Rocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBjYW5ub3QgZm9sZCB1bnBhcmFtZXRlcml6ZWQgcmV0cmlldmFsYClcclxuXHRcdH1cclxuXHRcdGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XHJcblx0XHRcdGlmICgoYXJncyBhcyBhbnlbXSkubGVuZ3RoID4gdGhpcy5hcmdzQ291bnQpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0YFJhZG9uUmV0cmlldmFsOiB0b28gbWF5IGFyZ3MgcGFzc2VkOiAke2FyZ3MubGVuZ3RofSA+ICR7dGhpcy5hcmdzQ291bnR9YCxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBhcmFtcy5wdXNoKC4uLihhcmdzIGFzIHN0cmluZ1tdKSk7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhcmdzID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRcdGlmICghdGhpcy5hcmdzS2V5cykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgUmFkb25SZXRyaWV2YWw6IHVuZXhwZWN0ZWQgYXJncyBtYXA6IHVuZGVmaW5lZCBhcmdzIGtleXMuYCxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuYXJnc0tleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoIWFyZ3Nba2V5XSkge1xyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdGBSYWRvblJldHJpZXZhbDogbWlzc2luZyB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCIuYCxcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHBhcmFtcy5wdXNoKGFyZ3Nba2V5XSBhcyBzdHJpbmcpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRwYXJhbXMucHVzaChhcmdzIGFzIHN0cmluZyk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmV0cmlldmFsKHtcclxuXHRcdFx0bWV0aG9kOiB0aGlzLm1ldGhvZCxcclxuXHRcdFx0dXJsOiByZXBsYWNlV2lsZGNhcmRzKHRoaXMudXJsLCBwYXJhbXMpLFxyXG5cdFx0XHRib2R5OiByZXBsYWNlV2lsZGNhcmRzKHRoaXMuYm9keSwgcGFyYW1zKSxcclxuXHRcdFx0aGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFxyXG5cdFx0XHRcdE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyB8fCB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcclxuXHRcdFx0XHRcdHJlcGxhY2VXaWxkY2FyZHMoa2V5LCBwYXJhbXMpLFxyXG5cdFx0XHRcdFx0cmVwbGFjZVdpbGRjYXJkcyh2YWx1ZSwgcGFyYW1zKSxcclxuXHRcdFx0XHRdKSxcclxuXHRcdFx0KSxcclxuXHRcdFx0c2NyaXB0OiB0aGlzLnNjcmlwdD8ucmVwbGFjZVdpbGRjYXJkcyguLi5wYXJhbXMpLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIG9uZSBvciBtb3JlIGNsb25lcyBvZiB0aGlzIHJldHJpZXZhbCwgaW4gd2hpY2ggdGhlIGluZGV4LTAgd2lsZGNhcmRcclxuXHQgKiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiB2YWx1ZXMuIEZhaWxzIGlmIHRoZSByZXRyaWV2YWwgaXMgbm90IHBhcmFtZXRlcml6ZWQuXHJcblx0ICovXHJcblx0cHVibGljIHNwYXduUmV0cmlldmFscyguLi52YWx1ZXM6IHN0cmluZ1tdKTogUmFkb25SZXRyaWV2YWxbXSB7XHJcblx0XHRjb25zdCBfc3Bhd25lZDogUmFkb25SZXRyaWV2YWxbXSA9IFtdO1xyXG5cdFx0aWYgKHRoaXMuaXNNb2RhbCgpKSB7XHJcblx0XHRcdHZhbHVlcy5mb3JFYWNoKCh1cmwpID0+IHtcclxuXHRcdFx0XHRfc3Bhd25lZC5wdXNoKFxyXG5cdFx0XHRcdFx0bmV3IFJhZG9uUmV0cmlldmFsKHtcclxuXHRcdFx0XHRcdFx0YXJnc0tleXM6IHRoaXMuYXJnc0tleXMsXHJcblx0XHRcdFx0XHRcdGJvZHk6IHRoaXMuYm9keSxcclxuXHRcdFx0XHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG5cdFx0XHRcdFx0XHRtZXRob2Q6IHRoaXMubWV0aG9kLFxyXG5cdFx0XHRcdFx0XHRzY3JpcHQ6IHRoaXMuc2NyaXB0Py5jbG9uZSgpLFxyXG5cdFx0XHRcdFx0XHR1cmwsXHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0aGlzLmFyZ3NDb3VudCA9PT0gMCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgUmFkb25SZXRyaWV2YWw6IGNhbm5vdCBzcGF3biBmcm9tIHVucGFyYW1ldGVyaXplZCByZXRyaWV2YWxgLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0X3NwYXduZWQucHVzaChcclxuXHRcdFx0XHRcdG5ldyBSYWRvblJldHJpZXZhbCh7XHJcblx0XHRcdFx0XHRcdG1ldGhvZDogdGhpcy5tZXRob2QsXHJcblx0XHRcdFx0XHRcdHVybDogc3BsaWNlV2lsZGNhcmQodGhpcy51cmwsIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcblx0XHRcdFx0XHRcdGJvZHk6IHNwbGljZVdpbGRjYXJkKHRoaXMuYm9keSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuXHRcdFx0XHRcdFx0aGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFxyXG5cdFx0XHRcdFx0XHRcdE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyB8fCB7fSkubWFwKFxyXG5cdFx0XHRcdFx0XHRcdFx0KFtoZWFkZXJLZXksIGhlYWRlclZhbHVlXSkgPT4gW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzcGxpY2VXaWxkY2FyZChoZWFkZXJLZXksIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNwbGljZVdpbGRjYXJkKGhlYWRlclZhbHVlLCAwLCB2YWx1ZSwgdGhpcy5hcmdzQ291bnQpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0XHRzY3JpcHQ6IHRoaXMuc2NyaXB0Py5zcGxpY2VXaWxkY2FyZCgwLCB2YWx1ZSksXHJcblx0XHRcdFx0XHRcdGFyZ3NLZXlzOiB0aGlzLmFyZ3NLZXlzPy5zbGljZSgxKSxcclxuXHRcdFx0XHRcdH0pLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIF9zcGF3bmVkO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHRvSlNPTihodW1hbml6ZT86IGJvb2xlYW4pOiBhbnkge1xyXG5cdFx0Y29uc3Qga2luZCA9IFtcIlwiLCBcIkhUVFAtR0VUXCIsIFwiUk5HXCIsIFwiSFRUUC1QT1NUXCIsIFwiSFRUUC1IRUFEXCJdO1xyXG5cdFx0Y29uc3QganNvbjogYW55ID0ge1xyXG5cdFx0XHRraW5kOiBraW5kW3RoaXMubWV0aG9kXSwgLy8gaHVtYW5pemUgPyBNZXRob2RzW3RoaXMubWV0aG9kXSA6IHRoaXMubWV0aG9kLFxyXG5cdFx0fTtcclxuXHRcdGlmICh0aGlzLnVybCkganNvbi51cmwgPSB0aGlzLnVybDtcclxuXHRcdGlmICh0aGlzLmhlYWRlcnMpIHtcclxuXHRcdFx0anNvbi5oZWFkZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5oZWFkZXJzKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmJvZHkpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRqc29uLmJvZHkgPSBodW1hbml6ZSA/IHRoaXMuYm9keSA6IHRvVXRmOEFycmF5KHRoaXMuYm9keSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0anNvbi5ib2R5ID0gdGhpcy5ib2R5O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRqc29uLnNjcmlwdCA9IGh1bWFuaXplXHJcblx0XHRcdD8gdGhpcy5zY3JpcHQ/LnRvU3RyaW5nKClcclxuXHRcdFx0OiBBcnJheS5mcm9tKGZyb21IZXhTdHJpbmcodGhpcy5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCBcIjB4ODBcIikpO1xyXG5cdFx0cmV0dXJuIGpzb247XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgdG9Qcm90b2J1ZigpOiBhbnkge1xyXG5cdFx0Y29uc3QgcHJvdG9idWY6IGFueSA9IHtcclxuXHRcdFx0a2luZDogdGhpcy5tZXRob2QsXHJcblx0XHR9O1xyXG5cdFx0aWYgKHRoaXMudXJsKSBwcm90b2J1Zi51cmwgPSB0aGlzLnVybDtcclxuXHRcdGlmICh0aGlzLmhlYWRlcnMpIHtcclxuXHRcdFx0cHJvdG9idWYuaGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycykubWFwKFxyXG5cdFx0XHRcdChbaGVhZGVyS2V5LCBoZWFkZXJWYWx1ZV0pID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdGxlZnQ6IGhlYWRlcktleSxcclxuXHRcdFx0XHRcdFx0cmlnaHQ6IGhlYWRlclZhbHVlLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuYm9keSkge1xyXG5cdFx0XHRjb25zdCB1dGY4QXJyYXkgPSB0b1V0ZjhBcnJheSh0aGlzLmJvZHkpO1xyXG5cdFx0XHRwcm90b2J1Zi5ib2R5ID0gdXRmOEFycmF5O1xyXG5cdFx0fVxyXG5cdFx0cHJvdG9idWYuc2NyaXB0ID0gT2JqZWN0LnZhbHVlcyhcclxuXHRcdFx0VWludDhBcnJheS5mcm9tKGNib3IuZW5jb2RlKHRoaXMuc2NyaXB0Py5lbmNvZGUoKSB8fCBbXSkpLFxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBwcm90b2J1ZjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvcHNDb3VudCgpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2NvdW50T3BzKHRoaXMuc2NyaXB0Py5lbmNvZGUoKSB8fCBbXSk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgX2NvdW50T3BzKGl0ZW1zOiBhbnlbXSk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gaXRlbXMubGVuZ3RoID4gMFxyXG5cdFx0XHQ/IGl0ZW1zXHJcblx0XHRcdFx0XHQubWFwKChpdGVtKSA9PiAoQXJyYXkuaXNBcnJheShpdGVtKSA/IHRoaXMuX2NvdW50T3BzKGl0ZW0pIDogMSkpXHJcblx0XHRcdFx0XHQucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEpXHJcblx0XHRcdDogMDtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgZmlsdGVycyB7XHJcblx0ZXhwb3J0IGNvbnN0IE9wY29kZXMgPSBGaWx0ZXJzO1xyXG5cdGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uRmlsdGVyO1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBNb2RlKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvbkZpbHRlcihGaWx0ZXJzLk1vZGUpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gU3RkZXYoc3RkZXY6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvbkZpbHRlcihGaWx0ZXJzLlN0YW5kYXJkRGV2aWF0aW9uLCBzdGRldik7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIHJlZHVjZXJzIHtcclxuXHRleHBvcnQgY29uc3QgT3Bjb2RlcyA9IFJlZHVjZXJzO1xyXG5cdGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uUmVkdWNlcjtcclxuXHRleHBvcnQgZnVuY3Rpb24gTW9kZSguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5Nb2RlLCBmaWx0ZXJzKTtcclxuXHR9XHJcblx0ZXhwb3J0IGZ1bmN0aW9uIE1lYW4oLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVhbkF2ZXJhZ2UsIGZpbHRlcnMpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gTWVkaWFuKC4uLmZpbHRlcnM6IFJhZG9uRmlsdGVyW10pIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1lZGlhbkF2ZXJhZ2UsIGZpbHRlcnMpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gU3RkZXYoLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuU3RhbmRhcmREZXZpYXRpb24sIGZpbHRlcnMpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gQ29uY2F0SGFzaCguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5Db25jYXRlbmF0ZUFuZEhhc2gsIGZpbHRlcnMpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIFByaWNlQWdncmVnYXRlKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVhbkF2ZXJhZ2UsIFtmaWx0ZXJzLlN0ZGV2KDEuNCldKTtcclxuXHR9XHJcblx0ZXhwb3J0IGZ1bmN0aW9uIFByaWNlVGFsbHkoKSB7XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgW2ZpbHRlcnMuU3RkZXYoMi41KV0pO1xyXG5cdH1cclxufVxyXG5cclxuaW1wb3J0ICogYXMgY2NkciBmcm9tIFwiLi9jY2RyL2luZGV4LmpzXCI7XHJcbmV4cG9ydCBuYW1lc3BhY2UgcmV0cmlldmFscyB7XHJcblx0ZXhwb3J0IGNvbnN0IHJwYyA9IGNjZHI7XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBmcm9tUmFkb25Bc3NldHMoXHJcblx0XHRhc3NldHM6IE9iamVjdCxcclxuXHQpOiBSZWNvcmQ8c3RyaW5nLCBSYWRvblJldHJpZXZhbD4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm94eShhc3NldHMsIHByb3h5SGFuZGxlcihSYWRvblJldHJpZXZhbCkpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGVudW0gTWV0aG9kcyB7XHJcblx0XHROb25lID0gMHgwLFxyXG5cdFx0SHR0cEdldCA9IDB4MDEsXHJcblx0XHRIdHRwSGVhZCA9IDB4MDQsXHJcblx0XHRIdHRwUG9zdCA9IDB4MDMsXHJcblx0XHRSTkcgPSAweDAyLFxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFdpdG5ldCByYW5kb21uZXNzIGRhdGEgc291cmNlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gc2NyaXB0IChPcHRpb25hbCkgUmFkb24gU2NyaXB0IHRvIGFwcGx5IHRvIHRoZSByYW5kb20gc2VlZCBwcm9wb3NlZCBieSBldmVyeSBzaW5nbGUgd2l0bmVzcyxcclxuXHQgKiBiZWZvcmUgYWdncmVnYXRpb24uXHJcblx0ICoqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBSTkcoc2NyaXB0PzogUmFkb25BbnkpIHtcclxuXHRcdGNvbnN0IHJldHJpZXZhbCA9IG5ldyBSYWRvblJldHJpZXZhbCh7IG1ldGhvZDogTWV0aG9kcy5STkcsIHNjcmlwdCB9KTtcclxuXHRcdGlmIChcclxuXHRcdFx0cmV0cmlldmFsPy5zY3JpcHQgJiZcclxuXHRcdFx0cmV0cmlldmFsPy5zY3JpcHQ/LmlucHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSAhPT0gXCJSYWRvbkJ5dGVzXCJcclxuXHRcdCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiUk5HIHNjcmlwdHMgcmVxdWlyZSBbUmFkb25CeXRlc10gYXMgaW5wdXQgdHlwZVwiKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXRyaWV2YWw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgSFRUUC9HRVQgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcblx0ICoqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBIdHRwR2V0KHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBVUkwuXHJcblx0XHQgKi9cclxuXHRcdHVybD86IHN0cmluZztcclxuXHRcdC8qKlxyXG5cdFx0ICogSFRUUCByZXF1ZXN0IGhlYWRlcnMuXHJcblx0XHQgKi9cclxuXHRcdGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBSYWRvblNjcmlwdCBmb3IgcHJvY2Vzc2luZyByZXR1cm5lZCB2YWx1ZS5cclxuXHRcdCAqL1xyXG5cdFx0c2NyaXB0PzogUmFkb25Bbnk7XHJcblx0XHQvKipcclxuXHRcdCAqIE5hbWVzIG9mIGluZGV4ZWQgcGFyYW1ldGVycyAob3B0aW9uYWwsIGlmIGFueSkuXHJcblx0XHQgKi9cclxuXHRcdGFyZ3NLZXlzPzogc3RyaW5nW107XHJcblx0XHQvKipcclxuXHRcdCAqIE1hcCBvZiBwcmUtc2V0IHBhcmFtZXRlcnMgKG9uIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscywgb25seSkuXHJcblx0XHQgKi9cclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblx0fSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1ldGhvZDogTWV0aG9kcy5IdHRwR2V0LFxyXG5cdFx0XHRcdHVybDogc3BlY3M/LnVybCxcclxuXHRcdFx0XHRoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuXHRcdFx0XHRzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcblx0XHRcdFx0YXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuXHRcdFx0fSxcclxuXHRcdFx0c3BlY3M/LnNhbXBsZXMsXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIEhUVFAvSEVBRCBkYXRhIHJldHJpZXZhbCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHNwZWNzIFJhZG9uIFJldHJpZXZhbCBzcGVjcy5cclxuXHQgKiovXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkKHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBVUkxcclxuXHRcdCAqL1xyXG5cdFx0dXJsPzogc3RyaW5nO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG5cdFx0ICovXHJcblx0XHRoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuXHRcdC8qKlxyXG5cdFx0ICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG5cdFx0ICovXHJcblx0XHRzY3JpcHQ/OiBSYWRvbkFueTtcclxuXHRcdC8qKlxyXG5cdFx0ICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG5cdFx0ICovXHJcblx0XHRhcmdzS2V5cz86IHN0cmluZ1tdO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG5cdFx0ICovXHJcblx0XHRzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG5cdH0pIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcblx0XHRcdHtcclxuXHRcdFx0XHRtZXRob2Q6IE1ldGhvZHMuSHR0cEhlYWQsXHJcblx0XHRcdFx0dXJsOiBzcGVjcz8udXJsLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHNwZWNzPy5oZWFkZXJzLFxyXG5cdFx0XHRcdHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuXHRcdFx0XHRhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzcGVjcz8uc2FtcGxlcyxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgSFRUUC9QT1NUIGRhdGEgcmV0cmlldmFsIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gc3BlY3MgUmFkb24gUmV0cmlldmFsIHNwZWNzLlxyXG5cdCAqKi9cclxuXHRleHBvcnQgZnVuY3Rpb24gSHR0cFBvc3Qoc3BlY3M6IHtcclxuXHRcdC8qKlxyXG5cdFx0ICogSFRUUCByZXF1ZXN0IFVSTFxyXG5cdFx0ICovXHJcblx0XHR1cmw/OiBzdHJpbmc7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBib2R5XHJcblx0XHQgKi9cclxuXHRcdGJvZHk/OiBzdHJpbmc7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBoZWFkZXJzXHJcblx0XHQgKi9cclxuXHRcdGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBSYWRvbiBzY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcblx0XHQgKi9cclxuXHRcdHNjcmlwdD86IFJhZG9uQW55O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpXHJcblx0XHQgKi9cclxuXHRcdGFyZ3NLZXlzPzogc3RyaW5nW107XHJcblx0XHQvKipcclxuXHRcdCAqIE1hcCBvZiBwcmUtc2V0IHBhcmFtZXRlcnMgKG9uIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscywgb25seSkuXHJcblx0XHQgKi9cclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblx0fSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1ldGhvZDogTWV0aG9kcy5IdHRwUG9zdCxcclxuXHRcdFx0XHR1cmw6IHNwZWNzPy51cmwsXHJcblx0XHRcdFx0aGVhZGVyczogc3BlY3M/LmhlYWRlcnMsXHJcblx0XHRcdFx0Ym9keTogc3BlY3M/LmJvZHksXHJcblx0XHRcdFx0c2NyaXB0OiBzcGVjcz8uc2NyaXB0LFxyXG5cdFx0XHRcdGFyZ3NLZXlzOiBzcGVjcz8uYXJnc0tleXMsXHJcblx0XHRcdH0sXHJcblx0XHRcdHNwZWNzPy5zYW1wbGVzLFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBHcmFwaFFMLXF1ZXJ5IGRhdGEgc291cmNlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gc3BlY3MgUmFkb24gUmV0cmlldmFsIHNwZWNzLlxyXG5cdCAqKi9cclxuXHRleHBvcnQgZnVuY3Rpb24gR3JhcGhRTFF1ZXJ5KHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEdyYXBoUUwgVVJMIGVuZHBvaW50XHJcblx0XHQgKi9cclxuXHRcdHVybD86IHN0cmluZztcclxuXHRcdC8qKlxyXG5cdFx0ICogR3JhcGhRTCBxdWVyeVxyXG5cdFx0ICovXHJcblx0XHRxdWVyeTogc3RyaW5nO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBSYWRvbiBzY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcblx0XHQgKi9cclxuXHRcdHNjcmlwdD86IFJhZG9uQW55O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpXHJcblx0XHQgKi9cclxuXHRcdGFyZ3NLZXlzPzogc3RyaW5nW107XHJcblx0XHQvKipcclxuXHRcdCAqIE1hcCBvZiBwcmUtc2V0IHBhcmFtZXRlcnMgKG9uIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscywgb25seSkuXHJcblx0XHQgKi9cclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblx0fSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1ldGhvZDogTWV0aG9kcy5IdHRwUG9zdCxcclxuXHRcdFx0XHR1cmw6IHNwZWNzLnVybCxcclxuXHRcdFx0XHRib2R5OiBge1wicXVlcnlcIjpcIiR7Z3JhcGhRbENvbXByZXNzKHNwZWNzLnF1ZXJ5KS5yZXBsYWNlQWxsKCdcIicsICdcXFxcXCInKX1cIn1gLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG5cdFx0XHRcdHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuXHRcdFx0XHRhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzcGVjcz8uc2FtcGxlcyxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgSlNPTi1SUEMgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcblx0ICoqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBKc29uUlBDKHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEpTT04tUlBDIG1ldGhvZCBhbmQgcGFyYW1ldGVycy5cclxuXHRcdCAqL1xyXG5cdFx0cnBjOiB7IG1ldGhvZDogc3RyaW5nOyBwYXJhbXM/OiBhbnkgfTtcclxuXHRcdC8qKlxyXG5cdFx0ICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG5cdFx0ICovXHJcblx0XHRzY3JpcHQ/OiBSYWRvbkFueTtcclxuXHRcdC8qKlxyXG5cdFx0ICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG5cdFx0ICovXHJcblx0XHRhcmdzS2V5cz86IHN0cmluZ1tdO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG5cdFx0ICovXHJcblx0XHRzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG5cdH0pIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcblx0XHRcdHtcclxuXHRcdFx0XHRtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCxcclxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0XHRqc29ucnBjOiBcIjIuMFwiLFxyXG5cdFx0XHRcdFx0bWV0aG9kOiBzcGVjcy5ycGMubWV0aG9kLFxyXG5cdFx0XHRcdFx0cGFyYW1zOiBzcGVjcy5ycGM/LnBhcmFtcyxcclxuXHRcdFx0XHRcdGlkOiAxLFxyXG5cdFx0XHRcdH0pLnJlcGxhY2VBbGwoXCJcXFxcXFxcXFwiLCBcIlxcXFxcIiksXHJcblx0XHRcdFx0aGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiIH0sXHJcblx0XHRcdFx0c2NyaXB0OiBzcGVjcz8uc2NyaXB0LFxyXG5cdFx0XHRcdGFyZ3NLZXlzOiBzcGVjcz8uYXJnc0tleXMsXHJcblx0XHRcdH0sXHJcblx0XHRcdHNwZWNzPy5zYW1wbGVzLFxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IG5hbWVzcGFjZSB0eXBlcyB7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uQXJyYXkgPSBfUmFkb25BcnJheTtcclxuXHRleHBvcnQgY29uc3QgUmFkb25Cb29sZWFuID0gX1JhZG9uQm9vbGVhbjtcclxuXHRleHBvcnQgY29uc3QgUmFkb25CeXRlcyA9IF9SYWRvbkJ5dGVzO1xyXG5cdGV4cG9ydCBjb25zdCBSYWRvbkZsb2F0ID0gX1JhZG9uRmxvYXQ7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uSW50ZWdlciA9IF9SYWRvbkludGVnZXI7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uTWFwID0gX1JhZG9uTWFwO1xyXG5cdGV4cG9ydCBjb25zdCBSYWRvblNjcmlwdCA9IF9SYWRvblNjcmlwdDtcclxuXHRleHBvcnQgY29uc3QgUmFkb25TdHJpbmcgPSBfUmFkb25TdHJpbmc7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uRW5jb2RpbmdzID0gX1JhZG9uRW5jb2RpbmdzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm94eUhhbmRsZXI8VD4odDogeyBuZXcgKHNwZWNzOiBhbnkpOiBUIH0pIHtcclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuXHRcdFx0Y29uc3QgZm91bmQgPSB0YXJnZXRbcHJvcF0gPz8gZmluZEtleUluT2JqZWN0KHRhcmdldCwgcHJvcCk7XHJcblx0XHRcdC8vIGlmICghZm91bmQpIHtcclxuXHRcdFx0Ly8gICAgIHRocm93IEV2YWxFcnJvcihgWycke3Byb3B9J10gd2FzIG5vdCBmb3VuZCBpbiBkaWN0aW9uYXJ5YClcclxuXHRcdFx0Ly8gfSBlbHNlXHJcblx0XHRcdGlmIChmb3VuZCAmJiAhKGZvdW5kIGluc3RhbmNlb2YgdCkpIHtcclxuXHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgWycke3Byb3B9J10gd2FzIGZvdW5kIHdpdGggdHlwZSAke2ZvdW5kPy5jb25zdHJ1Y3Rvcj8ubmFtZX0gaW5zdGVhZCBvZiAke3QubmFtZX0hYCxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBmb3VuZDtcclxuXHRcdH0sXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZEtleUluT2JqZWN0KGRpY3Q6IGFueSwgdGFnOiBzdHJpbmcpIHtcclxuXHRmb3IgKGNvbnN0IGtleSBpbiBkaWN0KSB7XHJcblx0XHRpZiAodHlwZW9mIGRpY3Rba2V5XSA9PT0gXCJvYmplY3RcIikge1xyXG5cdFx0XHRpZiAoa2V5ID09PSB0YWcpIHtcclxuXHRcdFx0XHRyZXR1cm4gZGljdFtrZXldO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IGZvdW5kOiBhbnkgPSBmaW5kS2V5SW5PYmplY3QoZGljdFtrZXldLCB0YWcpO1xyXG5cdFx0XHRcdGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdfQ==
|