babylonjs-materials 7.50.0 → 7.51.1
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/babylon.cellMaterial.js +507 -507
- package/babylon.customMaterial.js +990 -990
- package/babylon.fireMaterial.js +498 -498
- package/babylon.furMaterial.js +516 -516
- package/babylon.gradientMaterial.js +507 -507
- package/babylon.gridMaterial.js +514 -514
- package/babylon.lavaMaterial.js +475 -475
- package/babylon.mixMaterial.js +475 -475
- package/babylon.normalMaterial.js +475 -475
- package/babylon.shadowOnlyMaterial.js +475 -475
- package/babylon.simpleMaterial.js +475 -475
- package/babylon.skyMaterial.js +521 -521
- package/babylon.terrainMaterial.js +475 -475
- package/babylon.triPlanarMaterial.js +522 -522
- package/babylon.waterMaterial.js +475 -475
- package/babylonjs.materials.js +507 -507
- package/package.json +2 -2
package/babylon.waterMaterial.js
CHANGED
|
@@ -12,59 +12,506 @@ return /******/ (() => { // webpackBootstrap
|
|
|
12
12
|
/******/ "use strict";
|
|
13
13
|
/******/ var __webpack_modules__ = ({
|
|
14
14
|
|
|
15
|
-
/***/ "
|
|
16
|
-
|
|
17
|
-
!***
|
|
18
|
-
|
|
19
|
-
/***/ ((
|
|
15
|
+
/***/ "../../../../node_modules/tslib/tslib.es6.mjs":
|
|
16
|
+
/*!****************************************************!*\
|
|
17
|
+
!*** ../../../../node_modules/tslib/tslib.es6.mjs ***!
|
|
18
|
+
\****************************************************/
|
|
19
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
20
20
|
|
|
21
21
|
__webpack_require__.r(__webpack_exports__);
|
|
22
22
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
23
|
-
/* harmony export */
|
|
23
|
+
/* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
|
|
24
|
+
/* harmony export */ __assign: () => (/* binding */ __assign),
|
|
25
|
+
/* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
|
|
26
|
+
/* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
|
|
27
|
+
/* harmony export */ __asyncValues: () => (/* binding */ __asyncValues),
|
|
28
|
+
/* harmony export */ __await: () => (/* binding */ __await),
|
|
29
|
+
/* harmony export */ __awaiter: () => (/* binding */ __awaiter),
|
|
30
|
+
/* harmony export */ __classPrivateFieldGet: () => (/* binding */ __classPrivateFieldGet),
|
|
31
|
+
/* harmony export */ __classPrivateFieldIn: () => (/* binding */ __classPrivateFieldIn),
|
|
32
|
+
/* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
|
|
33
|
+
/* harmony export */ __createBinding: () => (/* binding */ __createBinding),
|
|
34
|
+
/* harmony export */ __decorate: () => (/* binding */ __decorate),
|
|
35
|
+
/* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
|
|
36
|
+
/* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
|
|
37
|
+
/* harmony export */ __exportStar: () => (/* binding */ __exportStar),
|
|
38
|
+
/* harmony export */ __extends: () => (/* binding */ __extends),
|
|
39
|
+
/* harmony export */ __generator: () => (/* binding */ __generator),
|
|
40
|
+
/* harmony export */ __importDefault: () => (/* binding */ __importDefault),
|
|
41
|
+
/* harmony export */ __importStar: () => (/* binding */ __importStar),
|
|
42
|
+
/* harmony export */ __makeTemplateObject: () => (/* binding */ __makeTemplateObject),
|
|
43
|
+
/* harmony export */ __metadata: () => (/* binding */ __metadata),
|
|
44
|
+
/* harmony export */ __param: () => (/* binding */ __param),
|
|
45
|
+
/* harmony export */ __propKey: () => (/* binding */ __propKey),
|
|
46
|
+
/* harmony export */ __read: () => (/* binding */ __read),
|
|
47
|
+
/* harmony export */ __rest: () => (/* binding */ __rest),
|
|
48
|
+
/* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
|
|
49
|
+
/* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
|
|
50
|
+
/* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
|
|
51
|
+
/* harmony export */ __spread: () => (/* binding */ __spread),
|
|
52
|
+
/* harmony export */ __spreadArray: () => (/* binding */ __spreadArray),
|
|
53
|
+
/* harmony export */ __spreadArrays: () => (/* binding */ __spreadArrays),
|
|
54
|
+
/* harmony export */ __values: () => (/* binding */ __values),
|
|
55
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
24
56
|
/* harmony export */ });
|
|
25
|
-
|
|
57
|
+
/******************************************************************************
|
|
58
|
+
Copyright (c) Microsoft Corporation.
|
|
26
59
|
|
|
60
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
61
|
+
purpose with or without fee is hereby granted.
|
|
27
62
|
|
|
63
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
64
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
65
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
66
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
67
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
68
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
69
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
70
|
+
***************************************************************************** */
|
|
71
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
28
72
|
|
|
29
|
-
|
|
73
|
+
var extendStatics = function(d, b) {
|
|
74
|
+
extendStatics = Object.setPrototypeOf ||
|
|
75
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
76
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
77
|
+
return extendStatics(d, b);
|
|
78
|
+
};
|
|
30
79
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
80
|
+
function __extends(d, b) {
|
|
81
|
+
if (typeof b !== "function" && b !== null)
|
|
82
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
83
|
+
extendStatics(d, b);
|
|
84
|
+
function __() { this.constructor = d; }
|
|
85
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
86
|
+
}
|
|
36
87
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
88
|
+
var __assign = function() {
|
|
89
|
+
__assign = Object.assign || function __assign(t) {
|
|
90
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
91
|
+
s = arguments[i];
|
|
92
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
93
|
+
}
|
|
94
|
+
return t;
|
|
95
|
+
}
|
|
96
|
+
return __assign.apply(this, arguments);
|
|
97
|
+
}
|
|
44
98
|
|
|
99
|
+
function __rest(s, e) {
|
|
100
|
+
var t = {};
|
|
101
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
102
|
+
t[p] = s[p];
|
|
103
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
104
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
105
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
106
|
+
t[p[i]] = s[p[i]];
|
|
107
|
+
}
|
|
108
|
+
return t;
|
|
109
|
+
}
|
|
45
110
|
|
|
111
|
+
function __decorate(decorators, target, key, desc) {
|
|
112
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
113
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
114
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
115
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
116
|
+
}
|
|
46
117
|
|
|
118
|
+
function __param(paramIndex, decorator) {
|
|
119
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
120
|
+
}
|
|
47
121
|
|
|
122
|
+
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
123
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
124
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
125
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
126
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
127
|
+
var _, done = false;
|
|
128
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
129
|
+
var context = {};
|
|
130
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
131
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
132
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
133
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
134
|
+
if (kind === "accessor") {
|
|
135
|
+
if (result === void 0) continue;
|
|
136
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
137
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
138
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
139
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
140
|
+
}
|
|
141
|
+
else if (_ = accept(result)) {
|
|
142
|
+
if (kind === "field") initializers.unshift(_);
|
|
143
|
+
else descriptor[key] = _;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
147
|
+
done = true;
|
|
148
|
+
};
|
|
48
149
|
|
|
150
|
+
function __runInitializers(thisArg, initializers, value) {
|
|
151
|
+
var useValue = arguments.length > 2;
|
|
152
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
153
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
154
|
+
}
|
|
155
|
+
return useValue ? value : void 0;
|
|
156
|
+
};
|
|
49
157
|
|
|
158
|
+
function __propKey(x) {
|
|
159
|
+
return typeof x === "symbol" ? x : "".concat(x);
|
|
160
|
+
};
|
|
50
161
|
|
|
162
|
+
function __setFunctionName(f, name, prefix) {
|
|
163
|
+
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
|
|
164
|
+
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
|
|
165
|
+
};
|
|
51
166
|
|
|
167
|
+
function __metadata(metadataKey, metadataValue) {
|
|
168
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
169
|
+
}
|
|
52
170
|
|
|
171
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
172
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
173
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
174
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
175
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
176
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
177
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
178
|
+
});
|
|
179
|
+
}
|
|
53
180
|
|
|
181
|
+
function __generator(thisArg, body) {
|
|
182
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
183
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
184
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
185
|
+
function step(op) {
|
|
186
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
187
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
188
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
189
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
190
|
+
switch (op[0]) {
|
|
191
|
+
case 0: case 1: t = op; break;
|
|
192
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
193
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
194
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
195
|
+
default:
|
|
196
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
197
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
198
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
199
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
200
|
+
if (t[2]) _.ops.pop();
|
|
201
|
+
_.trys.pop(); continue;
|
|
202
|
+
}
|
|
203
|
+
op = body.call(thisArg, _);
|
|
204
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
205
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
54
208
|
|
|
209
|
+
var __createBinding = Object.create ? (function(o, m, k, k2) {
|
|
210
|
+
if (k2 === undefined) k2 = k;
|
|
211
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
212
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
213
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
214
|
+
}
|
|
215
|
+
Object.defineProperty(o, k2, desc);
|
|
216
|
+
}) : (function(o, m, k, k2) {
|
|
217
|
+
if (k2 === undefined) k2 = k;
|
|
218
|
+
o[k2] = m[k];
|
|
219
|
+
});
|
|
55
220
|
|
|
221
|
+
function __exportStar(m, o) {
|
|
222
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
|
|
223
|
+
}
|
|
56
224
|
|
|
225
|
+
function __values(o) {
|
|
226
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
227
|
+
if (m) return m.call(o);
|
|
228
|
+
if (o && typeof o.length === "number") return {
|
|
229
|
+
next: function () {
|
|
230
|
+
if (o && i >= o.length) o = void 0;
|
|
231
|
+
return { value: o && o[i++], done: !o };
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
235
|
+
}
|
|
57
236
|
|
|
237
|
+
function __read(o, n) {
|
|
238
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
239
|
+
if (!m) return o;
|
|
240
|
+
var i = m.call(o), r, ar = [], e;
|
|
241
|
+
try {
|
|
242
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
243
|
+
}
|
|
244
|
+
catch (error) { e = { error: error }; }
|
|
245
|
+
finally {
|
|
246
|
+
try {
|
|
247
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
248
|
+
}
|
|
249
|
+
finally { if (e) throw e.error; }
|
|
250
|
+
}
|
|
251
|
+
return ar;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** @deprecated */
|
|
255
|
+
function __spread() {
|
|
256
|
+
for (var ar = [], i = 0; i < arguments.length; i++)
|
|
257
|
+
ar = ar.concat(__read(arguments[i]));
|
|
258
|
+
return ar;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** @deprecated */
|
|
262
|
+
function __spreadArrays() {
|
|
263
|
+
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
264
|
+
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
265
|
+
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
266
|
+
r[k] = a[j];
|
|
267
|
+
return r;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function __spreadArray(to, from, pack) {
|
|
271
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
272
|
+
if (ar || !(i in from)) {
|
|
273
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
274
|
+
ar[i] = from[i];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function __await(v) {
|
|
281
|
+
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function __asyncGenerator(thisArg, _arguments, generator) {
|
|
285
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
286
|
+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
287
|
+
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
288
|
+
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
289
|
+
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
290
|
+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
291
|
+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
292
|
+
function fulfill(value) { resume("next", value); }
|
|
293
|
+
function reject(value) { resume("throw", value); }
|
|
294
|
+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function __asyncDelegator(o) {
|
|
298
|
+
var i, p;
|
|
299
|
+
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
|
300
|
+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function __asyncValues(o) {
|
|
304
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
305
|
+
var m = o[Symbol.asyncIterator], i;
|
|
306
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
307
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
308
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function __makeTemplateObject(cooked, raw) {
|
|
312
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
313
|
+
return cooked;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
var __setModuleDefault = Object.create ? (function(o, v) {
|
|
317
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
318
|
+
}) : function(o, v) {
|
|
319
|
+
o["default"] = v;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
var ownKeys = function(o) {
|
|
323
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
324
|
+
var ar = [];
|
|
325
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
326
|
+
return ar;
|
|
327
|
+
};
|
|
328
|
+
return ownKeys(o);
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
function __importStar(mod) {
|
|
332
|
+
if (mod && mod.__esModule) return mod;
|
|
333
|
+
var result = {};
|
|
334
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
335
|
+
__setModuleDefault(result, mod);
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function __importDefault(mod) {
|
|
340
|
+
return (mod && mod.__esModule) ? mod : { default: mod };
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|
344
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
345
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
346
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
350
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
351
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
352
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
353
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function __classPrivateFieldIn(state, receiver) {
|
|
357
|
+
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
|
|
358
|
+
return typeof state === "function" ? receiver === state : state.has(receiver);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function __addDisposableResource(env, value, async) {
|
|
362
|
+
if (value !== null && value !== void 0) {
|
|
363
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
364
|
+
var dispose, inner;
|
|
365
|
+
if (async) {
|
|
366
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
367
|
+
dispose = value[Symbol.asyncDispose];
|
|
368
|
+
}
|
|
369
|
+
if (dispose === void 0) {
|
|
370
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
371
|
+
dispose = value[Symbol.dispose];
|
|
372
|
+
if (async) inner = dispose;
|
|
373
|
+
}
|
|
374
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
375
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
376
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
377
|
+
}
|
|
378
|
+
else if (async) {
|
|
379
|
+
env.stack.push({ async: true });
|
|
380
|
+
}
|
|
381
|
+
return value;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
385
|
+
var e = new Error(message);
|
|
386
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
function __disposeResources(env) {
|
|
390
|
+
function fail(e) {
|
|
391
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
392
|
+
env.hasError = true;
|
|
393
|
+
}
|
|
394
|
+
var r, s = 0;
|
|
395
|
+
function next() {
|
|
396
|
+
while (r = env.stack.pop()) {
|
|
397
|
+
try {
|
|
398
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
399
|
+
if (r.dispose) {
|
|
400
|
+
var result = r.dispose.call(r.value);
|
|
401
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
402
|
+
}
|
|
403
|
+
else s |= 1;
|
|
404
|
+
}
|
|
405
|
+
catch (e) {
|
|
406
|
+
fail(e);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
410
|
+
if (env.hasError) throw env.error;
|
|
411
|
+
}
|
|
412
|
+
return next();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function __rewriteRelativeImportExtension(path, preserveJsx) {
|
|
416
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
417
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
418
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
return path;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
425
|
+
__extends,
|
|
426
|
+
__assign,
|
|
427
|
+
__rest,
|
|
428
|
+
__decorate,
|
|
429
|
+
__param,
|
|
430
|
+
__esDecorate,
|
|
431
|
+
__runInitializers,
|
|
432
|
+
__propKey,
|
|
433
|
+
__setFunctionName,
|
|
434
|
+
__metadata,
|
|
435
|
+
__awaiter,
|
|
436
|
+
__generator,
|
|
437
|
+
__createBinding,
|
|
438
|
+
__exportStar,
|
|
439
|
+
__values,
|
|
440
|
+
__read,
|
|
441
|
+
__spread,
|
|
442
|
+
__spreadArrays,
|
|
443
|
+
__spreadArray,
|
|
444
|
+
__await,
|
|
445
|
+
__asyncGenerator,
|
|
446
|
+
__asyncDelegator,
|
|
447
|
+
__asyncValues,
|
|
448
|
+
__makeTemplateObject,
|
|
449
|
+
__importStar,
|
|
450
|
+
__importDefault,
|
|
451
|
+
__classPrivateFieldGet,
|
|
452
|
+
__classPrivateFieldSet,
|
|
453
|
+
__classPrivateFieldIn,
|
|
454
|
+
__addDisposableResource,
|
|
455
|
+
__disposeResources,
|
|
456
|
+
__rewriteRelativeImportExtension,
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
/***/ }),
|
|
461
|
+
|
|
462
|
+
/***/ "../../../dev/materials/src/water/index.ts":
|
|
463
|
+
/*!*************************************************!*\
|
|
464
|
+
!*** ../../../dev/materials/src/water/index.ts ***!
|
|
465
|
+
\*************************************************/
|
|
466
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
467
|
+
|
|
468
|
+
__webpack_require__.r(__webpack_exports__);
|
|
469
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
470
|
+
/* harmony export */ WaterMaterial: () => (/* reexport safe */ _waterMaterial__WEBPACK_IMPORTED_MODULE_0__.WaterMaterial)
|
|
471
|
+
/* harmony export */ });
|
|
472
|
+
/* harmony import */ var _waterMaterial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./waterMaterial */ "../../../dev/materials/src/water/waterMaterial.ts");
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
/***/ }),
|
|
477
|
+
|
|
478
|
+
/***/ "../../../dev/materials/src/water/water.fragment.ts":
|
|
479
|
+
/*!**********************************************************!*\
|
|
480
|
+
!*** ../../../dev/materials/src/water/water.fragment.ts ***!
|
|
481
|
+
\**********************************************************/
|
|
482
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
483
|
+
|
|
484
|
+
__webpack_require__.r(__webpack_exports__);
|
|
485
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
486
|
+
/* harmony export */ waterPixelShader: () => (/* binding */ waterPixelShader)
|
|
487
|
+
/* harmony export */ });
|
|
488
|
+
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Shaders/ShadersInclude/fogFragment */ "babylonjs/Materials/effect");
|
|
489
|
+
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
|
490
|
+
// Do not edit.
|
|
58
491
|
|
|
59
|
-
var name = "waterPixelShader";
|
|
60
|
-
var shader = "#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nprecision highp float;uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include<helperFunctions>\n#include<imageProcessingDeclaration>\n#include<imageProcessingFunctions>\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include<lightsFragmentFunctions>\n#include<shadowsFragmentFunctions>\n#ifdef BUMP\nvarying vec2 vNormalUV;\n#ifdef BUMPSUPERIMPOSE\nvarying vec2 vNormalUV2;\n#endif\nuniform sampler2D normalSampler;uniform vec2 vNormalInfos;\n#endif\nuniform sampler2D refractionSampler;uniform sampler2D reflectionSampler;const float LOG2=1.442695;uniform vec3 cameraPosition;uniform vec4 waterColor;uniform float colorBlendFactor;uniform vec4 waterColor2;uniform float colorBlendFactor2;uniform float bumpHeight;uniform float time;varying vec3 vRefractionMapTexCoord;varying vec3 vReflectionMapTexCoord;\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;\n#ifdef BUMP\n#ifdef BUMPSUPERIMPOSE\nbaseColor=0.6*texture2D(normalSampler,vNormalUV)+0.4*texture2D(normalSampler,vec2(vNormalUV2.x,vNormalUV2.y));\n#else\nbaseColor=texture2D(normalSampler,vNormalUV);\n#endif\nvec3 bumpColor=baseColor.rgb;\n#ifdef ALPHATEST\nif (baseColor.a<0.4)\ndiscard;\n#endif\nbaseColor.rgb*=vNormalInfos.y;\n#else\nvec3 bumpColor=vec3(1.0);\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nbaseColor.rgb*=vColor.rgb;\n#endif\n#ifdef NORMAL\nvec2 perturbation=bumpHeight*(baseColor.rg-0.5);\n#ifdef BUMPAFFECTSREFLECTION\nvec3 normalW=normalize(vNormalW+vec3(perturbation.x*8.0,0.0,perturbation.y*8.0));if (normalW.y<0.0) {normalW.y=-normalW.y;}\n#else\nvec3 normalW=normalize(vNormalW);\n#endif\n#else\nvec3 normalW=vec3(1.0,1.0,1.0);vec2 perturbation=bumpHeight*(vec2(1.0,1.0)-0.5);\n#endif\n#ifdef FRESNELSEPARATE\n#ifdef REFLECTION\nvec2 projectedRefractionTexCoords=clamp(vRefractionMapTexCoord.xy/vRefractionMapTexCoord.z+perturbation*0.5,0.0,1.0);vec4 refractiveColor=texture2D(refractionSampler,projectedRefractionTexCoords);\n#ifdef IS_REFRACTION_LINEAR\nrefractiveColor.rgb=toGammaSpace(refractiveColor.rgb);\n#endif\nvec2 projectedReflectionTexCoords=clamp(vec2(\nvReflectionMapTexCoord.x/vReflectionMapTexCoord.z+perturbation.x*0.3,\nvReflectionMapTexCoord.y/vReflectionMapTexCoord.z+perturbation.y\n),0.0,1.0);vec4 reflectiveColor=texture2D(reflectionSampler,projectedReflectionTexCoords);\n#ifdef IS_REFLECTION_LINEAR\nreflectiveColor.rgb=toGammaSpace(reflectiveColor.rgb);\n#endif\nvec3 upVector=vec3(0.0,1.0,0.0);float fresnelTerm=clamp(abs(pow(dot(viewDirectionW,upVector),3.0)),0.05,0.65);float IfresnelTerm=1.0-fresnelTerm;refractiveColor=colorBlendFactor*waterColor+(1.0-colorBlendFactor)*refractiveColor;reflectiveColor=IfresnelTerm*colorBlendFactor2*waterColor+(1.0-colorBlendFactor2*IfresnelTerm)*reflectiveColor;vec4 combinedColor=refractiveColor*fresnelTerm+reflectiveColor*IfresnelTerm;baseColor=combinedColor;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;float shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularBase=vec3(0.,0.,0.);vec3 specularColor=vSpecularColor.rgb;\n#else\nfloat glossiness=0.;\n#endif\n#include<lightFragment>[0..maxSimultaneousLights]\nvec3 finalDiffuse=clamp(baseColor.rgb,0.0,1.0);\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase*specularColor;\n#else\nvec3 finalSpecular=vec3(0.0);\n#endif\n#else \n#ifdef REFLECTION\nvec2 projectedRefractionTexCoords=clamp(vRefractionMapTexCoord.xy/vRefractionMapTexCoord.z+perturbation,0.0,1.0);vec4 refractiveColor=texture2D(refractionSampler,projectedRefractionTexCoords);\n#ifdef IS_REFRACTION_LINEAR\nrefractiveColor.rgb=toGammaSpace(refractiveColor.rgb);\n#endif\nvec2 projectedReflectionTexCoords=clamp(vReflectionMapTexCoord.xy/vReflectionMapTexCoord.z+perturbation,0.0,1.0);vec4 reflectiveColor=texture2D(reflectionSampler,projectedReflectionTexCoords);\n#ifdef IS_REFLECTION_LINEAR\nreflectiveColor.rgb=toGammaSpace(reflectiveColor.rgb);\n#endif\nvec3 upVector=vec3(0.0,1.0,0.0);float fresnelTerm=max(dot(viewDirectionW,upVector),0.0);vec4 combinedColor=refractiveColor*fresnelTerm+reflectiveColor*(1.0-fresnelTerm);baseColor=colorBlendFactor*waterColor+(1.0-colorBlendFactor)*combinedColor;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;float shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularBase=vec3(0.,0.,0.);vec3 specularColor=vSpecularColor.rgb;\n#else\nfloat glossiness=0.;\n#endif\n#include<lightFragment>[0..maxSimultaneousLights]\nvec3 finalDiffuse=clamp(baseColor.rgb,0.0,1.0);\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase*specularColor;\n#else\nvec3 finalSpecular=vec3(0.0);\n#endif\n#endif\nvec4 color=vec4(finalDiffuse+finalSpecular,alpha);\n#include<logDepthFragment>\n#include<fogFragment>\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#elif defined(IMAGEPROCESSING)\ncolor.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color);\n#endif\ngl_FragColor=color;\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n";
|
|
61
|
-
// Sideeffect
|
|
62
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
63
|
-
/** @internal */
|
|
64
|
-
var waterPixelShader = { name: name, shader: shader };
|
|
65
492
|
|
|
66
493
|
|
|
67
|
-
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
var name = "waterPixelShader";
|
|
507
|
+
var shader = "#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nprecision highp float;uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include<helperFunctions>\n#include<imageProcessingDeclaration>\n#include<imageProcessingFunctions>\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include<lightsFragmentFunctions>\n#include<shadowsFragmentFunctions>\n#ifdef BUMP\nvarying vec2 vNormalUV;\n#ifdef BUMPSUPERIMPOSE\nvarying vec2 vNormalUV2;\n#endif\nuniform sampler2D normalSampler;uniform vec2 vNormalInfos;\n#endif\nuniform sampler2D refractionSampler;uniform sampler2D reflectionSampler;const float LOG2=1.442695;uniform vec3 cameraPosition;uniform vec4 waterColor;uniform float colorBlendFactor;uniform vec4 waterColor2;uniform float colorBlendFactor2;uniform float bumpHeight;uniform float time;varying vec3 vRefractionMapTexCoord;varying vec3 vReflectionMapTexCoord;\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;\n#ifdef BUMP\n#ifdef BUMPSUPERIMPOSE\nbaseColor=0.6*texture2D(normalSampler,vNormalUV)+0.4*texture2D(normalSampler,vec2(vNormalUV2.x,vNormalUV2.y));\n#else\nbaseColor=texture2D(normalSampler,vNormalUV);\n#endif\nvec3 bumpColor=baseColor.rgb;\n#ifdef ALPHATEST\nif (baseColor.a<0.4)\ndiscard;\n#endif\nbaseColor.rgb*=vNormalInfos.y;\n#else\nvec3 bumpColor=vec3(1.0);\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nbaseColor.rgb*=vColor.rgb;\n#endif\n#ifdef NORMAL\nvec2 perturbation=bumpHeight*(baseColor.rg-0.5);\n#ifdef BUMPAFFECTSREFLECTION\nvec3 normalW=normalize(vNormalW+vec3(perturbation.x*8.0,0.0,perturbation.y*8.0));if (normalW.y<0.0) {normalW.y=-normalW.y;}\n#else\nvec3 normalW=normalize(vNormalW);\n#endif\n#else\nvec3 normalW=vec3(1.0,1.0,1.0);vec2 perturbation=bumpHeight*(vec2(1.0,1.0)-0.5);\n#endif\n#ifdef FRESNELSEPARATE\n#ifdef REFLECTION\nvec2 projectedRefractionTexCoords=clamp(vRefractionMapTexCoord.xy/vRefractionMapTexCoord.z+perturbation*0.5,0.0,1.0);vec4 refractiveColor=texture2D(refractionSampler,projectedRefractionTexCoords);\n#ifdef IS_REFRACTION_LINEAR\nrefractiveColor.rgb=toGammaSpace(refractiveColor.rgb);\n#endif\nvec2 projectedReflectionTexCoords=clamp(vec2(\nvReflectionMapTexCoord.x/vReflectionMapTexCoord.z+perturbation.x*0.3,\nvReflectionMapTexCoord.y/vReflectionMapTexCoord.z+perturbation.y\n),0.0,1.0);vec4 reflectiveColor=texture2D(reflectionSampler,projectedReflectionTexCoords);\n#ifdef IS_REFLECTION_LINEAR\nreflectiveColor.rgb=toGammaSpace(reflectiveColor.rgb);\n#endif\nvec3 upVector=vec3(0.0,1.0,0.0);float fresnelTerm=clamp(abs(pow(dot(viewDirectionW,upVector),3.0)),0.05,0.65);float IfresnelTerm=1.0-fresnelTerm;refractiveColor=colorBlendFactor*waterColor+(1.0-colorBlendFactor)*refractiveColor;reflectiveColor=IfresnelTerm*colorBlendFactor2*waterColor+(1.0-colorBlendFactor2*IfresnelTerm)*reflectiveColor;vec4 combinedColor=refractiveColor*fresnelTerm+reflectiveColor*IfresnelTerm;baseColor=combinedColor;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;float shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularBase=vec3(0.,0.,0.);vec3 specularColor=vSpecularColor.rgb;\n#else\nfloat glossiness=0.;\n#endif\n#include<lightFragment>[0..maxSimultaneousLights]\nvec3 finalDiffuse=clamp(baseColor.rgb,0.0,1.0);\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase*specularColor;\n#else\nvec3 finalSpecular=vec3(0.0);\n#endif\n#else \n#ifdef REFLECTION\nvec2 projectedRefractionTexCoords=clamp(vRefractionMapTexCoord.xy/vRefractionMapTexCoord.z+perturbation,0.0,1.0);vec4 refractiveColor=texture2D(refractionSampler,projectedRefractionTexCoords);\n#ifdef IS_REFRACTION_LINEAR\nrefractiveColor.rgb=toGammaSpace(refractiveColor.rgb);\n#endif\nvec2 projectedReflectionTexCoords=clamp(vReflectionMapTexCoord.xy/vReflectionMapTexCoord.z+perturbation,0.0,1.0);vec4 reflectiveColor=texture2D(reflectionSampler,projectedReflectionTexCoords);\n#ifdef IS_REFLECTION_LINEAR\nreflectiveColor.rgb=toGammaSpace(reflectiveColor.rgb);\n#endif\nvec3 upVector=vec3(0.0,1.0,0.0);float fresnelTerm=max(dot(viewDirectionW,upVector),0.0);vec4 combinedColor=refractiveColor*fresnelTerm+reflectiveColor*(1.0-fresnelTerm);baseColor=colorBlendFactor*waterColor+(1.0-colorBlendFactor)*combinedColor;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;float shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularBase=vec3(0.,0.,0.);vec3 specularColor=vSpecularColor.rgb;\n#else\nfloat glossiness=0.;\n#endif\n#include<lightFragment>[0..maxSimultaneousLights]\nvec3 finalDiffuse=clamp(baseColor.rgb,0.0,1.0);\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase*specularColor;\n#else\nvec3 finalSpecular=vec3(0.0);\n#endif\n#endif\nvec4 color=vec4(finalDiffuse+finalSpecular,alpha);\n#include<logDepthFragment>\n#include<fogFragment>\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#elif defined(IMAGEPROCESSING)\ncolor.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color);\n#endif\ngl_FragColor=color;\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n";
|
|
508
|
+
// Sideeffect
|
|
509
|
+
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
510
|
+
/** @internal */
|
|
511
|
+
var waterPixelShader = { name: name, shader: shader };
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
/***/ }),
|
|
68
515
|
|
|
69
516
|
/***/ "../../../dev/materials/src/water/water.vertex.ts":
|
|
70
517
|
/*!********************************************************!*\
|
|
@@ -915,453 +1362,6 @@ if (typeof globalObject !== "undefined") {
|
|
|
915
1362
|
|
|
916
1363
|
module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Materials_effect__;
|
|
917
1364
|
|
|
918
|
-
/***/ }),
|
|
919
|
-
|
|
920
|
-
/***/ "../../../../node_modules/tslib/tslib.es6.mjs":
|
|
921
|
-
/*!****************************************************!*\
|
|
922
|
-
!*** ../../../../node_modules/tslib/tslib.es6.mjs ***!
|
|
923
|
-
\****************************************************/
|
|
924
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
925
|
-
|
|
926
|
-
__webpack_require__.r(__webpack_exports__);
|
|
927
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
928
|
-
/* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
|
|
929
|
-
/* harmony export */ __assign: () => (/* binding */ __assign),
|
|
930
|
-
/* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
|
|
931
|
-
/* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
|
|
932
|
-
/* harmony export */ __asyncValues: () => (/* binding */ __asyncValues),
|
|
933
|
-
/* harmony export */ __await: () => (/* binding */ __await),
|
|
934
|
-
/* harmony export */ __awaiter: () => (/* binding */ __awaiter),
|
|
935
|
-
/* harmony export */ __classPrivateFieldGet: () => (/* binding */ __classPrivateFieldGet),
|
|
936
|
-
/* harmony export */ __classPrivateFieldIn: () => (/* binding */ __classPrivateFieldIn),
|
|
937
|
-
/* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
|
|
938
|
-
/* harmony export */ __createBinding: () => (/* binding */ __createBinding),
|
|
939
|
-
/* harmony export */ __decorate: () => (/* binding */ __decorate),
|
|
940
|
-
/* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
|
|
941
|
-
/* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
|
|
942
|
-
/* harmony export */ __exportStar: () => (/* binding */ __exportStar),
|
|
943
|
-
/* harmony export */ __extends: () => (/* binding */ __extends),
|
|
944
|
-
/* harmony export */ __generator: () => (/* binding */ __generator),
|
|
945
|
-
/* harmony export */ __importDefault: () => (/* binding */ __importDefault),
|
|
946
|
-
/* harmony export */ __importStar: () => (/* binding */ __importStar),
|
|
947
|
-
/* harmony export */ __makeTemplateObject: () => (/* binding */ __makeTemplateObject),
|
|
948
|
-
/* harmony export */ __metadata: () => (/* binding */ __metadata),
|
|
949
|
-
/* harmony export */ __param: () => (/* binding */ __param),
|
|
950
|
-
/* harmony export */ __propKey: () => (/* binding */ __propKey),
|
|
951
|
-
/* harmony export */ __read: () => (/* binding */ __read),
|
|
952
|
-
/* harmony export */ __rest: () => (/* binding */ __rest),
|
|
953
|
-
/* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
|
|
954
|
-
/* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
|
|
955
|
-
/* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
|
|
956
|
-
/* harmony export */ __spread: () => (/* binding */ __spread),
|
|
957
|
-
/* harmony export */ __spreadArray: () => (/* binding */ __spreadArray),
|
|
958
|
-
/* harmony export */ __spreadArrays: () => (/* binding */ __spreadArrays),
|
|
959
|
-
/* harmony export */ __values: () => (/* binding */ __values),
|
|
960
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
961
|
-
/* harmony export */ });
|
|
962
|
-
/******************************************************************************
|
|
963
|
-
Copyright (c) Microsoft Corporation.
|
|
964
|
-
|
|
965
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
966
|
-
purpose with or without fee is hereby granted.
|
|
967
|
-
|
|
968
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
969
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
970
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
971
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
972
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
973
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
974
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
975
|
-
***************************************************************************** */
|
|
976
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
977
|
-
|
|
978
|
-
var extendStatics = function(d, b) {
|
|
979
|
-
extendStatics = Object.setPrototypeOf ||
|
|
980
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
981
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
982
|
-
return extendStatics(d, b);
|
|
983
|
-
};
|
|
984
|
-
|
|
985
|
-
function __extends(d, b) {
|
|
986
|
-
if (typeof b !== "function" && b !== null)
|
|
987
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
988
|
-
extendStatics(d, b);
|
|
989
|
-
function __() { this.constructor = d; }
|
|
990
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
var __assign = function() {
|
|
994
|
-
__assign = Object.assign || function __assign(t) {
|
|
995
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
996
|
-
s = arguments[i];
|
|
997
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
998
|
-
}
|
|
999
|
-
return t;
|
|
1000
|
-
}
|
|
1001
|
-
return __assign.apply(this, arguments);
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
function __rest(s, e) {
|
|
1005
|
-
var t = {};
|
|
1006
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
1007
|
-
t[p] = s[p];
|
|
1008
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
1009
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
1010
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
1011
|
-
t[p[i]] = s[p[i]];
|
|
1012
|
-
}
|
|
1013
|
-
return t;
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
function __decorate(decorators, target, key, desc) {
|
|
1017
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1018
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1019
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1020
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
function __param(paramIndex, decorator) {
|
|
1024
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
|
-
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
1028
|
-
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
1029
|
-
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
1030
|
-
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
1031
|
-
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
1032
|
-
var _, done = false;
|
|
1033
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1034
|
-
var context = {};
|
|
1035
|
-
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
1036
|
-
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
1037
|
-
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
1038
|
-
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
1039
|
-
if (kind === "accessor") {
|
|
1040
|
-
if (result === void 0) continue;
|
|
1041
|
-
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
1042
|
-
if (_ = accept(result.get)) descriptor.get = _;
|
|
1043
|
-
if (_ = accept(result.set)) descriptor.set = _;
|
|
1044
|
-
if (_ = accept(result.init)) initializers.unshift(_);
|
|
1045
|
-
}
|
|
1046
|
-
else if (_ = accept(result)) {
|
|
1047
|
-
if (kind === "field") initializers.unshift(_);
|
|
1048
|
-
else descriptor[key] = _;
|
|
1049
|
-
}
|
|
1050
|
-
}
|
|
1051
|
-
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
1052
|
-
done = true;
|
|
1053
|
-
};
|
|
1054
|
-
|
|
1055
|
-
function __runInitializers(thisArg, initializers, value) {
|
|
1056
|
-
var useValue = arguments.length > 2;
|
|
1057
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
1058
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
1059
|
-
}
|
|
1060
|
-
return useValue ? value : void 0;
|
|
1061
|
-
};
|
|
1062
|
-
|
|
1063
|
-
function __propKey(x) {
|
|
1064
|
-
return typeof x === "symbol" ? x : "".concat(x);
|
|
1065
|
-
};
|
|
1066
|
-
|
|
1067
|
-
function __setFunctionName(f, name, prefix) {
|
|
1068
|
-
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
|
|
1069
|
-
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
|
|
1070
|
-
};
|
|
1071
|
-
|
|
1072
|
-
function __metadata(metadataKey, metadataValue) {
|
|
1073
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
|
-
function __awaiter(thisArg, _arguments, P, generator) {
|
|
1077
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
1078
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
1079
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
1080
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
1081
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
1082
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
1083
|
-
});
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
|
-
function __generator(thisArg, body) {
|
|
1087
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
1088
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
1089
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
1090
|
-
function step(op) {
|
|
1091
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
1092
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
1093
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
1094
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
1095
|
-
switch (op[0]) {
|
|
1096
|
-
case 0: case 1: t = op; break;
|
|
1097
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
1098
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
1099
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
1100
|
-
default:
|
|
1101
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
1102
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
1103
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
1104
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
1105
|
-
if (t[2]) _.ops.pop();
|
|
1106
|
-
_.trys.pop(); continue;
|
|
1107
|
-
}
|
|
1108
|
-
op = body.call(thisArg, _);
|
|
1109
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
1110
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
var __createBinding = Object.create ? (function(o, m, k, k2) {
|
|
1115
|
-
if (k2 === undefined) k2 = k;
|
|
1116
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
1117
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
1118
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
1119
|
-
}
|
|
1120
|
-
Object.defineProperty(o, k2, desc);
|
|
1121
|
-
}) : (function(o, m, k, k2) {
|
|
1122
|
-
if (k2 === undefined) k2 = k;
|
|
1123
|
-
o[k2] = m[k];
|
|
1124
|
-
});
|
|
1125
|
-
|
|
1126
|
-
function __exportStar(m, o) {
|
|
1127
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
function __values(o) {
|
|
1131
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
1132
|
-
if (m) return m.call(o);
|
|
1133
|
-
if (o && typeof o.length === "number") return {
|
|
1134
|
-
next: function () {
|
|
1135
|
-
if (o && i >= o.length) o = void 0;
|
|
1136
|
-
return { value: o && o[i++], done: !o };
|
|
1137
|
-
}
|
|
1138
|
-
};
|
|
1139
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
function __read(o, n) {
|
|
1143
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
1144
|
-
if (!m) return o;
|
|
1145
|
-
var i = m.call(o), r, ar = [], e;
|
|
1146
|
-
try {
|
|
1147
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
1148
|
-
}
|
|
1149
|
-
catch (error) { e = { error: error }; }
|
|
1150
|
-
finally {
|
|
1151
|
-
try {
|
|
1152
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
1153
|
-
}
|
|
1154
|
-
finally { if (e) throw e.error; }
|
|
1155
|
-
}
|
|
1156
|
-
return ar;
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
/** @deprecated */
|
|
1160
|
-
function __spread() {
|
|
1161
|
-
for (var ar = [], i = 0; i < arguments.length; i++)
|
|
1162
|
-
ar = ar.concat(__read(arguments[i]));
|
|
1163
|
-
return ar;
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
/** @deprecated */
|
|
1167
|
-
function __spreadArrays() {
|
|
1168
|
-
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
1169
|
-
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
1170
|
-
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
1171
|
-
r[k] = a[j];
|
|
1172
|
-
return r;
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
function __spreadArray(to, from, pack) {
|
|
1176
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
1177
|
-
if (ar || !(i in from)) {
|
|
1178
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
1179
|
-
ar[i] = from[i];
|
|
1180
|
-
}
|
|
1181
|
-
}
|
|
1182
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
|
-
function __await(v) {
|
|
1186
|
-
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
|
1187
|
-
}
|
|
1188
|
-
|
|
1189
|
-
function __asyncGenerator(thisArg, _arguments, generator) {
|
|
1190
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
1191
|
-
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
1192
|
-
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
1193
|
-
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
1194
|
-
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
1195
|
-
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
1196
|
-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
1197
|
-
function fulfill(value) { resume("next", value); }
|
|
1198
|
-
function reject(value) { resume("throw", value); }
|
|
1199
|
-
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
1200
|
-
}
|
|
1201
|
-
|
|
1202
|
-
function __asyncDelegator(o) {
|
|
1203
|
-
var i, p;
|
|
1204
|
-
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
|
1205
|
-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
|
|
1206
|
-
}
|
|
1207
|
-
|
|
1208
|
-
function __asyncValues(o) {
|
|
1209
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
1210
|
-
var m = o[Symbol.asyncIterator], i;
|
|
1211
|
-
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
1212
|
-
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
1213
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
function __makeTemplateObject(cooked, raw) {
|
|
1217
|
-
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
1218
|
-
return cooked;
|
|
1219
|
-
};
|
|
1220
|
-
|
|
1221
|
-
var __setModuleDefault = Object.create ? (function(o, v) {
|
|
1222
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
1223
|
-
}) : function(o, v) {
|
|
1224
|
-
o["default"] = v;
|
|
1225
|
-
};
|
|
1226
|
-
|
|
1227
|
-
var ownKeys = function(o) {
|
|
1228
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
1229
|
-
var ar = [];
|
|
1230
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
1231
|
-
return ar;
|
|
1232
|
-
};
|
|
1233
|
-
return ownKeys(o);
|
|
1234
|
-
};
|
|
1235
|
-
|
|
1236
|
-
function __importStar(mod) {
|
|
1237
|
-
if (mod && mod.__esModule) return mod;
|
|
1238
|
-
var result = {};
|
|
1239
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
1240
|
-
__setModuleDefault(result, mod);
|
|
1241
|
-
return result;
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
function __importDefault(mod) {
|
|
1245
|
-
return (mod && mod.__esModule) ? mod : { default: mod };
|
|
1246
|
-
}
|
|
1247
|
-
|
|
1248
|
-
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|
1249
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
1250
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
1251
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
1255
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
1256
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
1257
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
1258
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
function __classPrivateFieldIn(state, receiver) {
|
|
1262
|
-
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
|
|
1263
|
-
return typeof state === "function" ? receiver === state : state.has(receiver);
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
function __addDisposableResource(env, value, async) {
|
|
1267
|
-
if (value !== null && value !== void 0) {
|
|
1268
|
-
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
1269
|
-
var dispose, inner;
|
|
1270
|
-
if (async) {
|
|
1271
|
-
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
1272
|
-
dispose = value[Symbol.asyncDispose];
|
|
1273
|
-
}
|
|
1274
|
-
if (dispose === void 0) {
|
|
1275
|
-
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
1276
|
-
dispose = value[Symbol.dispose];
|
|
1277
|
-
if (async) inner = dispose;
|
|
1278
|
-
}
|
|
1279
|
-
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
1280
|
-
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
1281
|
-
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
1282
|
-
}
|
|
1283
|
-
else if (async) {
|
|
1284
|
-
env.stack.push({ async: true });
|
|
1285
|
-
}
|
|
1286
|
-
return value;
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
1290
|
-
var e = new Error(message);
|
|
1291
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
1292
|
-
};
|
|
1293
|
-
|
|
1294
|
-
function __disposeResources(env) {
|
|
1295
|
-
function fail(e) {
|
|
1296
|
-
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
1297
|
-
env.hasError = true;
|
|
1298
|
-
}
|
|
1299
|
-
var r, s = 0;
|
|
1300
|
-
function next() {
|
|
1301
|
-
while (r = env.stack.pop()) {
|
|
1302
|
-
try {
|
|
1303
|
-
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
1304
|
-
if (r.dispose) {
|
|
1305
|
-
var result = r.dispose.call(r.value);
|
|
1306
|
-
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
1307
|
-
}
|
|
1308
|
-
else s |= 1;
|
|
1309
|
-
}
|
|
1310
|
-
catch (e) {
|
|
1311
|
-
fail(e);
|
|
1312
|
-
}
|
|
1313
|
-
}
|
|
1314
|
-
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
1315
|
-
if (env.hasError) throw env.error;
|
|
1316
|
-
}
|
|
1317
|
-
return next();
|
|
1318
|
-
}
|
|
1319
|
-
|
|
1320
|
-
function __rewriteRelativeImportExtension(path, preserveJsx) {
|
|
1321
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
1322
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
1323
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
1324
|
-
});
|
|
1325
|
-
}
|
|
1326
|
-
return path;
|
|
1327
|
-
}
|
|
1328
|
-
|
|
1329
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
1330
|
-
__extends,
|
|
1331
|
-
__assign,
|
|
1332
|
-
__rest,
|
|
1333
|
-
__decorate,
|
|
1334
|
-
__param,
|
|
1335
|
-
__esDecorate,
|
|
1336
|
-
__runInitializers,
|
|
1337
|
-
__propKey,
|
|
1338
|
-
__setFunctionName,
|
|
1339
|
-
__metadata,
|
|
1340
|
-
__awaiter,
|
|
1341
|
-
__generator,
|
|
1342
|
-
__createBinding,
|
|
1343
|
-
__exportStar,
|
|
1344
|
-
__values,
|
|
1345
|
-
__read,
|
|
1346
|
-
__spread,
|
|
1347
|
-
__spreadArrays,
|
|
1348
|
-
__spreadArray,
|
|
1349
|
-
__await,
|
|
1350
|
-
__asyncGenerator,
|
|
1351
|
-
__asyncDelegator,
|
|
1352
|
-
__asyncValues,
|
|
1353
|
-
__makeTemplateObject,
|
|
1354
|
-
__importStar,
|
|
1355
|
-
__importDefault,
|
|
1356
|
-
__classPrivateFieldGet,
|
|
1357
|
-
__classPrivateFieldSet,
|
|
1358
|
-
__classPrivateFieldIn,
|
|
1359
|
-
__addDisposableResource,
|
|
1360
|
-
__disposeResources,
|
|
1361
|
-
__rewriteRelativeImportExtension,
|
|
1362
|
-
});
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
1365
|
/***/ })
|
|
1366
1366
|
|
|
1367
1367
|
/******/ });
|
|
@@ -1467,4 +1467,4 @@ __webpack_exports__ = __webpack_exports__["default"];
|
|
|
1467
1467
|
/******/ })()
|
|
1468
1468
|
;
|
|
1469
1469
|
});
|
|
1470
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi53YXRlck1hdGVyaWFsLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQXdJQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQW1HQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWVBO0FBRUE7QUFBQTtBQThDQTtBQUNBO0FBOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQXdKQTs7Ozs7QUFLQTtBQUNBO0FBR0E7QUFFQTtBQUZBO0FBdkpBO0FBR0E7QUFHQTtBQUdBO0FBS0E7QUFJQTs7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUlBOztBQUVBO0FBRUE7QUFJQTs7QUFFQTtBQUVBO0FBSUE7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFFQTs7QUFFQTtBQUVBO0FBRUE7O0FBRUE7QUFFQTtBQUNBOzs7QUFHQTtBQUVBO0FBRUE7Ozs7QUFJQTtBQUVBO0FBSUE7QUFFQTs7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBMkJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFsQ0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFtQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQWp2QkE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBUUE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBMm5CQTtBQUFBO0FBdnZCQTtBQXl2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5MUJBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUNkQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi4vLi4vLi4vZGV2L21hdGVyaWFscy9zcmMvd2F0ZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2Rldi9tYXRlcmlhbHMvc3JjL3dhdGVyL3dhdGVyLmZyYWdtZW50LnRzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9kZXYvbWF0ZXJpYWxzL3NyYy93YXRlci93YXRlci52ZXJ0ZXgudHMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2Rldi9tYXRlcmlhbHMvc3JjL3dhdGVyL3dhdGVyTWF0ZXJpYWwudHMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2x0cy9tYXRlcmlhbHMvc3JjL2xlZ2FjeS9sZWdhY3ktd2F0ZXIudHMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL2V4dGVybmFsIHVtZCB7XCJyb290XCI6XCJCQUJZTE9OXCIsXCJjb21tb25qc1wiOlwiYmFieWxvbmpzXCIsXCJjb21tb25qczJcIjpcImJhYnlsb25qc1wiLFwiYW1kXCI6XCJiYWJ5bG9uanNcIn0iLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL01BVEVSSUFMUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi9zcmMvd2F0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLW1hdGVyaWFsc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLW1hdGVyaWFsc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiTUFURVJJQUxTXCJdID0gZmFjdG9yeShyb290W1wiQkFCWUxPTlwiXSk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWF0ZXJpYWxzX2VmZmVjdF9fKSA9PiB7XG5yZXR1cm4gIiwiZXhwb3J0ICogZnJvbSBcIi4vd2F0ZXJNYXRlcmlhbFwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2hlbHBlckZ1bmN0aW9uc1wiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2ltYWdlUHJvY2Vzc2luZ0RlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvaW1hZ2VQcm9jZXNzaW5nRnVuY3Rpb25zXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRGcmFnbWVudERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRVYm9EZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2xpZ2h0c0ZyYWdtZW50RnVuY3Rpb25zXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvc2hhZG93c0ZyYWdtZW50RnVuY3Rpb25zXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvY2xpcFBsYW5lRnJhZ21lbnREZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2xvZ0RlcHRoRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9mb2dGcmFnbWVudERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvY2xpcFBsYW5lRnJhZ21lbnRcIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9saWdodEZyYWdtZW50XCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbG9nRGVwdGhGcmFnbWVudFwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2ZvZ0ZyYWdtZW50XCI7XG5cbmNvbnN0IG5hbWUgPSBcIndhdGVyUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGAjaWZkZWYgTE9HQVJJVEhNSUNERVBUSFxuI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZVxuI2VuZGlmXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHZFeWVQb3NpdGlvbjt1bmlmb3JtIHZlYzQgdkRpZmZ1c2VDb2xvcjtcbiNpZmRlZiBTUEVDVUxBUlRFUk1cbnVuaWZvcm0gdmVjNCB2U3BlY3VsYXJDb2xvcjtcbiNlbmRpZlxudmFyeWluZyB2ZWMzIHZQb3NpdGlvblc7XG4jaWZkZWYgTk9STUFMXG52YXJ5aW5nIHZlYzMgdk5vcm1hbFc7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKFZFUlRFWENPTE9SKSB8fCBkZWZpbmVkKElOU1RBTkNFU0NPTE9SKSAmJiBkZWZpbmVkKElOU1RBTkNFUylcbnZhcnlpbmcgdmVjNCB2Q29sb3I7XG4jZW5kaWZcbiNpbmNsdWRlPGhlbHBlckZ1bmN0aW9ucz5cbiNpbmNsdWRlPGltYWdlUHJvY2Vzc2luZ0RlY2xhcmF0aW9uPlxuI2luY2x1ZGU8aW1hZ2VQcm9jZXNzaW5nRnVuY3Rpb25zPlxuI2luY2x1ZGU8X19kZWNsX19saWdodEZyYWdtZW50PlswLi5tYXhTaW11bHRhbmVvdXNMaWdodHNdXG4jaW5jbHVkZTxsaWdodHNGcmFnbWVudEZ1bmN0aW9ucz5cbiNpbmNsdWRlPHNoYWRvd3NGcmFnbWVudEZ1bmN0aW9ucz5cbiNpZmRlZiBCVU1QXG52YXJ5aW5nIHZlYzIgdk5vcm1hbFVWO1xuI2lmZGVmIEJVTVBTVVBFUklNUE9TRVxudmFyeWluZyB2ZWMyIHZOb3JtYWxVVjI7XG4jZW5kaWZcbnVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbFNhbXBsZXI7dW5pZm9ybSB2ZWMyIHZOb3JtYWxJbmZvcztcbiNlbmRpZlxudW5pZm9ybSBzYW1wbGVyMkQgcmVmcmFjdGlvblNhbXBsZXI7dW5pZm9ybSBzYW1wbGVyMkQgcmVmbGVjdGlvblNhbXBsZXI7Y29uc3QgZmxvYXQgTE9HMj0xLjQ0MjY5NTt1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247dW5pZm9ybSB2ZWM0IHdhdGVyQ29sb3I7dW5pZm9ybSBmbG9hdCBjb2xvckJsZW5kRmFjdG9yO3VuaWZvcm0gdmVjNCB3YXRlckNvbG9yMjt1bmlmb3JtIGZsb2F0IGNvbG9yQmxlbmRGYWN0b3IyO3VuaWZvcm0gZmxvYXQgYnVtcEhlaWdodDt1bmlmb3JtIGZsb2F0IHRpbWU7dmFyeWluZyB2ZWMzIHZSZWZyYWN0aW9uTWFwVGV4Q29vcmQ7dmFyeWluZyB2ZWMzIHZSZWZsZWN0aW9uTWFwVGV4Q29vcmQ7XG4jaW5jbHVkZTxjbGlwUGxhbmVGcmFnbWVudERlY2xhcmF0aW9uPlxuI2luY2x1ZGU8bG9nRGVwdGhEZWNsYXJhdGlvbj5cbiNpbmNsdWRlPGZvZ0ZyYWdtZW50RGVjbGFyYXRpb24+XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbiNpbmNsdWRlPGNsaXBQbGFuZUZyYWdtZW50PlxudmVjMyB2aWV3RGlyZWN0aW9uVz1ub3JtYWxpemUodkV5ZVBvc2l0aW9uLnh5ei12UG9zaXRpb25XKTt2ZWM0IGJhc2VDb2xvcj12ZWM0KDEuLDEuLDEuLDEuKTt2ZWMzIGRpZmZ1c2VDb2xvcj12RGlmZnVzZUNvbG9yLnJnYjtmbG9hdCBhbHBoYT12RGlmZnVzZUNvbG9yLmE7XG4jaWZkZWYgQlVNUFxuI2lmZGVmIEJVTVBTVVBFUklNUE9TRVxuYmFzZUNvbG9yPTAuNip0ZXh0dXJlMkQobm9ybWFsU2FtcGxlcix2Tm9ybWFsVVYpKzAuNCp0ZXh0dXJlMkQobm9ybWFsU2FtcGxlcix2ZWMyKHZOb3JtYWxVVjIueCx2Tm9ybWFsVVYyLnkpKTtcbiNlbHNlXG5iYXNlQ29sb3I9dGV4dHVyZTJEKG5vcm1hbFNhbXBsZXIsdk5vcm1hbFVWKTtcbiNlbmRpZlxudmVjMyBidW1wQ29sb3I9YmFzZUNvbG9yLnJnYjtcbiNpZmRlZiBBTFBIQVRFU1RcbmlmIChiYXNlQ29sb3IuYTwwLjQpXG5kaXNjYXJkO1xuI2VuZGlmXG5iYXNlQ29sb3IucmdiKj12Tm9ybWFsSW5mb3MueTtcbiNlbHNlXG52ZWMzIGJ1bXBDb2xvcj12ZWMzKDEuMCk7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKFZFUlRFWENPTE9SKSB8fCBkZWZpbmVkKElOU1RBTkNFU0NPTE9SKSAmJiBkZWZpbmVkKElOU1RBTkNFUylcbmJhc2VDb2xvci5yZ2IqPXZDb2xvci5yZ2I7XG4jZW5kaWZcbiNpZmRlZiBOT1JNQUxcbnZlYzIgcGVydHVyYmF0aW9uPWJ1bXBIZWlnaHQqKGJhc2VDb2xvci5yZy0wLjUpO1xuI2lmZGVmIEJVTVBBRkZFQ1RTUkVGTEVDVElPTlxudmVjMyBub3JtYWxXPW5vcm1hbGl6ZSh2Tm9ybWFsVyt2ZWMzKHBlcnR1cmJhdGlvbi54KjguMCwwLjAscGVydHVyYmF0aW9uLnkqOC4wKSk7aWYgKG5vcm1hbFcueTwwLjApIHtub3JtYWxXLnk9LW5vcm1hbFcueTt9XG4jZWxzZVxudmVjMyBub3JtYWxXPW5vcm1hbGl6ZSh2Tm9ybWFsVyk7XG4jZW5kaWZcbiNlbHNlXG52ZWMzIG5vcm1hbFc9dmVjMygxLjAsMS4wLDEuMCk7dmVjMiBwZXJ0dXJiYXRpb249YnVtcEhlaWdodCoodmVjMigxLjAsMS4wKS0wLjUpO1xuI2VuZGlmXG4jaWZkZWYgRlJFU05FTFNFUEFSQVRFXG4jaWZkZWYgUkVGTEVDVElPTlxudmVjMiBwcm9qZWN0ZWRSZWZyYWN0aW9uVGV4Q29vcmRzPWNsYW1wKHZSZWZyYWN0aW9uTWFwVGV4Q29vcmQueHkvdlJlZnJhY3Rpb25NYXBUZXhDb29yZC56K3BlcnR1cmJhdGlvbiowLjUsMC4wLDEuMCk7dmVjNCByZWZyYWN0aXZlQ29sb3I9dGV4dHVyZTJEKHJlZnJhY3Rpb25TYW1wbGVyLHByb2plY3RlZFJlZnJhY3Rpb25UZXhDb29yZHMpO1xuI2lmZGVmIElTX1JFRlJBQ1RJT05fTElORUFSXG5yZWZyYWN0aXZlQ29sb3IucmdiPXRvR2FtbWFTcGFjZShyZWZyYWN0aXZlQ29sb3IucmdiKTtcbiNlbmRpZlxudmVjMiBwcm9qZWN0ZWRSZWZsZWN0aW9uVGV4Q29vcmRzPWNsYW1wKHZlYzIoXG52UmVmbGVjdGlvbk1hcFRleENvb3JkLngvdlJlZmxlY3Rpb25NYXBUZXhDb29yZC56K3BlcnR1cmJhdGlvbi54KjAuMyxcbnZSZWZsZWN0aW9uTWFwVGV4Q29vcmQueS92UmVmbGVjdGlvbk1hcFRleENvb3JkLnorcGVydHVyYmF0aW9uLnlcbiksMC4wLDEuMCk7dmVjNCByZWZsZWN0aXZlQ29sb3I9dGV4dHVyZTJEKHJlZmxlY3Rpb25TYW1wbGVyLHByb2plY3RlZFJlZmxlY3Rpb25UZXhDb29yZHMpO1xuI2lmZGVmIElTX1JFRkxFQ1RJT05fTElORUFSXG5yZWZsZWN0aXZlQ29sb3IucmdiPXRvR2FtbWFTcGFjZShyZWZsZWN0aXZlQ29sb3IucmdiKTtcbiNlbmRpZlxudmVjMyB1cFZlY3Rvcj12ZWMzKDAuMCwxLjAsMC4wKTtmbG9hdCBmcmVzbmVsVGVybT1jbGFtcChhYnMocG93KGRvdCh2aWV3RGlyZWN0aW9uVyx1cFZlY3RvciksMy4wKSksMC4wNSwwLjY1KTtmbG9hdCBJZnJlc25lbFRlcm09MS4wLWZyZXNuZWxUZXJtO3JlZnJhY3RpdmVDb2xvcj1jb2xvckJsZW5kRmFjdG9yKndhdGVyQ29sb3IrKDEuMC1jb2xvckJsZW5kRmFjdG9yKSpyZWZyYWN0aXZlQ29sb3I7cmVmbGVjdGl2ZUNvbG9yPUlmcmVzbmVsVGVybSpjb2xvckJsZW5kRmFjdG9yMip3YXRlckNvbG9yKygxLjAtY29sb3JCbGVuZEZhY3RvcjIqSWZyZXNuZWxUZXJtKSpyZWZsZWN0aXZlQ29sb3I7dmVjNCBjb21iaW5lZENvbG9yPXJlZnJhY3RpdmVDb2xvcipmcmVzbmVsVGVybStyZWZsZWN0aXZlQ29sb3IqSWZyZXNuZWxUZXJtO2Jhc2VDb2xvcj1jb21iaW5lZENvbG9yO1xuI2VuZGlmXG52ZWMzIGRpZmZ1c2VCYXNlPXZlYzMoMC4sMC4sMC4pO2xpZ2h0aW5nSW5mbyBpbmZvO2Zsb2F0IHNoYWRvdz0xLjtmbG9hdCBhZ2dTaGFkb3c9MC47ZmxvYXQgbnVtTGlnaHRzPTAuO1xuI2lmZGVmIFNQRUNVTEFSVEVSTVxuZmxvYXQgZ2xvc3NpbmVzcz12U3BlY3VsYXJDb2xvci5hO3ZlYzMgc3BlY3VsYXJCYXNlPXZlYzMoMC4sMC4sMC4pO3ZlYzMgc3BlY3VsYXJDb2xvcj12U3BlY3VsYXJDb2xvci5yZ2I7XG4jZWxzZVxuZmxvYXQgZ2xvc3NpbmVzcz0wLjtcbiNlbmRpZlxuI2luY2x1ZGU8bGlnaHRGcmFnbWVudD5bMC4ubWF4U2ltdWx0YW5lb3VzTGlnaHRzXVxudmVjMyBmaW5hbERpZmZ1c2U9Y2xhbXAoYmFzZUNvbG9yLnJnYiwwLjAsMS4wKTtcbiNpZiBkZWZpbmVkKFZFUlRFWEFMUEhBKSB8fCBkZWZpbmVkKElOU1RBTkNFU0NPTE9SKSAmJiBkZWZpbmVkKElOU1RBTkNFUylcbmFscGhhKj12Q29sb3IuYTtcbiNlbmRpZlxuI2lmZGVmIFNQRUNVTEFSVEVSTVxudmVjMyBmaW5hbFNwZWN1bGFyPXNwZWN1bGFyQmFzZSpzcGVjdWxhckNvbG9yO1xuI2Vsc2VcbnZlYzMgZmluYWxTcGVjdWxhcj12ZWMzKDAuMCk7XG4jZW5kaWZcbiNlbHNlIFxuI2lmZGVmIFJFRkxFQ1RJT05cbnZlYzIgcHJvamVjdGVkUmVmcmFjdGlvblRleENvb3Jkcz1jbGFtcCh2UmVmcmFjdGlvbk1hcFRleENvb3JkLnh5L3ZSZWZyYWN0aW9uTWFwVGV4Q29vcmQueitwZXJ0dXJiYXRpb24sMC4wLDEuMCk7dmVjNCByZWZyYWN0aXZlQ29sb3I9dGV4dHVyZTJEKHJlZnJhY3Rpb25TYW1wbGVyLHByb2plY3RlZFJlZnJhY3Rpb25UZXhDb29yZHMpO1xuI2lmZGVmIElTX1JFRlJBQ1RJT05fTElORUFSXG5yZWZyYWN0aXZlQ29sb3IucmdiPXRvR2FtbWFTcGFjZShyZWZyYWN0aXZlQ29sb3IucmdiKTtcbiNlbmRpZlxudmVjMiBwcm9qZWN0ZWRSZWZsZWN0aW9uVGV4Q29vcmRzPWNsYW1wKHZSZWZsZWN0aW9uTWFwVGV4Q29vcmQueHkvdlJlZmxlY3Rpb25NYXBUZXhDb29yZC56K3BlcnR1cmJhdGlvbiwwLjAsMS4wKTt2ZWM0IHJlZmxlY3RpdmVDb2xvcj10ZXh0dXJlMkQocmVmbGVjdGlvblNhbXBsZXIscHJvamVjdGVkUmVmbGVjdGlvblRleENvb3Jkcyk7XG4jaWZkZWYgSVNfUkVGTEVDVElPTl9MSU5FQVJcbnJlZmxlY3RpdmVDb2xvci5yZ2I9dG9HYW1tYVNwYWNlKHJlZmxlY3RpdmVDb2xvci5yZ2IpO1xuI2VuZGlmXG52ZWMzIHVwVmVjdG9yPXZlYzMoMC4wLDEuMCwwLjApO2Zsb2F0IGZyZXNuZWxUZXJtPW1heChkb3Qodmlld0RpcmVjdGlvblcsdXBWZWN0b3IpLDAuMCk7dmVjNCBjb21iaW5lZENvbG9yPXJlZnJhY3RpdmVDb2xvcipmcmVzbmVsVGVybStyZWZsZWN0aXZlQ29sb3IqKDEuMC1mcmVzbmVsVGVybSk7YmFzZUNvbG9yPWNvbG9yQmxlbmRGYWN0b3Iqd2F0ZXJDb2xvcisoMS4wLWNvbG9yQmxlbmRGYWN0b3IpKmNvbWJpbmVkQ29sb3I7XG4jZW5kaWZcbnZlYzMgZGlmZnVzZUJhc2U9dmVjMygwLiwwLiwwLik7bGlnaHRpbmdJbmZvIGluZm87ZmxvYXQgc2hhZG93PTEuO2Zsb2F0IGFnZ1NoYWRvdz0wLjtmbG9hdCBudW1MaWdodHM9MC47XG4jaWZkZWYgU1BFQ1VMQVJURVJNXG5mbG9hdCBnbG9zc2luZXNzPXZTcGVjdWxhckNvbG9yLmE7dmVjMyBzcGVjdWxhckJhc2U9dmVjMygwLiwwLiwwLik7dmVjMyBzcGVjdWxhckNvbG9yPXZTcGVjdWxhckNvbG9yLnJnYjtcbiNlbHNlXG5mbG9hdCBnbG9zc2luZXNzPTAuO1xuI2VuZGlmXG4jaW5jbHVkZTxsaWdodEZyYWdtZW50PlswLi5tYXhTaW11bHRhbmVvdXNMaWdodHNdXG52ZWMzIGZpbmFsRGlmZnVzZT1jbGFtcChiYXNlQ29sb3IucmdiLDAuMCwxLjApO1xuI2lmIGRlZmluZWQoVkVSVEVYQUxQSEEpIHx8IGRlZmluZWQoSU5TVEFOQ0VTQ09MT1IpICYmIGRlZmluZWQoSU5TVEFOQ0VTKVxuYWxwaGEqPXZDb2xvci5hO1xuI2VuZGlmXG4jaWZkZWYgU1BFQ1VMQVJURVJNXG52ZWMzIGZpbmFsU3BlY3VsYXI9c3BlY3VsYXJCYXNlKnNwZWN1bGFyQ29sb3I7XG4jZWxzZVxudmVjMyBmaW5hbFNwZWN1bGFyPXZlYzMoMC4wKTtcbiNlbmRpZlxuI2VuZGlmXG52ZWM0IGNvbG9yPXZlYzQoZmluYWxEaWZmdXNlK2ZpbmFsU3BlY3VsYXIsYWxwaGEpO1xuI2luY2x1ZGU8bG9nRGVwdGhGcmFnbWVudD5cbiNpbmNsdWRlPGZvZ0ZyYWdtZW50PlxuI2lmZGVmIElNQUdFUFJPQ0VTU0lOR1BPU1RQUk9DRVNTXG5jb2xvci5yZ2I9dG9MaW5lYXJTcGFjZShjb2xvci5yZ2IpO1xuI2VsaWYgZGVmaW5lZChJTUFHRVBST0NFU1NJTkcpXG5jb2xvci5yZ2I9dG9MaW5lYXJTcGFjZShjb2xvci5yZ2IpO2NvbG9yPWFwcGx5SW1hZ2VQcm9jZXNzaW5nKGNvbG9yKTtcbiNlbmRpZlxuZ2xfRnJhZ0NvbG9yPWNvbG9yO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgd2F0ZXJQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2JvbmVzRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9iYWtlZFZlcnRleEFuaW1hdGlvbkRlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvaW5zdGFuY2VzRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9jbGlwUGxhbmVWZXJ0ZXhEZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2ZvZ1ZlcnRleERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRGcmFnbWVudERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRVYm9EZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2xvZ0RlcHRoRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9pbnN0YW5jZXNWZXJ0ZXhcIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9ib25lc1ZlcnRleFwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2Jha2VkVmVydGV4QW5pbWF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvY2xpcFBsYW5lVmVydGV4XCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvZm9nVmVydGV4XCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvc2hhZG93c1ZlcnRleFwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL3ZlcnRleENvbG9yTWl4aW5nXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbG9nRGVwdGhWZXJ0ZXhcIjtcblxuY29uc3QgbmFtZSA9IFwid2F0ZXJWZXJ0ZXhTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG4jaWZkZWYgTk9STUFMXG5hdHRyaWJ1dGUgdmVjMyBub3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVVjFcbmF0dHJpYnV0ZSB2ZWMyIHV2O1xuI2VuZGlmXG4jaWZkZWYgVVYyXG5hdHRyaWJ1dGUgdmVjMiB1djI7XG4jZW5kaWZcbiNpZmRlZiBWRVJURVhDT0xPUlxuYXR0cmlidXRlIHZlYzQgY29sb3I7XG4jZW5kaWZcbiNpbmNsdWRlPGJvbmVzRGVjbGFyYXRpb24+XG4jaW5jbHVkZTxiYWtlZFZlcnRleEFuaW1hdGlvbkRlY2xhcmF0aW9uPlxuI2luY2x1ZGU8aW5zdGFuY2VzRGVjbGFyYXRpb24+XG51bmlmb3JtIG1hdDQgdmlldzt1bmlmb3JtIG1hdDQgdmlld1Byb2plY3Rpb247XG4jaWZkZWYgQlVNUFxudmFyeWluZyB2ZWMyIHZOb3JtYWxVVjtcbiNpZmRlZiBCVU1QU1VQRVJJTVBPU0VcbnZhcnlpbmcgdmVjMiB2Tm9ybWFsVVYyO1xuI2VuZGlmXG51bmlmb3JtIG1hdDQgbm9ybWFsTWF0cml4O3VuaWZvcm0gdmVjMiB2Tm9ybWFsSW5mb3M7XG4jZW5kaWZcbiNpZmRlZiBQT0lOVFNJWkVcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlBvc2l0aW9uVztcbiNpZmRlZiBOT1JNQUxcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsVztcbiNlbmRpZlxuI2lmIGRlZmluZWQoVkVSVEVYQ09MT1IpIHx8IGRlZmluZWQoSU5TVEFOQ0VTQ09MT1IpICYmIGRlZmluZWQoSU5TVEFOQ0VTKVxudmFyeWluZyB2ZWM0IHZDb2xvcjtcbiNlbmRpZlxuI2luY2x1ZGU8Y2xpcFBsYW5lVmVydGV4RGVjbGFyYXRpb24+XG4jaW5jbHVkZTxmb2dWZXJ0ZXhEZWNsYXJhdGlvbj5cbiNpbmNsdWRlPF9fZGVjbF9fbGlnaHRGcmFnbWVudD5bMC4ubWF4U2ltdWx0YW5lb3VzTGlnaHRzXVxuI2luY2x1ZGU8bG9nRGVwdGhEZWNsYXJhdGlvbj5cbnVuaWZvcm0gbWF0NCByZWZsZWN0aW9uVmlld1Byb2plY3Rpb247dW5pZm9ybSB2ZWMyIHdpbmREaXJlY3Rpb247dW5pZm9ybSBmbG9hdCB3YXZlTGVuZ3RoO3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIGZsb2F0IHdpbmRGb3JjZTt1bmlmb3JtIGZsb2F0IHdhdmVIZWlnaHQ7dW5pZm9ybSBmbG9hdCB3YXZlU3BlZWQ7dW5pZm9ybSBmbG9hdCB3YXZlQ291bnQ7dmFyeWluZyB2ZWMzIHZSZWZyYWN0aW9uTWFwVGV4Q29vcmQ7dmFyeWluZyB2ZWMzIHZSZWZsZWN0aW9uTWFwVGV4Q29vcmQ7XG4jZGVmaW5lIENVU1RPTV9WRVJURVhfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSB7XG4jZGVmaW5lIENVU1RPTV9WRVJURVhfTUFJTl9CRUdJTlxuI2lmZGVmIFZFUlRFWENPTE9SXG52ZWM0IGNvbG9yVXBkYXRlZD1jb2xvcjtcbiNlbmRpZlxuI2luY2x1ZGU8aW5zdGFuY2VzVmVydGV4PlxuI2luY2x1ZGU8Ym9uZXNWZXJ0ZXg+XG4jaW5jbHVkZTxiYWtlZFZlcnRleEFuaW1hdGlvbj5cbnZlYzQgd29ybGRQb3M9ZmluYWxXb3JsZCp2ZWM0KHBvc2l0aW9uLDEuMCk7dlBvc2l0aW9uVz12ZWMzKHdvcmxkUG9zKTtcbiNpZmRlZiBOT1JNQUxcbnZOb3JtYWxXPW5vcm1hbGl6ZSh2ZWMzKGZpbmFsV29ybGQqdmVjNChub3JtYWwsMC4wKSkpO1xuI2VuZGlmXG4jaWZuZGVmIFVWMVxudmVjMiB1dj12ZWMyKDAuLDAuKTtcbiNlbmRpZlxuI2lmbmRlZiBVVjJcbnZlYzIgdXYyPXZlYzIoMC4sMC4pO1xuI2VuZGlmXG4jaWZkZWYgQlVNUFxuaWYgKHZOb3JtYWxJbmZvcy54PT0wLilcbnt2Tm9ybWFsVVY9dmVjMihub3JtYWxNYXRyaXgqdmVjNCgodXYqMS4wKS93YXZlTGVuZ3RoK3RpbWUqd2luZEZvcmNlKndpbmREaXJlY3Rpb24sMS4wLDAuMCkpO1xuI2lmZGVmIEJVTVBTVVBFUklNUE9TRVxudk5vcm1hbFVWMj12ZWMyKG5vcm1hbE1hdHJpeCp2ZWM0KCh1diowLjcyMSkvd2F2ZUxlbmd0aCt0aW1lKjEuMip3aW5kRm9yY2Uqd2luZERpcmVjdGlvbiwxLjAsMC4wKSk7XG4jZW5kaWZcbn1cbmVsc2Vcbnt2Tm9ybWFsVVY9dmVjMihub3JtYWxNYXRyaXgqdmVjNCgodXYyKjEuMCkvd2F2ZUxlbmd0aCt0aW1lKndpbmRGb3JjZSp3aW5kRGlyZWN0aW9uICwxLjAsMC4wKSk7XG4jaWZkZWYgQlVNUFNVUEVSSU1QT1NFXG52Tm9ybWFsVVYyPXZlYzIobm9ybWFsTWF0cml4KnZlYzQoKHV2MiowLjcyMSkvd2F2ZUxlbmd0aCt0aW1lKjEuMip3aW5kRm9yY2Uqd2luZERpcmVjdGlvbiAsMS4wLDAuMCkpO1xuI2VuZGlmXG59XG4jZW5kaWZcbiNpbmNsdWRlPGNsaXBQbGFuZVZlcnRleD5cbiNpbmNsdWRlPGZvZ1ZlcnRleD5cbiNpbmNsdWRlPHNoYWRvd3NWZXJ0ZXg+WzAuLm1heFNpbXVsdGFuZW91c0xpZ2h0c11cbiNpbmNsdWRlPHZlcnRleENvbG9yTWl4aW5nPlxuI2lmIGRlZmluZWQoUE9JTlRTSVpFKSAmJiAhZGVmaW5lZChXRUJHUFUpXG5nbF9Qb2ludFNpemU9cG9pbnRTaXplO1xuI2VuZGlmXG5mbG9hdCBmaW5hbFdhdmVDb3VudD0xLjAvKHdhdmVDb3VudCowLjUpO1xuI2lmZGVmIFVTRV9XT1JMRF9DT09SRElOQVRFU1xudmVjMyBwPXdvcmxkUG9zLnh5ejtcbiNlbHNlXG52ZWMzIHA9cG9zaXRpb247XG4jZW5kaWZcbmZsb2F0IG5ld1k9KHNpbigoKHAueC9maW5hbFdhdmVDb3VudCkrdGltZSp3YXZlU3BlZWQpKSp3YXZlSGVpZ2h0KndpbmREaXJlY3Rpb24ueCo1LjApXG4rIChjb3MoKChwLnovZmluYWxXYXZlQ291bnQpKyB0aW1lKndhdmVTcGVlZCkpKndhdmVIZWlnaHQqd2luZERpcmVjdGlvbi55KjUuMCk7cC55Kz1hYnMobmV3WSk7XG4jaWZkZWYgVVNFX1dPUkxEX0NPT1JESU5BVEVTXG5nbF9Qb3NpdGlvbj12aWV3UHJvamVjdGlvbip2ZWM0KHAsMS4wKTtcbiNlbHNlXG5nbF9Qb3NpdGlvbj12aWV3UHJvamVjdGlvbipmaW5hbFdvcmxkKnZlYzQocCwxLjApO1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElPTlxudlJlZnJhY3Rpb25NYXBUZXhDb29yZC54PTAuNSooZ2xfUG9zaXRpb24udytnbF9Qb3NpdGlvbi54KTt2UmVmcmFjdGlvbk1hcFRleENvb3JkLnk9MC41KihnbF9Qb3NpdGlvbi53K2dsX1Bvc2l0aW9uLnkpO3ZSZWZyYWN0aW9uTWFwVGV4Q29vcmQuej1nbF9Qb3NpdGlvbi53O3dvcmxkUG9zPXJlZmxlY3Rpb25WaWV3UHJvamVjdGlvbipmaW5hbFdvcmxkKnZlYzQocG9zaXRpb24sMS4wKTt2UmVmbGVjdGlvbk1hcFRleENvb3JkLng9MC41Kih3b3JsZFBvcy53K3dvcmxkUG9zLngpO3ZSZWZsZWN0aW9uTWFwVGV4Q29vcmQueT0wLjUqKHdvcmxkUG9zLncrd29ybGRQb3MueSk7dlJlZmxlY3Rpb25NYXBUZXhDb29yZC56PXdvcmxkUG9zLnc7XG4jZW5kaWZcbiNpbmNsdWRlPGxvZ0RlcHRoVmVydGV4PlxuI2RlZmluZSBDVVNUT01fVkVSVEVYX01BSU5fRU5EXG59XG5gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHdhdGVyVmVydGV4U2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IHsgc2VyaWFsaXplQXNWZWN0b3IyLCBzZXJpYWxpemVBc1RleHR1cmUsIHNlcmlhbGl6ZSwgZXhwYW5kVG9Qcm9wZXJ0eSwgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IE1hdHJpeCwgVmVjdG9yMiwgVmVjdG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGgudmVjdG9yXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHsgUGxhbmUgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLnBsYW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgSUFuaW1hdGFibGUgfSBmcm9tIFwiY29yZS9BbmltYXRpb25zL2FuaW1hdGFibGUuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCJjb3JlL0VuZ2luZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFNtYXJ0QXJyYXkgfSBmcm9tIFwiY29yZS9NaXNjL3NtYXJ0QXJyYXlcIjtcclxuaW1wb3J0IHR5cGUgeyBPYnNlcnZlciB9IGZyb20gXCJjb3JlL01pc2Mvb2JzZXJ2YWJsZVwiO1xyXG5pbXBvcnQgdHlwZSB7IEJhc2VUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2Jhc2VUZXh0dXJlXCI7XHJcbmltcG9ydCB7IFJlbmRlclRhcmdldFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvcmVuZGVyVGFyZ2V0VGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IElFZmZlY3RDcmVhdGlvbk9wdGlvbnMgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZWZmZWN0XCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsRGVmaW5lcyB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbERlZmluZXNcIjtcclxuaW1wb3J0IHR5cGUgeyBJSW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbkRlZmluZXMgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvaW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbi5kZWZpbmVzXCI7XHJcbmltcG9ydCB7IEltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb24gfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvaW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvblwiO1xyXG5pbXBvcnQgeyBQdXNoTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvcHVzaE1hdGVyaWFsXCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsRmxhZ3MgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvbWF0ZXJpYWxGbGFnc1wiO1xyXG5pbXBvcnQgeyBWZXJ0ZXhCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0TWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9hYnN0cmFjdE1lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBTdWJNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL3N1Yk1lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL21lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5cclxuaW1wb3J0IFwiLi93YXRlci5mcmFnbWVudFwiO1xyXG5pbXBvcnQgXCIuL3dhdGVyLnZlcnRleFwiO1xyXG5pbXBvcnQgeyBFZmZlY3RGYWxsYmFja3MgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZWZmZWN0RmFsbGJhY2tzXCI7XHJcbmltcG9ydCB7IENyZWF0ZUdyb3VuZCB9IGZyb20gXCJjb3JlL01lc2hlcy9CdWlsZGVycy9ncm91bmRCdWlsZGVyXCI7XHJcbmltcG9ydCB7IGFkZENsaXBQbGFuZVVuaWZvcm1zLCBiaW5kQ2xpcFBsYW5lIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL2NsaXBQbGFuZU1hdGVyaWFsSGVscGVyXCI7XHJcbmltcG9ydCB7XHJcbiAgICBCaW5kQm9uZXNQYXJhbWV0ZXJzLFxyXG4gICAgQmluZEZvZ1BhcmFtZXRlcnMsXHJcbiAgICBCaW5kTGlnaHRzLFxyXG4gICAgQmluZExvZ0RlcHRoLFxyXG4gICAgSGFuZGxlRmFsbGJhY2tzRm9yU2hhZG93cyxcclxuICAgIFByZXBhcmVBdHRyaWJ1dGVzRm9yQm9uZXMsXHJcbiAgICBQcmVwYXJlQXR0cmlidXRlc0Zvckluc3RhbmNlcyxcclxuICAgIFByZXBhcmVEZWZpbmVzRm9yQXR0cmlidXRlcyxcclxuICAgIFByZXBhcmVEZWZpbmVzRm9yRnJhbWVCb3VuZFZhbHVlcyxcclxuICAgIFByZXBhcmVEZWZpbmVzRm9yTGlnaHRzLFxyXG4gICAgUHJlcGFyZURlZmluZXNGb3JNaXNjLFxyXG4gICAgUHJlcGFyZVVuaWZvcm1zQW5kU2FtcGxlcnNMaXN0LFxyXG59IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbEhlbHBlci5mdW5jdGlvbnNcIjtcclxuXHJcbmltcG9ydCBcImNvcmUvUmVuZGVyaW5nL2JvdW5kaW5nQm94UmVuZGVyZXJcIjtcclxuXHJcbmNsYXNzIFdhdGVyTWF0ZXJpYWxEZWZpbmVzIGV4dGVuZHMgTWF0ZXJpYWxEZWZpbmVzIGltcGxlbWVudHMgSUltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb25EZWZpbmVzIHtcclxuICAgIHB1YmxpYyBCVU1QID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgUkVGTEVDVElPTiA9IGZhbHNlO1xyXG4gICAgcHVibGljIENMSVBQTEFORSA9IGZhbHNlO1xyXG4gICAgcHVibGljIENMSVBQTEFORTIgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBDTElQUExBTkUzID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQ0xJUFBMQU5FNCA9IGZhbHNlO1xyXG4gICAgcHVibGljIENMSVBQTEFORTUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBDTElQUExBTkU2ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQUxQSEFURVNUID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgREVQVEhQUkVQQVNTID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgUE9JTlRTSVpFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgRk9HID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgTk9STUFMID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVVYxID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVVYyID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVkVSVEVYQ09MT1IgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBWRVJURVhBTFBIQSA9IGZhbHNlO1xyXG4gICAgcHVibGljIE5VTV9CT05FX0lORkxVRU5DRVJTID0gMDtcclxuICAgIHB1YmxpYyBCb25lc1Blck1lc2ggPSAwO1xyXG4gICAgcHVibGljIElOU1RBTkNFUyA9IGZhbHNlO1xyXG4gICAgcHVibGljIElOU1RBTkNFU0NPTE9SID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgU1BFQ1VMQVJURVJNID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgTE9HQVJJVEhNSUNERVBUSCA9IGZhbHNlO1xyXG4gICAgcHVibGljIFVTRV9SRVZFUlNFX0RFUFRIQlVGRkVSID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgRlJFU05FTFNFUEFSQVRFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQlVNUFNVUEVSSU1QT1NFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQlVNUEFGRkVDVFNSRUZMRUNUSU9OID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVVNFX1dPUkxEX0NPT1JESU5BVEVTID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIElNQUdFUFJPQ0VTU0lORyA9IGZhbHNlO1xyXG4gICAgcHVibGljIFZJR05FVFRFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVklHTkVUVEVCTEVORE1PREVNVUxUSVBMWSA9IGZhbHNlO1xyXG4gICAgcHVibGljIFZJR05FVFRFQkxFTkRNT0RFT1BBUVVFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVE9ORU1BUFBJTkcgPSAwO1xyXG4gICAgcHVibGljIENPTlRSQVNUID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgRVhQT1NVUkUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBDT0xPUkNVUlZFUyA9IGZhbHNlO1xyXG4gICAgcHVibGljIENPTE9SR1JBRElORyA9IGZhbHNlO1xyXG4gICAgcHVibGljIENPTE9SR1JBRElORzNEID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgU0FNUExFUjNER1JFRU5ERVBUSCA9IGZhbHNlO1xyXG4gICAgcHVibGljIFNBTVBMRVIzREJHUk1BUCA9IGZhbHNlO1xyXG4gICAgcHVibGljIERJVEhFUiA9IGZhbHNlO1xyXG4gICAgcHVibGljIElNQUdFUFJPQ0VTU0lOR1BPU1RQUk9DRVNTID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgU0tJUEZJTkFMQ09MT1JDTEFNUCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBXYXRlck1hdGVyaWFsIGV4dGVuZHMgUHVzaE1hdGVyaWFsIHtcclxuICAgIC8qXHJcbiAgICAgKiBQdWJsaWMgbWVtYmVyc1xyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplQXNUZXh0dXJlKFwiYnVtcFRleHR1cmVcIilcclxuICAgIHByaXZhdGUgX2J1bXBUZXh0dXJlOiBCYXNlVGV4dHVyZTtcclxuICAgIEBleHBhbmRUb1Byb3BlcnR5KFwiX21hcmtBbGxTdWJNZXNoZXNBc1RleHR1cmVzRGlydHlcIilcclxuICAgIHB1YmxpYyBidW1wVGV4dHVyZTogQmFzZVRleHR1cmU7XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBkaWZmdXNlQ29sb3IgPSBuZXcgQ29sb3IzKDEsIDEsIDEpO1xyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgc3BlY3VsYXJDb2xvciA9IG5ldyBDb2xvcjMoMCwgMCwgMCk7XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgc3BlY3VsYXJQb3dlciA9IDY0O1xyXG5cclxuICAgIEBzZXJpYWxpemUoXCJkaXNhYmxlTGlnaHRpbmdcIilcclxuICAgIHByaXZhdGUgX2Rpc2FibGVMaWdodGluZyA9IGZhbHNlO1xyXG4gICAgQGV4cGFuZFRvUHJvcGVydHkoXCJfbWFya0FsbFN1Yk1lc2hlc0FzTGlnaHRzRGlydHlcIilcclxuICAgIHB1YmxpYyBkaXNhYmxlTGlnaHRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgQHNlcmlhbGl6ZShcIm1heFNpbXVsdGFuZW91c0xpZ2h0c1wiKVxyXG4gICAgcHJpdmF0ZSBfbWF4U2ltdWx0YW5lb3VzTGlnaHRzID0gNDtcclxuICAgIEBleHBhbmRUb1Byb3BlcnR5KFwiX21hcmtBbGxTdWJNZXNoZXNBc0xpZ2h0c0RpcnR5XCIpXHJcbiAgICBwdWJsaWMgbWF4U2ltdWx0YW5lb3VzTGlnaHRzOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSB3aW5kIGZvcmNlLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB3aW5kRm9yY2U6IG51bWJlciA9IDY7XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgd2luZCBpbiB0aGUgcGxhbmUgKFgsIFopLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplQXNWZWN0b3IyKClcclxuICAgIHB1YmxpYyB3aW5kRGlyZWN0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgMSk7XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIGhlaWdodCBvZiB0aGUgd2F2ZXMuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHdhdmVIZWlnaHQ6IG51bWJlciA9IDAuNDtcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgYnVtcCBoZWlnaHQgcmVsYXRlZCB0byB0aGUgYnVtcCBtYXAuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGJ1bXBIZWlnaHQ6IG51bWJlciA9IDAuNDtcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3ZXRoZXIgb3Igbm90OiB0byBhZGQgYSBzbWFsbGVyIG1vdmluZyBidW1wIHRvIGxlc3Mgc3RlYWR5IHdhdmVzLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKFwiYnVtcFN1cGVyaW1wb3NlXCIpXHJcbiAgICBwcml2YXRlIF9idW1wU3VwZXJpbXBvc2UgPSBmYWxzZTtcclxuICAgIEBleHBhbmRUb1Byb3BlcnR5KFwiX21hcmtBbGxTdWJNZXNoZXNBc01pc2NEaXJ0eVwiKVxyXG4gICAgcHVibGljIGJ1bXBTdXBlcmltcG9zZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2V0aGVyIG9yIG5vdCBjb2xvciByZWZyYWN0aW9uIGFuZCByZWZsZWN0aW9uIGRpZmZlcmVudGx5IHdpdGggLndhdGVyQ29sb3IyIGFuZCAuY29sb3JCbGVuZEZhY3RvcjIuIE5vbi1saW5lYXIgKHBoeXNpY2FsbHkgY29ycmVjdCkgZnJlc25lbC5cclxuICAgICAqL1xyXG4gICAgQHNlcmlhbGl6ZShcImZyZXNuZWxTZXBhcmF0ZVwiKVxyXG4gICAgcHJpdmF0ZSBfZnJlc25lbFNlcGFyYXRlID0gZmFsc2U7XHJcbiAgICBAZXhwYW5kVG9Qcm9wZXJ0eShcIl9tYXJrQWxsU3ViTWVzaGVzQXNNaXNjRGlydHlcIilcclxuICAgIHB1YmxpYyBmcmVzbmVsU2VwYXJhdGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdldGhlciBvciBub3QgYnVtcCBXd3ZlcyBtb2RpZnkgdGhlIHJlZmxlY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoXCJidW1wQWZmZWN0c1JlZmxlY3Rpb25cIilcclxuICAgIHByaXZhdGUgX2J1bXBBZmZlY3RzUmVmbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgQGV4cGFuZFRvUHJvcGVydHkoXCJfbWFya0FsbFN1Yk1lc2hlc0FzTWlzY0RpcnR5XCIpXHJcbiAgICBwdWJsaWMgYnVtcEFmZmVjdHNSZWZsZWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgd2F0ZXIgY29sb3IgYmxlbmRlZCB3aXRoIHRoZSByZWZyYWN0aW9uIChuZWFyKS5cclxuICAgICAqL1xyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyB3YXRlckNvbG9yOiBDb2xvcjMgPSBuZXcgQ29sb3IzKDAuMSwgMC4xLCAwLjYpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSBibGVuZCBmYWN0b3IgcmVsYXRlZCB0byB0aGUgd2F0ZXIgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGNvbG9yQmxlbmRGYWN0b3I6IG51bWJlciA9IDAuMjtcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgd2F0ZXIgY29sb3IgYmxlbmRlZCB3aXRoIHRoZSByZWZsZWN0aW9uIChmYXIpLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIHdhdGVyQ29sb3IyOiBDb2xvcjMgPSBuZXcgQ29sb3IzKDAuMSwgMC4xLCAwLjYpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSBibGVuZCBmYWN0b3IgcmVsYXRlZCB0byB0aGUgd2F0ZXIgY29sb3IgKHJlZmxlY3Rpb24sIGZhcikuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGNvbG9yQmxlbmRGYWN0b3IyOiBudW1iZXIgPSAwLjI7XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgd2F2ZS5cclxuICAgICAqL1xyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgd2F2ZUxlbmd0aDogbnVtYmVyID0gMC4xO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgd2F2ZXMgc3BlZWQuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHdhdmVTcGVlZDogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdhdmVzIGFyZSByZXBlYXRlZC4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBhZGp1c3Qgd2F2ZXMgY291bnQgYWNjb3JkaW5nIHRvIHRoZSBncm91bmQncyBzaXplIHdoZXJlIHRoZSBtYXRlcmlhbCBpcyBhcHBsaWVkIG9uLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB3YXZlQ291bnQ6IG51bWJlciA9IDIwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgd2hldGhlciBvciBub3QgYXV0b21hdGljIGNsaXBwaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC4gU2V0dGluZyB0byB0cnVlIHdpbGwgc2F2ZSBwZXJmb3JtYW5jZXMgYW5kXHJcbiAgICAgKiB3aWxsIGF2b2lkIGNhbGN1bGF0aW5nIHVzZWxlc3MgcGl4ZWxzIGluIHRoZSBwaXhlbCBzaGFkZXIgb2YgdGhlIHdhdGVyIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBkaXNhYmxlQ2xpcFBsYW5lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB3b3JsZCBjb29yZGluYXRlcyBmb3Igd2F2ZSBkZWZvcm1hdGlvbnMuXHJcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBkZWZvcm1hdGlvbiBpcyBhcHBsaWVkIGluIG9iamVjdCAobG9jYWwpIHNwYWNlLlxyXG4gICAgICogWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBzZXQgaXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIHVzaW5nIGluc3RhbmNlcyBvciB0aGluIGluc3RhbmNlcyBmb3IgeW91ciB3YXRlciBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKFwidXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvblwiKVxyXG4gICAgcHJpdmF0ZSBfdXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvbiA9IGZhbHNlO1xyXG4gICAgQGV4cGFuZFRvUHJvcGVydHkoXCJfbWFya0FsbFN1Yk1lc2hlc0FzTWlzY0RpcnR5XCIpXHJcbiAgICBwdWJsaWMgdXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvbjogYm9vbGVhbjtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlclRhcmdldHMgPSBuZXcgU21hcnRBcnJheTxSZW5kZXJUYXJnZXRUZXh0dXJlPigxNik7XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgbWVtYmVyc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9tZXNoOiBOdWxsYWJsZTxBYnN0cmFjdE1lc2g+ID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9yZWZyYWN0aW9uUlRUOiBOdWxsYWJsZTxSZW5kZXJUYXJnZXRUZXh0dXJlPjtcclxuICAgIHByaXZhdGUgX3JlZmxlY3Rpb25SVFQ6IE51bGxhYmxlPFJlbmRlclRhcmdldFRleHR1cmU+O1xyXG5cclxuICAgIHByaXZhdGUgX3JlZmxlY3Rpb25UcmFuc2Zvcm06IE1hdHJpeCA9IE1hdHJpeC5aZXJvKCk7XHJcbiAgICBwcml2YXRlIF9sYXN0VGltZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2xhc3REZWx0YVRpbWU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfd2FpdGluZ1JlbmRlckxpc3Q6IE51bGxhYmxlPHN0cmluZ1tdPjtcclxuXHJcbiAgICBwcml2YXRlIF9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uOiBOdWxsYWJsZTxJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uPjtcclxuICAgIHByaXZhdGUgX2ltYWdlUHJvY2Vzc2luZ09ic2VydmVyOiBOdWxsYWJsZTxPYnNlcnZlcjxJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uPj47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgY3VycmVudCBtYXRlcmlhbCBuZWVkcyB0byByZWdpc3RlciBSVFRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBoYXNSZW5kZXJUYXJnZXRUZXh0dXJlcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gbmFtZVxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcmVuZGVyVGFyZ2V0U2l6ZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgc2NlbmU/OiBTY2VuZSxcclxuICAgICAgICBwdWJsaWMgcmVuZGVyVGFyZ2V0U2l6ZTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDUxMiwgNTEyKVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2NlbmUpO1xyXG5cclxuICAgICAgICB0aGlzLl9jcmVhdGVSZW5kZXJUYXJnZXRzKHRoaXMuZ2V0U2NlbmUoKSwgcmVuZGVyVGFyZ2V0U2l6ZSk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSByZW5kZXIgdGFyZ2V0c1xyXG4gICAgICAgIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMgPSAoKTogU21hcnRBcnJheTxSZW5kZXJUYXJnZXRUZXh0dXJlPiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRhcmdldHMucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGFyZ2V0cy5wdXNoKDxSZW5kZXJUYXJnZXRUZXh0dXJlPnRoaXMuX3JlZmxlY3Rpb25SVFQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUYXJnZXRzLnB1c2goPFJlbmRlclRhcmdldFRleHR1cmU+dGhpcy5fcmVmcmFjdGlvblJUVCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGFyZ2V0cztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uID0gdGhpcy5nZXRTY2VuZSgpLmltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5faW1hZ2VQcm9jZXNzaW5nT2JzZXJ2ZXIgPSB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLm9uVXBkYXRlUGFyYW1ldGVycy5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya0FsbFN1Yk1lc2hlc0FzSW1hZ2VQcm9jZXNzaW5nRGlydHkoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCAvIFNldFxyXG4gICAgcHVibGljIGdldCByZWZyYWN0aW9uVGV4dHVyZSgpOiBOdWxsYWJsZTxSZW5kZXJUYXJnZXRUZXh0dXJlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZnJhY3Rpb25SVFQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCByZWZsZWN0aW9uVGV4dHVyZSgpOiBOdWxsYWJsZTxSZW5kZXJUYXJnZXRUZXh0dXJlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmxlY3Rpb25SVFQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWV0aG9kc1xyXG4gICAgcHVibGljIGFkZFRvUmVuZGVyTGlzdChub2RlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCAmJiB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCAmJiB0aGlzLl9yZWZsZWN0aW9uUlRULnJlbmRlckxpc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmbGVjdGlvblJUVC5yZW5kZXJMaXN0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVGcm9tUmVuZGVyTGlzdChub2RlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCAmJiB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3QpIHtcclxuICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0LmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3Quc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWZsZWN0aW9uUlRUICYmIHRoaXMuX3JlZmxlY3Rpb25SVFQucmVuZGVyTGlzdCkge1xyXG4gICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9yZWZsZWN0aW9uUlRULnJlbmRlckxpc3QuaW5kZXhPZihub2RlKTtcclxuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQucmVuZGVyTGlzdC5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlUmVuZGVyVGFyZ2V0cyhlbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWZyZXNoUmF0ZSA9IGVuYWJsZSA/IDEgOiAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULnJlZnJlc2hSYXRlID0gcmVmcmVzaFJhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULnJlZnJlc2hSYXRlID0gcmVmcmVzaFJhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZW5kZXJMaXN0KCk6IE51bGxhYmxlPEFic3RyYWN0TWVzaFtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZnJhY3Rpb25SVFQgPyB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3QgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHJlbmRlclRhcmdldHNFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhKHRoaXMuX3JlZnJhY3Rpb25SVFQgJiYgdGhpcy5fcmVmcmFjdGlvblJUVC5yZWZyZXNoUmF0ZSA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIG5lZWRBbHBoYUJsZW5kaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFscGhhIDwgMS4wO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBuZWVkQWxwaGFUZXN0aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0QWxwaGFUZXN0VGV4dHVyZSgpOiBOdWxsYWJsZTxCYXNlVGV4dHVyZT4ge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpc1JlYWR5Rm9yU3ViTWVzaChtZXNoOiBBYnN0cmFjdE1lc2gsIHN1Yk1lc2g6IFN1Yk1lc2gsIHVzZUluc3RhbmNlcz86IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBkcmF3V3JhcHBlciA9IHN1Yk1lc2guX2RyYXdXcmFwcGVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Zyb3plbikge1xyXG4gICAgICAgICAgICBpZiAoZHJhd1dyYXBwZXIuZWZmZWN0ICYmIGRyYXdXcmFwcGVyLl93YXNQcmV2aW91c2x5UmVhZHkgJiYgZHJhd1dyYXBwZXIuX3dhc1ByZXZpb3VzbHlVc2luZ0luc3RhbmNlcyA9PT0gdXNlSW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzdWJNZXNoLm1hdGVyaWFsRGVmaW5lcykge1xyXG4gICAgICAgICAgICBzdWJNZXNoLm1hdGVyaWFsRGVmaW5lcyA9IG5ldyBXYXRlck1hdGVyaWFsRGVmaW5lcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IDxXYXRlck1hdGVyaWFsRGVmaW5lcz5zdWJNZXNoLm1hdGVyaWFsRGVmaW5lcztcclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUmVhZHlGb3JTdWJNZXNoKHN1Yk1lc2gpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZW5naW5lID0gc2NlbmUuZ2V0RW5naW5lKCk7XHJcblxyXG4gICAgICAgIC8vIFRleHR1cmVzXHJcbiAgICAgICAgaWYgKGRlZmluZXMuX2FyZVRleHR1cmVzRGlydHkpIHtcclxuICAgICAgICAgICAgZGVmaW5lcy5fbmVlZFVWcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoc2NlbmUudGV4dHVyZXNFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idW1wVGV4dHVyZSAmJiBNYXRlcmlhbEZsYWdzLkJ1bXBUZXh0dXJlRW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5idW1wVGV4dHVyZS5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMuX25lZWRVVnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVzLkJVTVAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoTWF0ZXJpYWxGbGFncy5SZWZsZWN0aW9uVGV4dHVyZUVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzLlJFRkxFQ1RJT04gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBQcmVwYXJlRGVmaW5lc0ZvckZyYW1lQm91bmRWYWx1ZXMoc2NlbmUsIGVuZ2luZSwgdGhpcywgZGVmaW5lcywgdXNlSW5zdGFuY2VzID8gdHJ1ZSA6IGZhbHNlKTtcclxuXHJcbiAgICAgICAgUHJlcGFyZURlZmluZXNGb3JNaXNjKG1lc2gsIHNjZW5lLCB0aGlzLl91c2VMb2dhcml0aG1pY0RlcHRoLCB0aGlzLnBvaW50c0Nsb3VkLCB0aGlzLmZvZ0VuYWJsZWQsIHRoaXMubmVlZEFscGhhVGVzdGluZ0Zvck1lc2gobWVzaCksIGRlZmluZXMpO1xyXG5cclxuICAgICAgICBpZiAoZGVmaW5lcy5fYXJlTWlzY0RpcnR5KSB7XHJcbiAgICAgICAgICAgIGRlZmluZXMuRlJFU05FTFNFUEFSQVRFID0gdGhpcy5fZnJlc25lbFNlcGFyYXRlO1xyXG4gICAgICAgICAgICBkZWZpbmVzLkJVTVBTVVBFUklNUE9TRSA9IHRoaXMuX2J1bXBTdXBlcmltcG9zZTtcclxuICAgICAgICAgICAgZGVmaW5lcy5CVU1QQUZGRUNUU1JFRkxFQ1RJT04gPSB0aGlzLl9idW1wQWZmZWN0c1JlZmxlY3Rpb247XHJcbiAgICAgICAgICAgIGRlZmluZXMuVVNFX1dPUkxEX0NPT1JESU5BVEVTID0gdGhpcy5fdXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExpZ2h0c1xyXG4gICAgICAgIGRlZmluZXMuX25lZWROb3JtYWxzID0gUHJlcGFyZURlZmluZXNGb3JMaWdodHMoc2NlbmUsIG1lc2gsIGRlZmluZXMsIHRydWUsIHRoaXMuX21heFNpbXVsdGFuZW91c0xpZ2h0cywgdGhpcy5fZGlzYWJsZUxpZ2h0aW5nKTtcclxuXHJcbiAgICAgICAgLy8gSW1hZ2UgcHJvY2Vzc2luZ1xyXG4gICAgICAgIGlmIChkZWZpbmVzLl9hcmVJbWFnZVByb2Nlc3NpbmdEaXJ0eSAmJiB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5faW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbi5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5faW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbi5wcmVwYXJlRGVmaW5lcyhkZWZpbmVzKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmluZXMuSVNfUkVGTEVDVElPTl9MSU5FQVIgPSB0aGlzLnJlZmxlY3Rpb25UZXh0dXJlICE9IG51bGwgJiYgIXRoaXMucmVmbGVjdGlvblRleHR1cmUuZ2FtbWFTcGFjZTtcclxuICAgICAgICAgICAgZGVmaW5lcy5JU19SRUZSQUNUSU9OX0xJTkVBUiA9IHRoaXMucmVmcmFjdGlvblRleHR1cmUgIT0gbnVsbCAmJiAhdGhpcy5yZWZyYWN0aW9uVGV4dHVyZS5nYW1tYVNwYWNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXR0cmlic1xyXG4gICAgICAgIFByZXBhcmVEZWZpbmVzRm9yQXR0cmlidXRlcyhtZXNoLCBkZWZpbmVzLCB0cnVlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gQ29uZmlndXJlIHRoaXNcclxuICAgICAgICB0aGlzLl9tZXNoID0gbWVzaDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmdSZW5kZXJMaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fd2FpdGluZ1JlbmRlckxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9SZW5kZXJMaXN0KHNjZW5lLmdldE5vZGVCeUlkKHRoaXMuX3dhaXRpbmdSZW5kZXJMaXN0W2ldKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dhaXRpbmdSZW5kZXJMaXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBjb3JyZWN0IGVmZmVjdFxyXG4gICAgICAgIGlmIChkZWZpbmVzLmlzRGlydHkpIHtcclxuICAgICAgICAgICAgZGVmaW5lcy5tYXJrQXNQcm9jZXNzZWQoKTtcclxuICAgICAgICAgICAgc2NlbmUucmVzZXRDYWNoZWRNYXRlcmlhbCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gRmFsbGJhY2tzXHJcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrcyA9IG5ldyBFZmZlY3RGYWxsYmFja3MoKTtcclxuICAgICAgICAgICAgaWYgKGRlZmluZXMuRk9HKSB7XHJcbiAgICAgICAgICAgICAgICBmYWxsYmFja3MuYWRkRmFsbGJhY2soMSwgXCJGT0dcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZWZpbmVzLkxPR0FSSVRITUlDREVQVEgpIHtcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrcy5hZGRGYWxsYmFjaygwLCBcIkxPR0FSSVRITUlDREVQVEhcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEhhbmRsZUZhbGxiYWNrc0ZvclNoYWRvd3MoZGVmaW5lcywgZmFsbGJhY2tzLCB0aGlzLm1heFNpbXVsdGFuZW91c0xpZ2h0cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGVmaW5lcy5OVU1fQk9ORV9JTkZMVUVOQ0VSUyA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrcy5hZGRDUFVTa2lubmluZ0ZhbGxiYWNrKDAsIG1lc2gpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0F0dHJpYnV0ZXNcclxuICAgICAgICAgICAgY29uc3QgYXR0cmlicyA9IFtWZXJ0ZXhCdWZmZXIuUG9zaXRpb25LaW5kXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkZWZpbmVzLk5PUk1BTCkge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlicy5wdXNoKFZlcnRleEJ1ZmZlci5Ob3JtYWxLaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRlZmluZXMuVVYxKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJzLnB1c2goVmVydGV4QnVmZmVyLlVWS2luZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZWZpbmVzLlVWMikge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlicy5wdXNoKFZlcnRleEJ1ZmZlci5VVjJLaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRlZmluZXMuVkVSVEVYQ09MT1IpIHtcclxuICAgICAgICAgICAgICAgIGF0dHJpYnMucHVzaChWZXJ0ZXhCdWZmZXIuQ29sb3JLaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgUHJlcGFyZUF0dHJpYnV0ZXNGb3JCb25lcyhhdHRyaWJzLCBtZXNoLCBkZWZpbmVzLCBmYWxsYmFja3MpO1xyXG4gICAgICAgICAgICBQcmVwYXJlQXR0cmlidXRlc0Zvckluc3RhbmNlcyhhdHRyaWJzLCBkZWZpbmVzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIExlZ2FjeSBicm93c2VyIHBhdGNoXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYWRlck5hbWUgPSBcIndhdGVyXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGpvaW4gPSBkZWZpbmVzLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1zID0gW1xyXG4gICAgICAgICAgICAgICAgXCJ3b3JsZFwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2aWV3XCIsXHJcbiAgICAgICAgICAgICAgICBcInZpZXdQcm9qZWN0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcInZFeWVQb3NpdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2TGlnaHRzVHlwZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2RGlmZnVzZUNvbG9yXCIsXHJcbiAgICAgICAgICAgICAgICBcInZTcGVjdWxhckNvbG9yXCIsXHJcbiAgICAgICAgICAgICAgICBcInZGb2dJbmZvc1wiLFxyXG4gICAgICAgICAgICAgICAgXCJ2Rm9nQ29sb3JcIixcclxuICAgICAgICAgICAgICAgIFwicG9pbnRTaXplXCIsXHJcbiAgICAgICAgICAgICAgICBcInZOb3JtYWxJbmZvc1wiLFxyXG4gICAgICAgICAgICAgICAgXCJtQm9uZXNcIixcclxuICAgICAgICAgICAgICAgIFwibm9ybWFsTWF0cml4XCIsXHJcbiAgICAgICAgICAgICAgICBcImxvZ2FyaXRobWljRGVwdGhDb25zdGFudFwiLFxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdhdGVyXHJcbiAgICAgICAgICAgICAgICBcInJlZmxlY3Rpb25WaWV3UHJvamVjdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3aW5kRGlyZWN0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcIndhdmVMZW5ndGhcIixcclxuICAgICAgICAgICAgICAgIFwidGltZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3aW5kRm9yY2VcIixcclxuICAgICAgICAgICAgICAgIFwiY2FtZXJhUG9zaXRpb25cIixcclxuICAgICAgICAgICAgICAgIFwiYnVtcEhlaWdodFwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3YXZlSGVpZ2h0XCIsXHJcbiAgICAgICAgICAgICAgICBcIndhdGVyQ29sb3JcIixcclxuICAgICAgICAgICAgICAgIFwid2F0ZXJDb2xvcjJcIixcclxuICAgICAgICAgICAgICAgIFwiY29sb3JCbGVuZEZhY3RvclwiLFxyXG4gICAgICAgICAgICAgICAgXCJjb2xvckJsZW5kRmFjdG9yMlwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3YXZlU3BlZWRcIixcclxuICAgICAgICAgICAgICAgIFwid2F2ZUNvdW50XCIsXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIGNvbnN0IHNhbXBsZXJzID0gW1xyXG4gICAgICAgICAgICAgICAgXCJub3JtYWxTYW1wbGVyXCIsXHJcbiAgICAgICAgICAgICAgICAvLyBXYXRlclxyXG4gICAgICAgICAgICAgICAgXCJyZWZyYWN0aW9uU2FtcGxlclwiLFxyXG4gICAgICAgICAgICAgICAgXCJyZWZsZWN0aW9uU2FtcGxlclwiLFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtQnVmZmVyczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLlByZXBhcmVVbmlmb3Jtcyh1bmlmb3JtcywgZGVmaW5lcyk7XHJcbiAgICAgICAgICAgICAgICBJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLlByZXBhcmVTYW1wbGVycyhzYW1wbGVycywgZGVmaW5lcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFkZENsaXBQbGFuZVVuaWZvcm1zKHVuaWZvcm1zKTtcclxuXHJcbiAgICAgICAgICAgIFByZXBhcmVVbmlmb3Jtc0FuZFNhbXBsZXJzTGlzdCg8SUVmZmVjdENyZWF0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc05hbWVzOiB1bmlmb3JtcyxcclxuICAgICAgICAgICAgICAgIHVuaWZvcm1CdWZmZXJzTmFtZXM6IHVuaWZvcm1CdWZmZXJzLFxyXG4gICAgICAgICAgICAgICAgc2FtcGxlcnM6IHNhbXBsZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVmaW5lczogZGVmaW5lcyxcclxuICAgICAgICAgICAgICAgIG1heFNpbXVsdGFuZW91c0xpZ2h0czogdGhpcy5tYXhTaW11bHRhbmVvdXNMaWdodHMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzdWJNZXNoLnNldEVmZmVjdChcclxuICAgICAgICAgICAgICAgIHNjZW5lLmdldEVuZ2luZSgpLmNyZWF0ZUVmZmVjdChcclxuICAgICAgICAgICAgICAgICAgICBzaGFkZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIDxJRWZmZWN0Q3JlYXRpb25PcHRpb25zPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogYXR0cmlicyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNOYW1lczogdW5pZm9ybXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1CdWZmZXJzTmFtZXM6IHVuaWZvcm1CdWZmZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyczogc2FtcGxlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IGpvaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrczogZmFsbGJhY2tzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBpbGVkOiB0aGlzLm9uQ29tcGlsZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMub25FcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhQYXJhbWV0ZXJzOiB7IG1heFNpbXVsdGFuZW91c0xpZ2h0czogdGhpcy5fbWF4U2ltdWx0YW5lb3VzTGlnaHRzIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBlbmdpbmVcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBkZWZpbmVzLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF0ZXJpYWxDb250ZXh0XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc3ViTWVzaC5lZmZlY3QgfHwgIXN1Yk1lc2guZWZmZWN0LmlzUmVhZHkoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZpbmVzLl9yZW5kZXJJZCA9IHNjZW5lLmdldFJlbmRlcklkKCk7XHJcbiAgICAgICAgZHJhd1dyYXBwZXIuX3dhc1ByZXZpb3VzbHlSZWFkeSA9IHRydWU7XHJcbiAgICAgICAgZHJhd1dyYXBwZXIuX3dhc1ByZXZpb3VzbHlVc2luZ0luc3RhbmNlcyA9ICEhdXNlSW5zdGFuY2VzO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYmluZEZvclN1Yk1lc2god29ybGQ6IE1hdHJpeCwgbWVzaDogTWVzaCwgc3ViTWVzaDogU3ViTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBkZWZpbmVzID0gPFdhdGVyTWF0ZXJpYWxEZWZpbmVzPnN1Yk1lc2gubWF0ZXJpYWxEZWZpbmVzO1xyXG4gICAgICAgIGlmICghZGVmaW5lcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlZmZlY3QgPSBzdWJNZXNoLmVmZmVjdDtcclxuICAgICAgICBpZiAoIWVmZmVjdCB8fCAhdGhpcy5fbWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdCA9IGVmZmVjdDtcclxuXHJcbiAgICAgICAgLy8gTWF0cmljZXNcclxuICAgICAgICB0aGlzLmJpbmRPbmx5V29ybGRNYXRyaXgod29ybGQpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJ2aWV3UHJvamVjdGlvblwiLCBzY2VuZS5nZXRUcmFuc2Zvcm1NYXRyaXgoKSk7XHJcblxyXG4gICAgICAgIC8vIEJvbmVzXHJcbiAgICAgICAgQmluZEJvbmVzUGFyYW1ldGVycyhtZXNoLCB0aGlzLl9hY3RpdmVFZmZlY3QpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbXVzdFJlYmluZChzY2VuZSwgZWZmZWN0LCBzdWJNZXNoKSkge1xyXG4gICAgICAgICAgICAvLyBUZXh0dXJlc1xyXG4gICAgICAgICAgICBpZiAodGhpcy5idW1wVGV4dHVyZSAmJiBNYXRlcmlhbEZsYWdzLkJ1bXBUZXh0dXJlRW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFRleHR1cmUoXCJub3JtYWxTYW1wbGVyXCIsIHRoaXMuYnVtcFRleHR1cmUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdDIoXCJ2Tm9ybWFsSW5mb3NcIiwgdGhpcy5idW1wVGV4dHVyZS5jb29yZGluYXRlc0luZGV4LCB0aGlzLmJ1bXBUZXh0dXJlLmxldmVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJub3JtYWxNYXRyaXhcIiwgdGhpcy5idW1wVGV4dHVyZS5nZXRUZXh0dXJlTWF0cml4KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIENsaXAgcGxhbmVcclxuICAgICAgICAgICAgYmluZENsaXBQbGFuZShlZmZlY3QsIHRoaXMsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBvaW50IHNpemVcclxuICAgICAgICAgICAgaWYgKHRoaXMucG9pbnRzQ2xvdWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcInBvaW50U2l6ZVwiLCB0aGlzLnBvaW50U2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIExvZy4gZGVwdGhcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3VzZUxvZ2FyaXRobWljRGVwdGgpIHtcclxuICAgICAgICAgICAgICAgIEJpbmRMb2dEZXB0aChkZWZpbmVzLCBlZmZlY3QsIHNjZW5lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2NlbmUuYmluZEV5ZVBvc2l0aW9uKGVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9hY3RpdmVFZmZlY3Quc2V0Q29sb3I0KFwidkRpZmZ1c2VDb2xvclwiLCB0aGlzLmRpZmZ1c2VDb2xvciwgdGhpcy5hbHBoYSAqIG1lc2gudmlzaWJpbGl0eSk7XHJcblxyXG4gICAgICAgIGlmIChkZWZpbmVzLlNQRUNVTEFSVEVSTSkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVFZmZlY3Quc2V0Q29sb3I0KFwidlNwZWN1bGFyQ29sb3JcIiwgdGhpcy5zcGVjdWxhckNvbG9yLCB0aGlzLnNwZWN1bGFyUG93ZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjZW5lLmxpZ2h0c0VuYWJsZWQgJiYgIXRoaXMuZGlzYWJsZUxpZ2h0aW5nKSB7XHJcbiAgICAgICAgICAgIEJpbmRMaWdodHMoc2NlbmUsIG1lc2gsIHRoaXMuX2FjdGl2ZUVmZmVjdCwgZGVmaW5lcywgdGhpcy5tYXhTaW11bHRhbmVvdXNMaWdodHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVmlld1xyXG4gICAgICAgIGlmIChzY2VuZS5mb2dFbmFibGVkICYmIG1lc2guYXBwbHlGb2cgJiYgc2NlbmUuZm9nTW9kZSAhPT0gU2NlbmUuRk9HTU9ERV9OT05FKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJ2aWV3XCIsIHNjZW5lLmdldFZpZXdNYXRyaXgoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGb2dcclxuICAgICAgICBCaW5kRm9nUGFyYW1ldGVycyhzY2VuZSwgbWVzaCwgdGhpcy5fYWN0aXZlRWZmZWN0KTtcclxuXHJcbiAgICAgICAgLy8gTG9nLiBkZXB0aFxyXG4gICAgICAgIEJpbmRMb2dEZXB0aChkZWZpbmVzLCB0aGlzLl9hY3RpdmVFZmZlY3QsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgLy8gV2F0ZXJcclxuICAgICAgICBpZiAoTWF0ZXJpYWxGbGFncy5SZWZsZWN0aW9uVGV4dHVyZUVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFRleHR1cmUoXCJyZWZyYWN0aW9uU2FtcGxlclwiLCB0aGlzLl9yZWZyYWN0aW9uUlRUKTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFRleHR1cmUoXCJyZWZsZWN0aW9uU2FtcGxlclwiLCB0aGlzLl9yZWZsZWN0aW9uUlRUKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdydnAgPSB0aGlzLl9yZWZsZWN0aW9uVHJhbnNmb3JtLm11bHRpcGx5KHNjZW5lLmdldFByb2plY3Rpb25NYXRyaXgoKSk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBkZWx0YSB0aW1lLiBQcmV2ZW50IGFkZGluZyBkZWx0YSB0aW1lIGlmIGl0IGhhc24ndCBjaGFuZ2VkLlxyXG4gICAgICAgIGNvbnN0IGRlbHRhVGltZSA9IHNjZW5lLmdldEVuZ2luZSgpLmdldERlbHRhVGltZSgpO1xyXG4gICAgICAgIGlmIChkZWx0YVRpbWUgIT09IHRoaXMuX2xhc3REZWx0YVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERlbHRhVGltZSA9IGRlbHRhVGltZTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFRpbWUgKz0gdGhpcy5fbGFzdERlbHRhVGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJyZWZsZWN0aW9uVmlld1Byb2plY3Rpb25cIiwgd3J2cCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFZlY3RvcjIoXCJ3aW5kRGlyZWN0aW9uXCIsIHRoaXMud2luZERpcmVjdGlvbik7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwid2F2ZUxlbmd0aFwiLCB0aGlzLndhdmVMZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcInRpbWVcIiwgdGhpcy5fbGFzdFRpbWUgLyAxMDAwMDApO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcIndpbmRGb3JjZVwiLCB0aGlzLndpbmRGb3JjZSk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwid2F2ZUhlaWdodFwiLCB0aGlzLndhdmVIZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcImJ1bXBIZWlnaHRcIiwgdGhpcy5idW1wSGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVFZmZlY3Quc2V0Q29sb3I0KFwid2F0ZXJDb2xvclwiLCB0aGlzLndhdGVyQ29sb3IsIDEuMCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwiY29sb3JCbGVuZEZhY3RvclwiLCB0aGlzLmNvbG9yQmxlbmRGYWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRDb2xvcjQoXCJ3YXRlckNvbG9yMlwiLCB0aGlzLndhdGVyQ29sb3IyLCAxLjApO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcImNvbG9yQmxlbmRGYWN0b3IyXCIsIHRoaXMuY29sb3JCbGVuZEZhY3RvcjIpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcIndhdmVTcGVlZFwiLCB0aGlzLndhdmVTcGVlZCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwid2F2ZUNvdW50XCIsIHRoaXMud2F2ZUNvdW50KTtcclxuXHJcbiAgICAgICAgLy8gaW1hZ2UgcHJvY2Vzc2luZ1xyXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uICYmICF0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLmFwcGx5QnlQb3N0UHJvY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLmJpbmQodGhpcy5fYWN0aXZlRWZmZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2FmdGVyQmluZChtZXNoLCB0aGlzLl9hY3RpdmVFZmZlY3QsIHN1Yk1lc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZVJlbmRlclRhcmdldHMoc2NlbmU6IFNjZW5lLCByZW5kZXJUYXJnZXRTaXplOiBWZWN0b3IyKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVuZGVyIHRhcmdldHNcclxuICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRUID0gbmV3IFJlbmRlclRhcmdldFRleHR1cmUobmFtZSArIFwiX3JlZnJhY3Rpb25cIiwgeyB3aWR0aDogcmVuZGVyVGFyZ2V0U2l6ZS54LCBoZWlnaHQ6IHJlbmRlclRhcmdldFNpemUueSB9LCBzY2VuZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3JlZnJhY3Rpb25SVFQud3JhcFUgPSBDb25zdGFudHMuVEVYVFVSRV9NSVJST1JfQUREUkVTU01PREU7XHJcbiAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC53cmFwViA9IENvbnN0YW50cy5URVhUVVJFX01JUlJPUl9BRERSRVNTTU9ERTtcclxuICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULmlnbm9yZUNhbWVyYVZpZXdwb3J0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IGJvdW5kaW5nQm94UmVuZGVyZXJFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC5vbkJlZm9yZVJlbmRlck9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgYm91bmRpbmdCb3hSZW5kZXJlckVuYWJsZWQgPSBzY2VuZS5nZXRCb3VuZGluZ0JveFJlbmRlcmVyKCkuZW5hYmxlZDtcclxuICAgICAgICAgICAgc2NlbmUuZ2V0Qm91bmRpbmdCb3hSZW5kZXJlcigpLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULm9uQWZ0ZXJSZW5kZXJPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHNjZW5lLmdldEJvdW5kaW5nQm94UmVuZGVyZXIoKS5lbmFibGVkID0gYm91bmRpbmdCb3hSZW5kZXJlckVuYWJsZWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQgPSBuZXcgUmVuZGVyVGFyZ2V0VGV4dHVyZShuYW1lICsgXCJfcmVmbGVjdGlvblwiLCB7IHdpZHRoOiByZW5kZXJUYXJnZXRTaXplLngsIGhlaWdodDogcmVuZGVyVGFyZ2V0U2l6ZS55IH0sIHNjZW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fcmVmbGVjdGlvblJUVC53cmFwVSA9IENvbnN0YW50cy5URVhUVVJFX01JUlJPUl9BRERSRVNTTU9ERTtcclxuICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULndyYXBWID0gQ29uc3RhbnRzLlRFWFRVUkVfTUlSUk9SX0FERFJFU1NNT0RFO1xyXG4gICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQuaWdub3JlQ2FtZXJhVmlld3BvcnQgPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgaXNWaXNpYmxlOiBib29sZWFuO1xyXG4gICAgICAgIGxldCBjbGlwUGxhbmU6IE51bGxhYmxlPFBsYW5lPiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNhdmVkVmlld01hdHJpeDogTWF0cml4O1xyXG4gICAgICAgIGNvbnN0IG1pcnJvck1hdHJpeCA9IE1hdHJpeC5aZXJvKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZnJhY3Rpb25SVFQub25CZWZvcmVSZW5kZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXNoKSB7XHJcbiAgICAgICAgICAgICAgICBpc1Zpc2libGUgPSB0aGlzLl9tZXNoLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc2guaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIENsaXAgcGxhbmVcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDbGlwUGxhbmUpIHtcclxuICAgICAgICAgICAgICAgIGNsaXBQbGFuZSA9IHNjZW5lLmNsaXBQbGFuZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbnkgPSB0aGlzLl9tZXNoID8gdGhpcy5fbWVzaC5hYnNvbHV0ZVBvc2l0aW9uLnkgOiAwLjA7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS5jbGlwUGxhbmUgPSBQbGFuZS5Gcm9tUG9zaXRpb25BbmROb3JtYWwobmV3IFZlY3RvcjMoMCwgcG9zaXRpb255ICsgMC4wNSwgMCksIG5ldyBWZWN0b3IzKDAsIDEsIDApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZnJhY3Rpb25SVFQub25BZnRlclJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21lc2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc2guaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDbGlwIHBsYW5lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2xpcFBsYW5lKSB7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS5jbGlwUGxhbmUgPSBjbGlwUGxhbmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULm9uQmVmb3JlUmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVzaCkge1xyXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlID0gdGhpcy5fbWVzaC5pc1Zpc2libGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNoLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDbGlwIHBsYW5lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2xpcFBsYW5lKSB7XHJcbiAgICAgICAgICAgICAgICBjbGlwUGxhbmUgPSBzY2VuZS5jbGlwUGxhbmU7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb255ID0gdGhpcy5fbWVzaCA/IHRoaXMuX21lc2guYWJzb2x1dGVQb3NpdGlvbi55IDogMC4wO1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuY2xpcFBsYW5lID0gUGxhbmUuRnJvbVBvc2l0aW9uQW5kTm9ybWFsKG5ldyBWZWN0b3IzKDAsIHBvc2l0aW9ueSAtIDAuMDUsIDApLCBuZXcgVmVjdG9yMygwLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIE1hdHJpeC5SZWZsZWN0aW9uVG9SZWYoc2NlbmUuY2xpcFBsYW5lLCBtaXJyb3JNYXRyaXgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm1cclxuICAgICAgICAgICAgc2F2ZWRWaWV3TWF0cml4ID0gc2NlbmUuZ2V0Vmlld01hdHJpeCgpO1xyXG5cclxuICAgICAgICAgICAgbWlycm9yTWF0cml4Lm11bHRpcGx5VG9SZWYoc2F2ZWRWaWV3TWF0cml4LCB0aGlzLl9yZWZsZWN0aW9uVHJhbnNmb3JtKTtcclxuICAgICAgICAgICAgc2NlbmUuc2V0VHJhbnNmb3JtTWF0cml4KHRoaXMuX3JlZmxlY3Rpb25UcmFuc2Zvcm0sIHNjZW5lLmdldFByb2plY3Rpb25NYXRyaXgoKSk7XHJcbiAgICAgICAgICAgIHNjZW5lLl9taXJyb3JlZENhbWVyYVBvc2l0aW9uID0gVmVjdG9yMy5UcmFuc2Zvcm1Db29yZGluYXRlcygoPENhbWVyYT5zY2VuZS5hY3RpdmVDYW1lcmEpLnBvc2l0aW9uLCBtaXJyb3JNYXRyaXgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQub25BZnRlclJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21lc2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc2guaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDbGlwIHBsYW5lXHJcbiAgICAgICAgICAgIHNjZW5lLmNsaXBQbGFuZSA9IGNsaXBQbGFuZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybVxyXG4gICAgICAgICAgICBzY2VuZS5zZXRUcmFuc2Zvcm1NYXRyaXgoc2F2ZWRWaWV3TWF0cml4LCBzY2VuZS5nZXRQcm9qZWN0aW9uTWF0cml4KCkpO1xyXG4gICAgICAgICAgICBzY2VuZS5fbWlycm9yZWRDYW1lcmFQb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0QW5pbWF0YWJsZXMoKTogSUFuaW1hdGFibGVbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5idW1wVGV4dHVyZSAmJiB0aGlzLmJ1bXBUZXh0dXJlLmFuaW1hdGlvbnMgJiYgdGhpcy5idW1wVGV4dHVyZS5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuYnVtcFRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCAmJiB0aGlzLl9yZWZsZWN0aW9uUlRULmFuaW1hdGlvbnMgJiYgdGhpcy5fcmVmbGVjdGlvblJUVC5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX3JlZmxlY3Rpb25SVFQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCAmJiB0aGlzLl9yZWZyYWN0aW9uUlRULmFuaW1hdGlvbnMgJiYgdGhpcy5fcmVmcmFjdGlvblJUVC5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX3JlZnJhY3Rpb25SVFQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldEFjdGl2ZVRleHR1cmVzKCk6IEJhc2VUZXh0dXJlW10ge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZVRleHR1cmVzID0gc3VwZXIuZ2V0QWN0aXZlVGV4dHVyZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2J1bXBUZXh0dXJlKSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZVRleHR1cmVzLnB1c2godGhpcy5fYnVtcFRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFjdGl2ZVRleHR1cmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBoYXNUZXh0dXJlKHRleHR1cmU6IEJhc2VUZXh0dXJlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHN1cGVyLmhhc1RleHR1cmUodGV4dHVyZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fYnVtcFRleHR1cmUgPT09IHRleHR1cmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc3Bvc2UoZm9yY2VEaXNwb3NlRWZmZWN0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmJ1bXBUZXh0dXJlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVtcFRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5nZXRTY2VuZSgpLmN1c3RvbVJlbmRlclRhcmdldHMuaW5kZXhPZig8UmVuZGVyVGFyZ2V0VGV4dHVyZT50aGlzLl9yZWZyYWN0aW9uUlRUKTtcclxuICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRTY2VuZSgpLmN1c3RvbVJlbmRlclRhcmdldHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAtMTtcclxuICAgICAgICBpbmRleCA9IHRoaXMuZ2V0U2NlbmUoKS5jdXN0b21SZW5kZXJUYXJnZXRzLmluZGV4T2YoPFJlbmRlclRhcmdldFRleHR1cmU+dGhpcy5fcmVmbGVjdGlvblJUVCk7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U2NlbmUoKS5jdXN0b21SZW5kZXJUYXJnZXRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlZnJhY3Rpb25SVFQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZW1vdmUgaW1hZ2UtcHJvY2Vzc2luZyBvYnNlcnZlclxyXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uICYmIHRoaXMuX2ltYWdlUHJvY2Vzc2luZ09ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb24ub25VcGRhdGVQYXJhbWV0ZXJzLnJlbW92ZSh0aGlzLl9pbWFnZVByb2Nlc3NpbmdPYnNlcnZlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5kaXNwb3NlKGZvcmNlRGlzcG9zZUVmZmVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGNsb25lKG5hbWU6IHN0cmluZyk6IFdhdGVyTWF0ZXJpYWwge1xyXG4gICAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uSGVscGVyLkNsb25lKCgpID0+IG5ldyBXYXRlck1hdGVyaWFsKG5hbWUsIHRoaXMuZ2V0U2NlbmUoKSksIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLldhdGVyTWF0ZXJpYWxcIjtcclxuXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5yZW5kZXJMaXN0ID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlZnJhY3Rpb25SVFQgJiYgdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LnJlbmRlckxpc3QucHVzaCh0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3RbaV0uaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiV2F0ZXJNYXRlcmlhbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXRpY3NcclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2Uoc291cmNlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogV2F0ZXJNYXRlcmlhbCB7XHJcbiAgICAgICAgY29uc3QgbWF0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZSgoKSA9PiBuZXcgV2F0ZXJNYXRlcmlhbChzb3VyY2UubmFtZSwgc2NlbmUpLCBzb3VyY2UsIHNjZW5lLCByb290VXJsKTtcclxuICAgICAgICBtYXQuX3dhaXRpbmdSZW5kZXJMaXN0ID0gc291cmNlLnJlbmRlckxpc3Q7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDcmVhdGVEZWZhdWx0TWVzaChuYW1lOiBzdHJpbmcsIHNjZW5lOiBTY2VuZSk6IE1lc2gge1xyXG4gICAgICAgIGNvbnN0IG1lc2ggPSBDcmVhdGVHcm91bmQobmFtZSwgeyB3aWR0aDogNTEyLCBoZWlnaHQ6IDUxMiwgc3ViZGl2aXNpb25zOiAzMiwgdXBkYXRhYmxlOiBmYWxzZSB9LCBzY2VuZSk7XHJcbiAgICAgICAgcmV0dXJuIG1lc2g7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLldhdGVyTWF0ZXJpYWxcIiwgV2F0ZXJNYXRlcmlhbCk7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmltcG9ydCAqIGFzIE1hdExpYiBmcm9tIFwibWF0ZXJpYWxzL3dhdGVyL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBVTUQgbW9kdWxlLlxyXG4gKiBUaGUgZW50cnkgcG9pbnQgZm9yIGEgZnV0dXJlIEVTTSBwYWNrYWdlIHNob3VsZCBiZSBpbmRleC50c1xyXG4gKi9cclxuY29uc3QgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XHJcbmlmICh0eXBlb2YgZ2xvYmFsT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBNYXRMaWIpIHtcclxuICAgICAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT05ba2V5XSA9ICg8YW55Pk1hdExpYilba2V5XTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0ICogZnJvbSBcIm1hdGVyaWFscy93YXRlci9pbmRleFwiO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGVyaWFsc19lZmZlY3RfXzsiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgIHZhciBhciA9IFtdO1xuICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgcmV0dXJuIGFyO1xuICB9O1xuICByZXR1cm4gb3duS2V5cyhvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgdmFyIHIsIHMgPSAwO1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcbiAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcbiAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgcyB8PSAxO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICB9XG4gIHJldHVybiBuZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xuICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fZXNEZWNvcmF0ZSxcbiAgX19ydW5Jbml0aWFsaXplcnMsXG4gIF9fcHJvcEtleSxcbiAgX19zZXRGdW5jdGlvbk5hbWUsXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxuICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcbn07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgKiBhcyBtYXRlcmlhbHMgZnJvbSBcIkBsdHMvbWF0ZXJpYWxzL2xlZ2FjeS9sZWdhY3ktd2F0ZXJcIjtcclxuZXhwb3J0IHsgbWF0ZXJpYWxzIH07XHJcbmV4cG9ydCBkZWZhdWx0IG1hdGVyaWFscztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
1470
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi53YXRlck1hdGVyaWFsLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDaFpBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQXdJQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQW1HQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWVBO0FBRUE7QUFBQTtBQThDQTtBQUNBO0FBOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQXdKQTs7Ozs7QUFLQTtBQUNBO0FBR0E7QUFFQTtBQUZBO0FBdkpBO0FBR0E7QUFHQTtBQUdBO0FBS0E7QUFJQTs7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUlBOztBQUVBO0FBRUE7QUFJQTs7QUFFQTtBQUVBO0FBSUE7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFFQTs7QUFFQTtBQUVBO0FBRUE7O0FBRUE7QUFFQTtBQUNBOzs7QUFHQTtBQUVBO0FBRUE7Ozs7QUFJQTtBQUVBO0FBSUE7QUFFQTs7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBMkJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFsQ0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFtQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQWp2QkE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBS0E7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBTUE7QUFEQTtBQUNBO0FBUUE7QUFEQTtBQUNBO0FBRUE7QUFEQTtBQUNBO0FBMm5CQTtBQUFBO0FBdnZCQTtBQXl2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5MUJBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUNkQTs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2Rldi9tYXRlcmlhbHMvc3JjL3dhdGVyL2luZGV4LnRzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9kZXYvbWF0ZXJpYWxzL3NyYy93YXRlci93YXRlci5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi4vLi4vLi4vZGV2L21hdGVyaWFscy9zcmMvd2F0ZXIvd2F0ZXIudmVydGV4LnRzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9kZXYvbWF0ZXJpYWxzL3NyYy93YXRlci93YXRlck1hdGVyaWFsLnRzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9sdHMvbWF0ZXJpYWxzL3NyYy9sZWdhY3kvbGVnYWN5LXdhdGVyLnRzIiwid2VicGFjazovL01BVEVSSUFMUy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiQkFCWUxPTlwiLFwiY29tbW9uanNcIjpcImJhYnlsb25qc1wiLFwiY29tbW9uanMyXCI6XCJiYWJ5bG9uanNcIixcImFtZFwiOlwiYmFieWxvbmpzXCJ9Iiwid2VicGFjazovL01BVEVSSUFMUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi9zcmMvd2F0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLW1hdGVyaWFsc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLW1hdGVyaWFsc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiTUFURVJJQUxTXCJdID0gZmFjdG9yeShyb290W1wiQkFCWUxPTlwiXSk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWF0ZXJpYWxzX2VmZmVjdF9fKSA9PiB7XG5yZXR1cm4gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vd2F0ZXJNYXRlcmlhbFwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2hlbHBlckZ1bmN0aW9uc1wiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2ltYWdlUHJvY2Vzc2luZ0RlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvaW1hZ2VQcm9jZXNzaW5nRnVuY3Rpb25zXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRGcmFnbWVudERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRVYm9EZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2xpZ2h0c0ZyYWdtZW50RnVuY3Rpb25zXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvc2hhZG93c0ZyYWdtZW50RnVuY3Rpb25zXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvY2xpcFBsYW5lRnJhZ21lbnREZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2xvZ0RlcHRoRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9mb2dGcmFnbWVudERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvY2xpcFBsYW5lRnJhZ21lbnRcIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9saWdodEZyYWdtZW50XCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbG9nRGVwdGhGcmFnbWVudFwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2ZvZ0ZyYWdtZW50XCI7XG5cbmNvbnN0IG5hbWUgPSBcIndhdGVyUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGAjaWZkZWYgTE9HQVJJVEhNSUNERVBUSFxuI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZVxuI2VuZGlmXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHZFeWVQb3NpdGlvbjt1bmlmb3JtIHZlYzQgdkRpZmZ1c2VDb2xvcjtcbiNpZmRlZiBTUEVDVUxBUlRFUk1cbnVuaWZvcm0gdmVjNCB2U3BlY3VsYXJDb2xvcjtcbiNlbmRpZlxudmFyeWluZyB2ZWMzIHZQb3NpdGlvblc7XG4jaWZkZWYgTk9STUFMXG52YXJ5aW5nIHZlYzMgdk5vcm1hbFc7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKFZFUlRFWENPTE9SKSB8fCBkZWZpbmVkKElOU1RBTkNFU0NPTE9SKSAmJiBkZWZpbmVkKElOU1RBTkNFUylcbnZhcnlpbmcgdmVjNCB2Q29sb3I7XG4jZW5kaWZcbiNpbmNsdWRlPGhlbHBlckZ1bmN0aW9ucz5cbiNpbmNsdWRlPGltYWdlUHJvY2Vzc2luZ0RlY2xhcmF0aW9uPlxuI2luY2x1ZGU8aW1hZ2VQcm9jZXNzaW5nRnVuY3Rpb25zPlxuI2luY2x1ZGU8X19kZWNsX19saWdodEZyYWdtZW50PlswLi5tYXhTaW11bHRhbmVvdXNMaWdodHNdXG4jaW5jbHVkZTxsaWdodHNGcmFnbWVudEZ1bmN0aW9ucz5cbiNpbmNsdWRlPHNoYWRvd3NGcmFnbWVudEZ1bmN0aW9ucz5cbiNpZmRlZiBCVU1QXG52YXJ5aW5nIHZlYzIgdk5vcm1hbFVWO1xuI2lmZGVmIEJVTVBTVVBFUklNUE9TRVxudmFyeWluZyB2ZWMyIHZOb3JtYWxVVjI7XG4jZW5kaWZcbnVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbFNhbXBsZXI7dW5pZm9ybSB2ZWMyIHZOb3JtYWxJbmZvcztcbiNlbmRpZlxudW5pZm9ybSBzYW1wbGVyMkQgcmVmcmFjdGlvblNhbXBsZXI7dW5pZm9ybSBzYW1wbGVyMkQgcmVmbGVjdGlvblNhbXBsZXI7Y29uc3QgZmxvYXQgTE9HMj0xLjQ0MjY5NTt1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247dW5pZm9ybSB2ZWM0IHdhdGVyQ29sb3I7dW5pZm9ybSBmbG9hdCBjb2xvckJsZW5kRmFjdG9yO3VuaWZvcm0gdmVjNCB3YXRlckNvbG9yMjt1bmlmb3JtIGZsb2F0IGNvbG9yQmxlbmRGYWN0b3IyO3VuaWZvcm0gZmxvYXQgYnVtcEhlaWdodDt1bmlmb3JtIGZsb2F0IHRpbWU7dmFyeWluZyB2ZWMzIHZSZWZyYWN0aW9uTWFwVGV4Q29vcmQ7dmFyeWluZyB2ZWMzIHZSZWZsZWN0aW9uTWFwVGV4Q29vcmQ7XG4jaW5jbHVkZTxjbGlwUGxhbmVGcmFnbWVudERlY2xhcmF0aW9uPlxuI2luY2x1ZGU8bG9nRGVwdGhEZWNsYXJhdGlvbj5cbiNpbmNsdWRlPGZvZ0ZyYWdtZW50RGVjbGFyYXRpb24+XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbiNpbmNsdWRlPGNsaXBQbGFuZUZyYWdtZW50PlxudmVjMyB2aWV3RGlyZWN0aW9uVz1ub3JtYWxpemUodkV5ZVBvc2l0aW9uLnh5ei12UG9zaXRpb25XKTt2ZWM0IGJhc2VDb2xvcj12ZWM0KDEuLDEuLDEuLDEuKTt2ZWMzIGRpZmZ1c2VDb2xvcj12RGlmZnVzZUNvbG9yLnJnYjtmbG9hdCBhbHBoYT12RGlmZnVzZUNvbG9yLmE7XG4jaWZkZWYgQlVNUFxuI2lmZGVmIEJVTVBTVVBFUklNUE9TRVxuYmFzZUNvbG9yPTAuNip0ZXh0dXJlMkQobm9ybWFsU2FtcGxlcix2Tm9ybWFsVVYpKzAuNCp0ZXh0dXJlMkQobm9ybWFsU2FtcGxlcix2ZWMyKHZOb3JtYWxVVjIueCx2Tm9ybWFsVVYyLnkpKTtcbiNlbHNlXG5iYXNlQ29sb3I9dGV4dHVyZTJEKG5vcm1hbFNhbXBsZXIsdk5vcm1hbFVWKTtcbiNlbmRpZlxudmVjMyBidW1wQ29sb3I9YmFzZUNvbG9yLnJnYjtcbiNpZmRlZiBBTFBIQVRFU1RcbmlmIChiYXNlQ29sb3IuYTwwLjQpXG5kaXNjYXJkO1xuI2VuZGlmXG5iYXNlQ29sb3IucmdiKj12Tm9ybWFsSW5mb3MueTtcbiNlbHNlXG52ZWMzIGJ1bXBDb2xvcj12ZWMzKDEuMCk7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKFZFUlRFWENPTE9SKSB8fCBkZWZpbmVkKElOU1RBTkNFU0NPTE9SKSAmJiBkZWZpbmVkKElOU1RBTkNFUylcbmJhc2VDb2xvci5yZ2IqPXZDb2xvci5yZ2I7XG4jZW5kaWZcbiNpZmRlZiBOT1JNQUxcbnZlYzIgcGVydHVyYmF0aW9uPWJ1bXBIZWlnaHQqKGJhc2VDb2xvci5yZy0wLjUpO1xuI2lmZGVmIEJVTVBBRkZFQ1RTUkVGTEVDVElPTlxudmVjMyBub3JtYWxXPW5vcm1hbGl6ZSh2Tm9ybWFsVyt2ZWMzKHBlcnR1cmJhdGlvbi54KjguMCwwLjAscGVydHVyYmF0aW9uLnkqOC4wKSk7aWYgKG5vcm1hbFcueTwwLjApIHtub3JtYWxXLnk9LW5vcm1hbFcueTt9XG4jZWxzZVxudmVjMyBub3JtYWxXPW5vcm1hbGl6ZSh2Tm9ybWFsVyk7XG4jZW5kaWZcbiNlbHNlXG52ZWMzIG5vcm1hbFc9dmVjMygxLjAsMS4wLDEuMCk7dmVjMiBwZXJ0dXJiYXRpb249YnVtcEhlaWdodCoodmVjMigxLjAsMS4wKS0wLjUpO1xuI2VuZGlmXG4jaWZkZWYgRlJFU05FTFNFUEFSQVRFXG4jaWZkZWYgUkVGTEVDVElPTlxudmVjMiBwcm9qZWN0ZWRSZWZyYWN0aW9uVGV4Q29vcmRzPWNsYW1wKHZSZWZyYWN0aW9uTWFwVGV4Q29vcmQueHkvdlJlZnJhY3Rpb25NYXBUZXhDb29yZC56K3BlcnR1cmJhdGlvbiowLjUsMC4wLDEuMCk7dmVjNCByZWZyYWN0aXZlQ29sb3I9dGV4dHVyZTJEKHJlZnJhY3Rpb25TYW1wbGVyLHByb2plY3RlZFJlZnJhY3Rpb25UZXhDb29yZHMpO1xuI2lmZGVmIElTX1JFRlJBQ1RJT05fTElORUFSXG5yZWZyYWN0aXZlQ29sb3IucmdiPXRvR2FtbWFTcGFjZShyZWZyYWN0aXZlQ29sb3IucmdiKTtcbiNlbmRpZlxudmVjMiBwcm9qZWN0ZWRSZWZsZWN0aW9uVGV4Q29vcmRzPWNsYW1wKHZlYzIoXG52UmVmbGVjdGlvbk1hcFRleENvb3JkLngvdlJlZmxlY3Rpb25NYXBUZXhDb29yZC56K3BlcnR1cmJhdGlvbi54KjAuMyxcbnZSZWZsZWN0aW9uTWFwVGV4Q29vcmQueS92UmVmbGVjdGlvbk1hcFRleENvb3JkLnorcGVydHVyYmF0aW9uLnlcbiksMC4wLDEuMCk7dmVjNCByZWZsZWN0aXZlQ29sb3I9dGV4dHVyZTJEKHJlZmxlY3Rpb25TYW1wbGVyLHByb2plY3RlZFJlZmxlY3Rpb25UZXhDb29yZHMpO1xuI2lmZGVmIElTX1JFRkxFQ1RJT05fTElORUFSXG5yZWZsZWN0aXZlQ29sb3IucmdiPXRvR2FtbWFTcGFjZShyZWZsZWN0aXZlQ29sb3IucmdiKTtcbiNlbmRpZlxudmVjMyB1cFZlY3Rvcj12ZWMzKDAuMCwxLjAsMC4wKTtmbG9hdCBmcmVzbmVsVGVybT1jbGFtcChhYnMocG93KGRvdCh2aWV3RGlyZWN0aW9uVyx1cFZlY3RvciksMy4wKSksMC4wNSwwLjY1KTtmbG9hdCBJZnJlc25lbFRlcm09MS4wLWZyZXNuZWxUZXJtO3JlZnJhY3RpdmVDb2xvcj1jb2xvckJsZW5kRmFjdG9yKndhdGVyQ29sb3IrKDEuMC1jb2xvckJsZW5kRmFjdG9yKSpyZWZyYWN0aXZlQ29sb3I7cmVmbGVjdGl2ZUNvbG9yPUlmcmVzbmVsVGVybSpjb2xvckJsZW5kRmFjdG9yMip3YXRlckNvbG9yKygxLjAtY29sb3JCbGVuZEZhY3RvcjIqSWZyZXNuZWxUZXJtKSpyZWZsZWN0aXZlQ29sb3I7dmVjNCBjb21iaW5lZENvbG9yPXJlZnJhY3RpdmVDb2xvcipmcmVzbmVsVGVybStyZWZsZWN0aXZlQ29sb3IqSWZyZXNuZWxUZXJtO2Jhc2VDb2xvcj1jb21iaW5lZENvbG9yO1xuI2VuZGlmXG52ZWMzIGRpZmZ1c2VCYXNlPXZlYzMoMC4sMC4sMC4pO2xpZ2h0aW5nSW5mbyBpbmZvO2Zsb2F0IHNoYWRvdz0xLjtmbG9hdCBhZ2dTaGFkb3c9MC47ZmxvYXQgbnVtTGlnaHRzPTAuO1xuI2lmZGVmIFNQRUNVTEFSVEVSTVxuZmxvYXQgZ2xvc3NpbmVzcz12U3BlY3VsYXJDb2xvci5hO3ZlYzMgc3BlY3VsYXJCYXNlPXZlYzMoMC4sMC4sMC4pO3ZlYzMgc3BlY3VsYXJDb2xvcj12U3BlY3VsYXJDb2xvci5yZ2I7XG4jZWxzZVxuZmxvYXQgZ2xvc3NpbmVzcz0wLjtcbiNlbmRpZlxuI2luY2x1ZGU8bGlnaHRGcmFnbWVudD5bMC4ubWF4U2ltdWx0YW5lb3VzTGlnaHRzXVxudmVjMyBmaW5hbERpZmZ1c2U9Y2xhbXAoYmFzZUNvbG9yLnJnYiwwLjAsMS4wKTtcbiNpZiBkZWZpbmVkKFZFUlRFWEFMUEhBKSB8fCBkZWZpbmVkKElOU1RBTkNFU0NPTE9SKSAmJiBkZWZpbmVkKElOU1RBTkNFUylcbmFscGhhKj12Q29sb3IuYTtcbiNlbmRpZlxuI2lmZGVmIFNQRUNVTEFSVEVSTVxudmVjMyBmaW5hbFNwZWN1bGFyPXNwZWN1bGFyQmFzZSpzcGVjdWxhckNvbG9yO1xuI2Vsc2VcbnZlYzMgZmluYWxTcGVjdWxhcj12ZWMzKDAuMCk7XG4jZW5kaWZcbiNlbHNlIFxuI2lmZGVmIFJFRkxFQ1RJT05cbnZlYzIgcHJvamVjdGVkUmVmcmFjdGlvblRleENvb3Jkcz1jbGFtcCh2UmVmcmFjdGlvbk1hcFRleENvb3JkLnh5L3ZSZWZyYWN0aW9uTWFwVGV4Q29vcmQueitwZXJ0dXJiYXRpb24sMC4wLDEuMCk7dmVjNCByZWZyYWN0aXZlQ29sb3I9dGV4dHVyZTJEKHJlZnJhY3Rpb25TYW1wbGVyLHByb2plY3RlZFJlZnJhY3Rpb25UZXhDb29yZHMpO1xuI2lmZGVmIElTX1JFRlJBQ1RJT05fTElORUFSXG5yZWZyYWN0aXZlQ29sb3IucmdiPXRvR2FtbWFTcGFjZShyZWZyYWN0aXZlQ29sb3IucmdiKTtcbiNlbmRpZlxudmVjMiBwcm9qZWN0ZWRSZWZsZWN0aW9uVGV4Q29vcmRzPWNsYW1wKHZSZWZsZWN0aW9uTWFwVGV4Q29vcmQueHkvdlJlZmxlY3Rpb25NYXBUZXhDb29yZC56K3BlcnR1cmJhdGlvbiwwLjAsMS4wKTt2ZWM0IHJlZmxlY3RpdmVDb2xvcj10ZXh0dXJlMkQocmVmbGVjdGlvblNhbXBsZXIscHJvamVjdGVkUmVmbGVjdGlvblRleENvb3Jkcyk7XG4jaWZkZWYgSVNfUkVGTEVDVElPTl9MSU5FQVJcbnJlZmxlY3RpdmVDb2xvci5yZ2I9dG9HYW1tYVNwYWNlKHJlZmxlY3RpdmVDb2xvci5yZ2IpO1xuI2VuZGlmXG52ZWMzIHVwVmVjdG9yPXZlYzMoMC4wLDEuMCwwLjApO2Zsb2F0IGZyZXNuZWxUZXJtPW1heChkb3Qodmlld0RpcmVjdGlvblcsdXBWZWN0b3IpLDAuMCk7dmVjNCBjb21iaW5lZENvbG9yPXJlZnJhY3RpdmVDb2xvcipmcmVzbmVsVGVybStyZWZsZWN0aXZlQ29sb3IqKDEuMC1mcmVzbmVsVGVybSk7YmFzZUNvbG9yPWNvbG9yQmxlbmRGYWN0b3Iqd2F0ZXJDb2xvcisoMS4wLWNvbG9yQmxlbmRGYWN0b3IpKmNvbWJpbmVkQ29sb3I7XG4jZW5kaWZcbnZlYzMgZGlmZnVzZUJhc2U9dmVjMygwLiwwLiwwLik7bGlnaHRpbmdJbmZvIGluZm87ZmxvYXQgc2hhZG93PTEuO2Zsb2F0IGFnZ1NoYWRvdz0wLjtmbG9hdCBudW1MaWdodHM9MC47XG4jaWZkZWYgU1BFQ1VMQVJURVJNXG5mbG9hdCBnbG9zc2luZXNzPXZTcGVjdWxhckNvbG9yLmE7dmVjMyBzcGVjdWxhckJhc2U9dmVjMygwLiwwLiwwLik7dmVjMyBzcGVjdWxhckNvbG9yPXZTcGVjdWxhckNvbG9yLnJnYjtcbiNlbHNlXG5mbG9hdCBnbG9zc2luZXNzPTAuO1xuI2VuZGlmXG4jaW5jbHVkZTxsaWdodEZyYWdtZW50PlswLi5tYXhTaW11bHRhbmVvdXNMaWdodHNdXG52ZWMzIGZpbmFsRGlmZnVzZT1jbGFtcChiYXNlQ29sb3IucmdiLDAuMCwxLjApO1xuI2lmIGRlZmluZWQoVkVSVEVYQUxQSEEpIHx8IGRlZmluZWQoSU5TVEFOQ0VTQ09MT1IpICYmIGRlZmluZWQoSU5TVEFOQ0VTKVxuYWxwaGEqPXZDb2xvci5hO1xuI2VuZGlmXG4jaWZkZWYgU1BFQ1VMQVJURVJNXG52ZWMzIGZpbmFsU3BlY3VsYXI9c3BlY3VsYXJCYXNlKnNwZWN1bGFyQ29sb3I7XG4jZWxzZVxudmVjMyBmaW5hbFNwZWN1bGFyPXZlYzMoMC4wKTtcbiNlbmRpZlxuI2VuZGlmXG52ZWM0IGNvbG9yPXZlYzQoZmluYWxEaWZmdXNlK2ZpbmFsU3BlY3VsYXIsYWxwaGEpO1xuI2luY2x1ZGU8bG9nRGVwdGhGcmFnbWVudD5cbiNpbmNsdWRlPGZvZ0ZyYWdtZW50PlxuI2lmZGVmIElNQUdFUFJPQ0VTU0lOR1BPU1RQUk9DRVNTXG5jb2xvci5yZ2I9dG9MaW5lYXJTcGFjZShjb2xvci5yZ2IpO1xuI2VsaWYgZGVmaW5lZChJTUFHRVBST0NFU1NJTkcpXG5jb2xvci5yZ2I9dG9MaW5lYXJTcGFjZShjb2xvci5yZ2IpO2NvbG9yPWFwcGx5SW1hZ2VQcm9jZXNzaW5nKGNvbG9yKTtcbiNlbmRpZlxuZ2xfRnJhZ0NvbG9yPWNvbG9yO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgd2F0ZXJQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2JvbmVzRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9iYWtlZFZlcnRleEFuaW1hdGlvbkRlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvaW5zdGFuY2VzRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9jbGlwUGxhbmVWZXJ0ZXhEZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2ZvZ1ZlcnRleERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRGcmFnbWVudERlY2xhcmF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbGlnaHRVYm9EZWNsYXJhdGlvblwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2xvZ0RlcHRoRGVjbGFyYXRpb25cIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9pbnN0YW5jZXNWZXJ0ZXhcIjtcbmltcG9ydCBcImNvcmUvU2hhZGVycy9TaGFkZXJzSW5jbHVkZS9ib25lc1ZlcnRleFwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL2Jha2VkVmVydGV4QW5pbWF0aW9uXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvY2xpcFBsYW5lVmVydGV4XCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvZm9nVmVydGV4XCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvc2hhZG93c1ZlcnRleFwiO1xuaW1wb3J0IFwiY29yZS9TaGFkZXJzL1NoYWRlcnNJbmNsdWRlL3ZlcnRleENvbG9yTWl4aW5nXCI7XG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvU2hhZGVyc0luY2x1ZGUvbG9nRGVwdGhWZXJ0ZXhcIjtcblxuY29uc3QgbmFtZSA9IFwid2F0ZXJWZXJ0ZXhTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG4jaWZkZWYgTk9STUFMXG5hdHRyaWJ1dGUgdmVjMyBub3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVVjFcbmF0dHJpYnV0ZSB2ZWMyIHV2O1xuI2VuZGlmXG4jaWZkZWYgVVYyXG5hdHRyaWJ1dGUgdmVjMiB1djI7XG4jZW5kaWZcbiNpZmRlZiBWRVJURVhDT0xPUlxuYXR0cmlidXRlIHZlYzQgY29sb3I7XG4jZW5kaWZcbiNpbmNsdWRlPGJvbmVzRGVjbGFyYXRpb24+XG4jaW5jbHVkZTxiYWtlZFZlcnRleEFuaW1hdGlvbkRlY2xhcmF0aW9uPlxuI2luY2x1ZGU8aW5zdGFuY2VzRGVjbGFyYXRpb24+XG51bmlmb3JtIG1hdDQgdmlldzt1bmlmb3JtIG1hdDQgdmlld1Byb2plY3Rpb247XG4jaWZkZWYgQlVNUFxudmFyeWluZyB2ZWMyIHZOb3JtYWxVVjtcbiNpZmRlZiBCVU1QU1VQRVJJTVBPU0VcbnZhcnlpbmcgdmVjMiB2Tm9ybWFsVVYyO1xuI2VuZGlmXG51bmlmb3JtIG1hdDQgbm9ybWFsTWF0cml4O3VuaWZvcm0gdmVjMiB2Tm9ybWFsSW5mb3M7XG4jZW5kaWZcbiNpZmRlZiBQT0lOVFNJWkVcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlBvc2l0aW9uVztcbiNpZmRlZiBOT1JNQUxcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsVztcbiNlbmRpZlxuI2lmIGRlZmluZWQoVkVSVEVYQ09MT1IpIHx8IGRlZmluZWQoSU5TVEFOQ0VTQ09MT1IpICYmIGRlZmluZWQoSU5TVEFOQ0VTKVxudmFyeWluZyB2ZWM0IHZDb2xvcjtcbiNlbmRpZlxuI2luY2x1ZGU8Y2xpcFBsYW5lVmVydGV4RGVjbGFyYXRpb24+XG4jaW5jbHVkZTxmb2dWZXJ0ZXhEZWNsYXJhdGlvbj5cbiNpbmNsdWRlPF9fZGVjbF9fbGlnaHRGcmFnbWVudD5bMC4ubWF4U2ltdWx0YW5lb3VzTGlnaHRzXVxuI2luY2x1ZGU8bG9nRGVwdGhEZWNsYXJhdGlvbj5cbnVuaWZvcm0gbWF0NCByZWZsZWN0aW9uVmlld1Byb2plY3Rpb247dW5pZm9ybSB2ZWMyIHdpbmREaXJlY3Rpb247dW5pZm9ybSBmbG9hdCB3YXZlTGVuZ3RoO3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIGZsb2F0IHdpbmRGb3JjZTt1bmlmb3JtIGZsb2F0IHdhdmVIZWlnaHQ7dW5pZm9ybSBmbG9hdCB3YXZlU3BlZWQ7dW5pZm9ybSBmbG9hdCB3YXZlQ291bnQ7dmFyeWluZyB2ZWMzIHZSZWZyYWN0aW9uTWFwVGV4Q29vcmQ7dmFyeWluZyB2ZWMzIHZSZWZsZWN0aW9uTWFwVGV4Q29vcmQ7XG4jZGVmaW5lIENVU1RPTV9WRVJURVhfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSB7XG4jZGVmaW5lIENVU1RPTV9WRVJURVhfTUFJTl9CRUdJTlxuI2lmZGVmIFZFUlRFWENPTE9SXG52ZWM0IGNvbG9yVXBkYXRlZD1jb2xvcjtcbiNlbmRpZlxuI2luY2x1ZGU8aW5zdGFuY2VzVmVydGV4PlxuI2luY2x1ZGU8Ym9uZXNWZXJ0ZXg+XG4jaW5jbHVkZTxiYWtlZFZlcnRleEFuaW1hdGlvbj5cbnZlYzQgd29ybGRQb3M9ZmluYWxXb3JsZCp2ZWM0KHBvc2l0aW9uLDEuMCk7dlBvc2l0aW9uVz12ZWMzKHdvcmxkUG9zKTtcbiNpZmRlZiBOT1JNQUxcbnZOb3JtYWxXPW5vcm1hbGl6ZSh2ZWMzKGZpbmFsV29ybGQqdmVjNChub3JtYWwsMC4wKSkpO1xuI2VuZGlmXG4jaWZuZGVmIFVWMVxudmVjMiB1dj12ZWMyKDAuLDAuKTtcbiNlbmRpZlxuI2lmbmRlZiBVVjJcbnZlYzIgdXYyPXZlYzIoMC4sMC4pO1xuI2VuZGlmXG4jaWZkZWYgQlVNUFxuaWYgKHZOb3JtYWxJbmZvcy54PT0wLilcbnt2Tm9ybWFsVVY9dmVjMihub3JtYWxNYXRyaXgqdmVjNCgodXYqMS4wKS93YXZlTGVuZ3RoK3RpbWUqd2luZEZvcmNlKndpbmREaXJlY3Rpb24sMS4wLDAuMCkpO1xuI2lmZGVmIEJVTVBTVVBFUklNUE9TRVxudk5vcm1hbFVWMj12ZWMyKG5vcm1hbE1hdHJpeCp2ZWM0KCh1diowLjcyMSkvd2F2ZUxlbmd0aCt0aW1lKjEuMip3aW5kRm9yY2Uqd2luZERpcmVjdGlvbiwxLjAsMC4wKSk7XG4jZW5kaWZcbn1cbmVsc2Vcbnt2Tm9ybWFsVVY9dmVjMihub3JtYWxNYXRyaXgqdmVjNCgodXYyKjEuMCkvd2F2ZUxlbmd0aCt0aW1lKndpbmRGb3JjZSp3aW5kRGlyZWN0aW9uICwxLjAsMC4wKSk7XG4jaWZkZWYgQlVNUFNVUEVSSU1QT1NFXG52Tm9ybWFsVVYyPXZlYzIobm9ybWFsTWF0cml4KnZlYzQoKHV2MiowLjcyMSkvd2F2ZUxlbmd0aCt0aW1lKjEuMip3aW5kRm9yY2Uqd2luZERpcmVjdGlvbiAsMS4wLDAuMCkpO1xuI2VuZGlmXG59XG4jZW5kaWZcbiNpbmNsdWRlPGNsaXBQbGFuZVZlcnRleD5cbiNpbmNsdWRlPGZvZ1ZlcnRleD5cbiNpbmNsdWRlPHNoYWRvd3NWZXJ0ZXg+WzAuLm1heFNpbXVsdGFuZW91c0xpZ2h0c11cbiNpbmNsdWRlPHZlcnRleENvbG9yTWl4aW5nPlxuI2lmIGRlZmluZWQoUE9JTlRTSVpFKSAmJiAhZGVmaW5lZChXRUJHUFUpXG5nbF9Qb2ludFNpemU9cG9pbnRTaXplO1xuI2VuZGlmXG5mbG9hdCBmaW5hbFdhdmVDb3VudD0xLjAvKHdhdmVDb3VudCowLjUpO1xuI2lmZGVmIFVTRV9XT1JMRF9DT09SRElOQVRFU1xudmVjMyBwPXdvcmxkUG9zLnh5ejtcbiNlbHNlXG52ZWMzIHA9cG9zaXRpb247XG4jZW5kaWZcbmZsb2F0IG5ld1k9KHNpbigoKHAueC9maW5hbFdhdmVDb3VudCkrdGltZSp3YXZlU3BlZWQpKSp3YXZlSGVpZ2h0KndpbmREaXJlY3Rpb24ueCo1LjApXG4rIChjb3MoKChwLnovZmluYWxXYXZlQ291bnQpKyB0aW1lKndhdmVTcGVlZCkpKndhdmVIZWlnaHQqd2luZERpcmVjdGlvbi55KjUuMCk7cC55Kz1hYnMobmV3WSk7XG4jaWZkZWYgVVNFX1dPUkxEX0NPT1JESU5BVEVTXG5nbF9Qb3NpdGlvbj12aWV3UHJvamVjdGlvbip2ZWM0KHAsMS4wKTtcbiNlbHNlXG5nbF9Qb3NpdGlvbj12aWV3UHJvamVjdGlvbipmaW5hbFdvcmxkKnZlYzQocCwxLjApO1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElPTlxudlJlZnJhY3Rpb25NYXBUZXhDb29yZC54PTAuNSooZ2xfUG9zaXRpb24udytnbF9Qb3NpdGlvbi54KTt2UmVmcmFjdGlvbk1hcFRleENvb3JkLnk9MC41KihnbF9Qb3NpdGlvbi53K2dsX1Bvc2l0aW9uLnkpO3ZSZWZyYWN0aW9uTWFwVGV4Q29vcmQuej1nbF9Qb3NpdGlvbi53O3dvcmxkUG9zPXJlZmxlY3Rpb25WaWV3UHJvamVjdGlvbipmaW5hbFdvcmxkKnZlYzQocG9zaXRpb24sMS4wKTt2UmVmbGVjdGlvbk1hcFRleENvb3JkLng9MC41Kih3b3JsZFBvcy53K3dvcmxkUG9zLngpO3ZSZWZsZWN0aW9uTWFwVGV4Q29vcmQueT0wLjUqKHdvcmxkUG9zLncrd29ybGRQb3MueSk7dlJlZmxlY3Rpb25NYXBUZXhDb29yZC56PXdvcmxkUG9zLnc7XG4jZW5kaWZcbiNpbmNsdWRlPGxvZ0RlcHRoVmVydGV4PlxuI2RlZmluZSBDVVNUT01fVkVSVEVYX01BSU5fRU5EXG59XG5gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHdhdGVyVmVydGV4U2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IHsgc2VyaWFsaXplQXNWZWN0b3IyLCBzZXJpYWxpemVBc1RleHR1cmUsIHNlcmlhbGl6ZSwgZXhwYW5kVG9Qcm9wZXJ0eSwgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IE1hdHJpeCwgVmVjdG9yMiwgVmVjdG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGgudmVjdG9yXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHsgUGxhbmUgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLnBsYW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgSUFuaW1hdGFibGUgfSBmcm9tIFwiY29yZS9BbmltYXRpb25zL2FuaW1hdGFibGUuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCJjb3JlL0VuZ2luZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFNtYXJ0QXJyYXkgfSBmcm9tIFwiY29yZS9NaXNjL3NtYXJ0QXJyYXlcIjtcclxuaW1wb3J0IHR5cGUgeyBPYnNlcnZlciB9IGZyb20gXCJjb3JlL01pc2Mvb2JzZXJ2YWJsZVwiO1xyXG5pbXBvcnQgdHlwZSB7IEJhc2VUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2Jhc2VUZXh0dXJlXCI7XHJcbmltcG9ydCB7IFJlbmRlclRhcmdldFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvcmVuZGVyVGFyZ2V0VGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IElFZmZlY3RDcmVhdGlvbk9wdGlvbnMgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZWZmZWN0XCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsRGVmaW5lcyB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbERlZmluZXNcIjtcclxuaW1wb3J0IHR5cGUgeyBJSW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbkRlZmluZXMgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvaW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbi5kZWZpbmVzXCI7XHJcbmltcG9ydCB7IEltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb24gfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvaW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvblwiO1xyXG5pbXBvcnQgeyBQdXNoTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvcHVzaE1hdGVyaWFsXCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsRmxhZ3MgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvbWF0ZXJpYWxGbGFnc1wiO1xyXG5pbXBvcnQgeyBWZXJ0ZXhCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0TWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9hYnN0cmFjdE1lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBTdWJNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL3N1Yk1lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL21lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5cclxuaW1wb3J0IFwiLi93YXRlci5mcmFnbWVudFwiO1xyXG5pbXBvcnQgXCIuL3dhdGVyLnZlcnRleFwiO1xyXG5pbXBvcnQgeyBFZmZlY3RGYWxsYmFja3MgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZWZmZWN0RmFsbGJhY2tzXCI7XHJcbmltcG9ydCB7IENyZWF0ZUdyb3VuZCB9IGZyb20gXCJjb3JlL01lc2hlcy9CdWlsZGVycy9ncm91bmRCdWlsZGVyXCI7XHJcbmltcG9ydCB7IGFkZENsaXBQbGFuZVVuaWZvcm1zLCBiaW5kQ2xpcFBsYW5lIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL2NsaXBQbGFuZU1hdGVyaWFsSGVscGVyXCI7XHJcbmltcG9ydCB7XHJcbiAgICBCaW5kQm9uZXNQYXJhbWV0ZXJzLFxyXG4gICAgQmluZEZvZ1BhcmFtZXRlcnMsXHJcbiAgICBCaW5kTGlnaHRzLFxyXG4gICAgQmluZExvZ0RlcHRoLFxyXG4gICAgSGFuZGxlRmFsbGJhY2tzRm9yU2hhZG93cyxcclxuICAgIFByZXBhcmVBdHRyaWJ1dGVzRm9yQm9uZXMsXHJcbiAgICBQcmVwYXJlQXR0cmlidXRlc0Zvckluc3RhbmNlcyxcclxuICAgIFByZXBhcmVEZWZpbmVzRm9yQXR0cmlidXRlcyxcclxuICAgIFByZXBhcmVEZWZpbmVzRm9yRnJhbWVCb3VuZFZhbHVlcyxcclxuICAgIFByZXBhcmVEZWZpbmVzRm9yTGlnaHRzLFxyXG4gICAgUHJlcGFyZURlZmluZXNGb3JNaXNjLFxyXG4gICAgUHJlcGFyZVVuaWZvcm1zQW5kU2FtcGxlcnNMaXN0LFxyXG59IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbEhlbHBlci5mdW5jdGlvbnNcIjtcclxuXHJcbmltcG9ydCBcImNvcmUvUmVuZGVyaW5nL2JvdW5kaW5nQm94UmVuZGVyZXJcIjtcclxuXHJcbmNsYXNzIFdhdGVyTWF0ZXJpYWxEZWZpbmVzIGV4dGVuZHMgTWF0ZXJpYWxEZWZpbmVzIGltcGxlbWVudHMgSUltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb25EZWZpbmVzIHtcclxuICAgIHB1YmxpYyBCVU1QID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgUkVGTEVDVElPTiA9IGZhbHNlO1xyXG4gICAgcHVibGljIENMSVBQTEFORSA9IGZhbHNlO1xyXG4gICAgcHVibGljIENMSVBQTEFORTIgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBDTElQUExBTkUzID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQ0xJUFBMQU5FNCA9IGZhbHNlO1xyXG4gICAgcHVibGljIENMSVBQTEFORTUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBDTElQUExBTkU2ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQUxQSEFURVNUID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgREVQVEhQUkVQQVNTID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgUE9JTlRTSVpFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgRk9HID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgTk9STUFMID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVVYxID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVVYyID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVkVSVEVYQ09MT1IgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBWRVJURVhBTFBIQSA9IGZhbHNlO1xyXG4gICAgcHVibGljIE5VTV9CT05FX0lORkxVRU5DRVJTID0gMDtcclxuICAgIHB1YmxpYyBCb25lc1Blck1lc2ggPSAwO1xyXG4gICAgcHVibGljIElOU1RBTkNFUyA9IGZhbHNlO1xyXG4gICAgcHVibGljIElOU1RBTkNFU0NPTE9SID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgU1BFQ1VMQVJURVJNID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgTE9HQVJJVEhNSUNERVBUSCA9IGZhbHNlO1xyXG4gICAgcHVibGljIFVTRV9SRVZFUlNFX0RFUFRIQlVGRkVSID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgRlJFU05FTFNFUEFSQVRFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQlVNUFNVUEVSSU1QT1NFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQlVNUEFGRkVDVFNSRUZMRUNUSU9OID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVVNFX1dPUkxEX0NPT1JESU5BVEVTID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIElNQUdFUFJPQ0VTU0lORyA9IGZhbHNlO1xyXG4gICAgcHVibGljIFZJR05FVFRFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVklHTkVUVEVCTEVORE1PREVNVUxUSVBMWSA9IGZhbHNlO1xyXG4gICAgcHVibGljIFZJR05FVFRFQkxFTkRNT0RFT1BBUVVFID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVE9ORU1BUFBJTkcgPSAwO1xyXG4gICAgcHVibGljIENPTlRSQVNUID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgRVhQT1NVUkUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBDT0xPUkNVUlZFUyA9IGZhbHNlO1xyXG4gICAgcHVibGljIENPTE9SR1JBRElORyA9IGZhbHNlO1xyXG4gICAgcHVibGljIENPTE9SR1JBRElORzNEID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgU0FNUExFUjNER1JFRU5ERVBUSCA9IGZhbHNlO1xyXG4gICAgcHVibGljIFNBTVBMRVIzREJHUk1BUCA9IGZhbHNlO1xyXG4gICAgcHVibGljIERJVEhFUiA9IGZhbHNlO1xyXG4gICAgcHVibGljIElNQUdFUFJPQ0VTU0lOR1BPU1RQUk9DRVNTID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgU0tJUEZJTkFMQ09MT1JDTEFNUCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBXYXRlck1hdGVyaWFsIGV4dGVuZHMgUHVzaE1hdGVyaWFsIHtcclxuICAgIC8qXHJcbiAgICAgKiBQdWJsaWMgbWVtYmVyc1xyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplQXNUZXh0dXJlKFwiYnVtcFRleHR1cmVcIilcclxuICAgIHByaXZhdGUgX2J1bXBUZXh0dXJlOiBCYXNlVGV4dHVyZTtcclxuICAgIEBleHBhbmRUb1Byb3BlcnR5KFwiX21hcmtBbGxTdWJNZXNoZXNBc1RleHR1cmVzRGlydHlcIilcclxuICAgIHB1YmxpYyBidW1wVGV4dHVyZTogQmFzZVRleHR1cmU7XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBkaWZmdXNlQ29sb3IgPSBuZXcgQ29sb3IzKDEsIDEsIDEpO1xyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgc3BlY3VsYXJDb2xvciA9IG5ldyBDb2xvcjMoMCwgMCwgMCk7XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgc3BlY3VsYXJQb3dlciA9IDY0O1xyXG5cclxuICAgIEBzZXJpYWxpemUoXCJkaXNhYmxlTGlnaHRpbmdcIilcclxuICAgIHByaXZhdGUgX2Rpc2FibGVMaWdodGluZyA9IGZhbHNlO1xyXG4gICAgQGV4cGFuZFRvUHJvcGVydHkoXCJfbWFya0FsbFN1Yk1lc2hlc0FzTGlnaHRzRGlydHlcIilcclxuICAgIHB1YmxpYyBkaXNhYmxlTGlnaHRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgQHNlcmlhbGl6ZShcIm1heFNpbXVsdGFuZW91c0xpZ2h0c1wiKVxyXG4gICAgcHJpdmF0ZSBfbWF4U2ltdWx0YW5lb3VzTGlnaHRzID0gNDtcclxuICAgIEBleHBhbmRUb1Byb3BlcnR5KFwiX21hcmtBbGxTdWJNZXNoZXNBc0xpZ2h0c0RpcnR5XCIpXHJcbiAgICBwdWJsaWMgbWF4U2ltdWx0YW5lb3VzTGlnaHRzOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSB3aW5kIGZvcmNlLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB3aW5kRm9yY2U6IG51bWJlciA9IDY7XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgd2luZCBpbiB0aGUgcGxhbmUgKFgsIFopLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplQXNWZWN0b3IyKClcclxuICAgIHB1YmxpYyB3aW5kRGlyZWN0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgMSk7XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIGhlaWdodCBvZiB0aGUgd2F2ZXMuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHdhdmVIZWlnaHQ6IG51bWJlciA9IDAuNDtcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgYnVtcCBoZWlnaHQgcmVsYXRlZCB0byB0aGUgYnVtcCBtYXAuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGJ1bXBIZWlnaHQ6IG51bWJlciA9IDAuNDtcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3ZXRoZXIgb3Igbm90OiB0byBhZGQgYSBzbWFsbGVyIG1vdmluZyBidW1wIHRvIGxlc3Mgc3RlYWR5IHdhdmVzLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKFwiYnVtcFN1cGVyaW1wb3NlXCIpXHJcbiAgICBwcml2YXRlIF9idW1wU3VwZXJpbXBvc2UgPSBmYWxzZTtcclxuICAgIEBleHBhbmRUb1Byb3BlcnR5KFwiX21hcmtBbGxTdWJNZXNoZXNBc01pc2NEaXJ0eVwiKVxyXG4gICAgcHVibGljIGJ1bXBTdXBlcmltcG9zZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2V0aGVyIG9yIG5vdCBjb2xvciByZWZyYWN0aW9uIGFuZCByZWZsZWN0aW9uIGRpZmZlcmVudGx5IHdpdGggLndhdGVyQ29sb3IyIGFuZCAuY29sb3JCbGVuZEZhY3RvcjIuIE5vbi1saW5lYXIgKHBoeXNpY2FsbHkgY29ycmVjdCkgZnJlc25lbC5cclxuICAgICAqL1xyXG4gICAgQHNlcmlhbGl6ZShcImZyZXNuZWxTZXBhcmF0ZVwiKVxyXG4gICAgcHJpdmF0ZSBfZnJlc25lbFNlcGFyYXRlID0gZmFsc2U7XHJcbiAgICBAZXhwYW5kVG9Qcm9wZXJ0eShcIl9tYXJrQWxsU3ViTWVzaGVzQXNNaXNjRGlydHlcIilcclxuICAgIHB1YmxpYyBmcmVzbmVsU2VwYXJhdGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdldGhlciBvciBub3QgYnVtcCBXd3ZlcyBtb2RpZnkgdGhlIHJlZmxlY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoXCJidW1wQWZmZWN0c1JlZmxlY3Rpb25cIilcclxuICAgIHByaXZhdGUgX2J1bXBBZmZlY3RzUmVmbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgQGV4cGFuZFRvUHJvcGVydHkoXCJfbWFya0FsbFN1Yk1lc2hlc0FzTWlzY0RpcnR5XCIpXHJcbiAgICBwdWJsaWMgYnVtcEFmZmVjdHNSZWZsZWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgd2F0ZXIgY29sb3IgYmxlbmRlZCB3aXRoIHRoZSByZWZyYWN0aW9uIChuZWFyKS5cclxuICAgICAqL1xyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyB3YXRlckNvbG9yOiBDb2xvcjMgPSBuZXcgQ29sb3IzKDAuMSwgMC4xLCAwLjYpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSBibGVuZCBmYWN0b3IgcmVsYXRlZCB0byB0aGUgd2F0ZXIgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGNvbG9yQmxlbmRGYWN0b3I6IG51bWJlciA9IDAuMjtcclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgd2F0ZXIgY29sb3IgYmxlbmRlZCB3aXRoIHRoZSByZWZsZWN0aW9uIChmYXIpLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIHdhdGVyQ29sb3IyOiBDb2xvcjMgPSBuZXcgQ29sb3IzKDAuMSwgMC4xLCAwLjYpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSBibGVuZCBmYWN0b3IgcmVsYXRlZCB0byB0aGUgd2F0ZXIgY29sb3IgKHJlZmxlY3Rpb24sIGZhcikuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGNvbG9yQmxlbmRGYWN0b3IyOiBudW1iZXIgPSAwLjI7XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgd2F2ZS5cclxuICAgICAqL1xyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgd2F2ZUxlbmd0aDogbnVtYmVyID0gMC4xO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgd2F2ZXMgc3BlZWQuXHJcbiAgICAgKi9cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHdhdmVTcGVlZDogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdhdmVzIGFyZSByZXBlYXRlZC4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBhZGp1c3Qgd2F2ZXMgY291bnQgYWNjb3JkaW5nIHRvIHRoZSBncm91bmQncyBzaXplIHdoZXJlIHRoZSBtYXRlcmlhbCBpcyBhcHBsaWVkIG9uLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB3YXZlQ291bnQ6IG51bWJlciA9IDIwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgd2hldGhlciBvciBub3QgYXV0b21hdGljIGNsaXBwaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC4gU2V0dGluZyB0byB0cnVlIHdpbGwgc2F2ZSBwZXJmb3JtYW5jZXMgYW5kXHJcbiAgICAgKiB3aWxsIGF2b2lkIGNhbGN1bGF0aW5nIHVzZWxlc3MgcGl4ZWxzIGluIHRoZSBwaXhlbCBzaGFkZXIgb2YgdGhlIHdhdGVyIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBkaXNhYmxlQ2xpcFBsYW5lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB3b3JsZCBjb29yZGluYXRlcyBmb3Igd2F2ZSBkZWZvcm1hdGlvbnMuXHJcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBkZWZvcm1hdGlvbiBpcyBhcHBsaWVkIGluIG9iamVjdCAobG9jYWwpIHNwYWNlLlxyXG4gICAgICogWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBzZXQgaXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIHVzaW5nIGluc3RhbmNlcyBvciB0aGluIGluc3RhbmNlcyBmb3IgeW91ciB3YXRlciBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBAc2VyaWFsaXplKFwidXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvblwiKVxyXG4gICAgcHJpdmF0ZSBfdXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvbiA9IGZhbHNlO1xyXG4gICAgQGV4cGFuZFRvUHJvcGVydHkoXCJfbWFya0FsbFN1Yk1lc2hlc0FzTWlzY0RpcnR5XCIpXHJcbiAgICBwdWJsaWMgdXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvbjogYm9vbGVhbjtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlclRhcmdldHMgPSBuZXcgU21hcnRBcnJheTxSZW5kZXJUYXJnZXRUZXh0dXJlPigxNik7XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgbWVtYmVyc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9tZXNoOiBOdWxsYWJsZTxBYnN0cmFjdE1lc2g+ID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9yZWZyYWN0aW9uUlRUOiBOdWxsYWJsZTxSZW5kZXJUYXJnZXRUZXh0dXJlPjtcclxuICAgIHByaXZhdGUgX3JlZmxlY3Rpb25SVFQ6IE51bGxhYmxlPFJlbmRlclRhcmdldFRleHR1cmU+O1xyXG5cclxuICAgIHByaXZhdGUgX3JlZmxlY3Rpb25UcmFuc2Zvcm06IE1hdHJpeCA9IE1hdHJpeC5aZXJvKCk7XHJcbiAgICBwcml2YXRlIF9sYXN0VGltZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2xhc3REZWx0YVRpbWU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfd2FpdGluZ1JlbmRlckxpc3Q6IE51bGxhYmxlPHN0cmluZ1tdPjtcclxuXHJcbiAgICBwcml2YXRlIF9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uOiBOdWxsYWJsZTxJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uPjtcclxuICAgIHByaXZhdGUgX2ltYWdlUHJvY2Vzc2luZ09ic2VydmVyOiBOdWxsYWJsZTxPYnNlcnZlcjxJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uPj47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgY3VycmVudCBtYXRlcmlhbCBuZWVkcyB0byByZWdpc3RlciBSVFRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBoYXNSZW5kZXJUYXJnZXRUZXh0dXJlcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gbmFtZVxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcmVuZGVyVGFyZ2V0U2l6ZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgc2NlbmU/OiBTY2VuZSxcclxuICAgICAgICBwdWJsaWMgcmVuZGVyVGFyZ2V0U2l6ZTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDUxMiwgNTEyKVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2NlbmUpO1xyXG5cclxuICAgICAgICB0aGlzLl9jcmVhdGVSZW5kZXJUYXJnZXRzKHRoaXMuZ2V0U2NlbmUoKSwgcmVuZGVyVGFyZ2V0U2l6ZSk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSByZW5kZXIgdGFyZ2V0c1xyXG4gICAgICAgIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMgPSAoKTogU21hcnRBcnJheTxSZW5kZXJUYXJnZXRUZXh0dXJlPiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRhcmdldHMucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGFyZ2V0cy5wdXNoKDxSZW5kZXJUYXJnZXRUZXh0dXJlPnRoaXMuX3JlZmxlY3Rpb25SVFQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUYXJnZXRzLnB1c2goPFJlbmRlclRhcmdldFRleHR1cmU+dGhpcy5fcmVmcmFjdGlvblJUVCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGFyZ2V0cztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uID0gdGhpcy5nZXRTY2VuZSgpLmltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5faW1hZ2VQcm9jZXNzaW5nT2JzZXJ2ZXIgPSB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLm9uVXBkYXRlUGFyYW1ldGVycy5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya0FsbFN1Yk1lc2hlc0FzSW1hZ2VQcm9jZXNzaW5nRGlydHkoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCAvIFNldFxyXG4gICAgcHVibGljIGdldCByZWZyYWN0aW9uVGV4dHVyZSgpOiBOdWxsYWJsZTxSZW5kZXJUYXJnZXRUZXh0dXJlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZnJhY3Rpb25SVFQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCByZWZsZWN0aW9uVGV4dHVyZSgpOiBOdWxsYWJsZTxSZW5kZXJUYXJnZXRUZXh0dXJlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmxlY3Rpb25SVFQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWV0aG9kc1xyXG4gICAgcHVibGljIGFkZFRvUmVuZGVyTGlzdChub2RlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCAmJiB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCAmJiB0aGlzLl9yZWZsZWN0aW9uUlRULnJlbmRlckxpc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmbGVjdGlvblJUVC5yZW5kZXJMaXN0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVGcm9tUmVuZGVyTGlzdChub2RlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCAmJiB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3QpIHtcclxuICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0LmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3Quc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWZsZWN0aW9uUlRUICYmIHRoaXMuX3JlZmxlY3Rpb25SVFQucmVuZGVyTGlzdCkge1xyXG4gICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9yZWZsZWN0aW9uUlRULnJlbmRlckxpc3QuaW5kZXhPZihub2RlKTtcclxuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQucmVuZGVyTGlzdC5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlUmVuZGVyVGFyZ2V0cyhlbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWZyZXNoUmF0ZSA9IGVuYWJsZSA/IDEgOiAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULnJlZnJlc2hSYXRlID0gcmVmcmVzaFJhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULnJlZnJlc2hSYXRlID0gcmVmcmVzaFJhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZW5kZXJMaXN0KCk6IE51bGxhYmxlPEFic3RyYWN0TWVzaFtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZnJhY3Rpb25SVFQgPyB0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3QgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHJlbmRlclRhcmdldHNFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhKHRoaXMuX3JlZnJhY3Rpb25SVFQgJiYgdGhpcy5fcmVmcmFjdGlvblJUVC5yZWZyZXNoUmF0ZSA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIG5lZWRBbHBoYUJsZW5kaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFscGhhIDwgMS4wO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBuZWVkQWxwaGFUZXN0aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0QWxwaGFUZXN0VGV4dHVyZSgpOiBOdWxsYWJsZTxCYXNlVGV4dHVyZT4ge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpc1JlYWR5Rm9yU3ViTWVzaChtZXNoOiBBYnN0cmFjdE1lc2gsIHN1Yk1lc2g6IFN1Yk1lc2gsIHVzZUluc3RhbmNlcz86IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBkcmF3V3JhcHBlciA9IHN1Yk1lc2guX2RyYXdXcmFwcGVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Zyb3plbikge1xyXG4gICAgICAgICAgICBpZiAoZHJhd1dyYXBwZXIuZWZmZWN0ICYmIGRyYXdXcmFwcGVyLl93YXNQcmV2aW91c2x5UmVhZHkgJiYgZHJhd1dyYXBwZXIuX3dhc1ByZXZpb3VzbHlVc2luZ0luc3RhbmNlcyA9PT0gdXNlSW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzdWJNZXNoLm1hdGVyaWFsRGVmaW5lcykge1xyXG4gICAgICAgICAgICBzdWJNZXNoLm1hdGVyaWFsRGVmaW5lcyA9IG5ldyBXYXRlck1hdGVyaWFsRGVmaW5lcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IDxXYXRlck1hdGVyaWFsRGVmaW5lcz5zdWJNZXNoLm1hdGVyaWFsRGVmaW5lcztcclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUmVhZHlGb3JTdWJNZXNoKHN1Yk1lc2gpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZW5naW5lID0gc2NlbmUuZ2V0RW5naW5lKCk7XHJcblxyXG4gICAgICAgIC8vIFRleHR1cmVzXHJcbiAgICAgICAgaWYgKGRlZmluZXMuX2FyZVRleHR1cmVzRGlydHkpIHtcclxuICAgICAgICAgICAgZGVmaW5lcy5fbmVlZFVWcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoc2NlbmUudGV4dHVyZXNFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idW1wVGV4dHVyZSAmJiBNYXRlcmlhbEZsYWdzLkJ1bXBUZXh0dXJlRW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5idW1wVGV4dHVyZS5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMuX25lZWRVVnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVzLkJVTVAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoTWF0ZXJpYWxGbGFncy5SZWZsZWN0aW9uVGV4dHVyZUVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzLlJFRkxFQ1RJT04gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBQcmVwYXJlRGVmaW5lc0ZvckZyYW1lQm91bmRWYWx1ZXMoc2NlbmUsIGVuZ2luZSwgdGhpcywgZGVmaW5lcywgdXNlSW5zdGFuY2VzID8gdHJ1ZSA6IGZhbHNlKTtcclxuXHJcbiAgICAgICAgUHJlcGFyZURlZmluZXNGb3JNaXNjKG1lc2gsIHNjZW5lLCB0aGlzLl91c2VMb2dhcml0aG1pY0RlcHRoLCB0aGlzLnBvaW50c0Nsb3VkLCB0aGlzLmZvZ0VuYWJsZWQsIHRoaXMubmVlZEFscGhhVGVzdGluZ0Zvck1lc2gobWVzaCksIGRlZmluZXMpO1xyXG5cclxuICAgICAgICBpZiAoZGVmaW5lcy5fYXJlTWlzY0RpcnR5KSB7XHJcbiAgICAgICAgICAgIGRlZmluZXMuRlJFU05FTFNFUEFSQVRFID0gdGhpcy5fZnJlc25lbFNlcGFyYXRlO1xyXG4gICAgICAgICAgICBkZWZpbmVzLkJVTVBTVVBFUklNUE9TRSA9IHRoaXMuX2J1bXBTdXBlcmltcG9zZTtcclxuICAgICAgICAgICAgZGVmaW5lcy5CVU1QQUZGRUNUU1JFRkxFQ1RJT04gPSB0aGlzLl9idW1wQWZmZWN0c1JlZmxlY3Rpb247XHJcbiAgICAgICAgICAgIGRlZmluZXMuVVNFX1dPUkxEX0NPT1JESU5BVEVTID0gdGhpcy5fdXNlV29ybGRDb29yZGluYXRlc0ZvcldhdmVEZWZvcm1hdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExpZ2h0c1xyXG4gICAgICAgIGRlZmluZXMuX25lZWROb3JtYWxzID0gUHJlcGFyZURlZmluZXNGb3JMaWdodHMoc2NlbmUsIG1lc2gsIGRlZmluZXMsIHRydWUsIHRoaXMuX21heFNpbXVsdGFuZW91c0xpZ2h0cywgdGhpcy5fZGlzYWJsZUxpZ2h0aW5nKTtcclxuXHJcbiAgICAgICAgLy8gSW1hZ2UgcHJvY2Vzc2luZ1xyXG4gICAgICAgIGlmIChkZWZpbmVzLl9hcmVJbWFnZVByb2Nlc3NpbmdEaXJ0eSAmJiB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5faW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbi5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5faW1hZ2VQcm9jZXNzaW5nQ29uZmlndXJhdGlvbi5wcmVwYXJlRGVmaW5lcyhkZWZpbmVzKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmluZXMuSVNfUkVGTEVDVElPTl9MSU5FQVIgPSB0aGlzLnJlZmxlY3Rpb25UZXh0dXJlICE9IG51bGwgJiYgIXRoaXMucmVmbGVjdGlvblRleHR1cmUuZ2FtbWFTcGFjZTtcclxuICAgICAgICAgICAgZGVmaW5lcy5JU19SRUZSQUNUSU9OX0xJTkVBUiA9IHRoaXMucmVmcmFjdGlvblRleHR1cmUgIT0gbnVsbCAmJiAhdGhpcy5yZWZyYWN0aW9uVGV4dHVyZS5nYW1tYVNwYWNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXR0cmlic1xyXG4gICAgICAgIFByZXBhcmVEZWZpbmVzRm9yQXR0cmlidXRlcyhtZXNoLCBkZWZpbmVzLCB0cnVlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gQ29uZmlndXJlIHRoaXNcclxuICAgICAgICB0aGlzLl9tZXNoID0gbWVzaDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmdSZW5kZXJMaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fd2FpdGluZ1JlbmRlckxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9SZW5kZXJMaXN0KHNjZW5lLmdldE5vZGVCeUlkKHRoaXMuX3dhaXRpbmdSZW5kZXJMaXN0W2ldKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dhaXRpbmdSZW5kZXJMaXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBjb3JyZWN0IGVmZmVjdFxyXG4gICAgICAgIGlmIChkZWZpbmVzLmlzRGlydHkpIHtcclxuICAgICAgICAgICAgZGVmaW5lcy5tYXJrQXNQcm9jZXNzZWQoKTtcclxuICAgICAgICAgICAgc2NlbmUucmVzZXRDYWNoZWRNYXRlcmlhbCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gRmFsbGJhY2tzXHJcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrcyA9IG5ldyBFZmZlY3RGYWxsYmFja3MoKTtcclxuICAgICAgICAgICAgaWYgKGRlZmluZXMuRk9HKSB7XHJcbiAgICAgICAgICAgICAgICBmYWxsYmFja3MuYWRkRmFsbGJhY2soMSwgXCJGT0dcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZWZpbmVzLkxPR0FSSVRITUlDREVQVEgpIHtcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrcy5hZGRGYWxsYmFjaygwLCBcIkxPR0FSSVRITUlDREVQVEhcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEhhbmRsZUZhbGxiYWNrc0ZvclNoYWRvd3MoZGVmaW5lcywgZmFsbGJhY2tzLCB0aGlzLm1heFNpbXVsdGFuZW91c0xpZ2h0cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGVmaW5lcy5OVU1fQk9ORV9JTkZMVUVOQ0VSUyA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrcy5hZGRDUFVTa2lubmluZ0ZhbGxiYWNrKDAsIG1lc2gpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0F0dHJpYnV0ZXNcclxuICAgICAgICAgICAgY29uc3QgYXR0cmlicyA9IFtWZXJ0ZXhCdWZmZXIuUG9zaXRpb25LaW5kXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkZWZpbmVzLk5PUk1BTCkge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlicy5wdXNoKFZlcnRleEJ1ZmZlci5Ob3JtYWxLaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRlZmluZXMuVVYxKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJzLnB1c2goVmVydGV4QnVmZmVyLlVWS2luZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZWZpbmVzLlVWMikge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlicy5wdXNoKFZlcnRleEJ1ZmZlci5VVjJLaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRlZmluZXMuVkVSVEVYQ09MT1IpIHtcclxuICAgICAgICAgICAgICAgIGF0dHJpYnMucHVzaChWZXJ0ZXhCdWZmZXIuQ29sb3JLaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgUHJlcGFyZUF0dHJpYnV0ZXNGb3JCb25lcyhhdHRyaWJzLCBtZXNoLCBkZWZpbmVzLCBmYWxsYmFja3MpO1xyXG4gICAgICAgICAgICBQcmVwYXJlQXR0cmlidXRlc0Zvckluc3RhbmNlcyhhdHRyaWJzLCBkZWZpbmVzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIExlZ2FjeSBicm93c2VyIHBhdGNoXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYWRlck5hbWUgPSBcIndhdGVyXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGpvaW4gPSBkZWZpbmVzLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1zID0gW1xyXG4gICAgICAgICAgICAgICAgXCJ3b3JsZFwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2aWV3XCIsXHJcbiAgICAgICAgICAgICAgICBcInZpZXdQcm9qZWN0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcInZFeWVQb3NpdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2TGlnaHRzVHlwZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2RGlmZnVzZUNvbG9yXCIsXHJcbiAgICAgICAgICAgICAgICBcInZTcGVjdWxhckNvbG9yXCIsXHJcbiAgICAgICAgICAgICAgICBcInZGb2dJbmZvc1wiLFxyXG4gICAgICAgICAgICAgICAgXCJ2Rm9nQ29sb3JcIixcclxuICAgICAgICAgICAgICAgIFwicG9pbnRTaXplXCIsXHJcbiAgICAgICAgICAgICAgICBcInZOb3JtYWxJbmZvc1wiLFxyXG4gICAgICAgICAgICAgICAgXCJtQm9uZXNcIixcclxuICAgICAgICAgICAgICAgIFwibm9ybWFsTWF0cml4XCIsXHJcbiAgICAgICAgICAgICAgICBcImxvZ2FyaXRobWljRGVwdGhDb25zdGFudFwiLFxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdhdGVyXHJcbiAgICAgICAgICAgICAgICBcInJlZmxlY3Rpb25WaWV3UHJvamVjdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3aW5kRGlyZWN0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcIndhdmVMZW5ndGhcIixcclxuICAgICAgICAgICAgICAgIFwidGltZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3aW5kRm9yY2VcIixcclxuICAgICAgICAgICAgICAgIFwiY2FtZXJhUG9zaXRpb25cIixcclxuICAgICAgICAgICAgICAgIFwiYnVtcEhlaWdodFwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3YXZlSGVpZ2h0XCIsXHJcbiAgICAgICAgICAgICAgICBcIndhdGVyQ29sb3JcIixcclxuICAgICAgICAgICAgICAgIFwid2F0ZXJDb2xvcjJcIixcclxuICAgICAgICAgICAgICAgIFwiY29sb3JCbGVuZEZhY3RvclwiLFxyXG4gICAgICAgICAgICAgICAgXCJjb2xvckJsZW5kRmFjdG9yMlwiLFxyXG4gICAgICAgICAgICAgICAgXCJ3YXZlU3BlZWRcIixcclxuICAgICAgICAgICAgICAgIFwid2F2ZUNvdW50XCIsXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIGNvbnN0IHNhbXBsZXJzID0gW1xyXG4gICAgICAgICAgICAgICAgXCJub3JtYWxTYW1wbGVyXCIsXHJcbiAgICAgICAgICAgICAgICAvLyBXYXRlclxyXG4gICAgICAgICAgICAgICAgXCJyZWZyYWN0aW9uU2FtcGxlclwiLFxyXG4gICAgICAgICAgICAgICAgXCJyZWZsZWN0aW9uU2FtcGxlclwiLFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtQnVmZmVyczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLlByZXBhcmVVbmlmb3Jtcyh1bmlmb3JtcywgZGVmaW5lcyk7XHJcbiAgICAgICAgICAgICAgICBJbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLlByZXBhcmVTYW1wbGVycyhzYW1wbGVycywgZGVmaW5lcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFkZENsaXBQbGFuZVVuaWZvcm1zKHVuaWZvcm1zKTtcclxuXHJcbiAgICAgICAgICAgIFByZXBhcmVVbmlmb3Jtc0FuZFNhbXBsZXJzTGlzdCg8SUVmZmVjdENyZWF0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc05hbWVzOiB1bmlmb3JtcyxcclxuICAgICAgICAgICAgICAgIHVuaWZvcm1CdWZmZXJzTmFtZXM6IHVuaWZvcm1CdWZmZXJzLFxyXG4gICAgICAgICAgICAgICAgc2FtcGxlcnM6IHNhbXBsZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVmaW5lczogZGVmaW5lcyxcclxuICAgICAgICAgICAgICAgIG1heFNpbXVsdGFuZW91c0xpZ2h0czogdGhpcy5tYXhTaW11bHRhbmVvdXNMaWdodHMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzdWJNZXNoLnNldEVmZmVjdChcclxuICAgICAgICAgICAgICAgIHNjZW5lLmdldEVuZ2luZSgpLmNyZWF0ZUVmZmVjdChcclxuICAgICAgICAgICAgICAgICAgICBzaGFkZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIDxJRWZmZWN0Q3JlYXRpb25PcHRpb25zPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogYXR0cmlicyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNOYW1lczogdW5pZm9ybXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1CdWZmZXJzTmFtZXM6IHVuaWZvcm1CdWZmZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyczogc2FtcGxlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IGpvaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrczogZmFsbGJhY2tzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBpbGVkOiB0aGlzLm9uQ29tcGlsZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMub25FcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhQYXJhbWV0ZXJzOiB7IG1heFNpbXVsdGFuZW91c0xpZ2h0czogdGhpcy5fbWF4U2ltdWx0YW5lb3VzTGlnaHRzIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBlbmdpbmVcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBkZWZpbmVzLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF0ZXJpYWxDb250ZXh0XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc3ViTWVzaC5lZmZlY3QgfHwgIXN1Yk1lc2guZWZmZWN0LmlzUmVhZHkoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZpbmVzLl9yZW5kZXJJZCA9IHNjZW5lLmdldFJlbmRlcklkKCk7XHJcbiAgICAgICAgZHJhd1dyYXBwZXIuX3dhc1ByZXZpb3VzbHlSZWFkeSA9IHRydWU7XHJcbiAgICAgICAgZHJhd1dyYXBwZXIuX3dhc1ByZXZpb3VzbHlVc2luZ0luc3RhbmNlcyA9ICEhdXNlSW5zdGFuY2VzO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYmluZEZvclN1Yk1lc2god29ybGQ6IE1hdHJpeCwgbWVzaDogTWVzaCwgc3ViTWVzaDogU3ViTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBkZWZpbmVzID0gPFdhdGVyTWF0ZXJpYWxEZWZpbmVzPnN1Yk1lc2gubWF0ZXJpYWxEZWZpbmVzO1xyXG4gICAgICAgIGlmICghZGVmaW5lcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlZmZlY3QgPSBzdWJNZXNoLmVmZmVjdDtcclxuICAgICAgICBpZiAoIWVmZmVjdCB8fCAhdGhpcy5fbWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdCA9IGVmZmVjdDtcclxuXHJcbiAgICAgICAgLy8gTWF0cmljZXNcclxuICAgICAgICB0aGlzLmJpbmRPbmx5V29ybGRNYXRyaXgod29ybGQpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJ2aWV3UHJvamVjdGlvblwiLCBzY2VuZS5nZXRUcmFuc2Zvcm1NYXRyaXgoKSk7XHJcblxyXG4gICAgICAgIC8vIEJvbmVzXHJcbiAgICAgICAgQmluZEJvbmVzUGFyYW1ldGVycyhtZXNoLCB0aGlzLl9hY3RpdmVFZmZlY3QpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbXVzdFJlYmluZChzY2VuZSwgZWZmZWN0LCBzdWJNZXNoKSkge1xyXG4gICAgICAgICAgICAvLyBUZXh0dXJlc1xyXG4gICAgICAgICAgICBpZiAodGhpcy5idW1wVGV4dHVyZSAmJiBNYXRlcmlhbEZsYWdzLkJ1bXBUZXh0dXJlRW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFRleHR1cmUoXCJub3JtYWxTYW1wbGVyXCIsIHRoaXMuYnVtcFRleHR1cmUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdDIoXCJ2Tm9ybWFsSW5mb3NcIiwgdGhpcy5idW1wVGV4dHVyZS5jb29yZGluYXRlc0luZGV4LCB0aGlzLmJ1bXBUZXh0dXJlLmxldmVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJub3JtYWxNYXRyaXhcIiwgdGhpcy5idW1wVGV4dHVyZS5nZXRUZXh0dXJlTWF0cml4KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIENsaXAgcGxhbmVcclxuICAgICAgICAgICAgYmluZENsaXBQbGFuZShlZmZlY3QsIHRoaXMsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBvaW50IHNpemVcclxuICAgICAgICAgICAgaWYgKHRoaXMucG9pbnRzQ2xvdWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcInBvaW50U2l6ZVwiLCB0aGlzLnBvaW50U2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIExvZy4gZGVwdGhcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3VzZUxvZ2FyaXRobWljRGVwdGgpIHtcclxuICAgICAgICAgICAgICAgIEJpbmRMb2dEZXB0aChkZWZpbmVzLCBlZmZlY3QsIHNjZW5lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2NlbmUuYmluZEV5ZVBvc2l0aW9uKGVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9hY3RpdmVFZmZlY3Quc2V0Q29sb3I0KFwidkRpZmZ1c2VDb2xvclwiLCB0aGlzLmRpZmZ1c2VDb2xvciwgdGhpcy5hbHBoYSAqIG1lc2gudmlzaWJpbGl0eSk7XHJcblxyXG4gICAgICAgIGlmIChkZWZpbmVzLlNQRUNVTEFSVEVSTSkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVFZmZlY3Quc2V0Q29sb3I0KFwidlNwZWN1bGFyQ29sb3JcIiwgdGhpcy5zcGVjdWxhckNvbG9yLCB0aGlzLnNwZWN1bGFyUG93ZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjZW5lLmxpZ2h0c0VuYWJsZWQgJiYgIXRoaXMuZGlzYWJsZUxpZ2h0aW5nKSB7XHJcbiAgICAgICAgICAgIEJpbmRMaWdodHMoc2NlbmUsIG1lc2gsIHRoaXMuX2FjdGl2ZUVmZmVjdCwgZGVmaW5lcywgdGhpcy5tYXhTaW11bHRhbmVvdXNMaWdodHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVmlld1xyXG4gICAgICAgIGlmIChzY2VuZS5mb2dFbmFibGVkICYmIG1lc2guYXBwbHlGb2cgJiYgc2NlbmUuZm9nTW9kZSAhPT0gU2NlbmUuRk9HTU9ERV9OT05FKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJ2aWV3XCIsIHNjZW5lLmdldFZpZXdNYXRyaXgoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGb2dcclxuICAgICAgICBCaW5kRm9nUGFyYW1ldGVycyhzY2VuZSwgbWVzaCwgdGhpcy5fYWN0aXZlRWZmZWN0KTtcclxuXHJcbiAgICAgICAgLy8gTG9nLiBkZXB0aFxyXG4gICAgICAgIEJpbmRMb2dEZXB0aChkZWZpbmVzLCB0aGlzLl9hY3RpdmVFZmZlY3QsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgLy8gV2F0ZXJcclxuICAgICAgICBpZiAoTWF0ZXJpYWxGbGFncy5SZWZsZWN0aW9uVGV4dHVyZUVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFRleHR1cmUoXCJyZWZyYWN0aW9uU2FtcGxlclwiLCB0aGlzLl9yZWZyYWN0aW9uUlRUKTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFRleHR1cmUoXCJyZWZsZWN0aW9uU2FtcGxlclwiLCB0aGlzLl9yZWZsZWN0aW9uUlRUKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdydnAgPSB0aGlzLl9yZWZsZWN0aW9uVHJhbnNmb3JtLm11bHRpcGx5KHNjZW5lLmdldFByb2plY3Rpb25NYXRyaXgoKSk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBkZWx0YSB0aW1lLiBQcmV2ZW50IGFkZGluZyBkZWx0YSB0aW1lIGlmIGl0IGhhc24ndCBjaGFuZ2VkLlxyXG4gICAgICAgIGNvbnN0IGRlbHRhVGltZSA9IHNjZW5lLmdldEVuZ2luZSgpLmdldERlbHRhVGltZSgpO1xyXG4gICAgICAgIGlmIChkZWx0YVRpbWUgIT09IHRoaXMuX2xhc3REZWx0YVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERlbHRhVGltZSA9IGRlbHRhVGltZTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFRpbWUgKz0gdGhpcy5fbGFzdERlbHRhVGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRNYXRyaXgoXCJyZWZsZWN0aW9uVmlld1Byb2plY3Rpb25cIiwgd3J2cCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldFZlY3RvcjIoXCJ3aW5kRGlyZWN0aW9uXCIsIHRoaXMud2luZERpcmVjdGlvbik7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwid2F2ZUxlbmd0aFwiLCB0aGlzLndhdmVMZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcInRpbWVcIiwgdGhpcy5fbGFzdFRpbWUgLyAxMDAwMDApO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcIndpbmRGb3JjZVwiLCB0aGlzLndpbmRGb3JjZSk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwid2F2ZUhlaWdodFwiLCB0aGlzLndhdmVIZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcImJ1bXBIZWlnaHRcIiwgdGhpcy5idW1wSGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVFZmZlY3Quc2V0Q29sb3I0KFwid2F0ZXJDb2xvclwiLCB0aGlzLndhdGVyQ29sb3IsIDEuMCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwiY29sb3JCbGVuZEZhY3RvclwiLCB0aGlzLmNvbG9yQmxlbmRGYWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRDb2xvcjQoXCJ3YXRlckNvbG9yMlwiLCB0aGlzLndhdGVyQ29sb3IyLCAxLjApO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcImNvbG9yQmxlbmRGYWN0b3IyXCIsIHRoaXMuY29sb3JCbGVuZEZhY3RvcjIpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUVmZmVjdC5zZXRGbG9hdChcIndhdmVTcGVlZFwiLCB0aGlzLndhdmVTcGVlZCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRWZmZWN0LnNldEZsb2F0KFwid2F2ZUNvdW50XCIsIHRoaXMud2F2ZUNvdW50KTtcclxuXHJcbiAgICAgICAgLy8gaW1hZ2UgcHJvY2Vzc2luZ1xyXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uICYmICF0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLmFwcGx5QnlQb3N0UHJvY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uLmJpbmQodGhpcy5fYWN0aXZlRWZmZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2FmdGVyQmluZChtZXNoLCB0aGlzLl9hY3RpdmVFZmZlY3QsIHN1Yk1lc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZVJlbmRlclRhcmdldHMoc2NlbmU6IFNjZW5lLCByZW5kZXJUYXJnZXRTaXplOiBWZWN0b3IyKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVuZGVyIHRhcmdldHNcclxuICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRUID0gbmV3IFJlbmRlclRhcmdldFRleHR1cmUobmFtZSArIFwiX3JlZnJhY3Rpb25cIiwgeyB3aWR0aDogcmVuZGVyVGFyZ2V0U2l6ZS54LCBoZWlnaHQ6IHJlbmRlclRhcmdldFNpemUueSB9LCBzY2VuZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3JlZnJhY3Rpb25SVFQud3JhcFUgPSBDb25zdGFudHMuVEVYVFVSRV9NSVJST1JfQUREUkVTU01PREU7XHJcbiAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC53cmFwViA9IENvbnN0YW50cy5URVhUVVJFX01JUlJPUl9BRERSRVNTTU9ERTtcclxuICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULmlnbm9yZUNhbWVyYVZpZXdwb3J0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IGJvdW5kaW5nQm94UmVuZGVyZXJFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC5vbkJlZm9yZVJlbmRlck9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgYm91bmRpbmdCb3hSZW5kZXJlckVuYWJsZWQgPSBzY2VuZS5nZXRCb3VuZGluZ0JveFJlbmRlcmVyKCkuZW5hYmxlZDtcclxuICAgICAgICAgICAgc2NlbmUuZ2V0Qm91bmRpbmdCb3hSZW5kZXJlcigpLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9yZWZyYWN0aW9uUlRULm9uQWZ0ZXJSZW5kZXJPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHNjZW5lLmdldEJvdW5kaW5nQm94UmVuZGVyZXIoKS5lbmFibGVkID0gYm91bmRpbmdCb3hSZW5kZXJlckVuYWJsZWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQgPSBuZXcgUmVuZGVyVGFyZ2V0VGV4dHVyZShuYW1lICsgXCJfcmVmbGVjdGlvblwiLCB7IHdpZHRoOiByZW5kZXJUYXJnZXRTaXplLngsIGhlaWdodDogcmVuZGVyVGFyZ2V0U2l6ZS55IH0sIHNjZW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fcmVmbGVjdGlvblJUVC53cmFwVSA9IENvbnN0YW50cy5URVhUVVJFX01JUlJPUl9BRERSRVNTTU9ERTtcclxuICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULndyYXBWID0gQ29uc3RhbnRzLlRFWFRVUkVfTUlSUk9SX0FERFJFU1NNT0RFO1xyXG4gICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQuaWdub3JlQ2FtZXJhVmlld3BvcnQgPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgaXNWaXNpYmxlOiBib29sZWFuO1xyXG4gICAgICAgIGxldCBjbGlwUGxhbmU6IE51bGxhYmxlPFBsYW5lPiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNhdmVkVmlld01hdHJpeDogTWF0cml4O1xyXG4gICAgICAgIGNvbnN0IG1pcnJvck1hdHJpeCA9IE1hdHJpeC5aZXJvKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZnJhY3Rpb25SVFQub25CZWZvcmVSZW5kZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXNoKSB7XHJcbiAgICAgICAgICAgICAgICBpc1Zpc2libGUgPSB0aGlzLl9tZXNoLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc2guaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIENsaXAgcGxhbmVcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDbGlwUGxhbmUpIHtcclxuICAgICAgICAgICAgICAgIGNsaXBQbGFuZSA9IHNjZW5lLmNsaXBQbGFuZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbnkgPSB0aGlzLl9tZXNoID8gdGhpcy5fbWVzaC5hYnNvbHV0ZVBvc2l0aW9uLnkgOiAwLjA7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS5jbGlwUGxhbmUgPSBQbGFuZS5Gcm9tUG9zaXRpb25BbmROb3JtYWwobmV3IFZlY3RvcjMoMCwgcG9zaXRpb255ICsgMC4wNSwgMCksIG5ldyBWZWN0b3IzKDAsIDEsIDApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZnJhY3Rpb25SVFQub25BZnRlclJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21lc2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc2guaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDbGlwIHBsYW5lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2xpcFBsYW5lKSB7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS5jbGlwUGxhbmUgPSBjbGlwUGxhbmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULm9uQmVmb3JlUmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVzaCkge1xyXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlID0gdGhpcy5fbWVzaC5pc1Zpc2libGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNoLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDbGlwIHBsYW5lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2xpcFBsYW5lKSB7XHJcbiAgICAgICAgICAgICAgICBjbGlwUGxhbmUgPSBzY2VuZS5jbGlwUGxhbmU7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb255ID0gdGhpcy5fbWVzaCA/IHRoaXMuX21lc2guYWJzb2x1dGVQb3NpdGlvbi55IDogMC4wO1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuY2xpcFBsYW5lID0gUGxhbmUuRnJvbVBvc2l0aW9uQW5kTm9ybWFsKG5ldyBWZWN0b3IzKDAsIHBvc2l0aW9ueSAtIDAuMDUsIDApLCBuZXcgVmVjdG9yMygwLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIE1hdHJpeC5SZWZsZWN0aW9uVG9SZWYoc2NlbmUuY2xpcFBsYW5lLCBtaXJyb3JNYXRyaXgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm1cclxuICAgICAgICAgICAgc2F2ZWRWaWV3TWF0cml4ID0gc2NlbmUuZ2V0Vmlld01hdHJpeCgpO1xyXG5cclxuICAgICAgICAgICAgbWlycm9yTWF0cml4Lm11bHRpcGx5VG9SZWYoc2F2ZWRWaWV3TWF0cml4LCB0aGlzLl9yZWZsZWN0aW9uVHJhbnNmb3JtKTtcclxuICAgICAgICAgICAgc2NlbmUuc2V0VHJhbnNmb3JtTWF0cml4KHRoaXMuX3JlZmxlY3Rpb25UcmFuc2Zvcm0sIHNjZW5lLmdldFByb2plY3Rpb25NYXRyaXgoKSk7XHJcbiAgICAgICAgICAgIHNjZW5lLl9taXJyb3JlZENhbWVyYVBvc2l0aW9uID0gVmVjdG9yMy5UcmFuc2Zvcm1Db29yZGluYXRlcygoPENhbWVyYT5zY2VuZS5hY3RpdmVDYW1lcmEpLnBvc2l0aW9uLCBtaXJyb3JNYXRyaXgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZmxlY3Rpb25SVFQub25BZnRlclJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21lc2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc2guaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBDbGlwIHBsYW5lXHJcbiAgICAgICAgICAgIHNjZW5lLmNsaXBQbGFuZSA9IGNsaXBQbGFuZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybVxyXG4gICAgICAgICAgICBzY2VuZS5zZXRUcmFuc2Zvcm1NYXRyaXgoc2F2ZWRWaWV3TWF0cml4LCBzY2VuZS5nZXRQcm9qZWN0aW9uTWF0cml4KCkpO1xyXG4gICAgICAgICAgICBzY2VuZS5fbWlycm9yZWRDYW1lcmFQb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0QW5pbWF0YWJsZXMoKTogSUFuaW1hdGFibGVbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5idW1wVGV4dHVyZSAmJiB0aGlzLmJ1bXBUZXh0dXJlLmFuaW1hdGlvbnMgJiYgdGhpcy5idW1wVGV4dHVyZS5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuYnVtcFRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCAmJiB0aGlzLl9yZWZsZWN0aW9uUlRULmFuaW1hdGlvbnMgJiYgdGhpcy5fcmVmbGVjdGlvblJUVC5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX3JlZmxlY3Rpb25SVFQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcmVmcmFjdGlvblJUVCAmJiB0aGlzLl9yZWZyYWN0aW9uUlRULmFuaW1hdGlvbnMgJiYgdGhpcy5fcmVmcmFjdGlvblJUVC5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX3JlZnJhY3Rpb25SVFQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldEFjdGl2ZVRleHR1cmVzKCk6IEJhc2VUZXh0dXJlW10ge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZVRleHR1cmVzID0gc3VwZXIuZ2V0QWN0aXZlVGV4dHVyZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2J1bXBUZXh0dXJlKSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZVRleHR1cmVzLnB1c2godGhpcy5fYnVtcFRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFjdGl2ZVRleHR1cmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBoYXNUZXh0dXJlKHRleHR1cmU6IEJhc2VUZXh0dXJlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHN1cGVyLmhhc1RleHR1cmUodGV4dHVyZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fYnVtcFRleHR1cmUgPT09IHRleHR1cmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc3Bvc2UoZm9yY2VEaXNwb3NlRWZmZWN0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmJ1bXBUZXh0dXJlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVtcFRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5nZXRTY2VuZSgpLmN1c3RvbVJlbmRlclRhcmdldHMuaW5kZXhPZig8UmVuZGVyVGFyZ2V0VGV4dHVyZT50aGlzLl9yZWZyYWN0aW9uUlRUKTtcclxuICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRTY2VuZSgpLmN1c3RvbVJlbmRlclRhcmdldHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAtMTtcclxuICAgICAgICBpbmRleCA9IHRoaXMuZ2V0U2NlbmUoKS5jdXN0b21SZW5kZXJUYXJnZXRzLmluZGV4T2YoPFJlbmRlclRhcmdldFRleHR1cmU+dGhpcy5fcmVmbGVjdGlvblJUVCk7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U2NlbmUoKS5jdXN0b21SZW5kZXJUYXJnZXRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVmbGVjdGlvblJUVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWZsZWN0aW9uUlRULmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlZnJhY3Rpb25SVFQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVmcmFjdGlvblJUVC5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZW1vdmUgaW1hZ2UtcHJvY2Vzc2luZyBvYnNlcnZlclxyXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZVByb2Nlc3NpbmdDb25maWd1cmF0aW9uICYmIHRoaXMuX2ltYWdlUHJvY2Vzc2luZ09ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlUHJvY2Vzc2luZ0NvbmZpZ3VyYXRpb24ub25VcGRhdGVQYXJhbWV0ZXJzLnJlbW92ZSh0aGlzLl9pbWFnZVByb2Nlc3NpbmdPYnNlcnZlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5kaXNwb3NlKGZvcmNlRGlzcG9zZUVmZmVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGNsb25lKG5hbWU6IHN0cmluZyk6IFdhdGVyTWF0ZXJpYWwge1xyXG4gICAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uSGVscGVyLkNsb25lKCgpID0+IG5ldyBXYXRlck1hdGVyaWFsKG5hbWUsIHRoaXMuZ2V0U2NlbmUoKSksIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLldhdGVyTWF0ZXJpYWxcIjtcclxuXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5yZW5kZXJMaXN0ID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlZnJhY3Rpb25SVFQgJiYgdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcmVmcmFjdGlvblJUVC5yZW5kZXJMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LnJlbmRlckxpc3QucHVzaCh0aGlzLl9yZWZyYWN0aW9uUlRULnJlbmRlckxpc3RbaV0uaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiV2F0ZXJNYXRlcmlhbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXRpY3NcclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2Uoc291cmNlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogV2F0ZXJNYXRlcmlhbCB7XHJcbiAgICAgICAgY29uc3QgbWF0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZSgoKSA9PiBuZXcgV2F0ZXJNYXRlcmlhbChzb3VyY2UubmFtZSwgc2NlbmUpLCBzb3VyY2UsIHNjZW5lLCByb290VXJsKTtcclxuICAgICAgICBtYXQuX3dhaXRpbmdSZW5kZXJMaXN0ID0gc291cmNlLnJlbmRlckxpc3Q7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDcmVhdGVEZWZhdWx0TWVzaChuYW1lOiBzdHJpbmcsIHNjZW5lOiBTY2VuZSk6IE1lc2gge1xyXG4gICAgICAgIGNvbnN0IG1lc2ggPSBDcmVhdGVHcm91bmQobmFtZSwgeyB3aWR0aDogNTEyLCBoZWlnaHQ6IDUxMiwgc3ViZGl2aXNpb25zOiAzMiwgdXBkYXRhYmxlOiBmYWxzZSB9LCBzY2VuZSk7XHJcbiAgICAgICAgcmV0dXJuIG1lc2g7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLldhdGVyTWF0ZXJpYWxcIiwgV2F0ZXJNYXRlcmlhbCk7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmltcG9ydCAqIGFzIE1hdExpYiBmcm9tIFwibWF0ZXJpYWxzL3dhdGVyL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBVTUQgbW9kdWxlLlxyXG4gKiBUaGUgZW50cnkgcG9pbnQgZm9yIGEgZnV0dXJlIEVTTSBwYWNrYWdlIHNob3VsZCBiZSBpbmRleC50c1xyXG4gKi9cclxuY29uc3QgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XHJcbmlmICh0eXBlb2YgZ2xvYmFsT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBNYXRMaWIpIHtcclxuICAgICAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT05ba2V5XSA9ICg8YW55Pk1hdExpYilba2V5XTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0ICogZnJvbSBcIm1hdGVyaWFscy93YXRlci9pbmRleFwiO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGVyaWFsc19lZmZlY3RfXzsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgKiBhcyBtYXRlcmlhbHMgZnJvbSBcIkBsdHMvbWF0ZXJpYWxzL2xlZ2FjeS9sZWdhY3ktd2F0ZXJcIjtcclxuZXhwb3J0IHsgbWF0ZXJpYWxzIH07XHJcbmV4cG9ydCBkZWZhdWx0IG1hdGVyaWFscztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|