vendor: 3,594 bytes, lines 1-88
1/******/ (function(modules) { // webpackBootstrap 2/******/ // The module cache 3/******/ var installedModules = {}; 4/******/ 5/******/ // The require function 6/******/ function __webpack_require__(moduleId) { 7/******/ 8/******/ // Check if module is in cache 9/******/ if(installedModules[moduleId]) { 10/******/ return installedModules[moduleId].exports; 11/******/ } 12/******/ // Create a new module (and put it into the cache) 13/******/ var module = installedModules[moduleId] = { 14/******/ i: moduleId, 15/******/ l: false, 16/******/ exports: {} 17/******/ }; 18/******/ 19/******/ // Execute the module function 20/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21/******/ 22/******/ // Flag the module as loaded 23/******/ module.l = true; 24/******/ 25/******/ // Return the exports of the module 26/******/ return module.exports; 27/******/ } 28/******/ 29/******/ 30/******/ // expose the modules object (__webpack_modules__) 31/******/ __webpack_require__.m = modules; 32/******/ 33/******/ // expose the module cache 34/******/ __webpack_require__.c = installedModules; 35/******/ 36/******/ // define getter function for harmony exports 37/******/ __webpack_require__.d = function(exports, name, getter) { 38/******/ if(!__webpack_require__.o(exports, name)) { 39/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40/******/ } 41/******/ }; 42/******/ 43/******/ // define __esModule on exports 44/******/ __webpack_require__.r = function(exports) { 45/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47/******/ } 48/******/ Object.defineProperty(exports, '__esModule', { value: true }); 49/******/ }; 50/******/ 51/******/ // create a fake namespace object 52/******/ // mode & 1: value is a module id, require it 53/******/ // mode & 2: merge all properties of value into the ns 54/******/ // mode & 4: return value when already ns object 55/******/ // mode & 8|1: behave like require 56/******/ __webpack_require__.t = function(value, mode) { 57/******/ if(mode & 1) value = __webpack_require__(value); 58/******/ if(mode & 8) return value; 59/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60/******/ var ns = Object.create(null); 61/******/ __webpack_require__.r(ns); 62/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64/******/ return ns; 65/******/ }; 66/******/ 67/******/ // getDefaultExport function for compatibility with non-harmony modules 68/******/ __webpack_require__.n = function(module) { 69/******/ var getter = module && module.__esModule ? 70/******/ function getDefault() { return module['default']; } : 71/******/ function getModuleExports() { return module; }; 72/******/ __webpack_require__.d(getter, 'a', getter); 73/******/ return getter; 74/******/ }; 75/******/ 76/******/ // Object.prototype.hasOwnProperty.call 77/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78/******/ 79/******/ // __webpack_public_path__ 80/******/ __webpack_require__.p = ""; 81/******/ 82/******/ 83/******/ // Load entry module and return exports 84/******/ return __webpack_require__(__webpack_require__.s = 1); 85/******/ }) 86/************************************************************************/ 87/******/ ({ 88
vendor: 1,588 bytes, lines 89-128
89/***/ "../node_modules/babel-polyfill/lib/index.js": 90/*!***************************************************!*\ 91 !*** ../node_modules/babel-polyfill/lib/index.js ***! 92 \***************************************************/ 93/*! no static exports found */ 94/***/ (function(module, exports, __webpack_require__) { 95 96"use strict"; 97/* WEBPACK VAR INJECTION */(function(global) { 98 99__webpack_require__(/*! core-js/shim */ "../node_modules/babel-polyfill/node_modules/core-js/shim.js"); 100 101__webpack_require__(/*! regenerator-runtime/runtime */ "../node_modules/regenerator-runtime/runtime.js"); 102 103__webpack_require__(/*! core-js/fn/regexp/escape */ "../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js"); 104 105if (global._babelPolyfill) { 106 throw new Error("only one instance of babel-polyfill is allowed"); 107} 108 109global._babelPolyfill = true; 110var DEFINE_PROPERTY = "defineProperty"; 111 112function define(O, key, value) { 113 O[key] || Object[DEFINE_PROPERTY](O, key, { 114 writable: true, 115 configurable: true, 116 value: value 117 }); 118} 119 120define(String.prototype, "padLeft", "".padStart); 121define(String.prototype, "padRight", "".padEnd); 122"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function (key) { 123 [][key] && define(Array, key, Function.call.bind([][key])); 124}); 125/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "../node_modules/webpack/buildin/global.js"))) 126 127/***/ }), 128
vendor: 733 bytes, lines 129-141
129/***/ "../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js": 130/*!*******************************************************************************!*\ 131 !*** ../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js ***! 132 \*******************************************************************************/ 133/*! no static exports found */ 134/***/ (function(module, exports, __webpack_require__) { 135 136__webpack_require__(/*! ../../modules/core.regexp.escape */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js"); 137 138module.exports = __webpack_require__(/*! ../../modules/_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js").RegExp.escape; 139 140/***/ }), 141
vendor: 551 bytes, lines 142-155
142/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js": 143/*!**********************************************************************************!*\ 144 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js ***! 145 \**********************************************************************************/ 146/*! no static exports found */ 147/***/ (function(module, exports) { 148 149module.exports = function (it) { 150 if (typeof it != 'function') throw TypeError(it + ' is not a function!'); 151 return it; 152}; 153 154/***/ }), 155
vendor: 709 bytes, lines 156-171
156/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js": 157/*!**************************************************************************************!*\ 158 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js ***! 159 \**************************************************************************************/ 160/*! no static exports found */ 161/***/ (function(module, exports, __webpack_require__) { 162 163var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 164 165module.exports = function (it, msg) { 166 if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg); 167 return +it; 168}; 169 170/***/ }), 171
vendor: 953 bytes, lines 172-190
172/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js": 173/*!******************************************************************************************!*\ 174 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js ***! 175 \******************************************************************************************/ 176/*! no static exports found */ 177/***/ (function(module, exports, __webpack_require__) { 178 179// 22.1.3.31 Array.prototype[@@unscopables] 180var UNSCOPABLES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('unscopables'); 181 182var ArrayProto = Array.prototype; 183if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")(ArrayProto, UNSCOPABLES, {}); 184 185module.exports = function (key) { 186 ArrayProto[UNSCOPABLES][key] = true; 187}; 188 189/***/ }), 190
vendor: 844 bytes, lines 191-210
191/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js": 192/*!********************************************************************************************!*\ 193 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js ***! 194 \********************************************************************************************/ 195/*! no static exports found */ 196/***/ (function(module, exports, __webpack_require__) { 197 198"use strict"; 199 200 201var at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(true); // `AdvanceStringIndex` abstract operation 202// https://tc39.github.io/ecma262/#sec-advancestringindex 203 204 205module.exports = function (S, index, unicode) { 206 return index + (unicode ? at(S, index).length : 1); 207}; 208 209/***/ }), 210
vendor: 668 bytes, lines 211-227
211/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js": 212/*!***********************************************************************************!*\ 213 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js ***! 214 \***********************************************************************************/ 215/*! no static exports found */ 216/***/ (function(module, exports) { 217 218module.exports = function (it, Constructor, name, forbiddenField) { 219 if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) { 220 throw TypeError(name + ': incorrect invocation!'); 221 } 222 223 return it; 224}; 225 226/***/ }), 227
vendor: 691 bytes, lines 228-243
228/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js": 229/*!*********************************************************************************!*\ 230 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js ***! 231 \*********************************************************************************/ 232/*! no static exports found */ 233/***/ (function(module, exports, __webpack_require__) { 234 235var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 236 237module.exports = function (it) { 238 if (!isObject(it)) throw TypeError(it + ' is not an object!'); 239 return it; 240}; 241 242/***/ }), 243
vendor: 1,644 bytes, lines 244-290
244/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js": 245/*!*****************************************************************************************!*\ 246 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js ***! 247 \*****************************************************************************************/ 248/*! no static exports found */ 249/***/ (function(module, exports, __webpack_require__) { 250 251"use strict"; 252// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) 253 254 255var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 256 257var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 258 259var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 260 261module.exports = [].copyWithin || function copyWithin(target 262/* = 0 */ 263, start 264/* = 0, end = @length */ 265) { 266 var O = toObject(this); 267 var len = toLength(O.length); 268 var to = toAbsoluteIndex(target, len); 269 var from = toAbsoluteIndex(start, len); 270 var end = arguments.length > 2 ? arguments[2] : undefined; 271 var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); 272 var inc = 1; 273 274 if (from < to && to < from + count) { 275 inc = -1; 276 from += count - 1; 277 to += count - 1; 278 } 279 280 while (count-- > 0) { 281 if (from in O) O[to] = O[from];else delete O[to]; 282 to += inc; 283 from += inc; 284 } 285 286 return O; 287}; 288 289/***/ }), 290
vendor: 1,395 bytes, lines 291-326
291/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js": 292/*!**********************************************************************************!*\ 293 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js ***! 294 \**********************************************************************************/ 295/*! no static exports found */ 296/***/ (function(module, exports, __webpack_require__) { 297 298"use strict"; 299// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) 300 301 302var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 303 304var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 305 306var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 307 308module.exports = function fill(value 309/* , start = 0, end = @length */ 310) { 311 var O = toObject(this); 312 var length = toLength(O.length); 313 var aLen = arguments.length; 314 var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length); 315 var end = aLen > 2 ? arguments[2] : undefined; 316 var endPos = end === undefined ? length : toAbsoluteIndex(end, length); 317 318 while (endPos > index) { 319 O[index++] = value; 320 } 321 322 return O; 323}; 324 325/***/ }), 326
vendor: 745 bytes, lines 327-343
327/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js": 328/*!*******************************************************************************************!*\ 329 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js ***! 330 \*******************************************************************************************/ 331/*! no static exports found */ 332/***/ (function(module, exports, __webpack_require__) { 333 334var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 335 336module.exports = function (iter, ITERATOR) { 337 var result = []; 338 forOf(iter, false, result.push, result, ITERATOR); 339 return result; 340}; 341 342/***/ }), 343
vendor: 1,689 bytes, lines 344-381
344/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js": 345/*!**************************************************************************************!*\ 346 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js ***! 347 \**************************************************************************************/ 348/*! no static exports found */ 349/***/ (function(module, exports, __webpack_require__) { 350 351// false -> Array#indexOf 352// true -> Array#includes 353var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 354 355var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 356 357var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 358 359module.exports = function (IS_INCLUDES) { 360 return function ($this, el, fromIndex) { 361 var O = toIObject($this); 362 var length = toLength(O.length); 363 var index = toAbsoluteIndex(fromIndex, length); 364 var value; // Array#includes uses SameValueZero equality algorithm 365 // eslint-disable-next-line no-self-compare 366 367 if (IS_INCLUDES && el != el) while (length > index) { 368 value = O[index++]; // eslint-disable-next-line no-self-compare 369 370 if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not 371 } else for (; length > index; index++) { 372 if (IS_INCLUDES || index in O) { 373 if (O[index] === el) return IS_INCLUDES || index || 0; 374 } 375 } 376 return !IS_INCLUDES && -1; 377 }; 378}; 379 380/***/ }), 381
vendor: 2,556 bytes, lines 382-456
382/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js": 383/*!*************************************************************************************!*\ 384 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js ***! 385 \*************************************************************************************/ 386/*! no static exports found */ 387/***/ (function(module, exports, __webpack_require__) { 388 389// 0 -> Array#forEach 390// 1 -> Array#map 391// 2 -> Array#filter 392// 3 -> Array#some 393// 4 -> Array#every 394// 5 -> Array#find 395// 6 -> Array#findIndex 396var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 397 398var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js"); 399 400var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 401 402var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 403 404var asc = __webpack_require__(/*! ./_array-species-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js"); 405 406module.exports = function (TYPE, $create) { 407 var IS_MAP = TYPE == 1; 408 var IS_FILTER = TYPE == 2; 409 var IS_SOME = TYPE == 3; 410 var IS_EVERY = TYPE == 4; 411 var IS_FIND_INDEX = TYPE == 6; 412 var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; 413 var create = $create || asc; 414 return function ($this, callbackfn, that) { 415 var O = toObject($this); 416 var self = IObject(O); 417 var f = ctx(callbackfn, that, 3); 418 var length = toLength(self.length); 419 var index = 0; 420 var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; 421 var val, res; 422 423 for (; length > index; index++) { 424 if (NO_HOLES || index in self) { 425 val = self[index]; 426 res = f(val, index, O); 427 428 if (TYPE) { 429 if (IS_MAP) result[index] = res; // map 430 else if (res) switch (TYPE) { 431 case 3: 432 return true; 433 // some 434 435 case 5: 436 return val; 437 // find 438 439 case 6: 440 return index; 441 // findIndex 442 443 case 2: 444 result.push(val); 445 // filter 446 } else if (IS_EVERY) return false; // every 447 } 448 } 449 } 450 451 return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; 452 }; 453}; 454 455/***/ }), 456
vendor: 1,669 bytes, lines 457-503
457/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js": 458/*!************************************************************************************!*\ 459 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js ***! 460 \************************************************************************************/ 461/*! no static exports found */ 462/***/ (function(module, exports, __webpack_require__) { 463 464var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 465 466var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 467 468var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js"); 469 470var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 471 472module.exports = function (that, callbackfn, aLen, memo, isRight) { 473 aFunction(callbackfn); 474 var O = toObject(that); 475 var self = IObject(O); 476 var length = toLength(O.length); 477 var index = isRight ? length - 1 : 0; 478 var i = isRight ? -1 : 1; 479 if (aLen < 2) for (;;) { 480 if (index in self) { 481 memo = self[index]; 482 index += i; 483 break; 484 } 485 486 index += i; 487 488 if (isRight ? index < 0 : length <= index) { 489 throw TypeError('Reduce of empty array with no initial value'); 490 } 491 } 492 493 for (; isRight ? index >= 0 : length > index; index += i) { 494 if (index in self) { 495 memo = callbackfn(memo, self[index], index, O); 496 } 497 } 498 499 return memo; 500}; 501 502/***/ }), 503
vendor: 1,258 bytes, lines 504-535
504/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js": 505/*!*************************************************************************************************!*\ 506 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js ***! 507 \*************************************************************************************************/ 508/*! no static exports found */ 509/***/ (function(module, exports, __webpack_require__) { 510 511var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 512 513var isArray = __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js"); 514 515var SPECIES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species'); 516 517module.exports = function (original) { 518 var C; 519 520 if (isArray(original)) { 521 C = original.constructor; // cross-realm fallback 522 523 if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; 524 525 if (isObject(C)) { 526 C = C[SPECIES]; 527 if (C === null) C = undefined; 528 } 529 } 530 531 return C === undefined ? Array : C; 532}; 533 534/***/ }), 535
vendor: 819 bytes, lines 536-551
536/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js": 537/*!********************************************************************************************!*\ 538 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js ***! 539 \********************************************************************************************/ 540/*! no static exports found */ 541/***/ (function(module, exports, __webpack_require__) { 542 543// 9.4.2.3 ArraySpeciesCreate(originalArray, length) 544var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js"); 545 546module.exports = function (original, length) { 547 return new (speciesConstructor(original))(length); 548}; 549 550/***/ }), 551
vendor: 1,645 bytes, lines 552-602
552/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js": 553/*!****************************************************************************!*\ 554 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js ***! 555 \****************************************************************************/ 556/*! no static exports found */ 557/***/ (function(module, exports, __webpack_require__) { 558 559"use strict"; 560 561 562var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 563 564var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 565 566var invoke = __webpack_require__(/*! ./_invoke */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js"); 567 568var arraySlice = [].slice; 569var factories = {}; 570 571var construct = function construct(F, len, args) { 572 if (!(len in factories)) { 573 for (var n = [], i = 0; i < len; i++) { 574 n[i] = 'a[' + i + ']'; 575 } // eslint-disable-next-line no-new-func 576 577 578 factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); 579 } 580 581 return factories[len](F, args); 582}; 583 584module.exports = Function.bind || function bind(that 585/* , ...args */ 586) { 587 var fn = aFunction(this); 588 var partArgs = arraySlice.call(arguments, 1); 589 590 var bound = function bound() 591 /* args... */ 592 { 593 var args = partArgs.concat(arraySlice.call(arguments)); 594 return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that); 595 }; 596 597 if (isObject(fn.prototype)) bound.prototype = fn.prototype; 598 return bound; 599}; 600 601/***/ }), 602
vendor: 1,326 bytes, lines 603-637
603/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js": 604/*!*******************************************************************************!*\ 605 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js ***! 606 \*******************************************************************************/ 607/*! no static exports found */ 608/***/ (function(module, exports, __webpack_require__) { 609 610// getting tag from 19.1.3.6 Object.prototype.toString() 611var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 612 613var TAG = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toStringTag'); // ES3 wrong here 614 615 616var ARG = cof(function () { 617 return arguments; 618}()) == 'Arguments'; // fallback for IE11 Script Access Denied error 619 620var tryGet = function tryGet(it, key) { 621 try { 622 return it[key]; 623 } catch (e) { 624 /* empty */ 625 } 626}; 627 628module.exports = function (it) { 629 var O, T, B; 630 return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case 631 : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case 632 : ARG ? cof(O) // ES3 arguments fallback 633 : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; 634}; 635 636/***/ }), 637
vendor: 504 bytes, lines 638-652
638/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js": 639/*!***************************************************************************!*\ 640 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js ***! 641 \***************************************************************************/ 642/*! no static exports found */ 643/***/ (function(module, exports) { 644 645var toString = {}.toString; 646 647module.exports = function (it) { 648 return toString.call(it).slice(8, -1); 649}; 650 651/***/ }), 652
vendor: 6,610 bytes, lines 653-846
653/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js": 654/*!*****************************************************************************************!*\ 655 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js ***! 656 \*****************************************************************************************/ 657/*! no static exports found */ 658/***/ (function(module, exports, __webpack_require__) { 659 660"use strict"; 661 662 663var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 664 665var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js"); 666 667var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js"); 668 669var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 670 671var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 672 673var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 674 675var $iterDefine = __webpack_require__(/*! ./_iter-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js"); 676 677var step = __webpack_require__(/*! ./_iter-step */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js"); 678 679var setSpecies = __webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js"); 680 681var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"); 682 683var fastKey = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").fastKey; 684 685var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 686 687var SIZE = DESCRIPTORS ? '_s' : 'size'; 688 689var getEntry = function getEntry(that, key) { 690 // fast case 691 var index = fastKey(key); 692 var entry; 693 if (index !== 'F') return that._i[index]; // frozen object case 694 695 for (entry = that._f; entry; entry = entry.n) { 696 if (entry.k == key) return entry; 697 } 698}; 699 700module.exports = { 701 getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) { 702 var C = wrapper(function (that, iterable) { 703 anInstance(that, C, NAME, '_i'); 704 that._t = NAME; // collection type 705 706 that._i = create(null); // index 707 708 that._f = undefined; // first entry 709 710 that._l = undefined; // last entry 711 712 that[SIZE] = 0; // size 713 714 if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); 715 }); 716 redefineAll(C.prototype, { 717 // 23.1.3.1 Map.prototype.clear() 718 // 23.2.3.2 Set.prototype.clear() 719 clear: function clear() { 720 for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { 721 entry.r = true; 722 if (entry.p) entry.p = entry.p.n = undefined; 723 delete data[entry.i]; 724 } 725 726 that._f = that._l = undefined; 727 that[SIZE] = 0; 728 }, 729 // 23.1.3.3 Map.prototype.delete(key) 730 // 23.2.3.4 Set.prototype.delete(value) 731 'delete': function _delete(key) { 732 var that = validate(this, NAME); 733 var entry = getEntry(that, key); 734 735 if (entry) { 736 var next = entry.n; 737 var prev = entry.p; 738 delete that._i[entry.i]; 739 entry.r = true; 740 if (prev) prev.n = next; 741 if (next) next.p = prev; 742 if (that._f == entry) that._f = next; 743 if (that._l == entry) that._l = prev; 744 that[SIZE]--; 745 } 746 747 return !!entry; 748 }, 749 // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) 750 // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) 751 forEach: function forEach(callbackfn 752 /* , that = undefined */ 753 ) { 754 validate(this, NAME); 755 var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); 756 var entry; 757 758 while (entry = entry ? entry.n : this._f) { 759 f(entry.v, entry.k, this); // revert to the last existing entry 760 761 while (entry && entry.r) { 762 entry = entry.p; 763 } 764 } 765 }, 766 // 23.1.3.7 Map.prototype.has(key) 767 // 23.2.3.7 Set.prototype.has(value) 768 has: function has(key) { 769 return !!getEntry(validate(this, NAME), key); 770 } 771 }); 772 if (DESCRIPTORS) dP(C.prototype, 'size', { 773 get: function get() { 774 return validate(this, NAME)[SIZE]; 775 } 776 }); 777 return C; 778 }, 779 def: function def(that, key, value) { 780 var entry = getEntry(that, key); 781 var prev, index; // change existing entry 782 783 if (entry) { 784 entry.v = value; // create new entry 785 } else { 786 that._l = entry = { 787 i: index = fastKey(key, true), 788 // <- index 789 k: key, 790 // <- key 791 v: value, 792 // <- value 793 p: prev = that._l, 794 // <- previous entry 795 n: undefined, 796 // <- next entry 797 r: false // <- removed 798 799 }; 800 if (!that._f) that._f = entry; 801 if (prev) prev.n = entry; 802 that[SIZE]++; // add to index 803 804 if (index !== 'F') that._i[index] = entry; 805 } 806 807 return that; 808 }, 809 getEntry: getEntry, 810 setStrong: function setStrong(C, NAME, IS_MAP) { 811 // add .keys, .values, .entries, [@@iterator] 812 // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 813 $iterDefine(C, NAME, function (iterated, kind) { 814 this._t = validate(iterated, NAME); // target 815 816 this._k = kind; // kind 817 818 this._l = undefined; // previous 819 }, function () { 820 var that = this; 821 var kind = that._k; 822 var entry = that._l; // revert to the last existing entry 823 824 while (entry && entry.r) { 825 entry = entry.p; 826 } // get next entry 827 828 829 if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { 830 // or finish the iteration 831 that._t = undefined; 832 return step(1); 833 } // return step by kind 834 835 836 if (kind == 'keys') return step(0, entry.k); 837 if (kind == 'values') return step(0, entry.v); 838 return step(0, [entry.k, entry.v]); 839 }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2 840 841 setSpecies(NAME); 842 } 843}; 844 845/***/ }), 846
vendor: 992 bytes, lines 847-867
847/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js": 848/*!******************************************************************************************!*\ 849 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js ***! 850 \******************************************************************************************/ 851/*! no static exports found */ 852/***/ (function(module, exports, __webpack_require__) { 853 854// https://github.com/DavidBruant/Map-Set.prototype.toJSON 855var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js"); 856 857var from = __webpack_require__(/*! ./_array-from-iterable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js"); 858 859module.exports = function (NAME) { 860 return function toJSON() { 861 if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic"); 862 return from(this); 863 }; 864}; 865 866/***/ }), 867
vendor: 4,189 bytes, lines 868-975
868/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js": 869/*!***************************************************************************************!*\ 870 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js ***! 871 \***************************************************************************************/ 872/*! no static exports found */ 873/***/ (function(module, exports, __webpack_require__) { 874 875"use strict"; 876 877 878var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js"); 879 880var getWeak = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").getWeak; 881 882var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 883 884var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 885 886var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 887 888var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 889 890var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js"); 891 892var $has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 893 894var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 895 896var arrayFind = createArrayMethod(5); 897var arrayFindIndex = createArrayMethod(6); 898var id = 0; // fallback for uncaught frozen keys 899 900var uncaughtFrozenStore = function uncaughtFrozenStore(that) { 901 return that._l || (that._l = new UncaughtFrozenStore()); 902}; 903 904var UncaughtFrozenStore = function UncaughtFrozenStore() { 905 this.a = []; 906}; 907 908var findUncaughtFrozen = function findUncaughtFrozen(store, key) { 909 return arrayFind(store.a, function (it) { 910 return it[0] === key; 911 }); 912}; 913 914UncaughtFrozenStore.prototype = { 915 get: function get(key) { 916 var entry = findUncaughtFrozen(this, key); 917 if (entry) return entry[1]; 918 }, 919 has: function has(key) { 920 return !!findUncaughtFrozen(this, key); 921 }, 922 set: function set(key, value) { 923 var entry = findUncaughtFrozen(this, key); 924 if (entry) entry[1] = value;else this.a.push([key, value]); 925 }, 926 'delete': function _delete(key) { 927 var index = arrayFindIndex(this.a, function (it) { 928 return it[0] === key; 929 }); 930 if (~index) this.a.splice(index, 1); 931 return !!~index; 932 } 933}; 934module.exports = { 935 getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) { 936 var C = wrapper(function (that, iterable) { 937 anInstance(that, C, NAME, '_i'); 938 that._t = NAME; // collection type 939 940 that._i = id++; // collection id 941 942 that._l = undefined; // leak store for uncaught frozen objects 943 944 if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); 945 }); 946 redefineAll(C.prototype, { 947 // 23.3.3.2 WeakMap.prototype.delete(key) 948 // 23.4.3.3 WeakSet.prototype.delete(value) 949 'delete': function _delete(key) { 950 if (!isObject(key)) return false; 951 var data = getWeak(key); 952 if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); 953 return data && $has(data, this._i) && delete data[this._i]; 954 }, 955 // 23.3.3.4 WeakMap.prototype.has(key) 956 // 23.4.3.4 WeakSet.prototype.has(value) 957 has: function has(key) { 958 if (!isObject(key)) return false; 959 var data = getWeak(key); 960 if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); 961 return data && $has(data, this._i); 962 } 963 }); 964 return C; 965 }, 966 def: function def(that, key, value) { 967 var data = getWeak(anObject(key), true); 968 if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value; 969 return that; 970 }, 971 ufstore: uncaughtFrozenStore 972}; 973 974/***/ }), 975
vendor: 4,930 bytes, lines 976-1097
976/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js": 977/*!**********************************************************************************!*\ 978 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js ***! 979 \**********************************************************************************/ 980/*! no static exports found */ 981/***/ (function(module, exports, __webpack_require__) { 982 983"use strict"; 984 985 986var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 987 988var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 989 990var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 991 992var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js"); 993 994var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js"); 995 996var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 997 998var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 999 1000var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 1001 1002var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 1003 1004var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js"); 1005 1006var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js"); 1007 1008var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js"); 1009 1010module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { 1011 var Base = global[NAME]; 1012 var C = Base; 1013 var ADDER = IS_MAP ? 'set' : 'add'; 1014 var proto = C && C.prototype; 1015 var O = {}; 1016 1017 var fixMethod = function fixMethod(KEY) { 1018 var fn = proto[KEY]; 1019 redefine(proto, KEY, KEY == 'delete' ? function (a) { 1020 return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); 1021 } : KEY == 'has' ? function has(a) { 1022 return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); 1023 } : KEY == 'get' ? function get(a) { 1024 return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); 1025 } : KEY == 'add' ? function add(a) { 1026 fn.call(this, a === 0 ? 0 : a); 1027 return this; 1028 } : function set(a, b) { 1029 fn.call(this, a === 0 ? 0 : a, b); 1030 return this; 1031 }); 1032 }; 1033 1034 if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { 1035 new C().entries().next(); 1036 }))) { 1037 // create collection constructor 1038 C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); 1039 redefineAll(C.prototype, methods); 1040 meta.NEED = true; 1041 } else { 1042 var instance = new C(); // early implementations not supports chaining 1043 1044 var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false 1045 1046 var THROWS_ON_PRIMITIVES = fails(function () { 1047 instance.has(1); 1048 }); // most early implementations doesn't supports iterables, most modern - not close it correctly 1049 1050 var ACCEPT_ITERABLES = $iterDetect(function (iter) { 1051 new C(iter); 1052 }); // eslint-disable-line no-new 1053 // for early implementations -0 and +0 not the same 1054 1055 var BUGGY_ZERO = !IS_WEAK && fails(function () { 1056 // V8 ~ Chromium 42- fails only with 5+ elements 1057 var $instance = new C(); 1058 var index = 5; 1059 1060 while (index--) { 1061 $instance[ADDER](index, index); 1062 } 1063 1064 return !$instance.has(-0); 1065 }); 1066 1067 if (!ACCEPT_ITERABLES) { 1068 C = wrapper(function (target, iterable) { 1069 anInstance(target, C, NAME); 1070 var that = inheritIfRequired(new Base(), target, C); 1071 if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); 1072 return that; 1073 }); 1074 C.prototype = proto; 1075 proto.constructor = C; 1076 } 1077 1078 if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { 1079 fixMethod('delete'); 1080 fixMethod('has'); 1081 IS_MAP && fixMethod('get'); 1082 } 1083 1084 if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method 1085 1086 if (IS_WEAK && proto.clear) delete proto.clear; 1087 } 1088 1089 setToStringTag(C, NAME); 1090 O[NAME] = C; 1091 $export($export.G + $export.W + $export.F * (C != Base), O); 1092 if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); 1093 return C; 1094}; 1095 1096/***/ }), 1097
vendor: 526 bytes, lines 1098-1111
1098/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js": 1099/*!****************************************************************************!*\ 1100 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js ***! 1101 \****************************************************************************/ 1102/*! no static exports found */ 1103/***/ (function(module, exports) { 1104 1105var core = module.exports = { 1106 version: '2.6.5' 1107}; 1108if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef 1109 1110/***/ }), 1111
vendor: 928 bytes, lines 1112-1131
1112/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js": 1113/*!***************************************************************************************!*\ 1114 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js ***! 1115 \***************************************************************************************/ 1116/*! no static exports found */ 1117/***/ (function(module, exports, __webpack_require__) { 1118 1119"use strict"; 1120 1121 1122var $defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 1123 1124var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 1125 1126module.exports = function (object, index, value) { 1127 if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value; 1128}; 1129 1130/***/ }), 1131
vendor: 1,073 bytes, lines 1132-1171
1132/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js": 1133/*!***************************************************************************!*\ 1134 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js ***! 1135 \***************************************************************************/ 1136/*! no static exports found */ 1137/***/ (function(module, exports, __webpack_require__) { 1138 1139// optional / simple context binding 1140var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 1141 1142module.exports = function (fn, that, length) { 1143 aFunction(fn); 1144 if (that === undefined) return fn; 1145 1146 switch (length) { 1147 case 1: 1148 return function (a) { 1149 return fn.call(that, a); 1150 }; 1151 1152 case 2: 1153 return function (a, b) { 1154 return fn.call(that, a, b); 1155 }; 1156 1157 case 3: 1158 return function (a, b, c) { 1159 return fn.call(that, a, b, c); 1160 }; 1161 } 1162 1163 return function () 1164 /* ...args */ 1165 { 1166 return fn.apply(that, arguments); 1167 }; 1168}; 1169 1170/***/ }), 1171
vendor: 1,556 bytes, lines 1172-1206
1172/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js": 1173/*!******************************************************************************************!*\ 1174 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js ***! 1175 \******************************************************************************************/ 1176/*! no static exports found */ 1177/***/ (function(module, exports, __webpack_require__) { 1178 1179"use strict"; 1180 // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() 1181 1182var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 1183 1184var getTime = Date.prototype.getTime; 1185var $toISOString = Date.prototype.toISOString; 1186 1187var lz = function lz(num) { 1188 return num > 9 ? num : '0' + num; 1189}; // PhantomJS / old WebKit has a broken implementations 1190 1191 1192module.exports = fails(function () { 1193 return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z'; 1194}) || !fails(function () { 1195 $toISOString.call(new Date(NaN)); 1196}) ? function toISOString() { 1197 if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value'); 1198 var d = this; 1199 var y = d.getUTCFullYear(); 1200 var m = d.getUTCMilliseconds(); 1201 var s = y < 0 ? '-' : y > 9999 ? '+' : ''; 1202 return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z'; 1203} : $toISOString; 1204 1205/***/ }), 1206
vendor: 985 bytes, lines 1207-1229
1207/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js": 1208/*!*****************************************************************************************!*\ 1209 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js ***! 1210 \*****************************************************************************************/ 1211/*! no static exports found */ 1212/***/ (function(module, exports, __webpack_require__) { 1213 1214"use strict"; 1215 1216 1217var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 1218 1219var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 1220 1221var NUMBER = 'number'; 1222 1223module.exports = function (hint) { 1224 if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint'); 1225 return toPrimitive(anObject(this), hint != NUMBER); 1226}; 1227 1228/***/ }), 1229
vendor: 576 bytes, lines 1230-1244
1230/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js": 1231/*!*******************************************************************************!*\ 1232 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js ***! 1233 \*******************************************************************************/ 1234/*! no static exports found */ 1235/***/ (function(module, exports) { 1236 1237// 7.2.1 RequireObjectCoercible(argument) 1238module.exports = function (it) { 1239 if (it == undefined) throw TypeError("Can't call method on " + it); 1240 return it; 1241}; 1242 1243/***/ }), 1244
vendor: 743 bytes, lines 1245-1262
1245/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js": 1246/*!***********************************************************************************!*\ 1247 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js ***! 1248 \***********************************************************************************/ 1249/*! no static exports found */ 1250/***/ (function(module, exports, __webpack_require__) { 1251 1252// Thank's IE8 for his funny defineProperty 1253module.exports = !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 1254 return Object.defineProperty({}, 'a', { 1255 get: function get() { 1256 return 7; 1257 } 1258 }).a != 7; 1259}); 1260 1261/***/ }), 1262
vendor: 923 bytes, lines 1263-1282
1263/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js": 1264/*!**********************************************************************************!*\ 1265 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js ***! 1266 \**********************************************************************************/ 1267/*! no static exports found */ 1268/***/ (function(module, exports, __webpack_require__) { 1269 1270var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 1271 1272var document = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").document; // typeof document.createElement is 'object' in old IE 1273 1274 1275var is = isObject(document) && isObject(document.createElement); 1276 1277module.exports = function (it) { 1278 return is ? document.createElement(it) : {}; 1279}; 1280 1281/***/ }), 1282
vendor: 592 bytes, lines 1283-1294
1283/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js": 1284/*!*************************************************************************************!*\ 1285 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js ***! 1286 \*************************************************************************************/ 1287/*! no static exports found */ 1288/***/ (function(module, exports) { 1289 1290// IE 8- don't enum bug keys 1291module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(','); 1292 1293/***/ }), 1294
vendor: 1,218 bytes, lines 1295-1328
1295/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js": 1296/*!*********************************************************************************!*\ 1297 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js ***! 1298 \*********************************************************************************/ 1299/*! no static exports found */ 1300/***/ (function(module, exports, __webpack_require__) { 1301 1302// all enumerable object keys, includes symbols 1303var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 1304 1305var gOPS = __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js"); 1306 1307var pIE = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js"); 1308 1309module.exports = function (it) { 1310 var result = getKeys(it); 1311 var getSymbols = gOPS.f; 1312 1313 if (getSymbols) { 1314 var symbols = getSymbols(it); 1315 var isEnum = pIE.f; 1316 var i = 0; 1317 var key; 1318 1319 while (symbols.length > i) { 1320 if (isEnum.call(it, key = symbols[i++])) result.push(key); 1321 } 1322 } 1323 1324 return result; 1325}; 1326 1327/***/ }), 1328
vendor: 2,477 bytes, lines 1329-1396
1329/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js": 1330/*!******************************************************************************!*\ 1331 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js ***! 1332 \******************************************************************************/ 1333/*! no static exports found */ 1334/***/ (function(module, exports, __webpack_require__) { 1335 1336var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 1337 1338var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 1339 1340var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 1341 1342var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 1343 1344var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 1345 1346var PROTOTYPE = 'prototype'; 1347 1348var $export = function $export(type, name, source) { 1349 var IS_FORCED = type & $export.F; 1350 var IS_GLOBAL = type & $export.G; 1351 var IS_STATIC = type & $export.S; 1352 var IS_PROTO = type & $export.P; 1353 var IS_BIND = type & $export.B; 1354 var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; 1355 var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); 1356 var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); 1357 var key, own, out, exp; 1358 if (IS_GLOBAL) source = name; 1359 1360 for (key in source) { 1361 // contains in native 1362 own = !IS_FORCED && target && target[key] !== undefined; // export native or passed 1363 1364 out = (own ? target : source)[key]; // bind timers to global for call from export context 1365 1366 exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // extend global 1367 1368 if (target) redefine(target, key, out, type & $export.U); // export 1369 1370 if (exports[key] != out) hide(exports, key, exp); 1371 if (IS_PROTO && expProto[key] != out) expProto[key] = out; 1372 } 1373}; 1374 1375global.core = core; // type bitmap 1376 1377$export.F = 1; // forced 1378 1379$export.G = 2; // global 1380 1381$export.S = 4; // static 1382 1383$export.P = 8; // proto 1384 1385$export.B = 16; // bind 1386 1387$export.W = 32; // wrap 1388 1389$export.U = 64; // safe 1390 1391$export.R = 128; // real proto method for `library` 1392 1393module.exports = $export; 1394 1395/***/ }), 1396
vendor: 820 bytes, lines 1397-1424
1397/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js": 1398/*!***************************************************************************************!*\ 1399 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js ***! 1400 \***************************************************************************************/ 1401/*! no static exports found */ 1402/***/ (function(module, exports, __webpack_require__) { 1403 1404var MATCH = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('match'); 1405 1406module.exports = function (KEY) { 1407 var re = /./; 1408 1409 try { 1410 '/./'[KEY](re); 1411 } catch (e) { 1412 try { 1413 re[MATCH] = false; 1414 return !'/./'[KEY](re); 1415 } catch (f) { 1416 /* empty */ 1417 } 1418 } 1419 1420 return true; 1421}; 1422 1423/***/ }), 1424
vendor: 510 bytes, lines 1425-1441
1425/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js": 1426/*!*****************************************************************************!*\ 1427 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js ***! 1428 \*****************************************************************************/ 1429/*! no static exports found */ 1430/***/ (function(module, exports) { 1431 1432module.exports = function (exec) { 1433 try { 1434 return !!exec(); 1435 } catch (e) { 1436 return true; 1437 } 1438}; 1439 1440/***/ }), 1441
vendor: 4,485 bytes, lines 1442-1573
1442/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js": 1443/*!**********************************************************************************!*\ 1444 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js ***! 1445 \**********************************************************************************/ 1446/*! no static exports found */ 1447/***/ (function(module, exports, __webpack_require__) { 1448 1449"use strict"; 1450 1451 1452__webpack_require__(/*! ./es6.regexp.exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js"); 1453 1454var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 1455 1456var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 1457 1458var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 1459 1460var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 1461 1462var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js"); 1463 1464var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js"); 1465 1466var SPECIES = wks('species'); 1467var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { 1468 // #replace needs built-in support for named groups. 1469 // #match works fine because it just return the exec results, even if it has 1470 // a "grops" property. 1471 var re = /./; 1472 1473 re.exec = function () { 1474 var result = []; 1475 result.groups = { 1476 a: '7' 1477 }; 1478 return result; 1479 }; 1480 1481 return ''.replace(re, '$<a>') !== '7'; 1482}); 1483 1484var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = function () { 1485 // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec 1486 var re = /(?:)/; 1487 var originalExec = re.exec; 1488 1489 re.exec = function () { 1490 return originalExec.apply(this, arguments); 1491 }; 1492 1493 var result = 'ab'.split(re); 1494 return result.length === 2 && result[0] === 'a' && result[1] === 'b'; 1495}(); 1496 1497module.exports = function (KEY, length, exec) { 1498 var SYMBOL = wks(KEY); 1499 var DELEGATES_TO_SYMBOL = !fails(function () { 1500 // String methods call symbol-named RegEp methods 1501 var O = {}; 1502 1503 O[SYMBOL] = function () { 1504 return 7; 1505 }; 1506 1507 return ''[KEY](O) != 7; 1508 }); 1509 var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () { 1510 // Symbol-named RegExp methods call .exec 1511 var execCalled = false; 1512 var re = /a/; 1513 1514 re.exec = function () { 1515 execCalled = true; 1516 return null; 1517 }; 1518 1519 if (KEY === 'split') { 1520 // RegExp[@@split] doesn't call the regex's exec method, but first creates 1521 // a new one. We need to return the patched regex when creating the new one. 1522 re.constructor = {}; 1523 1524 re.constructor[SPECIES] = function () { 1525 return re; 1526 }; 1527 } 1528 1529 re[SYMBOL](''); 1530 return !execCalled; 1531 }) : undefined; 1532 1533 if (!DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS || KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) { 1534 var nativeRegExpMethod = /./[SYMBOL]; 1535 var fns = exec(defined, SYMBOL, ''[KEY], function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { 1536 if (regexp.exec === regexpExec) { 1537 if (DELEGATES_TO_SYMBOL && !forceStringMethod) { 1538 // The native String method already delegates to @@method (this 1539 // polyfilled function), leasing to infinite recursion. 1540 // We avoid it by directly calling the native @@method method. 1541 return { 1542 done: true, 1543 value: nativeRegExpMethod.call(regexp, str, arg2) 1544 }; 1545 } 1546 1547 return { 1548 done: true, 1549 value: nativeMethod.call(str, regexp, arg2) 1550 }; 1551 } 1552 1553 return { 1554 done: false 1555 }; 1556 }); 1557 var strfn = fns[0]; 1558 var rxfn = fns[1]; 1559 redefine(String.prototype, KEY, strfn); 1560 hide(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) 1561 // 21.2.5.11 RegExp.prototype[@@split](string, limit) 1562 ? function (string, arg) { 1563 return rxfn.call(string, this, arg); 1564 } // 21.2.5.6 RegExp.prototype[@@match](string) 1565 // 21.2.5.9 RegExp.prototype[@@search](string) 1566 : function (string) { 1567 return rxfn.call(string, this); 1568 }); 1569 } 1570}; 1571 1572/***/ }), 1573
vendor: 893 bytes, lines 1574-1598
1574/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js": 1575/*!*****************************************************************************!*\ 1576 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js ***! 1577 \*****************************************************************************/ 1578/*! no static exports found */ 1579/***/ (function(module, exports, __webpack_require__) { 1580 1581"use strict"; 1582 // 21.2.5.3 get RegExp.prototype.flags 1583 1584var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 1585 1586module.exports = function () { 1587 var that = anObject(this); 1588 var result = ''; 1589 if (that.global) result += 'g'; 1590 if (that.ignoreCase) result += 'i'; 1591 if (that.multiline) result += 'm'; 1592 if (that.unicode) result += 'u'; 1593 if (that.sticky) result += 'y'; 1594 return result; 1595}; 1596 1597/***/ }), 1598
vendor: 2,225 bytes, lines 1599-1654
1599/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js": 1600/*!******************************************************************************************!*\ 1601 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js ***! 1602 \******************************************************************************************/ 1603/*! no static exports found */ 1604/***/ (function(module, exports, __webpack_require__) { 1605 1606"use strict"; 1607 // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray 1608 1609var isArray = __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js"); 1610 1611var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 1612 1613var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 1614 1615var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 1616 1617var IS_CONCAT_SPREADABLE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('isConcatSpreadable'); 1618 1619function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) { 1620 var targetIndex = start; 1621 var sourceIndex = 0; 1622 var mapFn = mapper ? ctx(mapper, thisArg, 3) : false; 1623 var element, spreadable; 1624 1625 while (sourceIndex < sourceLen) { 1626 if (sourceIndex in source) { 1627 element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex]; 1628 spreadable = false; 1629 1630 if (isObject(element)) { 1631 spreadable = element[IS_CONCAT_SPREADABLE]; 1632 spreadable = spreadable !== undefined ? !!spreadable : isArray(element); 1633 } 1634 1635 if (spreadable && depth > 0) { 1636 targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1; 1637 } else { 1638 if (targetIndex >= 0x1fffffffffffff) throw TypeError(); 1639 target[targetIndex] = element; 1640 } 1641 1642 targetIndex++; 1643 } 1644 1645 sourceIndex++; 1646 } 1647 1648 return targetIndex; 1649} 1650 1651module.exports = flattenIntoArray; 1652 1653/***/ }), 1654
vendor: 2,190 bytes, lines 1655-1699
1655/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js": 1656/*!******************************************************************************!*\ 1657 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js ***! 1658 \******************************************************************************/ 1659/*! no static exports found */ 1660/***/ (function(module, exports, __webpack_require__) { 1661 1662var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 1663 1664var call = __webpack_require__(/*! ./_iter-call */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js"); 1665 1666var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js"); 1667 1668var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 1669 1670var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 1671 1672var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js"); 1673 1674var BREAK = {}; 1675var RETURN = {}; 1676 1677var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { 1678 var iterFn = ITERATOR ? function () { 1679 return iterable; 1680 } : getIterFn(iterable); 1681 var f = ctx(fn, that, entries ? 2 : 1); 1682 var index = 0; 1683 var length, step, iterator, result; 1684 if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator 1685 1686 if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { 1687 result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); 1688 if (result === BREAK || result === RETURN) return result; 1689 } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { 1690 result = call(iterator, f, step.value, entries); 1691 if (result === BREAK || result === RETURN) return result; 1692 } 1693}; 1694 1695exports.BREAK = BREAK; 1696exports.RETURN = RETURN; 1697 1698/***/ }), 1699
vendor: 656 bytes, lines 1700-1710
1700/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js": 1701/*!******************************************************************************************!*\ 1702 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js ***! 1703 \******************************************************************************************/ 1704/*! no static exports found */ 1705/***/ (function(module, exports, __webpack_require__) { 1706 1707module.exports = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('native-function-to-string', Function.toString); 1708 1709/***/ }), 1710
vendor: 773 bytes, lines 1711-1724
1711/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js": 1712/*!******************************************************************************!*\ 1713 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js ***! 1714 \******************************************************************************/ 1715/*! no static exports found */ 1716/***/ (function(module, exports) { 1717 1718// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 1719var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func 1720: Function('return this')(); 1721if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef 1722 1723/***/ }), 1724
vendor: 519 bytes, lines 1725-1739
1725/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js": 1726/*!***************************************************************************!*\ 1727 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js ***! 1728 \***************************************************************************/ 1729/*! no static exports found */ 1730/***/ (function(module, exports) { 1731 1732var hasOwnProperty = {}.hasOwnProperty; 1733 1734module.exports = function (it, key) { 1735 return hasOwnProperty.call(it, key); 1736}; 1737 1738/***/ }), 1739
vendor: 996 bytes, lines 1740-1759
1740/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js": 1741/*!****************************************************************************!*\ 1742 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js ***! 1743 \****************************************************************************/ 1744/*! no static exports found */ 1745/***/ (function(module, exports, __webpack_require__) { 1746 1747var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 1748 1749var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 1750 1751module.exports = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? function (object, key, value) { 1752 return dP.f(object, key, createDesc(1, value)); 1753} : function (object, key, value) { 1754 object[key] = value; 1755 return object; 1756}; 1757 1758/***/ }), 1759
vendor: 615 bytes, lines 1760-1772
1760/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js": 1761/*!****************************************************************************!*\ 1762 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js ***! 1763 \****************************************************************************/ 1764/*! no static exports found */ 1765/***/ (function(module, exports, __webpack_require__) { 1766 1767var document = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").document; 1768 1769module.exports = document && document.documentElement; 1770 1771/***/ }), 1772
vendor: 959 bytes, lines 1773-1789
1773/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js": 1774/*!**************************************************************************************!*\ 1775 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js ***! 1776 \**************************************************************************************/ 1777/*! no static exports found */ 1778/***/ (function(module, exports, __webpack_require__) { 1779 1780module.exports = !__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 1781 return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js")('div'), 'a', { 1782 get: function get() { 1783 return 7; 1784 } 1785 }).a != 7; 1786}); 1787 1788/***/ }), 1789
vendor: 1,012 bytes, lines 1790-1813
1790/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js": 1791/*!*******************************************************************************************!*\ 1792 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js ***! 1793 \*******************************************************************************************/ 1794/*! no static exports found */ 1795/***/ (function(module, exports, __webpack_require__) { 1796 1797var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 1798 1799var setPrototypeOf = __webpack_require__(/*! ./_set-proto */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js").set; 1800 1801module.exports = function (that, target, C) { 1802 var S = target.constructor; 1803 var P; 1804 1805 if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { 1806 setPrototypeOf(that, P); 1807 } 1808 1809 return that; 1810}; 1811 1812/***/ }), 1813
vendor: 1,039 bytes, lines 1814-1846
1814/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js": 1815/*!******************************************************************************!*\ 1816 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js ***! 1817 \******************************************************************************/ 1818/*! no static exports found */ 1819/***/ (function(module, exports) { 1820 1821// fast apply, http://jsperf.lnkit.com/fast-apply/5 1822module.exports = function (fn, args, that) { 1823 var un = that === undefined; 1824 1825 switch (args.length) { 1826 case 0: 1827 return un ? fn() : fn.call(that); 1828 1829 case 1: 1830 return un ? fn(args[0]) : fn.call(that, args[0]); 1831 1832 case 2: 1833 return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]); 1834 1835 case 3: 1836 return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]); 1837 1838 case 4: 1839 return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]); 1840 } 1841 1842 return fn.apply(that, args); 1843}; 1844 1845/***/ }), 1846
vendor: 813 bytes, lines 1847-1863
1847/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js": 1848/*!*******************************************************************************!*\ 1849 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js ***! 1850 \*******************************************************************************/ 1851/*! no static exports found */ 1852/***/ (function(module, exports, __webpack_require__) { 1853 1854// fallback for non-array-like ES3 and non-enumerable old V8 strings 1855var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); // eslint-disable-next-line no-prototype-builtins 1856 1857 1858module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { 1859 return cof(it) == 'String' ? it.split('') : Object(it); 1860}; 1861 1862/***/ }), 1863
vendor: 920 bytes, lines 1864-1883
1864/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js": 1865/*!*************************************************************************************!*\ 1866 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js ***! 1867 \*************************************************************************************/ 1868/*! no static exports found */ 1869/***/ (function(module, exports, __webpack_require__) { 1870 1871// check on default Array iterator 1872var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js"); 1873 1874var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator'); 1875 1876var ArrayProto = Array.prototype; 1877 1878module.exports = function (it) { 1879 return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); 1880}; 1881 1882/***/ }), 1883
vendor: 674 bytes, lines 1884-1899
1884/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js": 1885/*!********************************************************************************!*\ 1886 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js ***! 1887 \********************************************************************************/ 1888/*! no static exports found */ 1889/***/ (function(module, exports, __webpack_require__) { 1890 1891// 7.2.2 IsArray(argument) 1892var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 1893 1894module.exports = Array.isArray || function isArray(arg) { 1895 return cof(arg) == 'Array'; 1896}; 1897 1898/***/ }), 1899
vendor: 748 bytes, lines 1900-1917
1900/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js": 1901/*!**********************************************************************************!*\ 1902 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js ***! 1903 \**********************************************************************************/ 1904/*! no static exports found */ 1905/***/ (function(module, exports, __webpack_require__) { 1906 1907// 20.1.2.3 Number.isInteger(number) 1908var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 1909 1910var floor = Math.floor; 1911 1912module.exports = function isInteger(it) { 1913 return !isObject(it) && isFinite(it) && floor(it) === it; 1914}; 1915 1916/***/ }), 1917
vendor: 887 bytes, lines 1918-1932
1918/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js": 1919/*!*********************************************************************************!*\ 1920 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js ***! 1921 \*********************************************************************************/ 1922/*! no static exports found */ 1923/***/ (function(module, exports) { 1924 1925function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 1926 1927module.exports = function (it) { 1928 return _typeof(it) === 'object' ? it !== null : typeof it === 'function'; 1929}; 1930 1931/***/ }), 1932
vendor: 1,002 bytes, lines 1933-1953
1933/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js": 1934/*!*********************************************************************************!*\ 1935 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js ***! 1936 \*********************************************************************************/ 1937/*! no static exports found */ 1938/***/ (function(module, exports, __webpack_require__) { 1939 1940// 7.2.8 IsRegExp(argument) 1941var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 1942 1943var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 1944 1945var MATCH = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('match'); 1946 1947module.exports = function (it) { 1948 var isRegExp; 1949 return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); 1950}; 1951 1952/***/ }), 1953
vendor: 945 bytes, lines 1954-1975
1954/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js": 1955/*!*********************************************************************************!*\ 1956 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js ***! 1957 \*********************************************************************************/ 1958/*! no static exports found */ 1959/***/ (function(module, exports, __webpack_require__) { 1960 1961// call something on iterator step with safe closing on error 1962var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 1963 1964module.exports = function (iterator, fn, value, entries) { 1965 try { 1966 return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion) 1967 } catch (e) { 1968 var ret = iterator['return']; 1969 if (ret !== undefined) anObject(ret.call(iterator)); 1970 throw e; 1971 } 1972}; 1973 1974/***/ }), 1975
vendor: 1,460 bytes, lines 1976-2006
1976/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js": 1977/*!***********************************************************************************!*\ 1978 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js ***! 1979 \***********************************************************************************/ 1980/*! no static exports found */ 1981/***/ (function(module, exports, __webpack_require__) { 1982 1983"use strict"; 1984 1985 1986var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js"); 1987 1988var descriptor = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 1989 1990var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js"); 1991 1992var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() 1993 1994__webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator'), function () { 1995 return this; 1996}); 1997 1998module.exports = function (Constructor, NAME, next) { 1999 Constructor.prototype = create(IteratorPrototype, { 2000 next: descriptor(1, next) 2001 }); 2002 setToStringTag(Constructor, NAME + ' Iterator'); 2003}; 2004 2005/***/ }), 2006
vendor: 4,173 bytes, lines 2007-2122
2007/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js": 2008/*!***********************************************************************************!*\ 2009 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js ***! 2010 \***********************************************************************************/ 2011/*! no static exports found */ 2012/***/ (function(module, exports, __webpack_require__) { 2013 2014"use strict"; 2015 2016 2017var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js"); 2018 2019var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 2020 2021var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 2022 2023var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 2024 2025var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js"); 2026 2027var $iterCreate = __webpack_require__(/*! ./_iter-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js"); 2028 2029var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js"); 2030 2031var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 2032 2033var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator'); 2034 2035var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` 2036 2037var FF_ITERATOR = '@@iterator'; 2038var KEYS = 'keys'; 2039var VALUES = 'values'; 2040 2041var returnThis = function returnThis() { 2042 return this; 2043}; 2044 2045module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { 2046 $iterCreate(Constructor, NAME, next); 2047 2048 var getMethod = function getMethod(kind) { 2049 if (!BUGGY && kind in proto) return proto[kind]; 2050 2051 switch (kind) { 2052 case KEYS: 2053 return function keys() { 2054 return new Constructor(this, kind); 2055 }; 2056 2057 case VALUES: 2058 return function values() { 2059 return new Constructor(this, kind); 2060 }; 2061 } 2062 2063 return function entries() { 2064 return new Constructor(this, kind); 2065 }; 2066 }; 2067 2068 var TAG = NAME + ' Iterator'; 2069 var DEF_VALUES = DEFAULT == VALUES; 2070 var VALUES_BUG = false; 2071 var proto = Base.prototype; 2072 var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; 2073 var $default = $native || getMethod(DEFAULT); 2074 var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; 2075 var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; 2076 var methods, key, IteratorPrototype; // Fix native 2077 2078 if ($anyNative) { 2079 IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); 2080 2081 if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { 2082 // Set @@toStringTag to native iterators 2083 setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines 2084 2085 if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); 2086 } 2087 } // fix Array#{values, @@iterator}.name in V8 / FF 2088 2089 2090 if (DEF_VALUES && $native && $native.name !== VALUES) { 2091 VALUES_BUG = true; 2092 2093 $default = function values() { 2094 return $native.call(this); 2095 }; 2096 } // Define iterator 2097 2098 2099 if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { 2100 hide(proto, ITERATOR, $default); 2101 } // Plug for library 2102 2103 2104 Iterators[NAME] = $default; 2105 Iterators[TAG] = returnThis; 2106 2107 if (DEFAULT) { 2108 methods = { 2109 values: DEF_VALUES ? $default : getMethod(VALUES), 2110 keys: IS_SET ? $default : getMethod(KEYS), 2111 entries: $entries 2112 }; 2113 if (FORCED) for (key in methods) { 2114 if (!(key in proto)) redefine(proto, key, methods[key]); 2115 } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); 2116 } 2117 2118 return methods; 2119}; 2120 2121/***/ }), 2122
vendor: 1,244 bytes, lines 2123-2176
2123/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js": 2124/*!***********************************************************************************!*\ 2125 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js ***! 2126 \***********************************************************************************/ 2127/*! no static exports found */ 2128/***/ (function(module, exports, __webpack_require__) { 2129 2130var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator'); 2131 2132var SAFE_CLOSING = false; 2133 2134try { 2135 var riter = [7][ITERATOR](); 2136 2137 riter['return'] = function () { 2138 SAFE_CLOSING = true; 2139 }; // eslint-disable-next-line no-throw-literal 2140 2141 2142 Array.from(riter, function () { 2143 throw 2; 2144 }); 2145} catch (e) { 2146 /* empty */ 2147} 2148 2149module.exports = function (exec, skipClosing) { 2150 if (!skipClosing && !SAFE_CLOSING) return false; 2151 var safe = false; 2152 2153 try { 2154 var arr = [7]; 2155 var iter = arr[ITERATOR](); 2156 2157 iter.next = function () { 2158 return { 2159 done: safe = true 2160 }; 2161 }; 2162 2163 arr[ITERATOR] = function () { 2164 return iter; 2165 }; 2166 2167 exec(arr); 2168 } catch (e) { 2169 /* empty */ 2170 } 2171 2172 return safe; 2173}; 2174 2175/***/ }), 2176
vendor: 518 bytes, lines 2177-2192
2177/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js": 2178/*!*********************************************************************************!*\ 2179 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js ***! 2180 \*********************************************************************************/ 2181/*! no static exports found */ 2182/***/ (function(module, exports) { 2183 2184module.exports = function (done, value) { 2185 return { 2186 value: value, 2187 done: !!done 2188 }; 2189}; 2190 2191/***/ }), 2192
vendor: 443 bytes, lines 2193-2203
2193/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js": 2194/*!*********************************************************************************!*\ 2195 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js ***! 2196 \*********************************************************************************/ 2197/*! no static exports found */ 2198/***/ (function(module, exports) { 2199 2200module.exports = {}; 2201 2202/***/ }), 2203
vendor: 438 bytes, lines 2204-2214
2204/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js": 2205/*!*******************************************************************************!*\ 2206 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js ***! 2207 \*******************************************************************************/ 2208/*! no static exports found */ 2209/***/ (function(module, exports) { 2210 2211module.exports = false; 2212 2213/***/ }), 2214
vendor: 758 bytes, lines 2215-2231
2215/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js": 2216/*!**********************************************************************************!*\ 2217 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js ***! 2218 \**********************************************************************************/ 2219/*! no static exports found */ 2220/***/ (function(module, exports) { 2221 2222// 20.2.2.14 Math.expm1(x) 2223var $expm1 = Math.expm1; 2224module.exports = !$expm1 // Old FF bug 2225|| $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 // Tor Browser bug 2226|| $expm1(-2e-17) != -2e-17 ? function expm1(x) { 2227 return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1; 2228} : $expm1; 2229 2230/***/ }), 2231
vendor: 1,275 bytes, lines 2232-2265
2232/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js": 2233/*!***********************************************************************************!*\ 2234 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js ***! 2235 \***********************************************************************************/ 2236/*! no static exports found */ 2237/***/ (function(module, exports, __webpack_require__) { 2238 2239// 20.2.2.16 Math.fround(x) 2240var sign = __webpack_require__(/*! ./_math-sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js"); 2241 2242var pow = Math.pow; 2243var EPSILON = pow(2, -52); 2244var EPSILON32 = pow(2, -23); 2245var MAX32 = pow(2, 127) * (2 - EPSILON32); 2246var MIN32 = pow(2, -126); 2247 2248var roundTiesToEven = function roundTiesToEven(n) { 2249 return n + 1 / EPSILON - 1 / EPSILON; 2250}; 2251 2252module.exports = Math.fround || function fround(x) { 2253 var $abs = Math.abs(x); 2254 var $sign = sign(x); 2255 var a, result; 2256 if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32; 2257 a = (1 + EPSILON32 / EPSILON) * $abs; 2258 result = a - (a - $abs); // eslint-disable-next-line no-self-compare 2259 2260 if (result > MAX32 || result != result) return $sign * Infinity; 2261 return $sign * result; 2262}; 2263 2264/***/ }), 2265
vendor: 580 bytes, lines 2266-2279
2266/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js": 2267/*!**********************************************************************************!*\ 2268 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js ***! 2269 \**********************************************************************************/ 2270/*! no static exports found */ 2271/***/ (function(module, exports) { 2272 2273// 20.2.2.20 Math.log1p(x) 2274module.exports = Math.log1p || function log1p(x) { 2275 return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x); 2276}; 2277 2278/***/ }), 2279
vendor: 1,052 bytes, lines 2280-2300
2280/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js": 2281/*!**********************************************************************************!*\ 2282 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js ***! 2283 \**********************************************************************************/ 2284/*! no static exports found */ 2285/***/ (function(module, exports) { 2286 2287// https://rwaldron.github.io/proposal-math-extensions/ 2288module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) { 2289 if (arguments.length === 0 // eslint-disable-next-line no-self-compare 2290 || x != x // eslint-disable-next-line no-self-compare 2291 || inLow != inLow // eslint-disable-next-line no-self-compare 2292 || inHigh != inHigh // eslint-disable-next-line no-self-compare 2293 || outLow != outLow // eslint-disable-next-line no-self-compare 2294 || outHigh != outHigh) return NaN; 2295 if (x === Infinity || x === -Infinity) return x; 2296 return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow; 2297}; 2298 2299/***/ }), 2300
vendor: 601 bytes, lines 2301-2315
2301/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js": 2302/*!*********************************************************************************!*\ 2303 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js ***! 2304 \*********************************************************************************/ 2305/*! no static exports found */ 2306/***/ (function(module, exports) { 2307 2308// 20.2.2.28 Math.sign(x) 2309module.exports = Math.sign || function sign(x) { 2310 // eslint-disable-next-line no-self-compare 2311 return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; 2312}; 2313 2314/***/ }), 2315
vendor: 2,827 bytes, lines 2316-2398
2316/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js": 2317/*!****************************************************************************!*\ 2318 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js ***! 2319 \****************************************************************************/ 2320/*! no static exports found */ 2321/***/ (function(module, exports, __webpack_require__) { 2322 2323function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 2324 2325var META = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js")('meta'); 2326 2327var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 2328 2329var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 2330 2331var setDesc = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 2332 2333var id = 0; 2334 2335var isExtensible = Object.isExtensible || function () { 2336 return true; 2337}; 2338 2339var FREEZE = !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 2340 return isExtensible(Object.preventExtensions({})); 2341}); 2342 2343var setMeta = function setMeta(it) { 2344 setDesc(it, META, { 2345 value: { 2346 i: 'O' + ++id, 2347 // object ID 2348 w: {} // weak collections IDs 2349 2350 } 2351 }); 2352}; 2353 2354var fastKey = function fastKey(it, create) { 2355 // return primitive with prefix 2356 if (!isObject(it)) return _typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; 2357 2358 if (!has(it, META)) { 2359 // can't set metadata to uncaught frozen object 2360 if (!isExtensible(it)) return 'F'; // not necessary to add metadata 2361 2362 if (!create) return 'E'; // add missing metadata 2363 2364 setMeta(it); // return object ID 2365 } 2366 2367 return it[META].i; 2368}; 2369 2370var getWeak = function getWeak(it, create) { 2371 if (!has(it, META)) { 2372 // can't set metadata to uncaught frozen object 2373 if (!isExtensible(it)) return true; // not necessary to add metadata 2374 2375 if (!create) return false; // add missing metadata 2376 2377 setMeta(it); // return hash weak collections IDs 2378 } 2379 2380 return it[META].w; 2381}; // add metadata on freeze-family methods calling 2382 2383 2384var onFreeze = function onFreeze(it) { 2385 if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); 2386 return it; 2387}; 2388 2389var meta = module.exports = { 2390 KEY: META, 2391 NEED: false, 2392 fastKey: fastKey, 2393 getWeak: getWeak, 2394 onFreeze: onFreeze 2395}; 2396 2397/***/ }), 2398
vendor: 3,109 bytes, lines 2399-2477
2399/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js": 2400/*!********************************************************************************!*\ 2401 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js ***! 2402 \********************************************************************************/ 2403/*! no static exports found */ 2404/***/ (function(module, exports, __webpack_require__) { 2405 2406function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 2407 2408var Map = __webpack_require__(/*! ./es6.map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js"); 2409 2410var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 2411 2412var shared = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('metadata'); 2413 2414var store = shared.store || (shared.store = new (__webpack_require__(/*! ./es6.weak-map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js"))()); 2415 2416var getOrCreateMetadataMap = function getOrCreateMetadataMap(target, targetKey, create) { 2417 var targetMetadata = store.get(target); 2418 2419 if (!targetMetadata) { 2420 if (!create) return undefined; 2421 store.set(target, targetMetadata = new Map()); 2422 } 2423 2424 var keyMetadata = targetMetadata.get(targetKey); 2425 2426 if (!keyMetadata) { 2427 if (!create) return undefined; 2428 targetMetadata.set(targetKey, keyMetadata = new Map()); 2429 } 2430 2431 return keyMetadata; 2432}; 2433 2434var ordinaryHasOwnMetadata = function ordinaryHasOwnMetadata(MetadataKey, O, P) { 2435 var metadataMap = getOrCreateMetadataMap(O, P, false); 2436 return metadataMap === undefined ? false : metadataMap.has(MetadataKey); 2437}; 2438 2439var ordinaryGetOwnMetadata = function ordinaryGetOwnMetadata(MetadataKey, O, P) { 2440 var metadataMap = getOrCreateMetadataMap(O, P, false); 2441 return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey); 2442}; 2443 2444var ordinaryDefineOwnMetadata = function ordinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) { 2445 getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue); 2446}; 2447 2448var ordinaryOwnMetadataKeys = function ordinaryOwnMetadataKeys(target, targetKey) { 2449 var metadataMap = getOrCreateMetadataMap(target, targetKey, false); 2450 var keys = []; 2451 if (metadataMap) metadataMap.forEach(function (_, key) { 2452 keys.push(key); 2453 }); 2454 return keys; 2455}; 2456 2457var toMetaKey = function toMetaKey(it) { 2458 return it === undefined || _typeof(it) == 'symbol' ? it : String(it); 2459}; 2460 2461var exp = function exp(O) { 2462 $export($export.S, 'Reflect', O); 2463}; 2464 2465module.exports = { 2466 store: store, 2467 map: getOrCreateMetadataMap, 2468 has: ordinaryHasOwnMetadata, 2469 get: ordinaryGetOwnMetadata, 2470 set: ordinaryDefineOwnMetadata, 2471 keys: ordinaryOwnMetadataKeys, 2472 key: toMetaKey, 2473 exp: exp 2474}; 2475 2476/***/ }), 2477
vendor: 2,759 bytes, lines 2478-2571
2478/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js": 2479/*!*********************************************************************************!*\ 2480 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js ***! 2481 \*********************************************************************************/ 2482/*! no static exports found */ 2483/***/ (function(module, exports, __webpack_require__) { 2484 2485var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 2486 2487var macrotask = __webpack_require__(/*! ./_task */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js").set; 2488 2489var Observer = global.MutationObserver || global.WebKitMutationObserver; 2490var process = global.process; 2491var Promise = global.Promise; 2492var isNode = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js")(process) == 'process'; 2493 2494module.exports = function () { 2495 var head, last, notify; 2496 2497 var flush = function flush() { 2498 var parent, fn; 2499 if (isNode && (parent = process.domain)) parent.exit(); 2500 2501 while (head) { 2502 fn = head.fn; 2503 head = head.next; 2504 2505 try { 2506 fn(); 2507 } catch (e) { 2508 if (head) notify();else last = undefined; 2509 throw e; 2510 } 2511 } 2512 2513 last = undefined; 2514 if (parent) parent.enter(); 2515 }; // Node.js 2516 2517 2518 if (isNode) { 2519 notify = function notify() { 2520 process.nextTick(flush); 2521 }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 2522 2523 } else if (Observer && !(global.navigator && global.navigator.standalone)) { 2524 var toggle = true; 2525 var node = document.createTextNode(''); 2526 new Observer(flush).observe(node, { 2527 characterData: true 2528 }); // eslint-disable-line no-new 2529 2530 notify = function notify() { 2531 node.data = toggle = !toggle; 2532 }; // environments with maybe non-completely correct, but existent Promise 2533 2534 } else if (Promise && Promise.resolve) { 2535 // Promise.resolve without an argument throws an error in LG WebOS 2 2536 var promise = Promise.resolve(undefined); 2537 2538 notify = function notify() { 2539 promise.then(flush); 2540 }; // for other environments - macrotask based on: 2541 // - setImmediate 2542 // - MessageChannel 2543 // - window.postMessag 2544 // - onreadystatechange 2545 // - setTimeout 2546 2547 } else { 2548 notify = function notify() { 2549 // strange IE + webpack dev server bug - use .call(global) 2550 macrotask.call(global, flush); 2551 }; 2552 } 2553 2554 return function (fn) { 2555 var task = { 2556 fn: fn, 2557 next: undefined 2558 }; 2559 if (last) last.next = task; 2560 2561 if (!head) { 2562 head = task; 2563 notify(); 2564 } 2565 2566 last = task; 2567 }; 2568}; 2569 2570/***/ }), 2571
vendor: 1,095 bytes, lines 2572-2600
2572/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js": 2573/*!**********************************************************************************************!*\ 2574 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js ***! 2575 \**********************************************************************************************/ 2576/*! no static exports found */ 2577/***/ (function(module, exports, __webpack_require__) { 2578 2579"use strict"; 2580 // 25.4.1.5 NewPromiseCapability(C) 2581 2582var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 2583 2584function PromiseCapability(C) { 2585 var resolve, reject; 2586 this.promise = new C(function ($$resolve, $$reject) { 2587 if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); 2588 resolve = $$resolve; 2589 reject = $$reject; 2590 }); 2591 this.resolve = aFunction(resolve); 2592 this.reject = aFunction(reject); 2593} 2594 2595module.exports.f = function (C) { 2596 return new PromiseCapability(C); 2597}; 2598 2599/***/ }), 2600
vendor: 2,244 bytes, lines 2601-2658
2601/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js": 2602/*!*************************************************************************************!*\ 2603 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js ***! 2604 \*************************************************************************************/ 2605/*! no static exports found */ 2606/***/ (function(module, exports, __webpack_require__) { 2607 2608"use strict"; 2609 // 19.1.2.1 Object.assign(target, source, ...) 2610 2611var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 2612 2613var gOPS = __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js"); 2614 2615var pIE = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js"); 2616 2617var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 2618 2619var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js"); 2620 2621var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) 2622 2623module.exports = !$assign || __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 2624 var A = {}; 2625 var B = {}; // eslint-disable-next-line no-undef 2626 2627 var S = Symbol(); 2628 var K = 'abcdefghijklmnopqrst'; 2629 A[S] = 7; 2630 K.split('').forEach(function (k) { 2631 B[k] = k; 2632 }); 2633 return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; 2634}) ? function assign(target, source) { 2635 // eslint-disable-line no-unused-vars 2636 var T = toObject(target); 2637 var aLen = arguments.length; 2638 var index = 1; 2639 var getSymbols = gOPS.f; 2640 var isEnum = pIE.f; 2641 2642 while (aLen > index) { 2643 var S = IObject(arguments[index++]); 2644 var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); 2645 var length = keys.length; 2646 var j = 0; 2647 var key; 2648 2649 while (length > j) { 2650 if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; 2651 } 2652 } 2653 2654 return T; 2655} : $assign; 2656 2657/***/ }), 2658
vendor: 2,566 bytes, lines 2659-2725
2659/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js": 2660/*!*************************************************************************************!*\ 2661 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js ***! 2662 \*************************************************************************************/ 2663/*! no static exports found */ 2664/***/ (function(module, exports, __webpack_require__) { 2665 2666// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) 2667var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 2668 2669var dPs = __webpack_require__(/*! ./_object-dps */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js"); 2670 2671var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js"); 2672 2673var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); 2674 2675var Empty = function Empty() { 2676 /* empty */ 2677}; 2678 2679var PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype 2680 2681var _createDict = function createDict() { 2682 // Thrash, waste and sodomy: IE GC bug 2683 var iframe = __webpack_require__(/*! ./_dom-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js")('iframe'); 2684 2685 var i = enumBugKeys.length; 2686 var lt = '<'; 2687 var gt = '>'; 2688 var iframeDocument; 2689 iframe.style.display = 'none'; 2690 2691 __webpack_require__(/*! ./_html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js").appendChild(iframe); 2692 2693 iframe.src = 'javascript:'; // eslint-disable-line no-script-url 2694 // createDict = iframe.contentWindow.Object; 2695 // html.removeChild(iframe); 2696 2697 iframeDocument = iframe.contentWindow.document; 2698 iframeDocument.open(); 2699 iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); 2700 iframeDocument.close(); 2701 _createDict = iframeDocument.F; 2702 2703 while (i--) { 2704 delete _createDict[PROTOTYPE][enumBugKeys[i]]; 2705 } 2706 2707 return _createDict(); 2708}; 2709 2710module.exports = Object.create || function create(O, Properties) { 2711 var result; 2712 2713 if (O !== null) { 2714 Empty[PROTOTYPE] = anObject(O); 2715 result = new Empty(); 2716 Empty[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill 2717 2718 result[IE_PROTO] = O; 2719 } else result = _createDict(); 2720 2721 return Properties === undefined ? result : dPs(result, Properties); 2722}; 2723 2724/***/ }), 2725
vendor: 1,433 bytes, lines 2726-2755
2726/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js": 2727/*!*********************************************************************************!*\ 2728 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js ***! 2729 \*********************************************************************************/ 2730/*! no static exports found */ 2731/***/ (function(module, exports, __webpack_require__) { 2732 2733var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 2734 2735var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js"); 2736 2737var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 2738 2739var dP = Object.defineProperty; 2740exports.f = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) { 2741 anObject(O); 2742 P = toPrimitive(P, true); 2743 anObject(Attributes); 2744 if (IE8_DOM_DEFINE) try { 2745 return dP(O, P, Attributes); 2746 } catch (e) { 2747 /* empty */ 2748 } 2749 if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); 2750 if ('value' in Attributes) O[P] = Attributes.value; 2751 return O; 2752}; 2753 2754/***/ }), 2755
vendor: 1,241 bytes, lines 2756-2784
2756/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js": 2757/*!**********************************************************************************!*\ 2758 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js ***! 2759 \**********************************************************************************/ 2760/*! no static exports found */ 2761/***/ (function(module, exports, __webpack_require__) { 2762 2763var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 2764 2765var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 2766 2767var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 2768 2769module.exports = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) { 2770 anObject(O); 2771 var keys = getKeys(Properties); 2772 var length = keys.length; 2773 var i = 0; 2774 var P; 2775 2776 while (length > i) { 2777 dP.f(O, P = keys[i++], Properties[P]); 2778 } 2779 2780 return O; 2781}; 2782 2783/***/ }), 2784
vendor: 1,114 bytes, lines 2785-2807
2785/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js": 2786/*!*****************************************************************************************!*\ 2787 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js ***! 2788 \*****************************************************************************************/ 2789/*! no static exports found */ 2790/***/ (function(module, exports, __webpack_require__) { 2791 2792"use strict"; 2793 // Forced replacement prototype accessors methods 2794 2795module.exports = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js") || !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 2796 var K = Math.random(); // In FF throws only define methods 2797 // eslint-disable-next-line no-undef, no-useless-call 2798 2799 __defineSetter__.call(null, K, function () { 2800 /* empty */ 2801 }); 2802 2803 delete __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js")[K]; 2804}); 2805 2806/***/ }), 2807
vendor: 1,700 bytes, lines 2808-2840
2808/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js": 2809/*!***********************************************************************************!*\ 2810 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js ***! 2811 \***********************************************************************************/ 2812/*! no static exports found */ 2813/***/ (function(module, exports, __webpack_require__) { 2814 2815var pIE = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js"); 2816 2817var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 2818 2819var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 2820 2821var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 2822 2823var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 2824 2825var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js"); 2826 2827var gOPD = Object.getOwnPropertyDescriptor; 2828exports.f = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) { 2829 O = toIObject(O); 2830 P = toPrimitive(P, true); 2831 if (IE8_DOM_DEFINE) try { 2832 return gOPD(O, P); 2833 } catch (e) { 2834 /* empty */ 2835 } 2836 if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); 2837}; 2838 2839/***/ }), 2840
vendor: 1,676 bytes, lines 2841-2871
2841/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js": 2842/*!***************************************************************************************!*\ 2843 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js ***! 2844 \***************************************************************************************/ 2845/*! no static exports found */ 2846/***/ (function(module, exports, __webpack_require__) { 2847 2848function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 2849 2850// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window 2851var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 2852 2853var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f; 2854 2855var toString = {}.toString; 2856var windowNames = (typeof window === "undefined" ? "undefined" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; 2857 2858var getWindowNames = function getWindowNames(it) { 2859 try { 2860 return gOPN(it); 2861 } catch (e) { 2862 return windowNames.slice(); 2863 } 2864}; 2865 2866module.exports.f = function getOwnPropertyNames(it) { 2867 return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); 2868}; 2869 2870/***/ }), 2871
vendor: 941 bytes, lines 2872-2889
2872/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js": 2873/*!***********************************************************************************!*\ 2874 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js ***! 2875 \***********************************************************************************/ 2876/*! no static exports found */ 2877/***/ (function(module, exports, __webpack_require__) { 2878 2879// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) 2880var $keys = __webpack_require__(/*! ./_object-keys-internal */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js"); 2881 2882var hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js").concat('length', 'prototype'); 2883 2884exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { 2885 return $keys(O, hiddenKeys); 2886}; 2887 2888/***/ }), 2889
vendor: 472 bytes, lines 2890-2900
2890/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js": 2891/*!***********************************************************************************!*\ 2892 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js ***! 2893 \***********************************************************************************/ 2894/*! no static exports found */ 2895/***/ (function(module, exports) { 2896 2897exports.f = Object.getOwnPropertySymbols; 2898 2899/***/ }), 2900
vendor: 1,221 bytes, lines 2901-2929
2901/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js": 2902/*!**********************************************************************************!*\ 2903 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js ***! 2904 \**********************************************************************************/ 2905/*! no static exports found */ 2906/***/ (function(module, exports, __webpack_require__) { 2907 2908// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) 2909var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 2910 2911var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 2912 2913var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); 2914 2915var ObjectProto = Object.prototype; 2916 2917module.exports = Object.getPrototypeOf || function (O) { 2918 O = toObject(O); 2919 if (has(O, IE_PROTO)) return O[IE_PROTO]; 2920 2921 if (typeof O.constructor == 'function' && O instanceof O.constructor) { 2922 return O.constructor.prototype; 2923 } 2924 2925 return O instanceof Object ? ObjectProto : null; 2926}; 2927 2928/***/ }), 2929
vendor: 1,426 bytes, lines 2930-2966
2930/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js": 2931/*!********************************************************************************************!*\ 2932 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js ***! 2933 \********************************************************************************************/ 2934/*! no static exports found */ 2935/***/ (function(module, exports, __webpack_require__) { 2936 2937var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 2938 2939var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 2940 2941var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js")(false); 2942 2943var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); 2944 2945module.exports = function (object, names) { 2946 var O = toIObject(object); 2947 var i = 0; 2948 var result = []; 2949 var key; 2950 2951 for (key in O) { 2952 if (key != IE_PROTO) has(O, key) && result.push(key); 2953 } // Don't enum bug & hidden keys 2954 2955 2956 while (names.length > i) { 2957 if (has(O, key = names[i++])) { 2958 ~arrayIndexOf(result, key) || result.push(key); 2959 } 2960 } 2961 2962 return result; 2963}; 2964 2965/***/ }), 2966
vendor: 875 bytes, lines 2967-2984
2967/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js": 2968/*!***********************************************************************************!*\ 2969 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js ***! 2970 \***********************************************************************************/ 2971/*! no static exports found */ 2972/***/ (function(module, exports, __webpack_require__) { 2973 2974// 19.1.2.14 / 15.2.3.14 Object.keys(O) 2975var $keys = __webpack_require__(/*! ./_object-keys-internal */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js"); 2976 2977var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js"); 2978 2979module.exports = Object.keys || function keys(O) { 2980 return $keys(O, enumBugKeys); 2981}; 2982 2983/***/ }), 2984
vendor: 463 bytes, lines 2985-2995
2985/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js": 2986/*!**********************************************************************************!*\ 2987 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js ***! 2988 \**********************************************************************************/ 2989/*! no static exports found */ 2990/***/ (function(module, exports) { 2991 2992exports.f = {}.propertyIsEnumerable; 2993 2994/***/ }), 2995
vendor: 1,093 bytes, lines 2996-3020
2996/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js": 2997/*!**********************************************************************************!*\ 2998 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js ***! 2999 \**********************************************************************************/ 3000/*! no static exports found */ 3001/***/ (function(module, exports, __webpack_require__) { 3002 3003// most Object methods by ES6 should accept primitives 3004var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 3005 3006var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 3007 3008var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 3009 3010module.exports = function (KEY, exec) { 3011 var fn = (core.Object || {})[KEY] || Object[KEY]; 3012 var exp = {}; 3013 exp[KEY] = exec(fn); 3014 $export($export.S + $export.F * fails(function () { 3015 fn(1); 3016 }), 'Object', exp); 3017}; 3018 3019/***/ }), 3020
vendor: 1,245 bytes, lines 3021-3054
3021/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js": 3022/*!***************************************************************************************!*\ 3023 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js ***! 3024 \***************************************************************************************/ 3025/*! no static exports found */ 3026/***/ (function(module, exports, __webpack_require__) { 3027 3028var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 3029 3030var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 3031 3032var isEnum = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js").f; 3033 3034module.exports = function (isEntries) { 3035 return function (it) { 3036 var O = toIObject(it); 3037 var keys = getKeys(O); 3038 var length = keys.length; 3039 var i = 0; 3040 var result = []; 3041 var key; 3042 3043 while (length > i) { 3044 if (isEnum.call(O, key = keys[i++])) { 3045 result.push(isEntries ? [key, O[key]] : O[key]); 3046 } 3047 } 3048 3049 return result; 3050 }; 3051}; 3052 3053/***/ }), 3054
vendor: 1,225 bytes, lines 3055-3078
3055/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js": 3056/*!********************************************************************************!*\ 3057 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js ***! 3058 \********************************************************************************/ 3059/*! no static exports found */ 3060/***/ (function(module, exports, __webpack_require__) { 3061 3062// all object keys, includes non-enumerable and symbols 3063var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js"); 3064 3065var gOPS = __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js"); 3066 3067var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 3068 3069var Reflect = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Reflect; 3070 3071module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { 3072 var keys = gOPN.f(anObject(it)); 3073 var getSymbols = gOPS.f; 3074 return getSymbols ? keys.concat(getSymbols(it)) : keys; 3075}; 3076 3077/***/ }), 3078
vendor: 1,089 bytes, lines 3079-3097
3079/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js": 3080/*!***********************************************************************************!*\ 3081 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js ***! 3082 \***********************************************************************************/ 3083/*! no static exports found */ 3084/***/ (function(module, exports, __webpack_require__) { 3085 3086var $parseFloat = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").parseFloat; 3087 3088var $trim = __webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js").trim; 3089 3090module.exports = 1 / $parseFloat(__webpack_require__(/*! ./_string-ws */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js") + '-0') !== -Infinity ? function parseFloat(str) { 3091 var string = $trim(String(str), 3); 3092 var result = $parseFloat(string); 3093 return result === 0 && string.charAt(0) == '-' ? -0 : result; 3094} : $parseFloat; 3095 3096/***/ }), 3097
vendor: 1,111 bytes, lines 3098-3118
3098/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js": 3099/*!*********************************************************************************!*\ 3100 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js ***! 3101 \*********************************************************************************/ 3102/*! no static exports found */ 3103/***/ (function(module, exports, __webpack_require__) { 3104 3105var $parseInt = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").parseInt; 3106 3107var $trim = __webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js").trim; 3108 3109var ws = __webpack_require__(/*! ./_string-ws */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js"); 3110 3111var hex = /^[-+]?0[xX]/; 3112module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) { 3113 var string = $trim(String(str), 3); 3114 return $parseInt(string, radix >>> 0 || (hex.test(string) ? 16 : 10)); 3115} : $parseInt; 3116 3117/***/ }), 3118
vendor: 578 bytes, lines 3119-3141
3119/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js": 3120/*!*******************************************************************************!*\ 3121 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js ***! 3122 \*******************************************************************************/ 3123/*! no static exports found */ 3124/***/ (function(module, exports) { 3125 3126module.exports = function (exec) { 3127 try { 3128 return { 3129 e: false, 3130 v: exec() 3131 }; 3132 } catch (e) { 3133 return { 3134 e: true, 3135 v: e 3136 }; 3137 } 3138}; 3139 3140/***/ }), 3141
vendor: 1,158 bytes, lines 3142-3165
3142/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js": 3143/*!***************************************************************************************!*\ 3144 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js ***! 3145 \***************************************************************************************/ 3146/*! no static exports found */ 3147/***/ (function(module, exports, __webpack_require__) { 3148 3149var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 3150 3151var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 3152 3153var newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js"); 3154 3155module.exports = function (C, x) { 3156 anObject(C); 3157 if (isObject(x) && x.constructor === C) return x; 3158 var promiseCapability = newPromiseCapability.f(C); 3159 var resolve = promiseCapability.resolve; 3160 resolve(x); 3161 return promiseCapability.promise; 3162}; 3163 3164/***/ }), 3165
vendor: 611 bytes, lines 3166-3183
3166/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js": 3167/*!*************************************************************************************!*\ 3168 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js ***! 3169 \*************************************************************************************/ 3170/*! no static exports found */ 3171/***/ (function(module, exports) { 3172 3173module.exports = function (bitmap, value) { 3174 return { 3175 enumerable: !(bitmap & 1), 3176 configurable: !(bitmap & 2), 3177 writable: !(bitmap & 4), 3178 value: value 3179 }; 3180}; 3181 3182/***/ }), 3183
vendor: 728 bytes, lines 3184-3202
3184/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js": 3185/*!************************************************************************************!*\ 3186 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js ***! 3187 \************************************************************************************/ 3188/*! no static exports found */ 3189/***/ (function(module, exports, __webpack_require__) { 3190 3191var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 3192 3193module.exports = function (target, src, safe) { 3194 for (var key in src) { 3195 redefine(target, key, src[key], safe); 3196 } 3197 3198 return target; 3199}; 3200 3201/***/ }), 3202
vendor: 2,038 bytes, lines 3203-3249
3203/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js": 3204/*!********************************************************************************!*\ 3205 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js ***! 3206 \********************************************************************************/ 3207/*! no static exports found */ 3208/***/ (function(module, exports, __webpack_require__) { 3209 3210var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 3211 3212var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 3213 3214var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 3215 3216var SRC = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js")('src'); 3217 3218var $toString = __webpack_require__(/*! ./_function-to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js"); 3219 3220var TO_STRING = 'toString'; 3221var TPL = ('' + $toString).split(TO_STRING); 3222 3223__webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js").inspectSource = function (it) { 3224 return $toString.call(it); 3225}; 3226 3227(module.exports = function (O, key, val, safe) { 3228 var isFunction = typeof val == 'function'; 3229 if (isFunction) has(val, 'name') || hide(val, 'name', key); 3230 if (O[key] === val) return; 3231 if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); 3232 3233 if (O === global) { 3234 O[key] = val; 3235 } else if (!safe) { 3236 delete O[key]; 3237 hide(O, key, val); 3238 } else if (O[key]) { 3239 O[key] = val; 3240 } else { 3241 hide(O, key, val); 3242 } // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative 3243 3244})(Function.prototype, TO_STRING, function toString() { 3245 return typeof this == 'function' && this[SRC] || $toString.call(this); 3246}); 3247 3248/***/ }), 3249
vendor: 1,554 bytes, lines 3250-3288
3250/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js": 3251/*!********************************************************************************************!*\ 3252 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js ***! 3253 \********************************************************************************************/ 3254/*! no static exports found */ 3255/***/ (function(module, exports, __webpack_require__) { 3256 3257"use strict"; 3258 3259 3260function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 3261 3262var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js"); 3263 3264var builtinExec = RegExp.prototype.exec; // `RegExpExec` abstract operation 3265// https://tc39.github.io/ecma262/#sec-regexpexec 3266 3267module.exports = function (R, S) { 3268 var exec = R.exec; 3269 3270 if (typeof exec === 'function') { 3271 var result = exec.call(R, S); 3272 3273 if (_typeof(result) !== 'object') { 3274 throw new TypeError('RegExp exec method returned something other than an Object or null'); 3275 } 3276 3277 return result; 3278 } 3279 3280 if (classof(R) !== 'RegExp') { 3281 throw new TypeError('RegExp#exec called on incompatible receiver'); 3282 } 3283 3284 return builtinExec.call(R, S); 3285}; 3286 3287/***/ }), 3288
vendor: 2,279 bytes, lines 3289-3355
3289/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js": 3290/*!***********************************************************************************!*\ 3291 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js ***! 3292 \***********************************************************************************/ 3293/*! no static exports found */ 3294/***/ (function(module, exports, __webpack_require__) { 3295 3296"use strict"; 3297 3298 3299var regexpFlags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js"); 3300 3301var nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the 3302// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, 3303// which loads this file before patching the method. 3304 3305var nativeReplace = String.prototype.replace; 3306var patchedExec = nativeExec; 3307var LAST_INDEX = 'lastIndex'; 3308 3309var UPDATES_LAST_INDEX_WRONG = function () { 3310 var re1 = /a/, 3311 re2 = /b*/g; 3312 nativeExec.call(re1, 'a'); 3313 nativeExec.call(re2, 'a'); 3314 return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; 3315}(); // nonparticipating capturing group, copied from es5-shim's String#split patch. 3316 3317 3318var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; 3319var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; 3320 3321if (PATCH) { 3322 patchedExec = function exec(str) { 3323 var re = this; 3324 var lastIndex, reCopy, match, i; 3325 3326 if (NPCG_INCLUDED) { 3327 reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); 3328 } 3329 3330 if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; 3331 match = nativeExec.call(re, str); 3332 3333 if (UPDATES_LAST_INDEX_WRONG && match) { 3334 re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; 3335 } 3336 3337 if (NPCG_INCLUDED && match && match.length > 1) { 3338 // Fix browsers whose `exec` methods don't consistently return `undefined` 3339 // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ 3340 // eslint-disable-next-line no-loop-func 3341 nativeReplace.call(match[0], reCopy, function () { 3342 for (i = 1; i < arguments.length - 2; i++) { 3343 if (arguments[i] === undefined) match[i] = undefined; 3344 } 3345 }); 3346 } 3347 3348 return match; 3349 }; 3350} 3351 3352module.exports = patchedExec; 3353 3354/***/ }), 3355
vendor: 652 bytes, lines 3356-3373
3356/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js": 3357/*!********************************************************************************!*\ 3358 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js ***! 3359 \********************************************************************************/ 3360/*! no static exports found */ 3361/***/ (function(module, exports) { 3362 3363module.exports = function (regExp, replace) { 3364 var replacer = replace === Object(replace) ? function (part) { 3365 return replace[part]; 3366 } : replace; 3367 return function (it) { 3368 return String(it).replace(regExp, replacer); 3369 }; 3370}; 3371 3372/***/ }), 3373
vendor: 616 bytes, lines 3374-3388
3374/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js": 3375/*!**********************************************************************************!*\ 3376 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js ***! 3377 \**********************************************************************************/ 3378/*! no static exports found */ 3379/***/ (function(module, exports) { 3380 3381// 7.2.9 SameValue(x, y) 3382module.exports = Object.is || function is(x, y) { 3383 // eslint-disable-next-line no-self-compare 3384 return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; 3385}; 3386 3387/***/ }), 3388
vendor: 1,704 bytes, lines 3389-3436
3389/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js": 3390/*!*******************************************************************************************!*\ 3391 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js ***! 3392 \*******************************************************************************************/ 3393/*! no static exports found */ 3394/***/ (function(module, exports, __webpack_require__) { 3395 3396"use strict"; 3397 // https://tc39.github.io/proposal-setmap-offrom/ 3398 3399var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 3400 3401var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 3402 3403var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 3404 3405var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 3406 3407module.exports = function (COLLECTION) { 3408 $export($export.S, COLLECTION, { 3409 from: function from(source 3410 /* , mapFn, thisArg */ 3411 ) { 3412 var mapFn = arguments[1]; 3413 var mapping, A, n, cb; 3414 aFunction(this); 3415 mapping = mapFn !== undefined; 3416 if (mapping) aFunction(mapFn); 3417 if (source == undefined) return new this(); 3418 A = []; 3419 3420 if (mapping) { 3421 n = 0; 3422 cb = ctx(mapFn, arguments[2], 2); 3423 forOf(source, false, function (nextItem) { 3424 A.push(cb(nextItem, n++)); 3425 }); 3426 } else { 3427 forOf(source, false, A.push, A); 3428 } 3429 3430 return new this(A); 3431 } 3432 }); 3433}; 3434 3435/***/ }), 3436
vendor: 953 bytes, lines 3437-3465
3437/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js": 3438/*!*****************************************************************************************!*\ 3439 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js ***! 3440 \*****************************************************************************************/ 3441/*! no static exports found */ 3442/***/ (function(module, exports, __webpack_require__) { 3443 3444"use strict"; 3445 // https://tc39.github.io/proposal-setmap-offrom/ 3446 3447var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 3448 3449module.exports = function (COLLECTION) { 3450 $export($export.S, COLLECTION, { 3451 of: function of() { 3452 var length = arguments.length; 3453 var A = new Array(length); 3454 3455 while (length--) { 3456 A[length] = arguments[length]; 3457 } 3458 3459 return new this(A); 3460 } 3461 }); 3462}; 3463 3464/***/ }), 3465
vendor: 1,704 bytes, lines 3466-3506
3466/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js": 3467/*!*********************************************************************************!*\ 3468 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js ***! 3469 \*********************************************************************************/ 3470/*! no static exports found */ 3471/***/ (function(module, exports, __webpack_require__) { 3472 3473// Works with __proto__ only. Old v8 can't work with null proto objects. 3474 3475/* eslint-disable no-proto */ 3476var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 3477 3478var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 3479 3480var check = function check(O, proto) { 3481 anObject(O); 3482 if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); 3483}; 3484 3485module.exports = { 3486 set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line 3487 function (test, buggy, set) { 3488 try { 3489 set = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js")(Function.call, __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f(Object.prototype, '__proto__').set, 2); 3490 set(test, []); 3491 buggy = !(test instanceof Array); 3492 } catch (e) { 3493 buggy = true; 3494 } 3495 3496 return function setPrototypeOf(O, proto) { 3497 check(O, proto); 3498 if (buggy) O.__proto__ = proto;else set(O, proto); 3499 return O; 3500 }; 3501 }({}, false) : undefined), 3502 check: check 3503}; 3504 3505/***/ }), 3506
vendor: 1,193 bytes, lines 3507-3536
3507/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js": 3508/*!***********************************************************************************!*\ 3509 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js ***! 3510 \***********************************************************************************/ 3511/*! no static exports found */ 3512/***/ (function(module, exports, __webpack_require__) { 3513 3514"use strict"; 3515 3516 3517var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 3518 3519var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 3520 3521var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"); 3522 3523var SPECIES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species'); 3524 3525module.exports = function (KEY) { 3526 var C = global[KEY]; 3527 if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { 3528 configurable: true, 3529 get: function get() { 3530 return this; 3531 } 3532 }); 3533}; 3534 3535/***/ }), 3536
vendor: 1,016 bytes, lines 3537-3558
3537/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js": 3538/*!*****************************************************************************************!*\ 3539 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js ***! 3540 \*****************************************************************************************/ 3541/*! no static exports found */ 3542/***/ (function(module, exports, __webpack_require__) { 3543 3544var def = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 3545 3546var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 3547 3548var TAG = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toStringTag'); 3549 3550module.exports = function (it, tag, stat) { 3551 if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { 3552 configurable: true, 3553 value: tag 3554 }); 3555}; 3556 3557/***/ }), 3558
vendor: 785 bytes, lines 3559-3575
3559/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js": 3560/*!**********************************************************************************!*\ 3561 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js ***! 3562 \**********************************************************************************/ 3563/*! no static exports found */ 3564/***/ (function(module, exports, __webpack_require__) { 3565 3566var shared = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('keys'); 3567 3568var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js"); 3569 3570module.exports = function (key) { 3571 return shared[key] || (shared[key] = uid(key)); 3572}; 3573 3574/***/ }), 3575
vendor: 1,129 bytes, lines 3576-3598
3576/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js": 3577/*!******************************************************************************!*\ 3578 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js ***! 3579 \******************************************************************************/ 3580/*! no static exports found */ 3581/***/ (function(module, exports, __webpack_require__) { 3582 3583var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 3584 3585var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 3586 3587var SHARED = '__core-js_shared__'; 3588var store = global[SHARED] || (global[SHARED] = {}); 3589(module.exports = function (key, value) { 3590 return store[key] || (store[key] = value !== undefined ? value : {}); 3591})('versions', []).push({ 3592 version: core.version, 3593 mode: __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js") ? 'pure' : 'global', 3594 copyright: '© 2019 Denis Pushkarev (zloirock.ru)' 3595}); 3596 3597/***/ }), 3598
vendor: 1,108 bytes, lines 3599-3620
3599/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js": 3600/*!*******************************************************************************************!*\ 3601 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js ***! 3602 \*******************************************************************************************/ 3603/*! no static exports found */ 3604/***/ (function(module, exports, __webpack_require__) { 3605 3606// 7.3.20 SpeciesConstructor(O, defaultConstructor) 3607var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 3608 3609var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 3610 3611var SPECIES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species'); 3612 3613module.exports = function (O, D) { 3614 var C = anObject(O).constructor; 3615 var S; 3616 return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); 3617}; 3618 3619/***/ }), 3620
vendor: 829 bytes, lines 3621-3643
3621/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js": 3622/*!*************************************************************************************!*\ 3623 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js ***! 3624 \*************************************************************************************/ 3625/*! no static exports found */ 3626/***/ (function(module, exports, __webpack_require__) { 3627 3628"use strict"; 3629 3630 3631var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 3632 3633module.exports = function (method, arg) { 3634 return !!method && fails(function () { 3635 // eslint-disable-next-line no-useless-call 3636 arg ? method.call(null, function () { 3637 /* empty */ 3638 }, 1) : method.call(null); 3639 }); 3640}; 3641 3642/***/ }), 3643
vendor: 1,239 bytes, lines 3644-3670
3644/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js": 3645/*!*********************************************************************************!*\ 3646 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js ***! 3647 \*********************************************************************************/ 3648/*! no static exports found */ 3649/***/ (function(module, exports, __webpack_require__) { 3650 3651var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 3652 3653var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); // true -> String#at 3654// false -> String#codePointAt 3655 3656 3657module.exports = function (TO_STRING) { 3658 return function (that, pos) { 3659 var s = String(defined(that)); 3660 var i = toInteger(pos); 3661 var l = s.length; 3662 var a, b; 3663 if (i < 0 || i >= l) return TO_STRING ? '' : undefined; 3664 a = s.charCodeAt(i); 3665 return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; 3666 }; 3667}; 3668 3669/***/ }), 3670
vendor: 962 bytes, lines 3671-3689
3671/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js": 3672/*!**************************************************************************************!*\ 3673 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js ***! 3674 \**************************************************************************************/ 3675/*! no static exports found */ 3676/***/ (function(module, exports, __webpack_require__) { 3677 3678// helper for String#{startsWith, endsWith, includes} 3679var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js"); 3680 3681var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 3682 3683module.exports = function (that, searchString, NAME) { 3684 if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); 3685 return String(defined(that)); 3686}; 3687 3688/***/ }), 3689
vendor: 1,438 bytes, lines 3690-3722
3690/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js": 3691/*!***********************************************************************************!*\ 3692 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js ***! 3693 \***********************************************************************************/ 3694/*! no static exports found */ 3695/***/ (function(module, exports, __webpack_require__) { 3696 3697var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 3698 3699var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 3700 3701var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 3702 3703var quot = /"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value) 3704 3705var createHTML = function createHTML(string, tag, attribute, value) { 3706 var S = String(defined(string)); 3707 var p1 = '<' + tag; 3708 if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; 3709 return p1 + '>' + S + '</' + tag + '>'; 3710}; 3711 3712module.exports = function (NAME, exec) { 3713 var O = {}; 3714 O[NAME] = exec(createHTML); 3715 $export($export.P + $export.F * fails(function () { 3716 var test = ''[NAME]('"'); 3717 return test !== test.toLowerCase() || test.split('"').length > 3; 3718 }), 'String', O); 3719}; 3720 3721/***/ }), 3722
vendor: 1,474 bytes, lines 3723-3750
3723/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js": 3724/*!**********************************************************************************!*\ 3725 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js ***! 3726 \**********************************************************************************/ 3727/*! no static exports found */ 3728/***/ (function(module, exports, __webpack_require__) { 3729 3730// https://github.com/tc39/proposal-string-pad-start-end 3731var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 3732 3733var repeat = __webpack_require__(/*! ./_string-repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js"); 3734 3735var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 3736 3737module.exports = function (that, maxLength, fillString, left) { 3738 var S = String(defined(that)); 3739 var stringLength = S.length; 3740 var fillStr = fillString === undefined ? ' ' : String(fillString); 3741 var intMaxLength = toLength(maxLength); 3742 if (intMaxLength <= stringLength || fillStr == '') return S; 3743 var fillLen = intMaxLength - stringLength; 3744 var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length)); 3745 if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen); 3746 return left ? stringFiller + S : S + stringFiller; 3747}; 3748 3749/***/ }), 3750
vendor: 1,033 bytes, lines 3751-3779
3751/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js": 3752/*!*************************************************************************************!*\ 3753 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js ***! 3754 \*************************************************************************************/ 3755/*! no static exports found */ 3756/***/ (function(module, exports, __webpack_require__) { 3757 3758"use strict"; 3759 3760 3761var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 3762 3763var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 3764 3765module.exports = function repeat(count) { 3766 var str = String(defined(this)); 3767 var res = ''; 3768 var n = toInteger(count); 3769 if (n < 0 || n == Infinity) throw RangeError("Count can't be negative"); 3770 3771 for (; n > 0; (n >>>= 1) && (str += str)) { 3772 if (n & 1) res += str; 3773 } 3774 3775 return res; 3776}; 3777 3778/***/ }), 3779
vendor: 1,724 bytes, lines 3780-3823
3780/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js": 3781/*!***********************************************************************************!*\ 3782 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js ***! 3783 \***********************************************************************************/ 3784/*! no static exports found */ 3785/***/ (function(module, exports, __webpack_require__) { 3786 3787var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 3788 3789var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 3790 3791var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 3792 3793var spaces = __webpack_require__(/*! ./_string-ws */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js"); 3794 3795var space = '[' + spaces + ']'; 3796var non = "\u200B\x85"; 3797var ltrim = RegExp('^' + space + space + '*'); 3798var rtrim = RegExp(space + space + '*$'); 3799 3800var exporter = function exporter(KEY, exec, ALIAS) { 3801 var exp = {}; 3802 var FORCE = fails(function () { 3803 return !!spaces[KEY]() || non[KEY]() != non; 3804 }); 3805 var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; 3806 if (ALIAS) exp[ALIAS] = fn; 3807 $export($export.P + $export.F * FORCE, 'String', exp); 3808}; // 1 -> String#trimLeft 3809// 2 -> String#trimRight 3810// 3 -> String#trim 3811 3812 3813var trim = exporter.trim = function (string, TYPE) { 3814 string = String(defined(string)); 3815 if (TYPE & 1) string = string.replace(ltrim, ''); 3816 if (TYPE & 2) string = string.replace(rtrim, ''); 3817 return string; 3818}; 3819 3820module.exports = exporter; 3821 3822/***/ }), 3823
vendor: 579 bytes, lines 3824-3834
3824/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js": 3825/*!*********************************************************************************!*\ 3826 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js ***! 3827 \*********************************************************************************/ 3828/*! no static exports found */ 3829/***/ (function(module, exports) { 3830 3831module.exports = "\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF"; 3832 3833/***/ }), 3834
vendor: 3,502 bytes, lines 3835-3943
3835/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js": 3836/*!****************************************************************************!*\ 3837 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js ***! 3838 \****************************************************************************/ 3839/*! no static exports found */ 3840/***/ (function(module, exports, __webpack_require__) { 3841 3842var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 3843 3844var invoke = __webpack_require__(/*! ./_invoke */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js"); 3845 3846var html = __webpack_require__(/*! ./_html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js"); 3847 3848var cel = __webpack_require__(/*! ./_dom-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js"); 3849 3850var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 3851 3852var process = global.process; 3853var setTask = global.setImmediate; 3854var clearTask = global.clearImmediate; 3855var MessageChannel = global.MessageChannel; 3856var Dispatch = global.Dispatch; 3857var counter = 0; 3858var queue = {}; 3859var ONREADYSTATECHANGE = 'onreadystatechange'; 3860var defer, channel, port; 3861 3862var run = function run() { 3863 var id = +this; // eslint-disable-next-line no-prototype-builtins 3864 3865 if (queue.hasOwnProperty(id)) { 3866 var fn = queue[id]; 3867 delete queue[id]; 3868 fn(); 3869 } 3870}; 3871 3872var listener = function listener(event) { 3873 run.call(event.data); 3874}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: 3875 3876 3877if (!setTask || !clearTask) { 3878 setTask = function setImmediate(fn) { 3879 var args = []; 3880 var i = 1; 3881 3882 while (arguments.length > i) { 3883 args.push(arguments[i++]); 3884 } 3885 3886 queue[++counter] = function () { 3887 // eslint-disable-next-line no-new-func 3888 invoke(typeof fn == 'function' ? fn : Function(fn), args); 3889 }; 3890 3891 defer(counter); 3892 return counter; 3893 }; 3894 3895 clearTask = function clearImmediate(id) { 3896 delete queue[id]; 3897 }; // Node.js 0.8- 3898 3899 3900 if (__webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js")(process) == 'process') { 3901 defer = function defer(id) { 3902 process.nextTick(ctx(run, id, 1)); 3903 }; // Sphere (JS game engine) Dispatch API 3904 3905 } else if (Dispatch && Dispatch.now) { 3906 defer = function defer(id) { 3907 Dispatch.now(ctx(run, id, 1)); 3908 }; // Browsers with MessageChannel, includes WebWorkers 3909 3910 } else if (MessageChannel) { 3911 channel = new MessageChannel(); 3912 port = channel.port2; 3913 channel.port1.onmessage = listener; 3914 defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers 3915 // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' 3916 } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { 3917 defer = function defer(id) { 3918 global.postMessage(id + '', '*'); 3919 }; 3920 3921 global.addEventListener('message', listener, false); // IE8- 3922 } else if (ONREADYSTATECHANGE in cel('script')) { 3923 defer = function defer(id) { 3924 html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { 3925 html.removeChild(this); 3926 run.call(id); 3927 }; 3928 }; // Rest old browsers 3929 3930 } else { 3931 defer = function defer(id) { 3932 setTimeout(ctx(run, id, 1), 0); 3933 }; 3934 } 3935} 3936 3937module.exports = { 3938 set: setTask, 3939 clear: clearTask 3940}; 3941 3942/***/ }), 3943
vendor: 794 bytes, lines 3944-3962
3944/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js": 3945/*!*****************************************************************************************!*\ 3946 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js ***! 3947 \*****************************************************************************************/ 3948/*! no static exports found */ 3949/***/ (function(module, exports, __webpack_require__) { 3950 3951var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 3952 3953var max = Math.max; 3954var min = Math.min; 3955 3956module.exports = function (index, length) { 3957 index = toInteger(index); 3958 return index < 0 ? max(index + length, 0) : min(index, length); 3959}; 3960 3961/***/ }), 3962
vendor: 967 bytes, lines 3963-3984
3963/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js": 3964/*!********************************************************************************!*\ 3965 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js ***! 3966 \********************************************************************************/ 3967/*! no static exports found */ 3968/***/ (function(module, exports, __webpack_require__) { 3969 3970// https://tc39.github.io/ecma262/#sec-toindex 3971var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 3972 3973var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 3974 3975module.exports = function (it) { 3976 if (it === undefined) return 0; 3977 var number = toInteger(it); 3978 var length = toLength(number); 3979 if (number !== length) throw RangeError('Wrong length!'); 3980 return length; 3981}; 3982 3983/***/ }), 3984
vendor: 588 bytes, lines 3985-4001
3985/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js": 3986/*!**********************************************************************************!*\ 3987 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js ***! 3988 \**********************************************************************************/ 3989/*! no static exports found */ 3990/***/ (function(module, exports) { 3991 3992// 7.1.4 ToInteger 3993var ceil = Math.ceil; 3994var floor = Math.floor; 3995 3996module.exports = function (it) { 3997 return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); 3998}; 3999 4000/***/ }), 4001
vendor: 848 bytes, lines 4002-4019
4002/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js": 4003/*!**********************************************************************************!*\ 4004 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js ***! 4005 \**********************************************************************************/ 4006/*! no static exports found */ 4007/***/ (function(module, exports, __webpack_require__) { 4008 4009// to indexed object, toObject with fallback for non-array-like ES3 strings 4010var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js"); 4011 4012var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 4013 4014module.exports = function (it) { 4015 return IObject(defined(it)); 4016}; 4017 4018/***/ }), 4019
vendor: 754 bytes, lines 4020-4037
4020/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js": 4021/*!*********************************************************************************!*\ 4022 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js ***! 4023 \*********************************************************************************/ 4024/*! no static exports found */ 4025/***/ (function(module, exports, __webpack_require__) { 4026 4027// 7.1.15 ToLength 4028var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 4029 4030var min = Math.min; 4031 4032module.exports = function (it) { 4033 return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 4034}; 4035 4036/***/ }), 4037
vendor: 667 bytes, lines 4038-4053
4038/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js": 4039/*!*********************************************************************************!*\ 4040 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js ***! 4041 \*********************************************************************************/ 4042/*! no static exports found */ 4043/***/ (function(module, exports, __webpack_require__) { 4044 4045// 7.1.13 ToObject(argument) 4046var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 4047 4048module.exports = function (it) { 4049 return Object(defined(it)); 4050}; 4051 4052/***/ }), 4053
vendor: 1,205 bytes, lines 4054-4076
4054/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js": 4055/*!************************************************************************************!*\ 4056 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js ***! 4057 \************************************************************************************/ 4058/*! no static exports found */ 4059/***/ (function(module, exports, __webpack_require__) { 4060 4061// 7.1.1 ToPrimitive(input [, PreferredType]) 4062var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); // instead of the ES6 spec version, we didn't implement @@toPrimitive case 4063// and the second argument - flag - preferred type is a string 4064 4065 4066module.exports = function (it, S) { 4067 if (!isObject(it)) return it; 4068 var fn, val; 4069 if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; 4070 if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; 4071 if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; 4072 throw TypeError("Can't convert object to primitive value"); 4073}; 4074 4075/***/ }), 4076
vendor: 23,111 bytes, lines 4077-4674
4077/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js": 4078/*!***********************************************************************************!*\ 4079 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js ***! 4080 \***********************************************************************************/ 4081/*! no static exports found */ 4082/***/ (function(module, exports, __webpack_require__) { 4083 4084"use strict"; 4085 4086 4087function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 4088 4089if (__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js")) { 4090 var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js"); 4091 4092 var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 4093 4094 var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 4095 4096 var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 4097 4098 var $typed = __webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js"); 4099 4100 var $buffer = __webpack_require__(/*! ./_typed-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js"); 4101 4102 var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 4103 4104 var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 4105 4106 var propertyDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 4107 4108 var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 4109 4110 var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js"); 4111 4112 var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 4113 4114 var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 4115 4116 var toIndex = __webpack_require__(/*! ./_to-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js"); 4117 4118 var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 4119 4120 var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 4121 4122 var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 4123 4124 var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js"); 4125 4126 var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 4127 4128 var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 4129 4130 var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js"); 4131 4132 var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js"); 4133 4134 var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 4135 4136 var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f; 4137 4138 var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js"); 4139 4140 var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js"); 4141 4142 var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js"); 4143 4144 var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js"); 4145 4146 var createArrayIncludes = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js"); 4147 4148 var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js"); 4149 4150 var ArrayIterators = __webpack_require__(/*! ./es6.array.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js"); 4151 4152 var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js"); 4153 4154 var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js"); 4155 4156 var setSpecies = __webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js"); 4157 4158 var arrayFill = __webpack_require__(/*! ./_array-fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js"); 4159 4160 var arrayCopyWithin = __webpack_require__(/*! ./_array-copy-within */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js"); 4161 4162 var $DP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 4163 4164 var $GOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js"); 4165 4166 var dP = $DP.f; 4167 var gOPD = $GOPD.f; 4168 var RangeError = global.RangeError; 4169 var TypeError = global.TypeError; 4170 var Uint8Array = global.Uint8Array; 4171 var ARRAY_BUFFER = 'ArrayBuffer'; 4172 var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER; 4173 var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT'; 4174 var PROTOTYPE = 'prototype'; 4175 var ArrayProto = Array[PROTOTYPE]; 4176 var $ArrayBuffer = $buffer.ArrayBuffer; 4177 var $DataView = $buffer.DataView; 4178 var arrayForEach = createArrayMethod(0); 4179 var arrayFilter = createArrayMethod(2); 4180 var arraySome = createArrayMethod(3); 4181 var arrayEvery = createArrayMethod(4); 4182 var arrayFind = createArrayMethod(5); 4183 var arrayFindIndex = createArrayMethod(6); 4184 var arrayIncludes = createArrayIncludes(true); 4185 var arrayIndexOf = createArrayIncludes(false); 4186 var arrayValues = ArrayIterators.values; 4187 var arrayKeys = ArrayIterators.keys; 4188 var arrayEntries = ArrayIterators.entries; 4189 var arrayLastIndexOf = ArrayProto.lastIndexOf; 4190 var arrayReduce = ArrayProto.reduce; 4191 var arrayReduceRight = ArrayProto.reduceRight; 4192 var arrayJoin = ArrayProto.join; 4193 var arraySort = ArrayProto.sort; 4194 var arraySlice = ArrayProto.slice; 4195 var arrayToString = ArrayProto.toString; 4196 var arrayToLocaleString = ArrayProto.toLocaleString; 4197 var ITERATOR = wks('iterator'); 4198 var TAG = wks('toStringTag'); 4199 var TYPED_CONSTRUCTOR = uid('typed_constructor'); 4200 var DEF_CONSTRUCTOR = uid('def_constructor'); 4201 var ALL_CONSTRUCTORS = $typed.CONSTR; 4202 var TYPED_ARRAY = $typed.TYPED; 4203 var VIEW = $typed.VIEW; 4204 var WRONG_LENGTH = 'Wrong length!'; 4205 var $map = createArrayMethod(1, function (O, length) { 4206 return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length); 4207 }); 4208 var LITTLE_ENDIAN = fails(function () { 4209 // eslint-disable-next-line no-undef 4210 return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1; 4211 }); 4212 var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () { 4213 new Uint8Array(1).set({}); 4214 }); 4215 4216 var toOffset = function toOffset(it, BYTES) { 4217 var offset = toInteger(it); 4218 if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!'); 4219 return offset; 4220 }; 4221 4222 var validate = function validate(it) { 4223 if (isObject(it) && TYPED_ARRAY in it) return it; 4224 throw TypeError(it + ' is not a typed array!'); 4225 }; 4226 4227 var allocate = function allocate(C, length) { 4228 if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) { 4229 throw TypeError('It is not a typed array constructor!'); 4230 } 4231 4232 return new C(length); 4233 }; 4234 4235 var speciesFromList = function speciesFromList(O, list) { 4236 return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list); 4237 }; 4238 4239 var fromList = function fromList(C, list) { 4240 var index = 0; 4241 var length = list.length; 4242 var result = allocate(C, length); 4243 4244 while (length > index) { 4245 result[index] = list[index++]; 4246 } 4247 4248 return result; 4249 }; 4250 4251 var addGetter = function addGetter(it, key, internal) { 4252 dP(it, key, { 4253 get: function get() { 4254 return this._d[internal]; 4255 } 4256 }); 4257 }; 4258 4259 var $from = function from(source 4260 /* , mapfn, thisArg */ 4261 ) { 4262 var O = toObject(source); 4263 var aLen = arguments.length; 4264 var mapfn = aLen > 1 ? arguments[1] : undefined; 4265 var mapping = mapfn !== undefined; 4266 var iterFn = getIterFn(O); 4267 var i, length, values, result, step, iterator; 4268 4269 if (iterFn != undefined && !isArrayIter(iterFn)) { 4270 for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) { 4271 values.push(step.value); 4272 } 4273 4274 O = values; 4275 } 4276 4277 if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2); 4278 4279 for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) { 4280 result[i] = mapping ? mapfn(O[i], i) : O[i]; 4281 } 4282 4283 return result; 4284 }; 4285 4286 var $of = function of() 4287 /* ...items */ 4288 { 4289 var index = 0; 4290 var length = arguments.length; 4291 var result = allocate(this, length); 4292 4293 while (length > index) { 4294 result[index] = arguments[index++]; 4295 } 4296 4297 return result; 4298 }; // iOS Safari 6.x fails here 4299 4300 4301 var TO_LOCALE_BUG = !!Uint8Array && fails(function () { 4302 arrayToLocaleString.call(new Uint8Array(1)); 4303 }); 4304 4305 var $toLocaleString = function toLocaleString() { 4306 return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments); 4307 }; 4308 4309 var proto = { 4310 copyWithin: function copyWithin(target, start 4311 /* , end */ 4312 ) { 4313 return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined); 4314 }, 4315 every: function every(callbackfn 4316 /* , thisArg */ 4317 ) { 4318 return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); 4319 }, 4320 fill: function fill(value 4321 /* , start, end */ 4322 ) { 4323 // eslint-disable-line no-unused-vars 4324 return arrayFill.apply(validate(this), arguments); 4325 }, 4326 filter: function filter(callbackfn 4327 /* , thisArg */ 4328 ) { 4329 return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined)); 4330 }, 4331 find: function find(predicate 4332 /* , thisArg */ 4333 ) { 4334 return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); 4335 }, 4336 findIndex: function findIndex(predicate 4337 /* , thisArg */ 4338 ) { 4339 return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); 4340 }, 4341 forEach: function forEach(callbackfn 4342 /* , thisArg */ 4343 ) { 4344 arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); 4345 }, 4346 indexOf: function indexOf(searchElement 4347 /* , fromIndex */ 4348 ) { 4349 return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); 4350 }, 4351 includes: function includes(searchElement 4352 /* , fromIndex */ 4353 ) { 4354 return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); 4355 }, 4356 join: function join(separator) { 4357 // eslint-disable-line no-unused-vars 4358 return arrayJoin.apply(validate(this), arguments); 4359 }, 4360 lastIndexOf: function lastIndexOf(searchElement 4361 /* , fromIndex */ 4362 ) { 4363 // eslint-disable-line no-unused-vars 4364 return arrayLastIndexOf.apply(validate(this), arguments); 4365 }, 4366 map: function map(mapfn 4367 /* , thisArg */ 4368 ) { 4369 return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined); 4370 }, 4371 reduce: function reduce(callbackfn 4372 /* , initialValue */ 4373 ) { 4374 // eslint-disable-line no-unused-vars 4375 return arrayReduce.apply(validate(this), arguments); 4376 }, 4377 reduceRight: function reduceRight(callbackfn 4378 /* , initialValue */ 4379 ) { 4380 // eslint-disable-line no-unused-vars 4381 return arrayReduceRight.apply(validate(this), arguments); 4382 }, 4383 reverse: function reverse() { 4384 var that = this; 4385 var length = validate(that).length; 4386 var middle = Math.floor(length / 2); 4387 var index = 0; 4388 var value; 4389 4390 while (index < middle) { 4391 value = that[index]; 4392 that[index++] = that[--length]; 4393 that[length] = value; 4394 } 4395 4396 return that; 4397 }, 4398 some: function some(callbackfn 4399 /* , thisArg */ 4400 ) { 4401 return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); 4402 }, 4403 sort: function sort(comparefn) { 4404 return arraySort.call(validate(this), comparefn); 4405 }, 4406 subarray: function subarray(begin, end) { 4407 var O = validate(this); 4408 var length = O.length; 4409 var $begin = toAbsoluteIndex(begin, length); 4410 return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)); 4411 } 4412 }; 4413 4414 var $slice = function slice(start, end) { 4415 return speciesFromList(this, arraySlice.call(validate(this), start, end)); 4416 }; 4417 4418 var $set = function set(arrayLike 4419 /* , offset */ 4420 ) { 4421 validate(this); 4422 var offset = toOffset(arguments[1], 1); 4423 var length = this.length; 4424 var src = toObject(arrayLike); 4425 var len = toLength(src.length); 4426 var index = 0; 4427 if (len + offset > length) throw RangeError(WRONG_LENGTH); 4428 4429 while (index < len) { 4430 this[offset + index] = src[index++]; 4431 } 4432 }; 4433 4434 var $iterators = { 4435 entries: function entries() { 4436 return arrayEntries.call(validate(this)); 4437 }, 4438 keys: function keys() { 4439 return arrayKeys.call(validate(this)); 4440 }, 4441 values: function values() { 4442 return arrayValues.call(validate(this)); 4443 } 4444 }; 4445 4446 var isTAIndex = function isTAIndex(target, key) { 4447 return isObject(target) && target[TYPED_ARRAY] && _typeof(key) != 'symbol' && key in target && String(+key) == String(key); 4448 }; 4449 4450 var $getDesc = function getOwnPropertyDescriptor(target, key) { 4451 return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key); 4452 }; 4453 4454 var $setDesc = function defineProperty(target, key, desc) { 4455 if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set') // TODO: add validation descriptor w/o calling accessors 4456 && !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable)) { 4457 target[key] = desc.value; 4458 return target; 4459 } 4460 4461 return dP(target, key, desc); 4462 }; 4463 4464 if (!ALL_CONSTRUCTORS) { 4465 $GOPD.f = $getDesc; 4466 $DP.f = $setDesc; 4467 } 4468 4469 $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', { 4470 getOwnPropertyDescriptor: $getDesc, 4471 defineProperty: $setDesc 4472 }); 4473 4474 if (fails(function () { 4475 arrayToString.call({}); 4476 })) { 4477 arrayToString = arrayToLocaleString = function toString() { 4478 return arrayJoin.call(this); 4479 }; 4480 } 4481 4482 var $TypedArrayPrototype$ = redefineAll({}, proto); 4483 redefineAll($TypedArrayPrototype$, $iterators); 4484 hide($TypedArrayPrototype$, ITERATOR, $iterators.values); 4485 redefineAll($TypedArrayPrototype$, { 4486 slice: $slice, 4487 set: $set, 4488 constructor: function constructor() { 4489 /* noop */ 4490 }, 4491 toString: arrayToString, 4492 toLocaleString: $toLocaleString 4493 }); 4494 addGetter($TypedArrayPrototype$, 'buffer', 'b'); 4495 addGetter($TypedArrayPrototype$, 'byteOffset', 'o'); 4496 addGetter($TypedArrayPrototype$, 'byteLength', 'l'); 4497 addGetter($TypedArrayPrototype$, 'length', 'e'); 4498 dP($TypedArrayPrototype$, TAG, { 4499 get: function get() { 4500 return this[TYPED_ARRAY]; 4501 } 4502 }); // eslint-disable-next-line max-statements 4503 4504 module.exports = function (KEY, BYTES, wrapper, CLAMPED) { 4505 CLAMPED = !!CLAMPED; 4506 var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array'; 4507 var GETTER = 'get' + KEY; 4508 var SETTER = 'set' + KEY; 4509 var TypedArray = global[NAME]; 4510 var Base = TypedArray || {}; 4511 var TAC = TypedArray && getPrototypeOf(TypedArray); 4512 var FORCED = !TypedArray || !$typed.ABV; 4513 var O = {}; 4514 var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE]; 4515 4516 var getter = function getter(that, index) { 4517 var data = that._d; 4518 return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN); 4519 }; 4520 4521 var setter = function setter(that, index, value) { 4522 var data = that._d; 4523 if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff; 4524 data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN); 4525 }; 4526 4527 var addElement = function addElement(that, index) { 4528 dP(that, index, { 4529 get: function get() { 4530 return getter(this, index); 4531 }, 4532 set: function set(value) { 4533 return setter(this, index, value); 4534 }, 4535 enumerable: true 4536 }); 4537 }; 4538 4539 if (FORCED) { 4540 TypedArray = wrapper(function (that, data, $offset, $length) { 4541 anInstance(that, TypedArray, NAME, '_d'); 4542 var index = 0; 4543 var offset = 0; 4544 var buffer, byteLength, length, klass; 4545 4546 if (!isObject(data)) { 4547 length = toIndex(data); 4548 byteLength = length * BYTES; 4549 buffer = new $ArrayBuffer(byteLength); 4550 } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { 4551 buffer = data; 4552 offset = toOffset($offset, BYTES); 4553 var $len = data.byteLength; 4554 4555 if ($length === undefined) { 4556 if ($len % BYTES) throw RangeError(WRONG_LENGTH); 4557 byteLength = $len - offset; 4558 if (byteLength < 0) throw RangeError(WRONG_LENGTH); 4559 } else { 4560 byteLength = toLength($length) * BYTES; 4561 if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH); 4562 } 4563 4564 length = byteLength / BYTES; 4565 } else if (TYPED_ARRAY in data) { 4566 return fromList(TypedArray, data); 4567 } else { 4568 return $from.call(TypedArray, data); 4569 } 4570 4571 hide(that, '_d', { 4572 b: buffer, 4573 o: offset, 4574 l: byteLength, 4575 e: length, 4576 v: new $DataView(buffer) 4577 }); 4578 4579 while (index < length) { 4580 addElement(that, index++); 4581 } 4582 }); 4583 TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$); 4584 hide(TypedArrayPrototype, 'constructor', TypedArray); 4585 } else if (!fails(function () { 4586 TypedArray(1); 4587 }) || !fails(function () { 4588 new TypedArray(-1); // eslint-disable-line no-new 4589 }) || !$iterDetect(function (iter) { 4590 new TypedArray(); // eslint-disable-line no-new 4591 4592 new TypedArray(null); // eslint-disable-line no-new 4593 4594 new TypedArray(1.5); // eslint-disable-line no-new 4595 4596 new TypedArray(iter); // eslint-disable-line no-new 4597 }, true)) { 4598 TypedArray = wrapper(function (that, data, $offset, $length) { 4599 anInstance(that, TypedArray, NAME); 4600 var klass; // `ws` module bug, temporarily remove validation length for Uint8Array 4601 // https://github.com/websockets/ws/pull/645 4602 4603 if (!isObject(data)) return new Base(toIndex(data)); 4604 4605 if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { 4606 return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data); 4607 } 4608 4609 if (TYPED_ARRAY in data) return fromList(TypedArray, data); 4610 return $from.call(TypedArray, data); 4611 }); 4612 arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) { 4613 if (!(key in TypedArray)) hide(TypedArray, key, Base[key]); 4614 }); 4615 TypedArray[PROTOTYPE] = TypedArrayPrototype; 4616 if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray; 4617 } 4618 4619 var $nativeIterator = TypedArrayPrototype[ITERATOR]; 4620 var CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined); 4621 var $iterator = $iterators.values; 4622 hide(TypedArray, TYPED_CONSTRUCTOR, true); 4623 hide(TypedArrayPrototype, TYPED_ARRAY, NAME); 4624 hide(TypedArrayPrototype, VIEW, true); 4625 hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray); 4626 4627 if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) { 4628 dP(TypedArrayPrototype, TAG, { 4629 get: function get() { 4630 return NAME; 4631 } 4632 }); 4633 } 4634 4635 O[NAME] = TypedArray; 4636 $export($export.G + $export.W + $export.F * (TypedArray != Base), O); 4637 $export($export.S, NAME, { 4638 BYTES_PER_ELEMENT: BYTES 4639 }); 4640 $export($export.S + $export.F * fails(function () { 4641 Base.of.call(TypedArray, 1); 4642 }), NAME, { 4643 from: $from, 4644 of: $of 4645 }); 4646 if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES); 4647 $export($export.P, NAME, proto); 4648 setSpecies(NAME); 4649 $export($export.P + $export.F * FORCED_SET, NAME, { 4650 set: $set 4651 }); 4652 $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators); 4653 if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString; 4654 $export($export.P + $export.F * fails(function () { 4655 new TypedArray(1).slice(); 4656 }), NAME, { 4657 slice: $slice 4658 }); 4659 $export($export.P + $export.F * (fails(function () { 4660 return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString(); 4661 }) || !fails(function () { 4662 TypedArrayPrototype.toLocaleString.call([1, 2]); 4663 })), NAME, { 4664 toLocaleString: $toLocaleString 4665 }); 4666 Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator; 4667 if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator); 4668 }; 4669} else module.exports = function () { 4670 /* empty */ 4671}; 4672 4673/***/ }), 4674
vendor: 11,557 bytes, lines 4675-5044
4675/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js": 4676/*!************************************************************************************!*\ 4677 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js ***! 4678 \************************************************************************************/ 4679/*! no static exports found */ 4680/***/ (function(module, exports, __webpack_require__) { 4681 4682"use strict"; 4683 4684 4685var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 4686 4687var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"); 4688 4689var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js"); 4690 4691var $typed = __webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js"); 4692 4693var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 4694 4695var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js"); 4696 4697var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 4698 4699var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 4700 4701var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 4702 4703var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 4704 4705var toIndex = __webpack_require__(/*! ./_to-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js"); 4706 4707var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f; 4708 4709var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 4710 4711var arrayFill = __webpack_require__(/*! ./_array-fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js"); 4712 4713var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js"); 4714 4715var ARRAY_BUFFER = 'ArrayBuffer'; 4716var DATA_VIEW = 'DataView'; 4717var PROTOTYPE = 'prototype'; 4718var WRONG_LENGTH = 'Wrong length!'; 4719var WRONG_INDEX = 'Wrong index!'; 4720var $ArrayBuffer = global[ARRAY_BUFFER]; 4721var $DataView = global[DATA_VIEW]; 4722var Math = global.Math; 4723var RangeError = global.RangeError; // eslint-disable-next-line no-shadow-restricted-names 4724 4725var Infinity = global.Infinity; 4726var BaseBuffer = $ArrayBuffer; 4727var abs = Math.abs; 4728var pow = Math.pow; 4729var floor = Math.floor; 4730var log = Math.log; 4731var LN2 = Math.LN2; 4732var BUFFER = 'buffer'; 4733var BYTE_LENGTH = 'byteLength'; 4734var BYTE_OFFSET = 'byteOffset'; 4735var $BUFFER = DESCRIPTORS ? '_b' : BUFFER; 4736var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH; 4737var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET; // IEEE754 conversions based on https://github.com/feross/ieee754 4738 4739function packIEEE754(value, mLen, nBytes) { 4740 var buffer = new Array(nBytes); 4741 var eLen = nBytes * 8 - mLen - 1; 4742 var eMax = (1 << eLen) - 1; 4743 var eBias = eMax >> 1; 4744 var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0; 4745 var i = 0; 4746 var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; 4747 var e, m, c; 4748 value = abs(value); // eslint-disable-next-line no-self-compare 4749 4750 if (value != value || value === Infinity) { 4751 // eslint-disable-next-line no-self-compare 4752 m = value != value ? 1 : 0; 4753 e = eMax; 4754 } else { 4755 e = floor(log(value) / LN2); 4756 4757 if (value * (c = pow(2, -e)) < 1) { 4758 e--; 4759 c *= 2; 4760 } 4761 4762 if (e + eBias >= 1) { 4763 value += rt / c; 4764 } else { 4765 value += rt * pow(2, 1 - eBias); 4766 } 4767 4768 if (value * c >= 2) { 4769 e++; 4770 c /= 2; 4771 } 4772 4773 if (e + eBias >= eMax) { 4774 m = 0; 4775 e = eMax; 4776 } else if (e + eBias >= 1) { 4777 m = (value * c - 1) * pow(2, mLen); 4778 e = e + eBias; 4779 } else { 4780 m = value * pow(2, eBias - 1) * pow(2, mLen); 4781 e = 0; 4782 } 4783 } 4784 4785 for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8) { 4786 ; 4787 } 4788 4789 e = e << mLen | m; 4790 eLen += mLen; 4791 4792 for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8) { 4793 ; 4794 } 4795 4796 buffer[--i] |= s * 128; 4797 return buffer; 4798} 4799 4800function unpackIEEE754(buffer, mLen, nBytes) { 4801 var eLen = nBytes * 8 - mLen - 1; 4802 var eMax = (1 << eLen) - 1; 4803 var eBias = eMax >> 1; 4804 var nBits = eLen - 7; 4805 var i = nBytes - 1; 4806 var s = buffer[i--]; 4807 var e = s & 127; 4808 var m; 4809 s >>= 7; 4810 4811 for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8) { 4812 ; 4813 } 4814 4815 m = e & (1 << -nBits) - 1; 4816 e >>= -nBits; 4817 nBits += mLen; 4818 4819 for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8) { 4820 ; 4821 } 4822 4823 if (e === 0) { 4824 e = 1 - eBias; 4825 } else if (e === eMax) { 4826 return m ? NaN : s ? -Infinity : Infinity; 4827 } else { 4828 m = m + pow(2, mLen); 4829 e = e - eBias; 4830 } 4831 4832 return (s ? -1 : 1) * m * pow(2, e - mLen); 4833} 4834 4835function unpackI32(bytes) { 4836 return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]; 4837} 4838 4839function packI8(it) { 4840 return [it & 0xff]; 4841} 4842 4843function packI16(it) { 4844 return [it & 0xff, it >> 8 & 0xff]; 4845} 4846 4847function packI32(it) { 4848 return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff]; 4849} 4850 4851function packF64(it) { 4852 return packIEEE754(it, 52, 8); 4853} 4854 4855function packF32(it) { 4856 return packIEEE754(it, 23, 4); 4857} 4858 4859function addGetter(C, key, internal) { 4860 dP(C[PROTOTYPE], key, { 4861 get: function get() { 4862 return this[internal]; 4863 } 4864 }); 4865} 4866 4867function get(view, bytes, index, isLittleEndian) { 4868 var numIndex = +index; 4869 var intIndex = toIndex(numIndex); 4870 if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); 4871 var store = view[$BUFFER]._b; 4872 var start = intIndex + view[$OFFSET]; 4873 var pack = store.slice(start, start + bytes); 4874 return isLittleEndian ? pack : pack.reverse(); 4875} 4876 4877function set(view, bytes, index, conversion, value, isLittleEndian) { 4878 var numIndex = +index; 4879 var intIndex = toIndex(numIndex); 4880 if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); 4881 var store = view[$BUFFER]._b; 4882 var start = intIndex + view[$OFFSET]; 4883 var pack = conversion(+value); 4884 4885 for (var i = 0; i < bytes; i++) { 4886 store[start + i] = pack[isLittleEndian ? i : bytes - i - 1]; 4887 } 4888} 4889 4890if (!$typed.ABV) { 4891 $ArrayBuffer = function ArrayBuffer(length) { 4892 anInstance(this, $ArrayBuffer, ARRAY_BUFFER); 4893 var byteLength = toIndex(length); 4894 this._b = arrayFill.call(new Array(byteLength), 0); 4895 this[$LENGTH] = byteLength; 4896 }; 4897 4898 $DataView = function DataView(buffer, byteOffset, byteLength) { 4899 anInstance(this, $DataView, DATA_VIEW); 4900 anInstance(buffer, $ArrayBuffer, DATA_VIEW); 4901 var bufferLength = buffer[$LENGTH]; 4902 var offset = toInteger(byteOffset); 4903 if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!'); 4904 byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength); 4905 if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH); 4906 this[$BUFFER] = buffer; 4907 this[$OFFSET] = offset; 4908 this[$LENGTH] = byteLength; 4909 }; 4910 4911 if (DESCRIPTORS) { 4912 addGetter($ArrayBuffer, BYTE_LENGTH, '_l'); 4913 addGetter($DataView, BUFFER, '_b'); 4914 addGetter($DataView, BYTE_LENGTH, '_l'); 4915 addGetter($DataView, BYTE_OFFSET, '_o'); 4916 } 4917 4918 redefineAll($DataView[PROTOTYPE], { 4919 getInt8: function getInt8(byteOffset) { 4920 return get(this, 1, byteOffset)[0] << 24 >> 24; 4921 }, 4922 getUint8: function getUint8(byteOffset) { 4923 return get(this, 1, byteOffset)[0]; 4924 }, 4925 getInt16: function getInt16(byteOffset 4926 /* , littleEndian */ 4927 ) { 4928 var bytes = get(this, 2, byteOffset, arguments[1]); 4929 return (bytes[1] << 8 | bytes[0]) << 16 >> 16; 4930 }, 4931 getUint16: function getUint16(byteOffset 4932 /* , littleEndian */ 4933 ) { 4934 var bytes = get(this, 2, byteOffset, arguments[1]); 4935 return bytes[1] << 8 | bytes[0]; 4936 }, 4937 getInt32: function getInt32(byteOffset 4938 /* , littleEndian */ 4939 ) { 4940 return unpackI32(get(this, 4, byteOffset, arguments[1])); 4941 }, 4942 getUint32: function getUint32(byteOffset 4943 /* , littleEndian */ 4944 ) { 4945 return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0; 4946 }, 4947 getFloat32: function getFloat32(byteOffset 4948 /* , littleEndian */ 4949 ) { 4950 return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4); 4951 }, 4952 getFloat64: function getFloat64(byteOffset 4953 /* , littleEndian */ 4954 ) { 4955 return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8); 4956 }, 4957 setInt8: function setInt8(byteOffset, value) { 4958 set(this, 1, byteOffset, packI8, value); 4959 }, 4960 setUint8: function setUint8(byteOffset, value) { 4961 set(this, 1, byteOffset, packI8, value); 4962 }, 4963 setInt16: function setInt16(byteOffset, value 4964 /* , littleEndian */ 4965 ) { 4966 set(this, 2, byteOffset, packI16, value, arguments[2]); 4967 }, 4968 setUint16: function setUint16(byteOffset, value 4969 /* , littleEndian */ 4970 ) { 4971 set(this, 2, byteOffset, packI16, value, arguments[2]); 4972 }, 4973 setInt32: function setInt32(byteOffset, value 4974 /* , littleEndian */ 4975 ) { 4976 set(this, 4, byteOffset, packI32, value, arguments[2]); 4977 }, 4978 setUint32: function setUint32(byteOffset, value 4979 /* , littleEndian */ 4980 ) { 4981 set(this, 4, byteOffset, packI32, value, arguments[2]); 4982 }, 4983 setFloat32: function setFloat32(byteOffset, value 4984 /* , littleEndian */ 4985 ) { 4986 set(this, 4, byteOffset, packF32, value, arguments[2]); 4987 }, 4988 setFloat64: function setFloat64(byteOffset, value 4989 /* , littleEndian */ 4990 ) { 4991 set(this, 8, byteOffset, packF64, value, arguments[2]); 4992 } 4993 }); 4994} else { 4995 if (!fails(function () { 4996 $ArrayBuffer(1); 4997 }) || !fails(function () { 4998 new $ArrayBuffer(-1); // eslint-disable-line no-new 4999 }) || fails(function () { 5000 new $ArrayBuffer(); // eslint-disable-line no-new 5001 5002 new $ArrayBuffer(1.5); // eslint-disable-line no-new 5003 5004 new $ArrayBuffer(NaN); // eslint-disable-line no-new 5005 5006 return $ArrayBuffer.name != ARRAY_BUFFER; 5007 })) { 5008 $ArrayBuffer = function ArrayBuffer(length) { 5009 anInstance(this, $ArrayBuffer); 5010 return new BaseBuffer(toIndex(length)); 5011 }; 5012 5013 var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE]; 5014 5015 for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) { 5016 if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]); 5017 } 5018 5019 if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer; 5020 } // iOS Safari 7.x bug 5021 5022 5023 var view = new $DataView(new $ArrayBuffer(2)); 5024 var $setInt8 = $DataView[PROTOTYPE].setInt8; 5025 view.setInt8(0, 2147483648); 5026 view.setInt8(1, 2147483649); 5027 if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], { 5028 setInt8: function setInt8(byteOffset, value) { 5029 $setInt8.call(this, byteOffset, value << 24 >> 24); 5030 }, 5031 setUint8: function setUint8(byteOffset, value) { 5032 $setInt8.call(this, byteOffset, value << 24 >> 24); 5033 } 5034 }, true); 5035} 5036 5037setToStringTag($ArrayBuffer, ARRAY_BUFFER); 5038setToStringTag($DataView, DATA_VIEW); 5039hide($DataView[PROTOTYPE], $typed.VIEW, true); 5040exports[ARRAY_BUFFER] = $ArrayBuffer; 5041exports[DATA_VIEW] = $DataView; 5042 5043/***/ }), 5044
vendor: 1,362 bytes, lines 5045-5082
5045/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js": 5046/*!*****************************************************************************!*\ 5047 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js ***! 5048 \*****************************************************************************/ 5049/*! no static exports found */ 5050/***/ (function(module, exports, __webpack_require__) { 5051 5052var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 5053 5054var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 5055 5056var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js"); 5057 5058var TYPED = uid('typed_array'); 5059var VIEW = uid('view'); 5060var ABV = !!(global.ArrayBuffer && global.DataView); 5061var CONSTR = ABV; 5062var i = 0; 5063var l = 9; 5064var Typed; 5065var TypedArrayConstructors = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(','); 5066 5067while (i < l) { 5068 if (Typed = global[TypedArrayConstructors[i++]]) { 5069 hide(Typed.prototype, TYPED, true); 5070 hide(Typed.prototype, VIEW, true); 5071 } else CONSTR = false; 5072} 5073 5074module.exports = { 5075 ABV: ABV, 5076 CONSTR: CONSTR, 5077 TYPED: TYPED, 5078 VIEW: VIEW 5079}; 5080 5081/***/ }), 5082
vendor: 561 bytes, lines 5083-5098
5083/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js": 5084/*!***************************************************************************!*\ 5085 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js ***! 5086 \***************************************************************************/ 5087/*! no static exports found */ 5088/***/ (function(module, exports) { 5089 5090var id = 0; 5091var px = Math.random(); 5092 5093module.exports = function (key) { 5094 return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); 5095}; 5096 5097/***/ }), 5098
vendor: 664 bytes, lines 5099-5112
5099/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js": 5100/*!**********************************************************************************!*\ 5101 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js ***! 5102 \**********************************************************************************/ 5103/*! no static exports found */ 5104/***/ (function(module, exports, __webpack_require__) { 5105 5106var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 5107 5108var navigator = global.navigator; 5109module.exports = navigator && navigator.userAgent || ''; 5110 5111/***/ }), 5112
vendor: 777 bytes, lines 5113-5128
5113/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js": 5114/*!*******************************************************************************************!*\ 5115 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js ***! 5116 \*******************************************************************************************/ 5117/*! no static exports found */ 5118/***/ (function(module, exports, __webpack_require__) { 5119 5120var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 5121 5122module.exports = function (it, TYPE) { 5123 if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); 5124 return it; 5125}; 5126 5127/***/ }), 5128
vendor: 1,328 bytes, lines 5129-5154
5129/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js": 5130/*!**********************************************************************************!*\ 5131 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js ***! 5132 \**********************************************************************************/ 5133/*! no static exports found */ 5134/***/ (function(module, exports, __webpack_require__) { 5135 5136var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 5137 5138var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 5139 5140var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js"); 5141 5142var wksExt = __webpack_require__(/*! ./_wks-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js"); 5143 5144var defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 5145 5146module.exports = function (name) { 5147 var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); 5148 if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { 5149 value: wksExt.f(name) 5150 }); 5151}; 5152 5153/***/ }), 5154
vendor: 553 bytes, lines 5155-5165
5155/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js": 5156/*!*******************************************************************************!*\ 5157 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js ***! 5158 \*******************************************************************************/ 5159/*! no static exports found */ 5160/***/ (function(module, exports, __webpack_require__) { 5161 5162exports.f = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js"); 5163 5164/***/ }), 5165
vendor: 1,047 bytes, lines 5166-5188
5166/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js": 5167/*!***************************************************************************!*\ 5168 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js ***! 5169 \***************************************************************************/ 5170/*! no static exports found */ 5171/***/ (function(module, exports, __webpack_require__) { 5172 5173var store = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('wks'); 5174 5175var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js"); 5176 5177var _Symbol = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Symbol; 5178 5179var USE_SYMBOL = typeof _Symbol == 'function'; 5180 5181var $exports = module.exports = function (name) { 5182 return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name)); 5183}; 5184 5185$exports.store = store; 5186 5187/***/ }), 5188
vendor: 1,150 bytes, lines 5189-5207
5189/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js": 5190/*!***********************************************************************************************!*\ 5191 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js ***! 5192 \***********************************************************************************************/ 5193/*! no static exports found */ 5194/***/ (function(module, exports, __webpack_require__) { 5195 5196var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js"); 5197 5198var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator'); 5199 5200var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js"); 5201 5202module.exports = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js").getIteratorMethod = function (it) { 5203 if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; 5204}; 5205 5206/***/ }), 5207
vendor: 898 bytes, lines 5208-5227
5208/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js": 5209/*!*****************************************************************************************!*\ 5210 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js ***! 5211 \*****************************************************************************************/ 5212/*! no static exports found */ 5213/***/ (function(module, exports, __webpack_require__) { 5214 5215// https://github.com/benjamingr/RexExp.escape 5216var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5217 5218var $re = __webpack_require__(/*! ./_replacer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js")(/[\\^$*+?.()|[\]{}]/g, '\\$&'); 5219 5220$export($export.S, 'RegExp', { 5221 escape: function escape(it) { 5222 return $re(it); 5223 } 5224}); 5225 5226/***/ }), 5227
vendor: 1,019 bytes, lines 5228-5245
5228/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js": 5229/*!********************************************************************************************!*\ 5230 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js ***! 5231 \********************************************************************************************/ 5232/*! no static exports found */ 5233/***/ (function(module, exports, __webpack_require__) { 5234 5235// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) 5236var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5237 5238$export($export.P, 'Array', { 5239 copyWithin: __webpack_require__(/*! ./_array-copy-within */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js") 5240}); 5241 5242__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('copyWithin'); 5243 5244/***/ }), 5245
vendor: 1,125 bytes, lines 5246-5270
5246/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js": 5247/*!**************************************************************************************!*\ 5248 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js ***! 5249 \**************************************************************************************/ 5250/*! no static exports found */ 5251/***/ (function(module, exports, __webpack_require__) { 5252 5253"use strict"; 5254 5255 5256var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5257 5258var $every = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(4); 5259 5260$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].every, true), 'Array', { 5261 // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg]) 5262 every: function every(callbackfn 5263 /* , thisArg */ 5264 ) { 5265 return $every(this, callbackfn, arguments[1]); 5266 } 5267}); 5268 5269/***/ }), 5270
vendor: 962 bytes, lines 5271-5288
5271/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js": 5272/*!*************************************************************************************!*\ 5273 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js ***! 5274 \*************************************************************************************/ 5275/*! no static exports found */ 5276/***/ (function(module, exports, __webpack_require__) { 5277 5278// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) 5279var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5280 5281$export($export.P, 'Array', { 5282 fill: __webpack_require__(/*! ./_array-fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js") 5283}); 5284 5285__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('fill'); 5286 5287/***/ }), 5288
vendor: 1,135 bytes, lines 5289-5313
5289/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js": 5290/*!***************************************************************************************!*\ 5291 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js ***! 5292 \***************************************************************************************/ 5293/*! no static exports found */ 5294/***/ (function(module, exports, __webpack_require__) { 5295 5296"use strict"; 5297 5298 5299var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5300 5301var $filter = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(2); 5302 5303$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].filter, true), 'Array', { 5304 // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) 5305 filter: function filter(callbackfn 5306 /* , thisArg */ 5307 ) { 5308 return $filter(this, callbackfn, arguments[1]); 5309 } 5310}); 5311 5312/***/ }), 5313
vendor: 1,332 bytes, lines 5314-5345
5314/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js": 5315/*!*******************************************************************************************!*\ 5316 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js ***! 5317 \*******************************************************************************************/ 5318/*! no static exports found */ 5319/***/ (function(module, exports, __webpack_require__) { 5320 5321"use strict"; 5322 // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) 5323 5324var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5325 5326var $find = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(6); 5327 5328var KEY = 'findIndex'; 5329var forced = true; // Shouldn't skip holes 5330 5331if (KEY in []) Array(1)[KEY](function () { 5332 forced = false; 5333}); 5334$export($export.P + $export.F * forced, 'Array', { 5335 findIndex: function findIndex(callbackfn 5336 /* , that = undefined */ 5337 ) { 5338 return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); 5339 } 5340}); 5341 5342__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")(KEY); 5343 5344/***/ }), 5345
vendor: 1,288 bytes, lines 5346-5377
5346/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js": 5347/*!*************************************************************************************!*\ 5348 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js ***! 5349 \*************************************************************************************/ 5350/*! no static exports found */ 5351/***/ (function(module, exports, __webpack_require__) { 5352 5353"use strict"; 5354 // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) 5355 5356var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5357 5358var $find = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(5); 5359 5360var KEY = 'find'; 5361var forced = true; // Shouldn't skip holes 5362 5363if (KEY in []) Array(1)[KEY](function () { 5364 forced = false; 5365}); 5366$export($export.P + $export.F * forced, 'Array', { 5367 find: function find(callbackfn 5368 /* , that = undefined */ 5369 ) { 5370 return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); 5371 } 5372}); 5373 5374__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")(KEY); 5375 5376/***/ }), 5377
vendor: 1,172 bytes, lines 5378-5404
5378/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js": 5379/*!*****************************************************************************************!*\ 5380 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js ***! 5381 \*****************************************************************************************/ 5382/*! no static exports found */ 5383/***/ (function(module, exports, __webpack_require__) { 5384 5385"use strict"; 5386 5387 5388var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5389 5390var $forEach = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(0); 5391 5392var STRICT = __webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].forEach, true); 5393 5394$export($export.P + $export.F * !STRICT, 'Array', { 5395 // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg]) 5396 forEach: function forEach(callbackfn 5397 /* , thisArg */ 5398 ) { 5399 return $forEach(this, callbackfn, arguments[1]); 5400 } 5401}); 5402 5403/***/ }), 5404
vendor: 2,963 bytes, lines 5405-5466
5405/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js": 5406/*!*************************************************************************************!*\ 5407 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js ***! 5408 \*************************************************************************************/ 5409/*! no static exports found */ 5410/***/ (function(module, exports, __webpack_require__) { 5411 5412"use strict"; 5413 5414 5415var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 5416 5417var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5418 5419var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 5420 5421var call = __webpack_require__(/*! ./_iter-call */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js"); 5422 5423var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js"); 5424 5425var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 5426 5427var createProperty = __webpack_require__(/*! ./_create-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js"); 5428 5429var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js"); 5430 5431$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js")(function (iter) { 5432 Array.from(iter); 5433}), 'Array', { 5434 // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) 5435 from: function from(arrayLike 5436 /* , mapfn = undefined, thisArg = undefined */ 5437 ) { 5438 var O = toObject(arrayLike); 5439 var C = typeof this == 'function' ? this : Array; 5440 var aLen = arguments.length; 5441 var mapfn = aLen > 1 ? arguments[1] : undefined; 5442 var mapping = mapfn !== undefined; 5443 var index = 0; 5444 var iterFn = getIterFn(O); 5445 var length, result, step, iterator; 5446 if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); // if object isn't iterable or it's array with default iterator - use simple case 5447 5448 if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { 5449 for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { 5450 createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); 5451 } 5452 } else { 5453 length = toLength(O.length); 5454 5455 for (result = new C(length); length > index; index++) { 5456 createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); 5457 } 5458 } 5459 5460 result.length = index; 5461 return result; 5462 } 5463}); 5464 5465/***/ }), 5466
vendor: 1,348 bytes, lines 5467-5494
5467/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js": 5468/*!*****************************************************************************************!*\ 5469 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js ***! 5470 \*****************************************************************************************/ 5471/*! no static exports found */ 5472/***/ (function(module, exports, __webpack_require__) { 5473 5474"use strict"; 5475 5476 5477var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5478 5479var $indexOf = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js")(false); 5480 5481var $native = [].indexOf; 5482var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0; 5483$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { 5484 // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex]) 5485 indexOf: function indexOf(searchElement 5486 /* , fromIndex = 0 */ 5487 ) { 5488 return NEGATIVE_ZERO // convert -0 to +0 5489 ? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]); 5490 } 5491}); 5492 5493/***/ }), 5494
vendor: 804 bytes, lines 5495-5510
5495/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js": 5496/*!*****************************************************************************************!*\ 5497 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js ***! 5498 \*****************************************************************************************/ 5499/*! no static exports found */ 5500/***/ (function(module, exports, __webpack_require__) { 5501 5502// 22.1.2.2 / 15.4.3.2 Array.isArray(arg) 5503var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5504 5505$export($export.S, 'Array', { 5506 isArray: __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js") 5507}); 5508 5509/***/ }), 5510
vendor: 2,046 bytes, lines 5511-5561
5511/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js": 5512/*!*****************************************************************************************!*\ 5513 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js ***! 5514 \*****************************************************************************************/ 5515/*! no static exports found */ 5516/***/ (function(module, exports, __webpack_require__) { 5517 5518"use strict"; 5519 5520 5521var addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js"); 5522 5523var step = __webpack_require__(/*! ./_iter-step */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js"); 5524 5525var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js"); 5526 5527var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); // 22.1.3.4 Array.prototype.entries() 5528// 22.1.3.13 Array.prototype.keys() 5529// 22.1.3.29 Array.prototype.values() 5530// 22.1.3.30 Array.prototype[@@iterator]() 5531 5532 5533module.exports = __webpack_require__(/*! ./_iter-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js")(Array, 'Array', function (iterated, kind) { 5534 this._t = toIObject(iterated); // target 5535 5536 this._i = 0; // next index 5537 5538 this._k = kind; // kind 5539 // 22.1.5.2.1 %ArrayIteratorPrototype%.next() 5540}, function () { 5541 var O = this._t; 5542 var kind = this._k; 5543 var index = this._i++; 5544 5545 if (!O || index >= O.length) { 5546 this._t = undefined; 5547 return step(1); 5548 } 5549 5550 if (kind == 'keys') return step(0, index); 5551 if (kind == 'values') return step(0, O[index]); 5552 return step(0, [index, O[index]]); 5553}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) 5554 5555Iterators.Arguments = Iterators.Array; 5556addToUnscopables('keys'); 5557addToUnscopables('values'); 5558addToUnscopables('entries'); 5559 5560/***/ }), 5561
vendor: 1,288 bytes, lines 5562-5585
5562/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js": 5563/*!*************************************************************************************!*\ 5564 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js ***! 5565 \*************************************************************************************/ 5566/*! no static exports found */ 5567/***/ (function(module, exports, __webpack_require__) { 5568 5569"use strict"; 5570 // 22.1.3.13 Array.prototype.join(separator) 5571 5572var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5573 5574var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 5575 5576var arrayJoin = [].join; // fallback for not array-like strings 5577 5578$export($export.P + $export.F * (__webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js") != Object || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")(arrayJoin)), 'Array', { 5579 join: function join(separator) { 5580 return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator); 5581 } 5582}); 5583 5584/***/ }), 5585
vendor: 1,954 bytes, lines 5586-5628
5586/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js": 5587/*!**********************************************************************************************!*\ 5588 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js ***! 5589 \**********************************************************************************************/ 5590/*! no static exports found */ 5591/***/ (function(module, exports, __webpack_require__) { 5592 5593"use strict"; 5594 5595 5596var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5597 5598var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 5599 5600var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 5601 5602var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 5603 5604var $native = [].lastIndexOf; 5605var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0; 5606$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { 5607 // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex]) 5608 lastIndexOf: function lastIndexOf(searchElement 5609 /* , fromIndex = @[*-1] */ 5610 ) { 5611 // convert -0 to +0 5612 if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0; 5613 var O = toIObject(this); 5614 var length = toLength(O.length); 5615 var index = length - 1; 5616 if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1])); 5617 if (index < 0) index = length + index; 5618 5619 for (; index >= 0; index--) { 5620 if (index in O) if (O[index] === searchElement) return index || 0; 5621 } 5622 5623 return -1; 5624 } 5625}); 5626 5627/***/ }), 5628
vendor: 1,106 bytes, lines 5629-5653
5629/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js": 5630/*!************************************************************************************!*\ 5631 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js ***! 5632 \************************************************************************************/ 5633/*! no static exports found */ 5634/***/ (function(module, exports, __webpack_require__) { 5635 5636"use strict"; 5637 5638 5639var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5640 5641var $map = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(1); 5642 5643$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].map, true), 'Array', { 5644 // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) 5645 map: function map(callbackfn 5646 /* , thisArg */ 5647 ) { 5648 return $map(this, callbackfn, arguments[1]); 5649 } 5650}); 5651 5652/***/ }), 5653
vendor: 1,373 bytes, lines 5654-5694
5654/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js": 5655/*!***********************************************************************************!*\ 5656 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js ***! 5657 \***********************************************************************************/ 5658/*! no static exports found */ 5659/***/ (function(module, exports, __webpack_require__) { 5660 5661"use strict"; 5662 5663 5664var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5665 5666var createProperty = __webpack_require__(/*! ./_create-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js"); // WebKit Array.of isn't generic 5667 5668 5669$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 5670 function F() { 5671 /* empty */ 5672 } 5673 5674 return !(Array.of.call(F) instanceof F); 5675}), 'Array', { 5676 // 22.1.2.3 Array.of( ...items) 5677 of: function of() 5678 /* ...args */ 5679 { 5680 var index = 0; 5681 var aLen = arguments.length; 5682 var result = new (typeof this == 'function' ? this : Array)(aLen); 5683 5684 while (aLen > index) { 5685 createProperty(result, index, arguments[index++]); 5686 } 5687 5688 result.length = aLen; 5689 return result; 5690 } 5691}); 5692 5693/***/ }), 5694
vendor: 1,209 bytes, lines 5695-5719
5695/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js": 5696/*!*********************************************************************************************!*\ 5697 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js ***! 5698 \*********************************************************************************************/ 5699/*! no static exports found */ 5700/***/ (function(module, exports, __webpack_require__) { 5701 5702"use strict"; 5703 5704 5705var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5706 5707var $reduce = __webpack_require__(/*! ./_array-reduce */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js"); 5708 5709$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].reduceRight, true), 'Array', { 5710 // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue]) 5711 reduceRight: function reduceRight(callbackfn 5712 /* , initialValue */ 5713 ) { 5714 return $reduce(this, callbackfn, arguments.length, arguments[1], true); 5715 } 5716}); 5717 5718/***/ }), 5719
vendor: 1,166 bytes, lines 5720-5744
5720/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js": 5721/*!***************************************************************************************!*\ 5722 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js ***! 5723 \***************************************************************************************/ 5724/*! no static exports found */ 5725/***/ (function(module, exports, __webpack_require__) { 5726 5727"use strict"; 5728 5729 5730var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5731 5732var $reduce = __webpack_require__(/*! ./_array-reduce */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js"); 5733 5734$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].reduce, true), 'Array', { 5735 // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue]) 5736 reduce: function reduce(callbackfn 5737 /* , initialValue */ 5738 ) { 5739 return $reduce(this, callbackfn, arguments.length, arguments[1], false); 5740 } 5741}); 5742 5743/***/ }), 5744
vendor: 1,955 bytes, lines 5745-5790
5745/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js": 5746/*!**************************************************************************************!*\ 5747 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js ***! 5748 \**************************************************************************************/ 5749/*! no static exports found */ 5750/***/ (function(module, exports, __webpack_require__) { 5751 5752"use strict"; 5753 5754 5755var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5756 5757var html = __webpack_require__(/*! ./_html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js"); 5758 5759var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 5760 5761var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 5762 5763var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 5764 5765var arraySlice = [].slice; // fallback for not array-like ES3 strings and DOM objects 5766 5767$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 5768 if (html) arraySlice.call(html); 5769}), 'Array', { 5770 slice: function slice(begin, end) { 5771 var len = toLength(this.length); 5772 var klass = cof(this); 5773 end = end === undefined ? len : end; 5774 if (klass == 'Array') return arraySlice.call(this, begin, end); 5775 var start = toAbsoluteIndex(begin, len); 5776 var upTo = toAbsoluteIndex(end, len); 5777 var size = toLength(upTo - start); 5778 var cloned = new Array(size); 5779 var i = 0; 5780 5781 for (; i < size; i++) { 5782 cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i]; 5783 } 5784 5785 return cloned; 5786 } 5787}); 5788 5789/***/ }), 5790
vendor: 1,116 bytes, lines 5791-5815
5791/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js": 5792/*!*************************************************************************************!*\ 5793 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js ***! 5794 \*************************************************************************************/ 5795/*! no static exports found */ 5796/***/ (function(module, exports, __webpack_require__) { 5797 5798"use strict"; 5799 5800 5801var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5802 5803var $some = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(3); 5804 5805$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].some, true), 'Array', { 5806 // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg]) 5807 some: function some(callbackfn 5808 /* , thisArg */ 5809 ) { 5810 return $some(this, callbackfn, arguments[1]); 5811 } 5812}); 5813 5814/***/ }), 5815
vendor: 1,556 bytes, lines 5816-5850
5816/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js": 5817/*!*************************************************************************************!*\ 5818 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js ***! 5819 \*************************************************************************************/ 5820/*! no static exports found */ 5821/***/ (function(module, exports, __webpack_require__) { 5822 5823"use strict"; 5824 5825 5826var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5827 5828var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 5829 5830var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 5831 5832var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 5833 5834var $sort = [].sort; 5835var test = [1, 2, 3]; 5836$export($export.P + $export.F * (fails(function () { 5837 // IE8- 5838 test.sort(undefined); 5839}) || !fails(function () { 5840 // V8 bug 5841 test.sort(null); // Old WebKit 5842}) || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")($sort)), 'Array', { 5843 // 22.1.3.25 Array.prototype.sort(comparefn) 5844 sort: function sort(comparefn) { 5845 return comparefn === undefined ? $sort.call(toObject(this)) : $sort.call(toObject(this), aFunction(comparefn)); 5846 } 5847}); 5848 5849/***/ }), 5850
vendor: 602 bytes, lines 5851-5861
5851/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js": 5852/*!****************************************************************************************!*\ 5853 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js ***! 5854 \****************************************************************************************/ 5855/*! no static exports found */ 5856/***/ (function(module, exports, __webpack_require__) { 5857 5858__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")('Array'); 5859 5860/***/ }), 5861
vendor: 706 bytes, lines 5862-5879
5862/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js": 5863/*!***********************************************************************************!*\ 5864 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js ***! 5865 \***********************************************************************************/ 5866/*! no static exports found */ 5867/***/ (function(module, exports, __webpack_require__) { 5868 5869// 20.3.3.1 / 15.9.4.4 Date.now() 5870var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5871 5872$export($export.S, 'Date', { 5873 now: function now() { 5874 return new Date().getTime(); 5875 } 5876}); 5877 5878/***/ }), 5879
vendor: 1,002 bytes, lines 5880-5898
5880/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js": 5881/*!*********************************************************************************************!*\ 5882 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js ***! 5883 \*********************************************************************************************/ 5884/*! no static exports found */ 5885/***/ (function(module, exports, __webpack_require__) { 5886 5887// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() 5888var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5889 5890var toISOString = __webpack_require__(/*! ./_date-to-iso-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js"); // PhantomJS / old WebKit has a broken implementations 5891 5892 5893$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', { 5894 toISOString: toISOString 5895}); 5896 5897/***/ }), 5898
vendor: 1,424 bytes, lines 5899-5931
5899/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js": 5900/*!***************************************************************************************!*\ 5901 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js ***! 5902 \***************************************************************************************/ 5903/*! no static exports found */ 5904/***/ (function(module, exports, __webpack_require__) { 5905 5906"use strict"; 5907 5908 5909var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5910 5911var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 5912 5913var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 5914 5915$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 5916 return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({ 5917 toISOString: function toISOString() { 5918 return 1; 5919 } 5920 }) !== 1; 5921}), 'Date', { 5922 // eslint-disable-next-line no-unused-vars 5923 toJSON: function toJSON(key) { 5924 var O = toObject(this); 5925 var pv = toPrimitive(O); 5926 return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); 5927 } 5928}); 5929 5930/***/ }), 5931
vendor: 949 bytes, lines 5932-5945
5932/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js": 5933/*!********************************************************************************************!*\ 5934 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js ***! 5935 \********************************************************************************************/ 5936/*! no static exports found */ 5937/***/ (function(module, exports, __webpack_require__) { 5938 5939var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toPrimitive'); 5940 5941var proto = Date.prototype; 5942if (!(TO_PRIMITIVE in proto)) __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")(proto, TO_PRIMITIVE, __webpack_require__(/*! ./_date-to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js")); 5943 5944/***/ }), 5945
vendor: 1,000 bytes, lines 5946-5968
5946/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js": 5947/*!*****************************************************************************************!*\ 5948 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js ***! 5949 \*****************************************************************************************/ 5950/*! no static exports found */ 5951/***/ (function(module, exports, __webpack_require__) { 5952 5953var DateProto = Date.prototype; 5954var INVALID_DATE = 'Invalid Date'; 5955var TO_STRING = 'toString'; 5956var $toString = DateProto[TO_STRING]; 5957var getTime = DateProto.getTime; 5958 5959if (new Date(NaN) + '' != INVALID_DATE) { 5960 __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(DateProto, TO_STRING, function toString() { 5961 var value = getTime.call(this); // eslint-disable-next-line no-self-compare 5962 5963 return value === value ? $toString.call(this) : INVALID_DATE; 5964 }); 5965} 5966 5967/***/ }), 5968
vendor: 815 bytes, lines 5969-5984
5969/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js": 5970/*!****************************************************************************************!*\ 5971 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js ***! 5972 \****************************************************************************************/ 5973/*! no static exports found */ 5974/***/ (function(module, exports, __webpack_require__) { 5975 5976// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...) 5977var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 5978 5979$export($export.P, 'Function', { 5980 bind: __webpack_require__(/*! ./_bind */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js") 5981}); 5982 5983/***/ }), 5984
vendor: 1,571 bytes, lines 5985-6017
5985/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js": 5986/*!************************************************************************************************!*\ 5987 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js ***! 5988 \************************************************************************************************/ 5989/*! no static exports found */ 5990/***/ (function(module, exports, __webpack_require__) { 5991 5992"use strict"; 5993 5994 5995var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 5996 5997var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 5998 5999var HAS_INSTANCE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('hasInstance'); 6000 6001var FunctionProto = Function.prototype; // 19.2.3.6 Function.prototype[@@hasInstance](V) 6002 6003if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f(FunctionProto, HAS_INSTANCE, { 6004 value: function value(O) { 6005 if (typeof this != 'function' || !isObject(O)) return false; 6006 if (!isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this: 6007 6008 while (O = getPrototypeOf(O)) { 6009 if (this.prototype === O) return true; 6010 } 6011 6012 return false; 6013 } 6014}); 6015 6016/***/ }), 6017
vendor: 1,018 bytes, lines 6018-6043
6018/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js": 6019/*!****************************************************************************************!*\ 6020 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js ***! 6021 \****************************************************************************************/ 6022/*! no static exports found */ 6023/***/ (function(module, exports, __webpack_require__) { 6024 6025var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 6026 6027var FProto = Function.prototype; 6028var nameRE = /^\s*function ([^ (]*)/; 6029var NAME = 'name'; // 19.2.4.2 name 6030 6031NAME in FProto || __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && dP(FProto, NAME, { 6032 configurable: true, 6033 get: function get() { 6034 try { 6035 return ('' + this).match(nameRE)[1]; 6036 } catch (e) { 6037 return ''; 6038 } 6039 } 6040}); 6041 6042/***/ }), 6043
vendor: 1,381 bytes, lines 6044-6077
6044/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js": 6045/*!******************************************************************************!*\ 6046 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js ***! 6047 \******************************************************************************/ 6048/*! no static exports found */ 6049/***/ (function(module, exports, __webpack_require__) { 6050 6051"use strict"; 6052 6053 6054var strong = __webpack_require__(/*! ./_collection-strong */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js"); 6055 6056var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 6057 6058var MAP = 'Map'; // 23.1 Map Objects 6059 6060module.exports = __webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(MAP, function (get) { 6061 return function Map() { 6062 return get(this, arguments.length > 0 ? arguments[0] : undefined); 6063 }; 6064}, { 6065 // 23.1.3.6 Map.prototype.get(key) 6066 get: function get(key) { 6067 var entry = strong.getEntry(validate(this, MAP), key); 6068 return entry && entry.v; 6069 }, 6070 // 23.1.3.9 Map.prototype.set(key, value) 6071 set: function set(key, value) { 6072 return strong.def(validate(this, MAP), key === 0 ? 0 : key, value); 6073 } 6074}, strong, true); 6075 6076/***/ }), 6077
vendor: 1,194 bytes, lines 6078-6101
6078/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js": 6079/*!*************************************************************************************!*\ 6080 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js ***! 6081 \*************************************************************************************/ 6082/*! no static exports found */ 6083/***/ (function(module, exports, __webpack_require__) { 6084 6085// 20.2.2.3 Math.acosh(x) 6086var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6087 6088var log1p = __webpack_require__(/*! ./_math-log1p */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js"); 6089 6090var sqrt = Math.sqrt; 6091var $acosh = Math.acosh; 6092$export($export.S + $export.F * !($acosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509 6093&& Math.floor($acosh(Number.MAX_VALUE)) == 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN 6094&& $acosh(Infinity) == Infinity), 'Math', { 6095 acosh: function acosh(x) { 6096 return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1)); 6097 } 6098}); 6099 6100/***/ }), 6101
vendor: 895 bytes, lines 6102-6124
6102/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js": 6103/*!*************************************************************************************!*\ 6104 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js ***! 6105 \*************************************************************************************/ 6106/*! no static exports found */ 6107/***/ (function(module, exports, __webpack_require__) { 6108 6109// 20.2.2.5 Math.asinh(x) 6110var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6111 6112var $asinh = Math.asinh; 6113 6114function asinh(x) { 6115 return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)); 6116} // Tor Browser bug: Math.asinh(0) -> -0 6117 6118 6119$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { 6120 asinh: asinh 6121}); 6122 6123/***/ }), 6124
vendor: 854 bytes, lines 6125-6144
6125/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js": 6126/*!*************************************************************************************!*\ 6127 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js ***! 6128 \*************************************************************************************/ 6129/*! no static exports found */ 6130/***/ (function(module, exports, __webpack_require__) { 6131 6132// 20.2.2.7 Math.atanh(x) 6133var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6134 6135var $atanh = Math.atanh; // Tor Browser bug: Math.atanh(-0) -> 0 6136 6137$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', { 6138 atanh: function atanh(x) { 6139 return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2; 6140 } 6141}); 6142 6143/***/ }), 6144
vendor: 857 bytes, lines 6145-6164
6145/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js": 6146/*!************************************************************************************!*\ 6147 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js ***! 6148 \************************************************************************************/ 6149/*! no static exports found */ 6150/***/ (function(module, exports, __webpack_require__) { 6151 6152// 20.2.2.9 Math.cbrt(x) 6153var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6154 6155var sign = __webpack_require__(/*! ./_math-sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js"); 6156 6157$export($export.S, 'Math', { 6158 cbrt: function cbrt(x) { 6159 return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3); 6160 } 6161}); 6162 6163/***/ }), 6164
vendor: 757 bytes, lines 6165-6182
6165/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js": 6166/*!*************************************************************************************!*\ 6167 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js ***! 6168 \*************************************************************************************/ 6169/*! no static exports found */ 6170/***/ (function(module, exports, __webpack_require__) { 6171 6172// 20.2.2.11 Math.clz32(x) 6173var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6174 6175$export($export.S, 'Math', { 6176 clz32: function clz32(x) { 6177 return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32; 6178 } 6179}); 6180 6181/***/ }), 6182
vendor: 732 bytes, lines 6183-6201
6183/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js": 6184/*!************************************************************************************!*\ 6185 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js ***! 6186 \************************************************************************************/ 6187/*! no static exports found */ 6188/***/ (function(module, exports, __webpack_require__) { 6189 6190// 20.2.2.12 Math.cosh(x) 6191var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6192 6193var exp = Math.exp; 6194$export($export.S, 'Math', { 6195 cosh: function cosh(x) { 6196 return (exp(x = +x) + exp(-x)) / 2; 6197 } 6198}); 6199 6200/***/ }), 6201
vendor: 833 bytes, lines 6202-6219
6202/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js": 6203/*!*************************************************************************************!*\ 6204 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js ***! 6205 \*************************************************************************************/ 6206/*! no static exports found */ 6207/***/ (function(module, exports, __webpack_require__) { 6208 6209// 20.2.2.14 Math.expm1(x) 6210var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6211 6212var $expm1 = __webpack_require__(/*! ./_math-expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js"); 6213 6214$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { 6215 expm1: $expm1 6216}); 6217 6218/***/ }), 6219
vendor: 782 bytes, lines 6220-6235
6220/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js": 6221/*!**************************************************************************************!*\ 6222 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js ***! 6223 \**************************************************************************************/ 6224/*! no static exports found */ 6225/***/ (function(module, exports, __webpack_require__) { 6226 6227// 20.2.2.16 Math.fround(x) 6228var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6229 6230$export($export.S, 'Math', { 6231 fround: __webpack_require__(/*! ./_math-fround */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js") 6232}); 6233 6234/***/ }), 6235
vendor: 1,220 bytes, lines 6236-6274
6236/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js": 6237/*!*************************************************************************************!*\ 6238 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js ***! 6239 \*************************************************************************************/ 6240/*! no static exports found */ 6241/***/ (function(module, exports, __webpack_require__) { 6242 6243// 20.2.2.17 Math.hypot([value1[, value2[, ⦠]]]) 6244var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6245 6246var abs = Math.abs; 6247$export($export.S, 'Math', { 6248 hypot: function hypot(value1, value2) { 6249 // eslint-disable-line no-unused-vars 6250 var sum = 0; 6251 var i = 0; 6252 var aLen = arguments.length; 6253 var larg = 0; 6254 var arg, div; 6255 6256 while (i < aLen) { 6257 arg = abs(arguments[i++]); 6258 6259 if (larg < arg) { 6260 div = larg / arg; 6261 sum = sum * div * div + 1; 6262 larg = arg; 6263 } else if (arg > 0) { 6264 div = arg / larg; 6265 sum += div * div; 6266 } else sum += arg; 6267 } 6268 6269 return larg === Infinity ? Infinity : larg * Math.sqrt(sum); 6270 } 6271}); 6272 6273/***/ }), 6274
vendor: 1,174 bytes, lines 6275-6301
6275/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js": 6276/*!************************************************************************************!*\ 6277 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js ***! 6278 \************************************************************************************/ 6279/*! no static exports found */ 6280/***/ (function(module, exports, __webpack_require__) { 6281 6282// 20.2.2.18 Math.imul(x, y) 6283var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6284 6285var $imul = Math.imul; // some WebKit versions fails with big numbers, some has wrong arity 6286 6287$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 6288 return $imul(0xffffffff, 5) != -5 || $imul.length != 2; 6289}), 'Math', { 6290 imul: function imul(x, y) { 6291 var UINT16 = 0xffff; 6292 var xn = +x; 6293 var yn = +y; 6294 var xl = UINT16 & xn; 6295 var yl = UINT16 & yn; 6296 return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0); 6297 } 6298}); 6299 6300/***/ }), 6301
vendor: 717 bytes, lines 6302-6319
6302/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js": 6303/*!*************************************************************************************!*\ 6304 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js ***! 6305 \*************************************************************************************/ 6306/*! no static exports found */ 6307/***/ (function(module, exports, __webpack_require__) { 6308 6309// 20.2.2.21 Math.log10(x) 6310var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6311 6312$export($export.S, 'Math', { 6313 log10: function log10(x) { 6314 return Math.log(x) * Math.LOG10E; 6315 } 6316}); 6317 6318/***/ }), 6319
vendor: 774 bytes, lines 6320-6335
6320/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js": 6321/*!*************************************************************************************!*\ 6322 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js ***! 6323 \*************************************************************************************/ 6324/*! no static exports found */ 6325/***/ (function(module, exports, __webpack_require__) { 6326 6327// 20.2.2.20 Math.log1p(x) 6328var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6329 6330$export($export.S, 'Math', { 6331 log1p: __webpack_require__(/*! ./_math-log1p */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js") 6332}); 6333 6334/***/ }), 6335
vendor: 707 bytes, lines 6336-6353
6336/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js": 6337/*!************************************************************************************!*\ 6338 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js ***! 6339 \************************************************************************************/ 6340/*! no static exports found */ 6341/***/ (function(module, exports, __webpack_require__) { 6342 6343// 20.2.2.22 Math.log2(x) 6344var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6345 6346$export($export.S, 'Math', { 6347 log2: function log2(x) { 6348 return Math.log(x) / Math.LN2; 6349 } 6350}); 6351 6352/***/ }), 6353
vendor: 766 bytes, lines 6354-6369
6354/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js": 6355/*!************************************************************************************!*\ 6356 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js ***! 6357 \************************************************************************************/ 6358/*! no static exports found */ 6359/***/ (function(module, exports, __webpack_require__) { 6360 6361// 20.2.2.28 Math.sign(x) 6362var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6363 6364$export($export.S, 'Math', { 6365 sign: __webpack_require__(/*! ./_math-sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js") 6366}); 6367 6368/***/ }), 6369
vendor: 1,172 bytes, lines 6370-6393
6370/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js": 6371/*!************************************************************************************!*\ 6372 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js ***! 6373 \************************************************************************************/ 6374/*! no static exports found */ 6375/***/ (function(module, exports, __webpack_require__) { 6376 6377// 20.2.2.30 Math.sinh(x) 6378var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6379 6380var expm1 = __webpack_require__(/*! ./_math-expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js"); 6381 6382var exp = Math.exp; // V8 near Chromium 38 has a problem with very small numbers 6383 6384$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 6385 return !Math.sinh(-2e-17) != -2e-17; 6386}), 'Math', { 6387 sinh: function sinh(x) { 6388 return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2); 6389 } 6390}); 6391 6392/***/ }), 6393
vendor: 957 bytes, lines 6394-6416
6394/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js": 6395/*!************************************************************************************!*\ 6396 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js ***! 6397 \************************************************************************************/ 6398/*! no static exports found */ 6399/***/ (function(module, exports, __webpack_require__) { 6400 6401// 20.2.2.33 Math.tanh(x) 6402var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6403 6404var expm1 = __webpack_require__(/*! ./_math-expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js"); 6405 6406var exp = Math.exp; 6407$export($export.S, 'Math', { 6408 tanh: function tanh(x) { 6409 var a = expm1(x = +x); 6410 var b = expm1(-x); 6411 return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x)); 6412 } 6413}); 6414 6415/***/ }), 6416
vendor: 730 bytes, lines 6417-6434
6417/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js": 6418/*!*************************************************************************************!*\ 6419 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js ***! 6420 \*************************************************************************************/ 6421/*! no static exports found */ 6422/***/ (function(module, exports, __webpack_require__) { 6423 6424// 20.2.2.34 Math.trunc(x) 6425var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6426 6427$export($export.S, 'Math', { 6428 trunc: function trunc(it) { 6429 return (it > 0 ? Math.floor : Math.ceil)(it); 6430 } 6431}); 6432 6433/***/ }), 6434
vendor: 4,607 bytes, lines 6435-6543
6435/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js": 6436/*!*********************************************************************************************!*\ 6437 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js ***! 6438 \*********************************************************************************************/ 6439/*! no static exports found */ 6440/***/ (function(module, exports, __webpack_require__) { 6441 6442"use strict"; 6443 6444 6445var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 6446 6447var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 6448 6449var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 6450 6451var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js"); 6452 6453var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 6454 6455var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 6456 6457var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f; 6458 6459var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; 6460 6461var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 6462 6463var $trim = __webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js").trim; 6464 6465var NUMBER = 'Number'; 6466var $Number = global[NUMBER]; 6467var Base = $Number; 6468var proto = $Number.prototype; // Opera ~12 has broken Object#toString 6469 6470var BROKEN_COF = cof(__webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js")(proto)) == NUMBER; 6471var TRIM = 'trim' in String.prototype; // 7.1.3 ToNumber(argument) 6472 6473var toNumber = function toNumber(argument) { 6474 var it = toPrimitive(argument, false); 6475 6476 if (typeof it == 'string' && it.length > 2) { 6477 it = TRIM ? it.trim() : $trim(it, 3); 6478 var first = it.charCodeAt(0); 6479 var third, radix, maxCode; 6480 6481 if (first === 43 || first === 45) { 6482 third = it.charCodeAt(2); 6483 if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix 6484 } else if (first === 48) { 6485 switch (it.charCodeAt(1)) { 6486 case 66: 6487 case 98: 6488 radix = 2; 6489 maxCode = 49; 6490 break; 6491 // fast equal /^0b[01]+$/i 6492 6493 case 79: 6494 case 111: 6495 radix = 8; 6496 maxCode = 55; 6497 break; 6498 // fast equal /^0o[0-7]+$/i 6499 6500 default: 6501 return +it; 6502 } 6503 6504 for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { 6505 code = digits.charCodeAt(i); // parseInt parses a string to a first unavailable symbol 6506 // but ToNumber should return NaN if a string contains unavailable symbols 6507 6508 if (code < 48 || code > maxCode) return NaN; 6509 } 6510 6511 return parseInt(digits, radix); 6512 } 6513 } 6514 6515 return +it; 6516}; 6517 6518if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { 6519 $Number = function Number(value) { 6520 var it = arguments.length < 1 ? 0 : value; 6521 var that = this; 6522 return that instanceof $Number // check on 1..constructor(foo) case 6523 && (BROKEN_COF ? fails(function () { 6524 proto.valueOf.call(that); 6525 }) : cof(that) != NUMBER) ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); 6526 }; 6527 6528 for (var keys = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? gOPN(Base) : ( // ES3: 6529 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case, if modules with ES6 Number statics required before): 6530 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys.length > j; j++) { 6531 if (has(Base, key = keys[j]) && !has($Number, key)) { 6532 dP($Number, key, gOPD(Base, key)); 6533 } 6534 } 6535 6536 $Number.prototype = proto; 6537 proto.constructor = $Number; 6538 6539 __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(global, NUMBER, $Number); 6540} 6541 6542/***/ }), 6543
vendor: 692 bytes, lines 6544-6559
6544/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js": 6545/*!*****************************************************************************************!*\ 6546 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js ***! 6547 \*****************************************************************************************/ 6548/*! no static exports found */ 6549/***/ (function(module, exports, __webpack_require__) { 6550 6551// 20.1.2.1 Number.EPSILON 6552var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6553 6554$export($export.S, 'Number', { 6555 EPSILON: Math.pow(2, -52) 6556}); 6557 6558/***/ }), 6559
vendor: 910 bytes, lines 6560-6579
6560/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js": 6561/*!*******************************************************************************************!*\ 6562 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js ***! 6563 \*******************************************************************************************/ 6564/*! no static exports found */ 6565/***/ (function(module, exports, __webpack_require__) { 6566 6567// 20.1.2.2 Number.isFinite(number) 6568var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6569 6570var _isFinite = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").isFinite; 6571 6572$export($export.S, 'Number', { 6573 isFinite: function isFinite(it) { 6574 return typeof it == 'number' && _isFinite(it); 6575 } 6576}); 6577 6578/***/ }), 6579
vendor: 818 bytes, lines 6580-6595
6580/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js": 6581/*!********************************************************************************************!*\ 6582 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js ***! 6583 \********************************************************************************************/ 6584/*! no static exports found */ 6585/***/ (function(module, exports, __webpack_require__) { 6586 6587// 20.1.2.3 Number.isInteger(number) 6588var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6589 6590$export($export.S, 'Number', { 6591 isInteger: __webpack_require__(/*! ./_is-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js") 6592}); 6593 6594/***/ }), 6595
vendor: 781 bytes, lines 6596-6614
6596/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js": 6597/*!****************************************************************************************!*\ 6598 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js ***! 6599 \****************************************************************************************/ 6600/*! no static exports found */ 6601/***/ (function(module, exports, __webpack_require__) { 6602 6603// 20.1.2.4 Number.isNaN(number) 6604var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6605 6606$export($export.S, 'Number', { 6607 isNaN: function isNaN(number) { 6608 // eslint-disable-next-line no-self-compare 6609 return number != number; 6610 } 6611}); 6612 6613/***/ }), 6614
vendor: 986 bytes, lines 6615-6635
6615/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js": 6616/*!*************************************************************************************************!*\ 6617 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js ***! 6618 \*************************************************************************************************/ 6619/*! no static exports found */ 6620/***/ (function(module, exports, __webpack_require__) { 6621 6622// 20.1.2.5 Number.isSafeInteger(number) 6623var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6624 6625var isInteger = __webpack_require__(/*! ./_is-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js"); 6626 6627var abs = Math.abs; 6628$export($export.S, 'Number', { 6629 isSafeInteger: function isSafeInteger(number) { 6630 return isInteger(number) && abs(number) <= 0x1fffffffffffff; 6631 } 6632}); 6633 6634/***/ }), 6635
vendor: 746 bytes, lines 6636-6651
6636/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js": 6637/*!**************************************************************************************************!*\ 6638 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js ***! 6639 \**************************************************************************************************/ 6640/*! no static exports found */ 6641/***/ (function(module, exports, __webpack_require__) { 6642 6643// 20.1.2.6 Number.MAX_SAFE_INTEGER 6644var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6645 6646$export($export.S, 'Number', { 6647 MAX_SAFE_INTEGER: 0x1fffffffffffff 6648}); 6649 6650/***/ }), 6651
vendor: 748 bytes, lines 6652-6667
6652/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js": 6653/*!**************************************************************************************************!*\ 6654 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js ***! 6655 \**************************************************************************************************/ 6656/*! no static exports found */ 6657/***/ (function(module, exports, __webpack_require__) { 6658 6659// 20.1.2.10 Number.MIN_SAFE_INTEGER 6660var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6661 6662$export($export.S, 'Number', { 6663 MIN_SAFE_INTEGER: -0x1fffffffffffff 6664}); 6665 6666/***/ }), 6667
vendor: 909 bytes, lines 6668-6685
6668/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js": 6669/*!*********************************************************************************************!*\ 6670 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js ***! 6671 \*********************************************************************************************/ 6672/*! no static exports found */ 6673/***/ (function(module, exports, __webpack_require__) { 6674 6675var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6676 6677var $parseFloat = __webpack_require__(/*! ./_parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js"); // 20.1.2.12 Number.parseFloat(string) 6678 6679 6680$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { 6681 parseFloat: $parseFloat 6682}); 6683 6684/***/ }), 6685
vendor: 892 bytes, lines 6686-6703
6686/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js": 6687/*!*******************************************************************************************!*\ 6688 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js ***! 6689 \*******************************************************************************************/ 6690/*! no static exports found */ 6691/***/ (function(module, exports, __webpack_require__) { 6692 6693var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6694 6695var $parseInt = __webpack_require__(/*! ./_parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js"); // 20.1.2.13 Number.parseInt(string, radix) 6696 6697 6698$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { 6699 parseInt: $parseInt 6700}); 6701 6702/***/ }), 6703
vendor: 3,767 bytes, lines 6704-6851
6704/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js": 6705/*!******************************************************************************************!*\ 6706 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js ***! 6707 \******************************************************************************************/ 6708/*! no static exports found */ 6709/***/ (function(module, exports, __webpack_require__) { 6710 6711"use strict"; 6712 6713 6714var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6715 6716var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 6717 6718var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js"); 6719 6720var repeat = __webpack_require__(/*! ./_string-repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js"); 6721 6722var $toFixed = 1.0.toFixed; 6723var floor = Math.floor; 6724var data = [0, 0, 0, 0, 0, 0]; 6725var ERROR = 'Number.toFixed: incorrect invocation!'; 6726var ZERO = '0'; 6727 6728var multiply = function multiply(n, c) { 6729 var i = -1; 6730 var c2 = c; 6731 6732 while (++i < 6) { 6733 c2 += n * data[i]; 6734 data[i] = c2 % 1e7; 6735 c2 = floor(c2 / 1e7); 6736 } 6737}; 6738 6739var divide = function divide(n) { 6740 var i = 6; 6741 var c = 0; 6742 6743 while (--i >= 0) { 6744 c += data[i]; 6745 data[i] = floor(c / n); 6746 c = c % n * 1e7; 6747 } 6748}; 6749 6750var numToString = function numToString() { 6751 var i = 6; 6752 var s = ''; 6753 6754 while (--i >= 0) { 6755 if (s !== '' || i === 0 || data[i] !== 0) { 6756 var t = String(data[i]); 6757 s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t; 6758 } 6759 } 6760 6761 return s; 6762}; 6763 6764var pow = function pow(x, n, acc) { 6765 return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc); 6766}; 6767 6768var log = function log(x) { 6769 var n = 0; 6770 var x2 = x; 6771 6772 while (x2 >= 4096) { 6773 n += 12; 6774 x2 /= 4096; 6775 } 6776 6777 while (x2 >= 2) { 6778 n += 1; 6779 x2 /= 2; 6780 } 6781 6782 return n; 6783}; 6784 6785$export($export.P + $export.F * (!!$toFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128') || !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 6786 // V8 ~ Android 4.3- 6787 $toFixed.call({}); 6788})), 'Number', { 6789 toFixed: function toFixed(fractionDigits) { 6790 var x = aNumberValue(this, ERROR); 6791 var f = toInteger(fractionDigits); 6792 var s = ''; 6793 var m = ZERO; 6794 var e, z, j, k; 6795 if (f < 0 || f > 20) throw RangeError(ERROR); // eslint-disable-next-line no-self-compare 6796 6797 if (x != x) return 'NaN'; 6798 if (x <= -1e21 || x >= 1e21) return String(x); 6799 6800 if (x < 0) { 6801 s = '-'; 6802 x = -x; 6803 } 6804 6805 if (x > 1e-21) { 6806 e = log(x * pow(2, 69, 1)) - 69; 6807 z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1); 6808 z *= 0x10000000000000; 6809 e = 52 - e; 6810 6811 if (e > 0) { 6812 multiply(0, z); 6813 j = f; 6814 6815 while (j >= 7) { 6816 multiply(1e7, 0); 6817 j -= 7; 6818 } 6819 6820 multiply(pow(10, j, 1), 0); 6821 j = e - 1; 6822 6823 while (j >= 23) { 6824 divide(1 << 23); 6825 j -= 23; 6826 } 6827 6828 divide(1 << j); 6829 multiply(1, 1); 6830 divide(2); 6831 m = numToString(); 6832 } else { 6833 multiply(0, z); 6834 multiply(1 << -e, 0); 6835 m = numToString() + repeat.call(ZERO, f); 6836 } 6837 } 6838 6839 if (f > 0) { 6840 k = m.length; 6841 m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f)); 6842 } else { 6843 m = s + m; 6844 } 6845 6846 return m; 6847 } 6848}); 6849 6850/***/ }), 6851
vendor: 1,389 bytes, lines 6852-6883
6852/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js": 6853/*!**********************************************************************************************!*\ 6854 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js ***! 6855 \**********************************************************************************************/ 6856/*! no static exports found */ 6857/***/ (function(module, exports, __webpack_require__) { 6858 6859"use strict"; 6860 6861 6862var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6863 6864var $fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 6865 6866var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js"); 6867 6868var $toPrecision = 1.0.toPrecision; 6869$export($export.P + $export.F * ($fails(function () { 6870 // IE7- 6871 return $toPrecision.call(1, undefined) !== '1'; 6872}) || !$fails(function () { 6873 // V8 ~ Android 4.3- 6874 $toPrecision.call({}); 6875})), 'Number', { 6876 toPrecision: function toPrecision(precision) { 6877 var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!'); 6878 return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision); 6879 } 6880}); 6881 6882/***/ }), 6883
vendor: 822 bytes, lines 6884-6899
6884/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js": 6885/*!****************************************************************************************!*\ 6886 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js ***! 6887 \****************************************************************************************/ 6888/*! no static exports found */ 6889/***/ (function(module, exports, __webpack_require__) { 6890 6891// 19.1.3.1 Object.assign(target, source) 6892var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 6893 6894$export($export.S + $export.F, 'Object', { 6895 assign: __webpack_require__(/*! ./_object-assign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js") 6896}); 6897 6898/***/ }), 6899
vendor: 824 bytes, lines 6900-6915
6900/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js": 6901/*!****************************************************************************************!*\ 6902 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js ***! 6903 \****************************************************************************************/ 6904/*! no static exports found */ 6905/***/ (function(module, exports, __webpack_require__) { 6906 6907var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) 6908 6909 6910$export($export.S, 'Object', { 6911 create: __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js") 6912}); 6913 6914/***/ }), 6915
vendor: 1,015 bytes, lines 6916-6931
6916/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js": 6917/*!***************************************************************************************************!*\ 6918 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js ***! 6919 \***************************************************************************************************/ 6920/*! no static exports found */ 6921/***/ (function(module, exports, __webpack_require__) { 6922 6923var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties) 6924 6925 6926$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"), 'Object', { 6927 defineProperties: __webpack_require__(/*! ./_object-dps */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js") 6928}); 6929 6930/***/ }), 6931
vendor: 1,006 bytes, lines 6932-6947
6932/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js": 6933/*!*************************************************************************************************!*\ 6934 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js ***! 6935 \*************************************************************************************************/ 6936/*! no static exports found */ 6937/***/ (function(module, exports, __webpack_require__) { 6938 6939var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) 6940 6941 6942$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"), 'Object', { 6943 defineProperty: __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f 6944}); 6945 6946/***/ }), 6947
vendor: 1,014 bytes, lines 6948-6967
6948/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js": 6949/*!****************************************************************************************!*\ 6950 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js ***! 6951 \****************************************************************************************/ 6952/*! no static exports found */ 6953/***/ (function(module, exports, __webpack_require__) { 6954 6955// 19.1.2.5 Object.freeze(O) 6956var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 6957 6958var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").onFreeze; 6959 6960__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('freeze', function ($freeze) { 6961 return function freeze(it) { 6962 return $freeze && isObject(it) ? $freeze(meta(it)) : it; 6963 }; 6964}); 6965 6966/***/ }), 6967
vendor: 1,181 bytes, lines 6968-6987
6968/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js": 6969/*!*************************************************************************************************************!*\ 6970 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***! 6971 \*************************************************************************************************************/ 6972/*! no static exports found */ 6973/***/ (function(module, exports, __webpack_require__) { 6974 6975// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) 6976var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 6977 6978var $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; 6979 6980__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('getOwnPropertyDescriptor', function () { 6981 return function getOwnPropertyDescriptor(it, key) { 6982 return $getOwnPropertyDescriptor(toIObject(it), key); 6983 }; 6984}); 6985 6986/***/ }), 6987
vendor: 878 bytes, lines 6988-7001
6988/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js": 6989/*!********************************************************************************************************!*\ 6990 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js ***! 6991 \********************************************************************************************************/ 6992/*! no static exports found */ 6993/***/ (function(module, exports, __webpack_require__) { 6994 6995// 19.1.2.7 Object.getOwnPropertyNames(O) 6996__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('getOwnPropertyNames', function () { 6997 return __webpack_require__(/*! ./_object-gopn-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js").f; 6998}); 6999 7000/***/ }), 7001
vendor: 1,066 bytes, lines 7002-7021
7002/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js": 7003/*!**************************************************************************************************!*\ 7004 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js ***! 7005 \**************************************************************************************************/ 7006/*! no static exports found */ 7007/***/ (function(module, exports, __webpack_require__) { 7008 7009// 19.1.2.9 Object.getPrototypeOf(O) 7010var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 7011 7012var $getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 7013 7014__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('getPrototypeOf', function () { 7015 return function getPrototypeOf(it) { 7016 return $getPrototypeOf(toObject(it)); 7017 }; 7018}); 7019 7020/***/ }), 7021
vendor: 953 bytes, lines 7022-7039
7022/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js": 7023/*!***********************************************************************************************!*\ 7024 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js ***! 7025 \***********************************************************************************************/ 7026/*! no static exports found */ 7027/***/ (function(module, exports, __webpack_require__) { 7028 7029// 19.1.2.11 Object.isExtensible(O) 7030var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7031 7032__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('isExtensible', function ($isExtensible) { 7033 return function isExtensible(it) { 7034 return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false; 7035 }; 7036}); 7037 7038/***/ }), 7039
vendor: 913 bytes, lines 7040-7057
7040/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js": 7041/*!*******************************************************************************************!*\ 7042 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js ***! 7043 \*******************************************************************************************/ 7044/*! no static exports found */ 7045/***/ (function(module, exports, __webpack_require__) { 7046 7047// 19.1.2.12 Object.isFrozen(O) 7048var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7049 7050__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('isFrozen', function ($isFrozen) { 7051 return function isFrozen(it) { 7052 return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true; 7053 }; 7054}); 7055 7056/***/ }), 7057
vendor: 913 bytes, lines 7058-7075
7058/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js": 7059/*!*******************************************************************************************!*\ 7060 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js ***! 7061 \*******************************************************************************************/ 7062/*! no static exports found */ 7063/***/ (function(module, exports, __webpack_require__) { 7064 7065// 19.1.2.13 Object.isSealed(O) 7066var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7067 7068__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('isSealed', function ($isSealed) { 7069 return function isSealed(it) { 7070 return isObject(it) ? $isSealed ? $isSealed(it) : false : true; 7071 }; 7072}); 7073 7074/***/ }), 7075
vendor: 781 bytes, lines 7076-7091
7076/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js": 7077/*!************************************************************************************!*\ 7078 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js ***! 7079 \************************************************************************************/ 7080/*! no static exports found */ 7081/***/ (function(module, exports, __webpack_require__) { 7082 7083// 19.1.3.10 Object.is(value1, value2) 7084var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7085 7086$export($export.S, 'Object', { 7087 is: __webpack_require__(/*! ./_same-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js") 7088}); 7089 7090/***/ }), 7091
vendor: 971 bytes, lines 7092-7111
7092/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js": 7093/*!**************************************************************************************!*\ 7094 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js ***! 7095 \**************************************************************************************/ 7096/*! no static exports found */ 7097/***/ (function(module, exports, __webpack_require__) { 7098 7099// 19.1.2.14 Object.keys(O) 7100var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 7101 7102var $keys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 7103 7104__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('keys', function () { 7105 return function keys(it) { 7106 return $keys(toObject(it)); 7107 }; 7108}); 7109 7110/***/ }), 7111
vendor: 1,129 bytes, lines 7112-7131
7112/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js": 7113/*!****************************************************************************************************!*\ 7114 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js ***! 7115 \****************************************************************************************************/ 7116/*! no static exports found */ 7117/***/ (function(module, exports, __webpack_require__) { 7118 7119// 19.1.2.15 Object.preventExtensions(O) 7120var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7121 7122var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").onFreeze; 7123 7124__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('preventExtensions', function ($preventExtensions) { 7125 return function preventExtensions(it) { 7126 return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it; 7127 }; 7128}); 7129 7130/***/ }), 7131
vendor: 995 bytes, lines 7132-7151
7132/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js": 7133/*!**************************************************************************************!*\ 7134 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js ***! 7135 \**************************************************************************************/ 7136/*! no static exports found */ 7137/***/ (function(module, exports, __webpack_require__) { 7138 7139// 19.1.2.17 Object.seal(O) 7140var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7141 7142var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").onFreeze; 7143 7144__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('seal', function ($seal) { 7145 return function seal(it) { 7146 return $seal && isObject(it) ? $seal(meta(it)) : it; 7147 }; 7148}); 7149 7150/***/ }), 7151
vendor: 857 bytes, lines 7152-7167
7152/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js": 7153/*!**************************************************************************************************!*\ 7154 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js ***! 7155 \**************************************************************************************************/ 7156/*! no static exports found */ 7157/***/ (function(module, exports, __webpack_require__) { 7158 7159// 19.1.3.19 Object.setPrototypeOf(O, proto) 7160var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7161 7162$export($export.S, 'Object', { 7163 setPrototypeOf: __webpack_require__(/*! ./_set-proto */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js").set 7164}); 7165 7166/***/ }), 7167
vendor: 1,078 bytes, lines 7168-7190
7168/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js": 7169/*!*******************************************************************************************!*\ 7170 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js ***! 7171 \*******************************************************************************************/ 7172/*! no static exports found */ 7173/***/ (function(module, exports, __webpack_require__) { 7174 7175"use strict"; 7176 // 19.1.3.6 Object.prototype.toString() 7177 7178var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js"); 7179 7180var test = {}; 7181test[__webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toStringTag')] = 'z'; 7182 7183if (test + '' != '[object z]') { 7184 __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(Object.prototype, 'toString', function toString() { 7185 return '[object ' + classof(this) + ']'; 7186 }, true); 7187} 7188 7189/***/ }), 7190
vendor: 854 bytes, lines 7191-7208
7191/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js": 7192/*!**************************************************************************************!*\ 7193 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js ***! 7194 \**************************************************************************************/ 7195/*! no static exports found */ 7196/***/ (function(module, exports, __webpack_require__) { 7197 7198var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7199 7200var $parseFloat = __webpack_require__(/*! ./_parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js"); // 18.2.4 parseFloat(string) 7201 7202 7203$export($export.G + $export.F * (parseFloat != $parseFloat), { 7204 parseFloat: $parseFloat 7205}); 7206 7207/***/ }), 7208
vendor: 837 bytes, lines 7209-7226
7209/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js": 7210/*!************************************************************************************!*\ 7211 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js ***! 7212 \************************************************************************************/ 7213/*! no static exports found */ 7214/***/ (function(module, exports, __webpack_require__) { 7215 7216var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7217 7218var $parseInt = __webpack_require__(/*! ./_parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js"); // 18.2.5 parseInt(string, radix) 7219 7220 7221$export($export.G + $export.F * (parseInt != $parseInt), { 7222 parseInt: $parseInt 7223}); 7224 7225/***/ }), 7226
vendor: 12,505 bytes, lines 7227-7593
7227/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js": 7228/*!**********************************************************************************!*\ 7229 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js ***! 7230 \**********************************************************************************/ 7231/*! no static exports found */ 7232/***/ (function(module, exports, __webpack_require__) { 7233 7234"use strict"; 7235 7236 7237var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js"); 7238 7239var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 7240 7241var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js"); 7242 7243var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js"); 7244 7245var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7246 7247var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7248 7249var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 7250 7251var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 7252 7253var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 7254 7255var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js"); 7256 7257var task = __webpack_require__(/*! ./_task */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js").set; 7258 7259var microtask = __webpack_require__(/*! ./_microtask */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js")(); 7260 7261var newPromiseCapabilityModule = __webpack_require__(/*! ./_new-promise-capability */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js"); 7262 7263var perform = __webpack_require__(/*! ./_perform */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js"); 7264 7265var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js"); 7266 7267var promiseResolve = __webpack_require__(/*! ./_promise-resolve */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js"); 7268 7269var PROMISE = 'Promise'; 7270var TypeError = global.TypeError; 7271var process = global.process; 7272var versions = process && process.versions; 7273var v8 = versions && versions.v8 || ''; 7274var $Promise = global[PROMISE]; 7275var isNode = classof(process) == 'process'; 7276 7277var empty = function empty() { 7278 /* empty */ 7279}; 7280 7281var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; 7282var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; 7283var USE_NATIVE = !!function () { 7284 try { 7285 // correct subclassing with @@species support 7286 var promise = $Promise.resolve(1); 7287 7288 var FakePromise = (promise.constructor = {})[__webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species')] = function (exec) { 7289 exec(empty, empty); 7290 }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test 7291 7292 7293 return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables 7294 // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 7295 // we can't detect it synchronously, so just check versions 7296 && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1; 7297 } catch (e) { 7298 /* empty */ 7299 } 7300}(); // helpers 7301 7302var isThenable = function isThenable(it) { 7303 var then; 7304 return isObject(it) && typeof (then = it.then) == 'function' ? then : false; 7305}; 7306 7307var notify = function notify(promise, isReject) { 7308 if (promise._n) return; 7309 promise._n = true; 7310 var chain = promise._c; 7311 microtask(function () { 7312 var value = promise._v; 7313 var ok = promise._s == 1; 7314 var i = 0; 7315 7316 var run = function run(reaction) { 7317 var handler = ok ? reaction.ok : reaction.fail; 7318 var resolve = reaction.resolve; 7319 var reject = reaction.reject; 7320 var domain = reaction.domain; 7321 var result, then, exited; 7322 7323 try { 7324 if (handler) { 7325 if (!ok) { 7326 if (promise._h == 2) onHandleUnhandled(promise); 7327 promise._h = 1; 7328 } 7329 7330 if (handler === true) result = value;else { 7331 if (domain) domain.enter(); 7332 result = handler(value); // may throw 7333 7334 if (domain) { 7335 domain.exit(); 7336 exited = true; 7337 } 7338 } 7339 7340 if (result === reaction.promise) { 7341 reject(TypeError('Promise-chain cycle')); 7342 } else if (then = isThenable(result)) { 7343 then.call(result, resolve, reject); 7344 } else resolve(result); 7345 } else reject(value); 7346 } catch (e) { 7347 if (domain && !exited) domain.exit(); 7348 reject(e); 7349 } 7350 }; 7351 7352 while (chain.length > i) { 7353 run(chain[i++]); 7354 } // variable length - can't use forEach 7355 7356 7357 promise._c = []; 7358 promise._n = false; 7359 if (isReject && !promise._h) onUnhandled(promise); 7360 }); 7361}; 7362 7363var onUnhandled = function onUnhandled(promise) { 7364 task.call(global, function () { 7365 var value = promise._v; 7366 var unhandled = isUnhandled(promise); 7367 var result, handler, console; 7368 7369 if (unhandled) { 7370 result = perform(function () { 7371 if (isNode) { 7372 process.emit('unhandledRejection', value, promise); 7373 } else if (handler = global.onunhandledrejection) { 7374 handler({ 7375 promise: promise, 7376 reason: value 7377 }); 7378 } else if ((console = global.console) && console.error) { 7379 console.error('Unhandled promise rejection', value); 7380 } 7381 }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should 7382 7383 promise._h = isNode || isUnhandled(promise) ? 2 : 1; 7384 } 7385 7386 promise._a = undefined; 7387 if (unhandled && result.e) throw result.v; 7388 }); 7389}; 7390 7391var isUnhandled = function isUnhandled(promise) { 7392 return promise._h !== 1 && (promise._a || promise._c).length === 0; 7393}; 7394 7395var onHandleUnhandled = function onHandleUnhandled(promise) { 7396 task.call(global, function () { 7397 var handler; 7398 7399 if (isNode) { 7400 process.emit('rejectionHandled', promise); 7401 } else if (handler = global.onrejectionhandled) { 7402 handler({ 7403 promise: promise, 7404 reason: promise._v 7405 }); 7406 } 7407 }); 7408}; 7409 7410var $reject = function $reject(value) { 7411 var promise = this; 7412 if (promise._d) return; 7413 promise._d = true; 7414 promise = promise._w || promise; // unwrap 7415 7416 promise._v = value; 7417 promise._s = 2; 7418 if (!promise._a) promise._a = promise._c.slice(); 7419 notify(promise, true); 7420}; 7421 7422var $resolve = function $resolve(value) { 7423 var promise = this; 7424 var then; 7425 if (promise._d) return; 7426 promise._d = true; 7427 promise = promise._w || promise; // unwrap 7428 7429 try { 7430 if (promise === value) throw TypeError("Promise can't be resolved itself"); 7431 7432 if (then = isThenable(value)) { 7433 microtask(function () { 7434 var wrapper = { 7435 _w: promise, 7436 _d: false 7437 }; // wrap 7438 7439 try { 7440 then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); 7441 } catch (e) { 7442 $reject.call(wrapper, e); 7443 } 7444 }); 7445 } else { 7446 promise._v = value; 7447 promise._s = 1; 7448 notify(promise, false); 7449 } 7450 } catch (e) { 7451 $reject.call({ 7452 _w: promise, 7453 _d: false 7454 }, e); // wrap 7455 } 7456}; // constructor polyfill 7457 7458 7459if (!USE_NATIVE) { 7460 // 25.4.3.1 Promise(executor) 7461 $Promise = function Promise(executor) { 7462 anInstance(this, $Promise, PROMISE, '_h'); 7463 aFunction(executor); 7464 Internal.call(this); 7465 7466 try { 7467 executor(ctx($resolve, this, 1), ctx($reject, this, 1)); 7468 } catch (err) { 7469 $reject.call(this, err); 7470 } 7471 }; // eslint-disable-next-line no-unused-vars 7472 7473 7474 Internal = function Promise(executor) { 7475 this._c = []; // <- awaiting reactions 7476 7477 this._a = undefined; // <- checked in isUnhandled reactions 7478 7479 this._s = 0; // <- state 7480 7481 this._d = false; // <- done 7482 7483 this._v = undefined; // <- value 7484 7485 this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled 7486 7487 this._n = false; // <- notify 7488 }; 7489 7490 Internal.prototype = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js")($Promise.prototype, { 7491 // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) 7492 then: function then(onFulfilled, onRejected) { 7493 var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); 7494 reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; 7495 reaction.fail = typeof onRejected == 'function' && onRejected; 7496 reaction.domain = isNode ? process.domain : undefined; 7497 7498 this._c.push(reaction); 7499 7500 if (this._a) this._a.push(reaction); 7501 if (this._s) notify(this, false); 7502 return reaction.promise; 7503 }, 7504 // 25.4.5.1 Promise.prototype.catch(onRejected) 7505 'catch': function _catch(onRejected) { 7506 return this.then(undefined, onRejected); 7507 } 7508 }); 7509 7510 OwnPromiseCapability = function OwnPromiseCapability() { 7511 var promise = new Internal(); 7512 this.promise = promise; 7513 this.resolve = ctx($resolve, promise, 1); 7514 this.reject = ctx($reject, promise, 1); 7515 }; 7516 7517 newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) { 7518 return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); 7519 }; 7520} 7521 7522$export($export.G + $export.W + $export.F * !USE_NATIVE, { 7523 Promise: $Promise 7524}); 7525 7526__webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js")($Promise, PROMISE); 7527 7528__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")(PROMISE); 7529 7530Wrapper = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js")[PROMISE]; // statics 7531 7532$export($export.S + $export.F * !USE_NATIVE, PROMISE, { 7533 // 25.4.4.5 Promise.reject(r) 7534 reject: function reject(r) { 7535 var capability = newPromiseCapability(this); 7536 var $$reject = capability.reject; 7537 $$reject(r); 7538 return capability.promise; 7539 } 7540}); 7541$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { 7542 // 25.4.4.6 Promise.resolve(x) 7543 resolve: function resolve(x) { 7544 return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); 7545 } 7546}); 7547$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js")(function (iter) { 7548 $Promise.all(iter)['catch'](empty); 7549})), PROMISE, { 7550 // 25.4.4.1 Promise.all(iterable) 7551 all: function all(iterable) { 7552 var C = this; 7553 var capability = newPromiseCapability(C); 7554 var resolve = capability.resolve; 7555 var reject = capability.reject; 7556 var result = perform(function () { 7557 var values = []; 7558 var index = 0; 7559 var remaining = 1; 7560 forOf(iterable, false, function (promise) { 7561 var $index = index++; 7562 var alreadyCalled = false; 7563 values.push(undefined); 7564 remaining++; 7565 C.resolve(promise).then(function (value) { 7566 if (alreadyCalled) return; 7567 alreadyCalled = true; 7568 values[$index] = value; 7569 --remaining || resolve(values); 7570 }, reject); 7571 }); 7572 --remaining || resolve(values); 7573 }); 7574 if (result.e) reject(result.v); 7575 return capability.promise; 7576 }, 7577 // 25.4.4.4 Promise.race(iterable) 7578 race: function race(iterable) { 7579 var C = this; 7580 var capability = newPromiseCapability(C); 7581 var reject = capability.reject; 7582 var result = perform(function () { 7583 forOf(iterable, false, function (promise) { 7584 C.resolve(promise).then(capability.resolve, reject); 7585 }); 7586 }); 7587 if (result.e) reject(result.v); 7588 return capability.promise; 7589 } 7590}); 7591 7592/***/ }), 7593
vendor: 1,592 bytes, lines 7594-7624
7594/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js": 7595/*!****************************************************************************************!*\ 7596 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js ***! 7597 \****************************************************************************************/ 7598/*! no static exports found */ 7599/***/ (function(module, exports, __webpack_require__) { 7600 7601// 26.1.1 Reflect.apply(target, thisArgument, argumentsList) 7602var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7603 7604var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 7605 7606var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7607 7608var rApply = (__webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Reflect || {}).apply; 7609var fApply = Function.apply; // MS Edge argumentsList argument is optional 7610 7611$export($export.S + $export.F * !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 7612 rApply(function () { 7613 /* empty */ 7614 }); 7615}), 'Reflect', { 7616 apply: function apply(target, thisArgument, argumentsList) { 7617 var T = aFunction(target); 7618 var L = anObject(argumentsList); 7619 return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L); 7620 } 7621}); 7622 7623/***/ }), 7624
vendor: 3,293 bytes, lines 7625-7707
7625/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js": 7626/*!********************************************************************************************!*\ 7627 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js ***! 7628 \********************************************************************************************/ 7629/*! no static exports found */ 7630/***/ (function(module, exports, __webpack_require__) { 7631 7632// 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) 7633var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7634 7635var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js"); 7636 7637var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 7638 7639var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7640 7641var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7642 7643var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 7644 7645var bind = __webpack_require__(/*! ./_bind */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js"); 7646 7647var rConstruct = (__webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Reflect || {}).construct; // MS Edge supports only 2 arguments and argumentsList argument is optional 7648// FF Nightly sets third argument as `new.target`, but does not create `this` from it 7649 7650var NEW_TARGET_BUG = fails(function () { 7651 function F() { 7652 /* empty */ 7653 } 7654 7655 return !(rConstruct(function () { 7656 /* empty */ 7657 }, [], F) instanceof F); 7658}); 7659var ARGS_BUG = !fails(function () { 7660 rConstruct(function () { 7661 /* empty */ 7662 }); 7663}); 7664$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { 7665 construct: function construct(Target, args 7666 /* , newTarget */ 7667 ) { 7668 aFunction(Target); 7669 anObject(args); 7670 var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); 7671 if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); 7672 7673 if (Target == newTarget) { 7674 // w/o altered newTarget, optimization for 0-4 arguments 7675 switch (args.length) { 7676 case 0: 7677 return new Target(); 7678 7679 case 1: 7680 return new Target(args[0]); 7681 7682 case 2: 7683 return new Target(args[0], args[1]); 7684 7685 case 3: 7686 return new Target(args[0], args[1], args[2]); 7687 7688 case 4: 7689 return new Target(args[0], args[1], args[2], args[3]); 7690 } // w/o altered newTarget, lot of arguments case 7691 7692 7693 var $args = [null]; 7694 $args.push.apply($args, args); 7695 return new (bind.apply(Target, $args))(); 7696 } // with altered newTarget, not support built-in constructors 7697 7698 7699 var proto = newTarget.prototype; 7700 var instance = create(isObject(proto) ? proto : Object.prototype); 7701 var result = Function.apply.call(Target, instance, args); 7702 return isObject(result) ? result : instance; 7703 } 7704}); 7705 7706/***/ }), 7707
vendor: 1,788 bytes, lines 7708-7748
7708/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js": 7709/*!**************************************************************************************************!*\ 7710 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js ***! 7711 \**************************************************************************************************/ 7712/*! no static exports found */ 7713/***/ (function(module, exports, __webpack_require__) { 7714 7715// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) 7716var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 7717 7718var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7719 7720var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7721 7722var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); // MS Edge has broken Reflect.defineProperty - throwing instead of returning false 7723 7724 7725$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 7726 // eslint-disable-next-line no-undef 7727 Reflect.defineProperty(dP.f({}, 1, { 7728 value: 1 7729 }), 1, { 7730 value: 2 7731 }); 7732}), 'Reflect', { 7733 defineProperty: function defineProperty(target, propertyKey, attributes) { 7734 anObject(target); 7735 propertyKey = toPrimitive(propertyKey, true); 7736 anObject(attributes); 7737 7738 try { 7739 dP.f(target, propertyKey, attributes); 7740 return true; 7741 } catch (e) { 7742 return false; 7743 } 7744 } 7745}); 7746 7747/***/ }), 7748
vendor: 1,195 bytes, lines 7749-7771
7749/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js": 7750/*!**************************************************************************************************!*\ 7751 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js ***! 7752 \**************************************************************************************************/ 7753/*! no static exports found */ 7754/***/ (function(module, exports, __webpack_require__) { 7755 7756// 26.1.4 Reflect.deleteProperty(target, propertyKey) 7757var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7758 7759var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; 7760 7761var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7762 7763$export($export.S, 'Reflect', { 7764 deleteProperty: function deleteProperty(target, propertyKey) { 7765 var desc = gOPD(anObject(target), propertyKey); 7766 return desc && !desc.configurable ? false : delete target[propertyKey]; 7767 } 7768}); 7769 7770/***/ }), 7771
vendor: 1,548 bytes, lines 7772-7825
7772/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js": 7773/*!********************************************************************************************!*\ 7774 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js ***! 7775 \********************************************************************************************/ 7776/*! no static exports found */ 7777/***/ (function(module, exports, __webpack_require__) { 7778 7779"use strict"; 7780 // 26.1.5 Reflect.enumerate(target) 7781 7782var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7783 7784var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7785 7786var Enumerate = function Enumerate(iterated) { 7787 this._t = anObject(iterated); // target 7788 7789 this._i = 0; // next index 7790 7791 var keys = this._k = []; // keys 7792 7793 var key; 7794 7795 for (key in iterated) { 7796 keys.push(key); 7797 } 7798}; 7799 7800__webpack_require__(/*! ./_iter-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js")(Enumerate, 'Object', function () { 7801 var that = this; 7802 var keys = that._k; 7803 var key; 7804 7805 do { 7806 if (that._i >= keys.length) return { 7807 value: undefined, 7808 done: true 7809 }; 7810 } while (!((key = keys[that._i++]) in that._t)); 7811 7812 return { 7813 value: key, 7814 done: false 7815 }; 7816}); 7817 7818$export($export.S, 'Reflect', { 7819 enumerate: function enumerate(target) { 7820 return new Enumerate(target); 7821 } 7822}); 7823 7824/***/ }), 7825
vendor: 1,193 bytes, lines 7826-7847
7826/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js": 7827/*!**************************************************************************************************************!*\ 7828 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***! 7829 \**************************************************************************************************************/ 7830/*! no static exports found */ 7831/***/ (function(module, exports, __webpack_require__) { 7832 7833// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey) 7834var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js"); 7835 7836var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7837 7838var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7839 7840$export($export.S, 'Reflect', { 7841 getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) { 7842 return gOPD.f(anObject(target), propertyKey); 7843 } 7844}); 7845 7846/***/ }), 7847
vendor: 1,084 bytes, lines 7848-7869
7848/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js": 7849/*!***************************************************************************************************!*\ 7850 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***! 7851 \***************************************************************************************************/ 7852/*! no static exports found */ 7853/***/ (function(module, exports, __webpack_require__) { 7854 7855// 26.1.8 Reflect.getPrototypeOf(target) 7856var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7857 7858var getProto = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 7859 7860var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7861 7862$export($export.S, 'Reflect', { 7863 getPrototypeOf: function getPrototypeOf(target) { 7864 return getProto(anObject(target)); 7865 } 7866}); 7867 7868/***/ }), 7869
vendor: 1,793 bytes, lines 7870-7905
7870/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js": 7871/*!**************************************************************************************!*\ 7872 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js ***! 7873 \**************************************************************************************/ 7874/*! no static exports found */ 7875/***/ (function(module, exports, __webpack_require__) { 7876 7877// 26.1.6 Reflect.get(target, propertyKey [, receiver]) 7878var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js"); 7879 7880var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 7881 7882var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 7883 7884var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7885 7886var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 7887 7888var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7889 7890function get(target, propertyKey 7891/* , receiver */ 7892) { 7893 var receiver = arguments.length < 3 ? target : arguments[2]; 7894 var desc, proto; 7895 if (anObject(target) === receiver) return target[propertyKey]; 7896 if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined; 7897 if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver); 7898} 7899 7900$export($export.S, 'Reflect', { 7901 get: get 7902}); 7903 7904/***/ }), 7905
vendor: 750 bytes, lines 7906-7923
7906/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js": 7907/*!**************************************************************************************!*\ 7908 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js ***! 7909 \**************************************************************************************/ 7910/*! no static exports found */ 7911/***/ (function(module, exports, __webpack_require__) { 7912 7913// 26.1.9 Reflect.has(target, propertyKey) 7914var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7915 7916$export($export.S, 'Reflect', { 7917 has: function has(target, propertyKey) { 7918 return propertyKey in target; 7919 } 7920}); 7921 7922/***/ }), 7923
vendor: 1,012 bytes, lines 7924-7945
7924/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js": 7925/*!************************************************************************************************!*\ 7926 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js ***! 7927 \************************************************************************************************/ 7928/*! no static exports found */ 7929/***/ (function(module, exports, __webpack_require__) { 7930 7931// 26.1.10 Reflect.isExtensible(target) 7932var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7933 7934var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7935 7936var $isExtensible = Object.isExtensible; 7937$export($export.S, 'Reflect', { 7938 isExtensible: function isExtensible(target) { 7939 anObject(target); 7940 return $isExtensible ? $isExtensible(target) : true; 7941 } 7942}); 7943 7944/***/ }), 7945
vendor: 807 bytes, lines 7946-7961
7946/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js": 7947/*!*******************************************************************************************!*\ 7948 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js ***! 7949 \*******************************************************************************************/ 7950/*! no static exports found */ 7951/***/ (function(module, exports, __webpack_require__) { 7952 7953// 26.1.11 Reflect.ownKeys(target) 7954var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7955 7956$export($export.S, 'Reflect', { 7957 ownKeys: __webpack_require__(/*! ./_own-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js") 7958}); 7959 7960/***/ }), 7961
vendor: 1,132 bytes, lines 7962-7989
7962/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js": 7963/*!*****************************************************************************************************!*\ 7964 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***! 7965 \*****************************************************************************************************/ 7966/*! no static exports found */ 7967/***/ (function(module, exports, __webpack_require__) { 7968 7969// 26.1.12 Reflect.preventExtensions(target) 7970var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7971 7972var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 7973 7974var $preventExtensions = Object.preventExtensions; 7975$export($export.S, 'Reflect', { 7976 preventExtensions: function preventExtensions(target) { 7977 anObject(target); 7978 7979 try { 7980 if ($preventExtensions) $preventExtensions(target); 7981 return true; 7982 } catch (e) { 7983 return false; 7984 } 7985 } 7986}); 7987 7988/***/ }), 7989
vendor: 1,082 bytes, lines 7990-8016
7990/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js": 7991/*!***************************************************************************************************!*\ 7992 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***! 7993 \***************************************************************************************************/ 7994/*! no static exports found */ 7995/***/ (function(module, exports, __webpack_require__) { 7996 7997// 26.1.14 Reflect.setPrototypeOf(target, proto) 7998var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 7999 8000var setProto = __webpack_require__(/*! ./_set-proto */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js"); 8001 8002if (setProto) $export($export.S, 'Reflect', { 8003 setPrototypeOf: function setPrototypeOf(target, proto) { 8004 setProto.check(target, proto); 8005 8006 try { 8007 setProto.set(target, proto); 8008 return true; 8009 } catch (e) { 8010 return false; 8011 } 8012 } 8013}); 8014 8015/***/ }), 8016
vendor: 2,542 bytes, lines 8017-8076
8017/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js": 8018/*!**************************************************************************************!*\ 8019 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js ***! 8020 \**************************************************************************************/ 8021/*! no static exports found */ 8022/***/ (function(module, exports, __webpack_require__) { 8023 8024// 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) 8025var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 8026 8027var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js"); 8028 8029var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 8030 8031var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 8032 8033var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8034 8035var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 8036 8037var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 8038 8039var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 8040 8041function set(target, propertyKey, V 8042/* , receiver */ 8043) { 8044 var receiver = arguments.length < 4 ? target : arguments[3]; 8045 var ownDesc = gOPD.f(anObject(target), propertyKey); 8046 var existingDescriptor, proto; 8047 8048 if (!ownDesc) { 8049 if (isObject(proto = getPrototypeOf(target))) { 8050 return set(proto, propertyKey, V, receiver); 8051 } 8052 8053 ownDesc = createDesc(0); 8054 } 8055 8056 if (has(ownDesc, 'value')) { 8057 if (ownDesc.writable === false || !isObject(receiver)) return false; 8058 8059 if (existingDescriptor = gOPD.f(receiver, propertyKey)) { 8060 if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; 8061 existingDescriptor.value = V; 8062 dP.f(receiver, propertyKey, existingDescriptor); 8063 } else dP.f(receiver, propertyKey, createDesc(0, V)); 8064 8065 return true; 8066 } 8067 8068 return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true); 8069} 8070 8071$export($export.S, 'Reflect', { 8072 set: set 8073}); 8074 8075/***/ }), 8076
vendor: 3,150 bytes, lines 8077-8141
8077/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js": 8078/*!*********************************************************************************************!*\ 8079 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js ***! 8080 \*********************************************************************************************/ 8081/*! no static exports found */ 8082/***/ (function(module, exports, __webpack_require__) { 8083 8084var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 8085 8086var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js"); 8087 8088var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f; 8089 8090var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f; 8091 8092var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js"); 8093 8094var $flags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js"); 8095 8096var $RegExp = global.RegExp; 8097var Base = $RegExp; 8098var proto = $RegExp.prototype; 8099var re1 = /a/g; 8100var re2 = /a/g; // "new" creates a new object, old webkit buggy here 8101 8102var CORRECT_NEW = new $RegExp(re1) !== re1; 8103 8104if (__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 8105 re2[__webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('match')] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match 8106 8107 return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; 8108}))) { 8109 $RegExp = function RegExp(p, f) { 8110 var tiRE = this instanceof $RegExp; 8111 var piRE = isRegExp(p); 8112 var fiU = f === undefined; 8113 return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : inheritIfRequired(CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f), tiRE ? this : proto, $RegExp); 8114 }; 8115 8116 var proxy = function proxy(key) { 8117 key in $RegExp || dP($RegExp, key, { 8118 configurable: true, 8119 get: function get() { 8120 return Base[key]; 8121 }, 8122 set: function set(it) { 8123 Base[key] = it; 8124 } 8125 }); 8126 }; 8127 8128 for (var keys = gOPN(Base), i = 0; keys.length > i;) { 8129 proxy(keys[i++]); 8130 } 8131 8132 proto.constructor = $RegExp; 8133 $RegExp.prototype = proto; 8134 8135 __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(global, 'RegExp', $RegExp); 8136} 8137 8138__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")('RegExp'); 8139 8140/***/ }), 8141
vendor: 829 bytes, lines 8142-8163
8142/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js": 8143/*!**************************************************************************************!*\ 8144 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js ***! 8145 \**************************************************************************************/ 8146/*! no static exports found */ 8147/***/ (function(module, exports, __webpack_require__) { 8148 8149"use strict"; 8150 8151 8152var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js"); 8153 8154__webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js")({ 8155 target: 'RegExp', 8156 proto: true, 8157 forced: regexpExec !== /./.exec 8158}, { 8159 exec: regexpExec 8160}); 8161 8162/***/ }), 8163
vendor: 945 bytes, lines 8164-8178
8164/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js": 8165/*!***************************************************************************************!*\ 8166 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js ***! 8167 \***************************************************************************************/ 8168/*! no static exports found */ 8169/***/ (function(module, exports, __webpack_require__) { 8170 8171// 21.2.5.3 get RegExp.prototype.flags() 8172if (__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f(RegExp.prototype, 'flags', { 8173 configurable: true, 8174 get: __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js") 8175}); 8176 8177/***/ }), 8178
vendor: 2,294 bytes, lines 8179-8231
8179/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js": 8180/*!***************************************************************************************!*\ 8181 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js ***! 8182 \***************************************************************************************/ 8183/*! no static exports found */ 8184/***/ (function(module, exports, __webpack_require__) { 8185 8186"use strict"; 8187 8188 8189var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 8190 8191var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 8192 8193var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js"); 8194 8195var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js"); // @@match logic 8196 8197 8198__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('match', 1, function (defined, MATCH, $match, maybeCallNative) { 8199 return [// `String.prototype.match` method 8200 // https://tc39.github.io/ecma262/#sec-string.prototype.match 8201 function match(regexp) { 8202 var O = defined(this); 8203 var fn = regexp == undefined ? undefined : regexp[MATCH]; 8204 return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); 8205 }, // `RegExp.prototype[@@match]` method 8206 // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match 8207 function (regexp) { 8208 var res = maybeCallNative($match, regexp, this); 8209 if (res.done) return res.value; 8210 var rx = anObject(regexp); 8211 var S = String(this); 8212 if (!rx.global) return regExpExec(rx, S); 8213 var fullUnicode = rx.unicode; 8214 rx.lastIndex = 0; 8215 var A = []; 8216 var n = 0; 8217 var result; 8218 8219 while ((result = regExpExec(rx, S)) !== null) { 8220 var matchStr = String(result[0]); 8221 A[n] = matchStr; 8222 if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); 8223 n++; 8224 } 8225 8226 return n === 0 ? null : A; 8227 }]; 8228}); 8229 8230/***/ }), 8231
vendor: 5,766 bytes, lines 8232-8386
8232/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js": 8233/*!*****************************************************************************************!*\ 8234 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js ***! 8235 \*****************************************************************************************/ 8236/*! no static exports found */ 8237/***/ (function(module, exports, __webpack_require__) { 8238 8239"use strict"; 8240 8241 8242var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 8243 8244var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 8245 8246var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 8247 8248var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 8249 8250var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js"); 8251 8252var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js"); 8253 8254var max = Math.max; 8255var min = Math.min; 8256var floor = Math.floor; 8257var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; 8258var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; 8259 8260var maybeToString = function maybeToString(it) { 8261 return it === undefined ? it : String(it); 8262}; // @@replace logic 8263 8264 8265__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { 8266 return [// `String.prototype.replace` method 8267 // https://tc39.github.io/ecma262/#sec-string.prototype.replace 8268 function replace(searchValue, replaceValue) { 8269 var O = defined(this); 8270 var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; 8271 return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue); 8272 }, // `RegExp.prototype[@@replace]` method 8273 // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace 8274 function (regexp, replaceValue) { 8275 var res = maybeCallNative($replace, regexp, this, replaceValue); 8276 if (res.done) return res.value; 8277 var rx = anObject(regexp); 8278 var S = String(this); 8279 var functionalReplace = typeof replaceValue === 'function'; 8280 if (!functionalReplace) replaceValue = String(replaceValue); 8281 var global = rx.global; 8282 8283 if (global) { 8284 var fullUnicode = rx.unicode; 8285 rx.lastIndex = 0; 8286 } 8287 8288 var results = []; 8289 8290 while (true) { 8291 var result = regExpExec(rx, S); 8292 if (result === null) break; 8293 results.push(result); 8294 if (!global) break; 8295 var matchStr = String(result[0]); 8296 if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); 8297 } 8298 8299 var accumulatedResult = ''; 8300 var nextSourcePosition = 0; 8301 8302 for (var i = 0; i < results.length; i++) { 8303 result = results[i]; 8304 var matched = String(result[0]); 8305 var position = max(min(toInteger(result.index), S.length), 0); 8306 var captures = []; // NOTE: This is equivalent to 8307 // captures = result.slice(1).map(maybeToString) 8308 // but for some reason `nativeSlice.call(result, 1, result.length)` (called in 8309 // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and 8310 // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. 8311 8312 for (var j = 1; j < result.length; j++) { 8313 captures.push(maybeToString(result[j])); 8314 } 8315 8316 var namedCaptures = result.groups; 8317 8318 if (functionalReplace) { 8319 var replacerArgs = [matched].concat(captures, position, S); 8320 if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); 8321 var replacement = String(replaceValue.apply(undefined, replacerArgs)); 8322 } else { 8323 replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); 8324 } 8325 8326 if (position >= nextSourcePosition) { 8327 accumulatedResult += S.slice(nextSourcePosition, position) + replacement; 8328 nextSourcePosition = position + matched.length; 8329 } 8330 } 8331 8332 return accumulatedResult + S.slice(nextSourcePosition); 8333 }]; // https://tc39.github.io/ecma262/#sec-getsubstitution 8334 8335 function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { 8336 var tailPos = position + matched.length; 8337 var m = captures.length; 8338 var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; 8339 8340 if (namedCaptures !== undefined) { 8341 namedCaptures = toObject(namedCaptures); 8342 symbols = SUBSTITUTION_SYMBOLS; 8343 } 8344 8345 return $replace.call(replacement, symbols, function (match, ch) { 8346 var capture; 8347 8348 switch (ch.charAt(0)) { 8349 case '$': 8350 return '$'; 8351 8352 case '&': 8353 return matched; 8354 8355 case '`': 8356 return str.slice(0, position); 8357 8358 case "'": 8359 return str.slice(tailPos); 8360 8361 case '<': 8362 capture = namedCaptures[ch.slice(1, -1)]; 8363 break; 8364 8365 default: 8366 // \d\d? 8367 var n = +ch; 8368 if (n === 0) return match; 8369 8370 if (n > m) { 8371 var f = floor(n / 10); 8372 if (f === 0) return match; 8373 if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); 8374 return match; 8375 } 8376 8377 capture = captures[n - 1]; 8378 } 8379 8380 return capture === undefined ? '' : capture; 8381 }); 8382 } 8383}); 8384 8385/***/ }), 8386
vendor: 2,004 bytes, lines 8387-8427
8387/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js": 8388/*!****************************************************************************************!*\ 8389 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js ***! 8390 \****************************************************************************************/ 8391/*! no static exports found */ 8392/***/ (function(module, exports, __webpack_require__) { 8393 8394"use strict"; 8395 8396 8397var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 8398 8399var sameValue = __webpack_require__(/*! ./_same-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js"); 8400 8401var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js"); // @@search logic 8402 8403 8404__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('search', 1, function (defined, SEARCH, $search, maybeCallNative) { 8405 return [// `String.prototype.search` method 8406 // https://tc39.github.io/ecma262/#sec-string.prototype.search 8407 function search(regexp) { 8408 var O = defined(this); 8409 var fn = regexp == undefined ? undefined : regexp[SEARCH]; 8410 return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); 8411 }, // `RegExp.prototype[@@search]` method 8412 // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search 8413 function (regexp) { 8414 var res = maybeCallNative($search, regexp, this); 8415 if (res.done) return res.value; 8416 var rx = anObject(regexp); 8417 var S = String(this); 8418 var previousLastIndex = rx.lastIndex; 8419 if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; 8420 var result = regExpExec(rx, S); 8421 if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; 8422 return result === null ? -1 : result.index; 8423 }]; 8424}); 8425 8426/***/ }), 8427
vendor: 6,307 bytes, lines 8428-8567
8428/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js": 8429/*!***************************************************************************************!*\ 8430 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js ***! 8431 \***************************************************************************************/ 8432/*! no static exports found */ 8433/***/ (function(module, exports, __webpack_require__) { 8434 8435"use strict"; 8436 8437 8438var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js"); 8439 8440var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 8441 8442var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js"); 8443 8444var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js"); 8445 8446var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 8447 8448var callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js"); 8449 8450var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js"); 8451 8452var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 8453 8454var $min = Math.min; 8455var $push = [].push; 8456var $SPLIT = 'split'; 8457var LENGTH = 'length'; 8458var LAST_INDEX = 'lastIndex'; 8459var MAX_UINT32 = 0xffffffff; // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError 8460 8461var SUPPORTS_Y = !fails(function () { 8462 RegExp(MAX_UINT32, 'y'); 8463}); // @@split logic 8464 8465__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('split', 2, function (defined, SPLIT, $split, maybeCallNative) { 8466 var internalSplit; 8467 8468 if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) { 8469 // based on es5-shim implementation, need to rework it 8470 internalSplit = function internalSplit(separator, limit) { 8471 var string = String(this); 8472 if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split 8473 8474 if (!isRegExp(separator)) return $split.call(string, separator, limit); 8475 var output = []; 8476 var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : ''); 8477 var lastLastIndex = 0; 8478 var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy 8479 8480 var separatorCopy = new RegExp(separator.source, flags + 'g'); 8481 var match, lastIndex, lastLength; 8482 8483 while (match = regexpExec.call(separatorCopy, string)) { 8484 lastIndex = separatorCopy[LAST_INDEX]; 8485 8486 if (lastIndex > lastLastIndex) { 8487 output.push(string.slice(lastLastIndex, match.index)); 8488 if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); 8489 lastLength = match[0][LENGTH]; 8490 lastLastIndex = lastIndex; 8491 if (output[LENGTH] >= splitLimit) break; 8492 } 8493 8494 if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop 8495 } 8496 8497 if (lastLastIndex === string[LENGTH]) { 8498 if (lastLength || !separatorCopy.test('')) output.push(''); 8499 } else output.push(string.slice(lastLastIndex)); 8500 8501 return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; 8502 }; // Chakra, V8 8503 8504 } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { 8505 internalSplit = function internalSplit(separator, limit) { 8506 return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); 8507 }; 8508 } else { 8509 internalSplit = $split; 8510 } 8511 8512 return [// `String.prototype.split` method 8513 // https://tc39.github.io/ecma262/#sec-string.prototype.split 8514 function split(separator, limit) { 8515 var O = defined(this); 8516 var splitter = separator == undefined ? undefined : separator[SPLIT]; 8517 return splitter !== undefined ? splitter.call(separator, O, limit) : internalSplit.call(String(O), separator, limit); 8518 }, // `RegExp.prototype[@@split]` method 8519 // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split 8520 // 8521 // NOTE: This cannot be properly polyfilled in engines that don't support 8522 // the 'y' flag. 8523 function (regexp, limit) { 8524 var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); 8525 if (res.done) return res.value; 8526 var rx = anObject(regexp); 8527 var S = String(this); 8528 var C = speciesConstructor(rx, RegExp); 8529 var unicodeMatching = rx.unicode; 8530 var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (SUPPORTS_Y ? 'y' : 'g'); // ^(? + rx + ) is needed, in combination with some S slicing, to 8531 // simulate the 'y' flag. 8532 8533 var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); 8534 var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; 8535 if (lim === 0) return []; 8536 if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; 8537 var p = 0; 8538 var q = 0; 8539 var A = []; 8540 8541 while (q < S.length) { 8542 splitter.lastIndex = SUPPORTS_Y ? q : 0; 8543 var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); 8544 var e; 8545 8546 if (z === null || (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p) { 8547 q = advanceStringIndex(S, q, unicodeMatching); 8548 } else { 8549 A.push(S.slice(p, q)); 8550 if (A.length === lim) return A; 8551 8552 for (var i = 1; i <= z.length - 1; i++) { 8553 A.push(z[i]); 8554 if (A.length === lim) return A; 8555 } 8556 8557 q = p = e; 8558 } 8559 } 8560 8561 A.push(S.slice(p)); 8562 return A; 8563 }]; 8564}); 8565 8566/***/ }), 8567
vendor: 1,885 bytes, lines 8568-8611
8568/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js": 8569/*!*******************************************************************************************!*\ 8570 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js ***! 8571 \*******************************************************************************************/ 8572/*! no static exports found */ 8573/***/ (function(module, exports, __webpack_require__) { 8574 8575"use strict"; 8576 8577 8578__webpack_require__(/*! ./es6.regexp.flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js"); 8579 8580var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 8581 8582var $flags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js"); 8583 8584var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"); 8585 8586var TO_STRING = 'toString'; 8587var $toString = /./[TO_STRING]; 8588 8589var define = function define(fn) { 8590 __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(RegExp.prototype, TO_STRING, fn, true); 8591}; // 21.2.5.14 RegExp.prototype.toString() 8592 8593 8594if (__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 8595 return $toString.call({ 8596 source: 'a', 8597 flags: 'b' 8598 }) != '/a/b'; 8599})) { 8600 define(function toString() { 8601 var R = anObject(this); 8602 return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined); 8603 }); // FF44- RegExp#toString has a wrong name 8604} else if ($toString.name != TO_STRING) { 8605 define(function toString() { 8606 return $toString.call(this); 8607 }); 8608} 8609 8610/***/ }), 8611
vendor: 1,220 bytes, lines 8612-8640
8612/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js": 8613/*!******************************************************************************!*\ 8614 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js ***! 8615 \******************************************************************************/ 8616/*! no static exports found */ 8617/***/ (function(module, exports, __webpack_require__) { 8618 8619"use strict"; 8620 8621 8622var strong = __webpack_require__(/*! ./_collection-strong */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js"); 8623 8624var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 8625 8626var SET = 'Set'; // 23.2 Set Objects 8627 8628module.exports = __webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(SET, function (get) { 8629 return function Set() { 8630 return get(this, arguments.length > 0 ? arguments[0] : undefined); 8631 }; 8632}, { 8633 // 23.2.3.1 Set.prototype.add(value) 8634 add: function add(value) { 8635 return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); 8636 } 8637}, strong); 8638 8639/***/ }), 8640
vendor: 773 bytes, lines 8641-8658
8641/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js": 8642/*!****************************************************************************************!*\ 8643 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js ***! 8644 \****************************************************************************************/ 8645/*! no static exports found */ 8646/***/ (function(module, exports, __webpack_require__) { 8647 8648"use strict"; 8649 // B.2.3.2 String.prototype.anchor(name) 8650 8651__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('anchor', function (createHTML) { 8652 return function anchor(name) { 8653 return createHTML(this, 'a', 'name', name); 8654 }; 8655}); 8656 8657/***/ }), 8658
vendor: 740 bytes, lines 8659-8676
8659/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js": 8660/*!*************************************************************************************!*\ 8661 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js ***! 8662 \*************************************************************************************/ 8663/*! no static exports found */ 8664/***/ (function(module, exports, __webpack_require__) { 8665 8666"use strict"; 8667 // B.2.3.3 String.prototype.big() 8668 8669__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('big', function (createHTML) { 8670 return function big() { 8671 return createHTML(this, 'big', '', ''); 8672 }; 8673}); 8674 8675/***/ }), 8676
vendor: 756 bytes, lines 8677-8694
8677/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js": 8678/*!***************************************************************************************!*\ 8679 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js ***! 8680 \***************************************************************************************/ 8681/*! no static exports found */ 8682/***/ (function(module, exports, __webpack_require__) { 8683 8684"use strict"; 8685 // B.2.3.4 String.prototype.blink() 8686 8687__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('blink', function (createHTML) { 8688 return function blink() { 8689 return createHTML(this, 'blink', '', ''); 8690 }; 8691}); 8692 8693/***/ }), 8694
vendor: 745 bytes, lines 8695-8712
8695/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js": 8696/*!**************************************************************************************!*\ 8697 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js ***! 8698 \**************************************************************************************/ 8699/*! no static exports found */ 8700/***/ (function(module, exports, __webpack_require__) { 8701 8702"use strict"; 8703 // B.2.3.5 String.prototype.bold() 8704 8705__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('bold', function (createHTML) { 8706 return function bold() { 8707 return createHTML(this, 'b', '', ''); 8708 }; 8709}); 8710 8711/***/ }), 8712
vendor: 935 bytes, lines 8713-8735
8713/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js": 8714/*!***********************************************************************************************!*\ 8715 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js ***! 8716 \***********************************************************************************************/ 8717/*! no static exports found */ 8718/***/ (function(module, exports, __webpack_require__) { 8719 8720"use strict"; 8721 8722 8723var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8724 8725var $at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(false); 8726 8727$export($export.P, 'String', { 8728 // 21.1.3.3 String.prototype.codePointAt(pos) 8729 codePointAt: function codePointAt(pos) { 8730 return $at(this, pos); 8731 } 8732}); 8733 8734/***/ }), 8735
vendor: 1,700 bytes, lines 8736-8769
8736/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js": 8737/*!*******************************************************************************************!*\ 8738 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js ***! 8739 \*******************************************************************************************/ 8740/*! no static exports found */ 8741/***/ (function(module, exports, __webpack_require__) { 8742 8743"use strict"; 8744// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition]) 8745 8746 8747var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8748 8749var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 8750 8751var context = __webpack_require__(/*! ./_string-context */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js"); 8752 8753var ENDS_WITH = 'endsWith'; 8754var $endsWith = ''[ENDS_WITH]; 8755$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js")(ENDS_WITH), 'String', { 8756 endsWith: function endsWith(searchString 8757 /* , endPosition = @length */ 8758 ) { 8759 var that = context(this, searchString, ENDS_WITH); 8760 var endPosition = arguments.length > 1 ? arguments[1] : undefined; 8761 var len = toLength(that.length); 8762 var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len); 8763 var search = String(searchString); 8764 return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search; 8765 } 8766}); 8767 8768/***/ }), 8769
vendor: 753 bytes, lines 8770-8787
8770/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js": 8771/*!***************************************************************************************!*\ 8772 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js ***! 8773 \***************************************************************************************/ 8774/*! no static exports found */ 8775/***/ (function(module, exports, __webpack_require__) { 8776 8777"use strict"; 8778 // B.2.3.6 String.prototype.fixed() 8779 8780__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('fixed', function (createHTML) { 8781 return function fixed() { 8782 return createHTML(this, 'tt', '', ''); 8783 }; 8784}); 8785 8786/***/ }), 8787
vendor: 801 bytes, lines 8788-8805
8788/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js": 8789/*!*******************************************************************************************!*\ 8790 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js ***! 8791 \*******************************************************************************************/ 8792/*! no static exports found */ 8793/***/ (function(module, exports, __webpack_require__) { 8794 8795"use strict"; 8796 // B.2.3.7 String.prototype.fontcolor(color) 8797 8798__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('fontcolor', function (createHTML) { 8799 return function fontcolor(color) { 8800 return createHTML(this, 'font', 'color', color); 8801 }; 8802}); 8803 8804/***/ }), 8805
vendor: 790 bytes, lines 8806-8823
8806/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js": 8807/*!******************************************************************************************!*\ 8808 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js ***! 8809 \******************************************************************************************/ 8810/*! no static exports found */ 8811/***/ (function(module, exports, __webpack_require__) { 8812 8813"use strict"; 8814 // B.2.3.8 String.prototype.fontsize(size) 8815 8816__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('fontsize', function (createHTML) { 8817 return function fontsize(size) { 8818 return createHTML(this, 'font', 'size', size); 8819 }; 8820}); 8821 8822/***/ }), 8823
vendor: 1,552 bytes, lines 8824-8858
8824/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js": 8825/*!*************************************************************************************************!*\ 8826 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js ***! 8827 \*************************************************************************************************/ 8828/*! no static exports found */ 8829/***/ (function(module, exports, __webpack_require__) { 8830 8831var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8832 8833var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 8834 8835var fromCharCode = String.fromCharCode; 8836var $fromCodePoint = String.fromCodePoint; // length should be 1, old FF problem 8837 8838$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', { 8839 // 21.1.2.2 String.fromCodePoint(...codePoints) 8840 fromCodePoint: function fromCodePoint(x) { 8841 // eslint-disable-line no-unused-vars 8842 var res = []; 8843 var aLen = arguments.length; 8844 var i = 0; 8845 var code; 8846 8847 while (aLen > i) { 8848 code = +arguments[i++]; 8849 if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point'); 8850 res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)); 8851 } 8852 8853 return res.join(''); 8854 } 8855}); 8856 8857/***/ }), 8858
vendor: 1,246 bytes, lines 8859-8884
8859/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js": 8860/*!******************************************************************************************!*\ 8861 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js ***! 8862 \******************************************************************************************/ 8863/*! no static exports found */ 8864/***/ (function(module, exports, __webpack_require__) { 8865 8866"use strict"; 8867// 21.1.3.7 String.prototype.includes(searchString, position = 0) 8868 8869 8870var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8871 8872var context = __webpack_require__(/*! ./_string-context */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js"); 8873 8874var INCLUDES = 'includes'; 8875$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js")(INCLUDES), 'String', { 8876 includes: function includes(searchString 8877 /* , position = 0 */ 8878 ) { 8879 return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); 8880 } 8881}); 8882 8883/***/ }), 8884
vendor: 766 bytes, lines 8885-8902
8885/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js": 8886/*!*****************************************************************************************!*\ 8887 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js ***! 8888 \*****************************************************************************************/ 8889/*! no static exports found */ 8890/***/ (function(module, exports, __webpack_require__) { 8891 8892"use strict"; 8893 // B.2.3.9 String.prototype.italics() 8894 8895__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('italics', function (createHTML) { 8896 return function italics() { 8897 return createHTML(this, 'i', '', ''); 8898 }; 8899}); 8900 8901/***/ }), 8902
vendor: 1,209 bytes, lines 8903-8938
8903/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js": 8904/*!******************************************************************************************!*\ 8905 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js ***! 8906 \******************************************************************************************/ 8907/*! no static exports found */ 8908/***/ (function(module, exports, __webpack_require__) { 8909 8910"use strict"; 8911 8912 8913var $at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(true); // 21.1.3.27 String.prototype[@@iterator]() 8914 8915 8916__webpack_require__(/*! ./_iter-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js")(String, 'String', function (iterated) { 8917 this._t = String(iterated); // target 8918 8919 this._i = 0; // next index 8920 // 21.1.5.2.1 %StringIteratorPrototype%.next() 8921}, function () { 8922 var O = this._t; 8923 var index = this._i; 8924 var point; 8925 if (index >= O.length) return { 8926 value: undefined, 8927 done: true 8928 }; 8929 point = $at(O, index); 8930 this._i += point.length; 8931 return { 8932 value: point, 8933 done: false 8934 }; 8935}); 8936 8937/***/ }), 8938
vendor: 757 bytes, lines 8939-8956
8939/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js": 8940/*!**************************************************************************************!*\ 8941 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js ***! 8942 \**************************************************************************************/ 8943/*! no static exports found */ 8944/***/ (function(module, exports, __webpack_require__) { 8945 8946"use strict"; 8947 // B.2.3.10 String.prototype.link(url) 8948 8949__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('link', function (createHTML) { 8950 return function link(url) { 8951 return createHTML(this, 'a', 'href', url); 8952 }; 8953}); 8954 8955/***/ }), 8956
vendor: 1,263 bytes, lines 8957-8989
8957/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js": 8958/*!*************************************************************************************!*\ 8959 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js ***! 8960 \*************************************************************************************/ 8961/*! no static exports found */ 8962/***/ (function(module, exports, __webpack_require__) { 8963 8964var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8965 8966var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 8967 8968var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 8969 8970$export($export.S, 'String', { 8971 // 21.1.2.4 String.raw(callSite, ...substitutions) 8972 raw: function raw(callSite) { 8973 var tpl = toIObject(callSite.raw); 8974 var len = toLength(tpl.length); 8975 var aLen = arguments.length; 8976 var res = []; 8977 var i = 0; 8978 8979 while (len > i) { 8980 res.push(String(tpl[i++])); 8981 if (i < aLen) res.push(String(arguments[i])); 8982 } 8983 8984 return res.join(''); 8985 } 8986}); 8987 8988/***/ }), 8989
vendor: 814 bytes, lines 8990-9005
8990/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js": 8991/*!****************************************************************************************!*\ 8992 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js ***! 8993 \****************************************************************************************/ 8994/*! no static exports found */ 8995/***/ (function(module, exports, __webpack_require__) { 8996 8997var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 8998 8999$export($export.P, 'String', { 9000 // 21.1.3.13 String.prototype.repeat(count) 9001 repeat: __webpack_require__(/*! ./_string-repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js") 9002}); 9003 9004/***/ }), 9005
vendor: 757 bytes, lines 9006-9023
9006/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js": 9007/*!***************************************************************************************!*\ 9008 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js ***! 9009 \***************************************************************************************/ 9010/*! no static exports found */ 9011/***/ (function(module, exports, __webpack_require__) { 9012 9013"use strict"; 9014 // B.2.3.11 String.prototype.small() 9015 9016__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('small', function (createHTML) { 9017 return function small() { 9018 return createHTML(this, 'small', '', ''); 9019 }; 9020}); 9021 9022/***/ }), 9023
vendor: 1,630 bytes, lines 9024-9055
9024/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js": 9025/*!*********************************************************************************************!*\ 9026 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js ***! 9027 \*********************************************************************************************/ 9028/*! no static exports found */ 9029/***/ (function(module, exports, __webpack_require__) { 9030 9031"use strict"; 9032// 21.1.3.18 String.prototype.startsWith(searchString [, position ]) 9033 9034 9035var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9036 9037var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 9038 9039var context = __webpack_require__(/*! ./_string-context */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js"); 9040 9041var STARTS_WITH = 'startsWith'; 9042var $startsWith = ''[STARTS_WITH]; 9043$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js")(STARTS_WITH), 'String', { 9044 startsWith: function startsWith(searchString 9045 /* , position = 0 */ 9046 ) { 9047 var that = context(this, searchString, STARTS_WITH); 9048 var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); 9049 var search = String(searchString); 9050 return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search; 9051 } 9052}); 9053 9054/***/ }), 9055
vendor: 765 bytes, lines 9056-9073
9056/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js": 9057/*!****************************************************************************************!*\ 9058 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js ***! 9059 \****************************************************************************************/ 9060/*! no static exports found */ 9061/***/ (function(module, exports, __webpack_require__) { 9062 9063"use strict"; 9064 // B.2.3.12 String.prototype.strike() 9065 9066__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('strike', function (createHTML) { 9067 return function strike() { 9068 return createHTML(this, 'strike', '', ''); 9069 }; 9070}); 9071 9072/***/ }), 9073
vendor: 741 bytes, lines 9074-9091
9074/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js": 9075/*!*************************************************************************************!*\ 9076 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js ***! 9077 \*************************************************************************************/ 9078/*! no static exports found */ 9079/***/ (function(module, exports, __webpack_require__) { 9080 9081"use strict"; 9082 // B.2.3.13 String.prototype.sub() 9083 9084__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('sub', function (createHTML) { 9085 return function sub() { 9086 return createHTML(this, 'sub', '', ''); 9087 }; 9088}); 9089 9090/***/ }), 9091
vendor: 741 bytes, lines 9092-9109
9092/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js": 9093/*!*************************************************************************************!*\ 9094 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js ***! 9095 \*************************************************************************************/ 9096/*! no static exports found */ 9097/***/ (function(module, exports, __webpack_require__) { 9098 9099"use strict"; 9100 // B.2.3.14 String.prototype.sup() 9101 9102__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('sup', function (createHTML) { 9103 return function sup() { 9104 return createHTML(this, 'sup', '', ''); 9105 }; 9106}); 9107 9108/***/ }), 9109
vendor: 727 bytes, lines 9110-9127
9110/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js": 9111/*!**************************************************************************************!*\ 9112 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js ***! 9113 \**************************************************************************************/ 9114/*! no static exports found */ 9115/***/ (function(module, exports, __webpack_require__) { 9116 9117"use strict"; 9118 // 21.1.3.25 String.prototype.trim() 9119 9120__webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js")('trim', function ($trim) { 9121 return function trim() { 9122 return $trim(this, 3); 9123 }; 9124}); 9125 9126/***/ }), 9127
vendor: 12,643 bytes, lines 9128-9446
9128/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js": 9129/*!*********************************************************************************!*\ 9130 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js ***! 9131 \*********************************************************************************/ 9132/*! no static exports found */ 9133/***/ (function(module, exports, __webpack_require__) { 9134 9135"use strict"; 9136 // ECMAScript 6 symbols shim 9137 9138function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 9139 9140var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 9141 9142var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js"); 9143 9144var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"); 9145 9146var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9147 9148var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 9149 9150var META = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").KEY; 9151 9152var $fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js"); 9153 9154var shared = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js"); 9155 9156var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js"); 9157 9158var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js"); 9159 9160var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js"); 9161 9162var wksExt = __webpack_require__(/*! ./_wks-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js"); 9163 9164var wksDefine = __webpack_require__(/*! ./_wks-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js"); 9165 9166var enumKeys = __webpack_require__(/*! ./_enum-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js"); 9167 9168var isArray = __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js"); 9169 9170var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 9171 9172var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 9173 9174var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 9175 9176var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 9177 9178var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js"); 9179 9180var _create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js"); 9181 9182var gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js"); 9183 9184var $GOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js"); 9185 9186var $DP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); 9187 9188var $keys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 9189 9190var gOPD = $GOPD.f; 9191var dP = $DP.f; 9192var gOPN = gOPNExt.f; 9193var $Symbol = global.Symbol; 9194var $JSON = global.JSON; 9195 9196var _stringify = $JSON && $JSON.stringify; 9197 9198var PROTOTYPE = 'prototype'; 9199var HIDDEN = wks('_hidden'); 9200var TO_PRIMITIVE = wks('toPrimitive'); 9201var isEnum = {}.propertyIsEnumerable; 9202var SymbolRegistry = shared('symbol-registry'); 9203var AllSymbols = shared('symbols'); 9204var OPSymbols = shared('op-symbols'); 9205var ObjectProto = Object[PROTOTYPE]; 9206var USE_NATIVE = typeof $Symbol == 'function'; 9207var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 9208 9209var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 9210 9211var setSymbolDesc = DESCRIPTORS && $fails(function () { 9212 return _create(dP({}, 'a', { 9213 get: function get() { 9214 return dP(this, 'a', { 9215 value: 7 9216 }).a; 9217 } 9218 })).a != 7; 9219}) ? function (it, key, D) { 9220 var protoDesc = gOPD(ObjectProto, key); 9221 if (protoDesc) delete ObjectProto[key]; 9222 dP(it, key, D); 9223 if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); 9224} : dP; 9225 9226var wrap = function wrap(tag) { 9227 var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); 9228 9229 sym._k = tag; 9230 return sym; 9231}; 9232 9233var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) { 9234 return _typeof(it) == 'symbol'; 9235} : function (it) { 9236 return it instanceof $Symbol; 9237}; 9238 9239var $defineProperty = function defineProperty(it, key, D) { 9240 if (it === ObjectProto) $defineProperty(OPSymbols, key, D); 9241 anObject(it); 9242 key = toPrimitive(key, true); 9243 anObject(D); 9244 9245 if (has(AllSymbols, key)) { 9246 if (!D.enumerable) { 9247 if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); 9248 it[HIDDEN][key] = true; 9249 } else { 9250 if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; 9251 D = _create(D, { 9252 enumerable: createDesc(0, false) 9253 }); 9254 } 9255 9256 return setSymbolDesc(it, key, D); 9257 } 9258 9259 return dP(it, key, D); 9260}; 9261 9262var $defineProperties = function defineProperties(it, P) { 9263 anObject(it); 9264 var keys = enumKeys(P = toIObject(P)); 9265 var i = 0; 9266 var l = keys.length; 9267 var key; 9268 9269 while (l > i) { 9270 $defineProperty(it, key = keys[i++], P[key]); 9271 } 9272 9273 return it; 9274}; 9275 9276var $create = function create(it, P) { 9277 return P === undefined ? _create(it) : $defineProperties(_create(it), P); 9278}; 9279 9280var $propertyIsEnumerable = function propertyIsEnumerable(key) { 9281 var E = isEnum.call(this, key = toPrimitive(key, true)); 9282 if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; 9283 return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; 9284}; 9285 9286var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { 9287 it = toIObject(it); 9288 key = toPrimitive(key, true); 9289 if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; 9290 var D = gOPD(it, key); 9291 if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; 9292 return D; 9293}; 9294 9295var $getOwnPropertyNames = function getOwnPropertyNames(it) { 9296 var names = gOPN(toIObject(it)); 9297 var result = []; 9298 var i = 0; 9299 var key; 9300 9301 while (names.length > i) { 9302 if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); 9303 } 9304 9305 return result; 9306}; 9307 9308var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { 9309 var IS_OP = it === ObjectProto; 9310 var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); 9311 var result = []; 9312 var i = 0; 9313 var key; 9314 9315 while (names.length > i) { 9316 if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); 9317 } 9318 9319 return result; 9320}; // 19.4.1.1 Symbol([description]) 9321 9322 9323if (!USE_NATIVE) { 9324 $Symbol = function _Symbol() { 9325 if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); 9326 var tag = uid(arguments.length > 0 ? arguments[0] : undefined); 9327 9328 var $set = function $set(value) { 9329 if (this === ObjectProto) $set.call(OPSymbols, value); 9330 if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; 9331 setSymbolDesc(this, tag, createDesc(1, value)); 9332 }; 9333 9334 if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { 9335 configurable: true, 9336 set: $set 9337 }); 9338 return wrap(tag); 9339 }; 9340 9341 redefine($Symbol[PROTOTYPE], 'toString', function toString() { 9342 return this._k; 9343 }); 9344 $GOPD.f = $getOwnPropertyDescriptor; 9345 $DP.f = $defineProperty; 9346 __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f = gOPNExt.f = $getOwnPropertyNames; 9347 __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js").f = $propertyIsEnumerable; 9348 __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js").f = $getOwnPropertySymbols; 9349 9350 if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js")) { 9351 redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); 9352 } 9353 9354 wksExt.f = function (name) { 9355 return wrap(wks(name)); 9356 }; 9357} 9358 9359$export($export.G + $export.W + $export.F * !USE_NATIVE, { 9360 Symbol: $Symbol 9361}); 9362 9363for (var es6Symbols = // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 9364'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) { 9365 wks(es6Symbols[j++]); 9366} 9367 9368for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) { 9369 wksDefine(wellKnownSymbols[k++]); 9370} 9371 9372$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { 9373 // 19.4.2.1 Symbol.for(key) 9374 'for': function _for(key) { 9375 return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key); 9376 }, 9377 // 19.4.2.5 Symbol.keyFor(sym) 9378 keyFor: function keyFor(sym) { 9379 if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); 9380 9381 for (var key in SymbolRegistry) { 9382 if (SymbolRegistry[key] === sym) return key; 9383 } 9384 }, 9385 useSetter: function useSetter() { 9386 setter = true; 9387 }, 9388 useSimple: function useSimple() { 9389 setter = false; 9390 } 9391}); 9392$export($export.S + $export.F * !USE_NATIVE, 'Object', { 9393 // 19.1.2.2 Object.create(O [, Properties]) 9394 create: $create, 9395 // 19.1.2.4 Object.defineProperty(O, P, Attributes) 9396 defineProperty: $defineProperty, 9397 // 19.1.2.3 Object.defineProperties(O, Properties) 9398 defineProperties: $defineProperties, 9399 // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) 9400 getOwnPropertyDescriptor: $getOwnPropertyDescriptor, 9401 // 19.1.2.7 Object.getOwnPropertyNames(O) 9402 getOwnPropertyNames: $getOwnPropertyNames, 9403 // 19.1.2.8 Object.getOwnPropertySymbols(O) 9404 getOwnPropertySymbols: $getOwnPropertySymbols 9405}); // 24.3.2 JSON.stringify(value [, replacer [, space]]) 9406 9407$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { 9408 var S = $Symbol(); // MS Edge converts symbol values to JSON as {} 9409 // WebKit converts symbol values to JSON as null 9410 // V8 throws on boxed symbols 9411 9412 return _stringify([S]) != '[null]' || _stringify({ 9413 a: S 9414 }) != '{}' || _stringify(Object(S)) != '{}'; 9415})), 'JSON', { 9416 stringify: function stringify(it) { 9417 var args = [it]; 9418 var i = 1; 9419 var replacer, $replacer; 9420 9421 while (arguments.length > i) { 9422 args.push(arguments[i++]); 9423 } 9424 9425 $replacer = replacer = args[1]; 9426 if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined 9427 9428 if (!isArray(replacer)) replacer = function replacer(key, value) { 9429 if (typeof $replacer == 'function') value = $replacer.call(this, key, value); 9430 if (!isSymbol(value)) return value; 9431 }; 9432 args[1] = replacer; 9433 return _stringify.apply($JSON, args); 9434 } 9435}); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) 9436 9437$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag] 9438 9439setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag] 9440 9441setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag] 9442 9443setToStringTag(global.JSON, 'JSON', true); 9444 9445/***/ }), 9446
vendor: 3,334 bytes, lines 9447-9516
9447/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js": 9448/*!*********************************************************************************************!*\ 9449 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js ***! 9450 \*********************************************************************************************/ 9451/*! no static exports found */ 9452/***/ (function(module, exports, __webpack_require__) { 9453 9454"use strict"; 9455 9456 9457var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9458 9459var $typed = __webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js"); 9460 9461var buffer = __webpack_require__(/*! ./_typed-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js"); 9462 9463var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 9464 9465var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js"); 9466 9467var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 9468 9469var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 9470 9471var ArrayBuffer = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").ArrayBuffer; 9472 9473var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js"); 9474 9475var $ArrayBuffer = buffer.ArrayBuffer; 9476var $DataView = buffer.DataView; 9477var $isView = $typed.ABV && ArrayBuffer.isView; 9478var $slice = $ArrayBuffer.prototype.slice; 9479var VIEW = $typed.VIEW; 9480var ARRAY_BUFFER = 'ArrayBuffer'; 9481$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { 9482 ArrayBuffer: $ArrayBuffer 9483}); 9484$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, { 9485 // 24.1.3.1 ArrayBuffer.isView(arg) 9486 isView: function isView(it) { 9487 return $isView && $isView(it) || isObject(it) && VIEW in it; 9488 } 9489}); 9490$export($export.P + $export.U + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () { 9491 return !new $ArrayBuffer(2).slice(1, undefined).byteLength; 9492}), ARRAY_BUFFER, { 9493 // 24.1.4.3 ArrayBuffer.prototype.slice(start, end) 9494 slice: function slice(start, end) { 9495 if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix 9496 9497 var len = anObject(this).byteLength; 9498 var first = toAbsoluteIndex(start, len); 9499 var fin = toAbsoluteIndex(end === undefined ? len : end, len); 9500 var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first)); 9501 var viewS = new $DataView(this); 9502 var viewT = new $DataView(result); 9503 var index = 0; 9504 9505 while (first < fin) { 9506 viewT.setUint8(index++, viewS.getUint8(first++)); 9507 } 9508 9509 return result; 9510 } 9511}); 9512 9513__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")(ARRAY_BUFFER); 9514 9515/***/ }), 9516
vendor: 915 bytes, lines 9517-9531
9517/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js": 9518/*!******************************************************************************************!*\ 9519 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js ***! 9520 \******************************************************************************************/ 9521/*! no static exports found */ 9522/***/ (function(module, exports, __webpack_require__) { 9523 9524var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9525 9526$export($export.G + $export.W + $export.F * !__webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js").ABV, { 9527 DataView: __webpack_require__(/*! ./_typed-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js").DataView 9528}); 9529 9530/***/ }), 9531
vendor: 765 bytes, lines 9532-9546
9532/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js": 9533/*!**********************************************************************************************!*\ 9534 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js ***! 9535 \**********************************************************************************************/ 9536/*! no static exports found */ 9537/***/ (function(module, exports, __webpack_require__) { 9538 9539__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Float32', 4, function (init) { 9540 return function Float32Array(data, byteOffset, length) { 9541 return init(this, data, byteOffset, length); 9542 }; 9543}); 9544 9545/***/ }), 9546
vendor: 765 bytes, lines 9547-9561
9547/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js": 9548/*!**********************************************************************************************!*\ 9549 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js ***! 9550 \**********************************************************************************************/ 9551/*! no static exports found */ 9552/***/ (function(module, exports, __webpack_require__) { 9553 9554__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Float64', 8, function (init) { 9555 return function Float64Array(data, byteOffset, length) { 9556 return init(this, data, byteOffset, length); 9557 }; 9558}); 9559 9560/***/ }), 9561
vendor: 753 bytes, lines 9562-9576
9562/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js": 9563/*!********************************************************************************************!*\ 9564 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js ***! 9565 \********************************************************************************************/ 9566/*! no static exports found */ 9567/***/ (function(module, exports, __webpack_require__) { 9568 9569__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Int16', 2, function (init) { 9570 return function Int16Array(data, byteOffset, length) { 9571 return init(this, data, byteOffset, length); 9572 }; 9573}); 9574 9575/***/ }), 9576
vendor: 753 bytes, lines 9577-9591
9577/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js": 9578/*!********************************************************************************************!*\ 9579 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js ***! 9580 \********************************************************************************************/ 9581/*! no static exports found */ 9582/***/ (function(module, exports, __webpack_require__) { 9583 9584__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Int32', 4, function (init) { 9585 return function Int32Array(data, byteOffset, length) { 9586 return init(this, data, byteOffset, length); 9587 }; 9588}); 9589 9590/***/ }), 9591
vendor: 747 bytes, lines 9592-9606
9592/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js": 9593/*!*******************************************************************************************!*\ 9594 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js ***! 9595 \*******************************************************************************************/ 9596/*! no static exports found */ 9597/***/ (function(module, exports, __webpack_require__) { 9598 9599__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Int8', 1, function (init) { 9600 return function Int8Array(data, byteOffset, length) { 9601 return init(this, data, byteOffset, length); 9602 }; 9603}); 9604 9605/***/ }), 9606
vendor: 759 bytes, lines 9607-9621
9607/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js": 9608/*!*********************************************************************************************!*\ 9609 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js ***! 9610 \*********************************************************************************************/ 9611/*! no static exports found */ 9612/***/ (function(module, exports, __webpack_require__) { 9613 9614__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint16', 2, function (init) { 9615 return function Uint16Array(data, byteOffset, length) { 9616 return init(this, data, byteOffset, length); 9617 }; 9618}); 9619 9620/***/ }), 9621
vendor: 759 bytes, lines 9622-9636
9622/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js": 9623/*!*********************************************************************************************!*\ 9624 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js ***! 9625 \*********************************************************************************************/ 9626/*! no static exports found */ 9627/***/ (function(module, exports, __webpack_require__) { 9628 9629__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint32', 4, function (init) { 9630 return function Uint32Array(data, byteOffset, length) { 9631 return init(this, data, byteOffset, length); 9632 }; 9633}); 9634 9635/***/ }), 9636
vendor: 753 bytes, lines 9637-9651
9637/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js": 9638/*!********************************************************************************************!*\ 9639 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js ***! 9640 \********************************************************************************************/ 9641/*! no static exports found */ 9642/***/ (function(module, exports, __webpack_require__) { 9643 9644__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint8', 1, function (init) { 9645 return function Uint8Array(data, byteOffset, length) { 9646 return init(this, data, byteOffset, length); 9647 }; 9648}); 9649 9650/***/ }), 9651
vendor: 798 bytes, lines 9652-9666
9652/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js": 9653/*!****************************************************************************************************!*\ 9654 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js ***! 9655 \****************************************************************************************************/ 9656/*! no static exports found */ 9657/***/ (function(module, exports, __webpack_require__) { 9658 9659__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint8', 1, function (init) { 9660 return function Uint8ClampedArray(data, byteOffset, length) { 9661 return init(this, data, byteOffset, length); 9662 }; 9663}, true); 9664 9665/***/ }), 9666
vendor: 3,433 bytes, lines 9667-9749
9667/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js": 9668/*!***********************************************************************************!*\ 9669 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js ***! 9670 \***********************************************************************************/ 9671/*! no static exports found */ 9672/***/ (function(module, exports, __webpack_require__) { 9673 9674"use strict"; 9675 9676 9677var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 9678 9679var each = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(0); 9680 9681var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 9682 9683var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js"); 9684 9685var assign = __webpack_require__(/*! ./_object-assign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js"); 9686 9687var weak = __webpack_require__(/*! ./_collection-weak */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js"); 9688 9689var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); 9690 9691var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 9692 9693var NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 9694 9695var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; 9696var WEAK_MAP = 'WeakMap'; 9697var getWeak = meta.getWeak; 9698var isExtensible = Object.isExtensible; 9699var uncaughtFrozenStore = weak.ufstore; 9700var InternalMap; 9701 9702var wrapper = function wrapper(get) { 9703 return function WeakMap() { 9704 return get(this, arguments.length > 0 ? arguments[0] : undefined); 9705 }; 9706}; 9707 9708var methods = { 9709 // 23.3.3.3 WeakMap.prototype.get(key) 9710 get: function get(key) { 9711 if (isObject(key)) { 9712 var data = getWeak(key); 9713 if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); 9714 return data ? data[this._i] : undefined; 9715 } 9716 }, 9717 // 23.3.3.5 WeakMap.prototype.set(key, value) 9718 set: function set(key, value) { 9719 return weak.def(validate(this, WEAK_MAP), key, value); 9720 } 9721}; // 23.3 WeakMap Objects 9722 9723var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); // IE11 WeakMap frozen keys fix 9724 9725 9726if (NATIVE_WEAK_MAP && IS_IE11) { 9727 InternalMap = weak.getConstructor(wrapper, WEAK_MAP); 9728 assign(InternalMap.prototype, methods); 9729 meta.NEED = true; 9730 each(['delete', 'has', 'get', 'set'], function (key) { 9731 var proto = $WeakMap.prototype; 9732 var method = proto[key]; 9733 redefine(proto, key, function (a, b) { 9734 // store frozen objects on internal weakmap shim 9735 if (isObject(a) && !isExtensible(a)) { 9736 if (!this._f) this._f = new InternalMap(); 9737 9738 var result = this._f[key](a, b); 9739 9740 return key == 'set' ? this : result; // store all the rest on native weakmap 9741 } 9742 9743 return method.call(this, a, b); 9744 }); 9745 }); 9746} 9747 9748/***/ }), 9749
vendor: 1,230 bytes, lines 9750-9778
9750/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js": 9751/*!***********************************************************************************!*\ 9752 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js ***! 9753 \***********************************************************************************/ 9754/*! no static exports found */ 9755/***/ (function(module, exports, __webpack_require__) { 9756 9757"use strict"; 9758 9759 9760var weak = __webpack_require__(/*! ./_collection-weak */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js"); 9761 9762var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js"); 9763 9764var WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects 9765 9766__webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(WEAK_SET, function (get) { 9767 return function WeakSet() { 9768 return get(this, arguments.length > 0 ? arguments[0] : undefined); 9769 }; 9770}, { 9771 // 23.4.3.1 WeakSet.prototype.add(value) 9772 add: function add(value) { 9773 return weak.def(validate(this, WEAK_SET), value, true); 9774 } 9775}, weak, false, true); 9776 9777/***/ }), 9778
vendor: 1,905 bytes, lines 9779-9818
9779/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js": 9780/*!*****************************************************************************************!*\ 9781 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js ***! 9782 \*****************************************************************************************/ 9783/*! no static exports found */ 9784/***/ (function(module, exports, __webpack_require__) { 9785 9786"use strict"; 9787 // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap 9788 9789var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9790 9791var flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js"); 9792 9793var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 9794 9795var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 9796 9797var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 9798 9799var arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js"); 9800 9801$export($export.P, 'Array', { 9802 flatMap: function flatMap(callbackfn 9803 /* , thisArg */ 9804 ) { 9805 var O = toObject(this); 9806 var sourceLen, A; 9807 aFunction(callbackfn); 9808 sourceLen = toLength(O.length); 9809 A = arraySpeciesCreate(O, 0); 9810 flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]); 9811 return A; 9812 } 9813}); 9814 9815__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('flatMap'); 9816 9817/***/ }), 9818
vendor: 1,906 bytes, lines 9819-9857
9819/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js": 9820/*!****************************************************************************************!*\ 9821 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js ***! 9822 \****************************************************************************************/ 9823/*! no static exports found */ 9824/***/ (function(module, exports, __webpack_require__) { 9825 9826"use strict"; 9827 // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten 9828 9829var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9830 9831var flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js"); 9832 9833var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 9834 9835var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 9836 9837var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js"); 9838 9839var arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js"); 9840 9841$export($export.P, 'Array', { 9842 flatten: function flatten() 9843 /* depthArg = 1 */ 9844 { 9845 var depthArg = arguments[0]; 9846 var O = toObject(this); 9847 var sourceLen = toLength(O.length); 9848 var A = arraySpeciesCreate(O, 0); 9849 flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg)); 9850 return A; 9851 } 9852}); 9853 9854__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('flatten'); 9855 9856/***/ }), 9857
vendor: 1,152 bytes, lines 9858-9883
9858/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js": 9859/*!*****************************************************************************************!*\ 9860 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js ***! 9861 \*****************************************************************************************/ 9862/*! no static exports found */ 9863/***/ (function(module, exports, __webpack_require__) { 9864 9865"use strict"; 9866 // https://github.com/tc39/Array.prototype.includes 9867 9868var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9869 9870var $includes = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js")(true); 9871 9872$export($export.P, 'Array', { 9873 includes: function includes(el 9874 /* , fromIndex = 0 */ 9875 ) { 9876 return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); 9877 } 9878}); 9879 9880__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('includes'); 9881 9882/***/ }), 9883
vendor: 1,239 bytes, lines 9884-9907
9884/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js": 9885/*!*******************************************************************************!*\ 9886 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js ***! 9887 \*******************************************************************************/ 9888/*! no static exports found */ 9889/***/ (function(module, exports, __webpack_require__) { 9890 9891// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask 9892var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9893 9894var microtask = __webpack_require__(/*! ./_microtask */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js")(); 9895 9896var process = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").process; 9897 9898var isNode = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js")(process) == 'process'; 9899$export($export.G, { 9900 asap: function asap(fn) { 9901 var domain = isNode && process.domain; 9902 microtask(domain ? domain.bind(fn) : fn); 9903 } 9904}); 9905 9906/***/ }), 9907
vendor: 870 bytes, lines 9908-9927
9908/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js": 9909/*!*****************************************************************************************!*\ 9910 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js ***! 9911 \*****************************************************************************************/ 9912/*! no static exports found */ 9913/***/ (function(module, exports, __webpack_require__) { 9914 9915// https://github.com/ljharb/proposal-is-error 9916var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9917 9918var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); 9919 9920$export($export.S, 'Error', { 9921 isError: function isError(it) { 9922 return cof(it) === 'Error'; 9923 } 9924}); 9925 9926/***/ }), 9927
vendor: 759 bytes, lines 9928-9943
9928/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js": 9929/*!*********************************************************************************!*\ 9930 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js ***! 9931 \*********************************************************************************/ 9932/*! no static exports found */ 9933/***/ (function(module, exports, __webpack_require__) { 9934 9935// https://github.com/tc39/proposal-global 9936var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9937 9938$export($export.G, { 9939 global: __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js") 9940}); 9941 9942/***/ }), 9943
vendor: 659 bytes, lines 9944-9955
9944/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js": 9945/*!***********************************************************************************!*\ 9946 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js ***! 9947 \***********************************************************************************/ 9948/*! no static exports found */ 9949/***/ (function(module, exports, __webpack_require__) { 9950 9951// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from 9952__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('Map'); 9953 9954/***/ }), 9955
vendor: 645 bytes, lines 9956-9967
9956/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js": 9957/*!*********************************************************************************!*\ 9958 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js ***! 9959 \*********************************************************************************/ 9960/*! no static exports found */ 9961/***/ (function(module, exports, __webpack_require__) { 9962 9963// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of 9964__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('Map'); 9965 9966/***/ }), 9967
vendor: 845 bytes, lines 9968-9983
9968/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js": 9969/*!**************************************************************************************!*\ 9970 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js ***! 9971 \**************************************************************************************/ 9972/*! no static exports found */ 9973/***/ (function(module, exports, __webpack_require__) { 9974 9975// https://github.com/DavidBruant/Map-Set.prototype.toJSON 9976var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9977 9978$export($export.P + $export.R, 'Map', { 9979 toJSON: __webpack_require__(/*! ./_collection-to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js")('Map') 9980}); 9981 9982/***/ }), 9983
vendor: 770 bytes, lines 9984-10001
9984/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js": 9985/*!*************************************************************************************!*\ 9986 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js ***! 9987 \*************************************************************************************/ 9988/*! no static exports found */ 9989/***/ (function(module, exports, __webpack_require__) { 9990 9991// https://rwaldron.github.io/proposal-math-extensions/ 9992var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 9993 9994$export($export.S, 'Math', { 9995 clamp: function clamp(x, lower, upper) { 9996 return Math.min(upper, Math.max(lower, x)); 9997 } 9998}); 9999 10000/***/ }), 10001
vendor: 728 bytes, lines 10002-10017
10002/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js": 10003/*!*******************************************************************************************!*\ 10004 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js ***! 10005 \*******************************************************************************************/ 10006/*! no static exports found */ 10007/***/ (function(module, exports, __webpack_require__) { 10008 10009// https://rwaldron.github.io/proposal-math-extensions/ 10010var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10011 10012$export($export.S, 'Math', { 10013 DEG_PER_RAD: Math.PI / 180 10014}); 10015 10016/***/ }), 10017
vendor: 793 bytes, lines 10018-10036
10018/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js": 10019/*!***************************************************************************************!*\ 10020 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js ***! 10021 \***************************************************************************************/ 10022/*! no static exports found */ 10023/***/ (function(module, exports, __webpack_require__) { 10024 10025// https://rwaldron.github.io/proposal-math-extensions/ 10026var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10027 10028var RAD_PER_DEG = 180 / Math.PI; 10029$export($export.S, 'Math', { 10030 degrees: function degrees(radians) { 10031 return radians * RAD_PER_DEG; 10032 } 10033}); 10034 10035/***/ }), 10036
vendor: 1,076 bytes, lines 10037-10058
10037/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js": 10038/*!**************************************************************************************!*\ 10039 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js ***! 10040 \**************************************************************************************/ 10041/*! no static exports found */ 10042/***/ (function(module, exports, __webpack_require__) { 10043 10044// https://rwaldron.github.io/proposal-math-extensions/ 10045var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10046 10047var scale = __webpack_require__(/*! ./_math-scale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js"); 10048 10049var fround = __webpack_require__(/*! ./_math-fround */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js"); 10050 10051$export($export.S, 'Math', { 10052 fscale: function fscale(x, inLow, inHigh, outLow, outHigh) { 10053 return fround(scale(x, inLow, inHigh, outLow, outHigh)); 10054 } 10055}); 10056 10057/***/ }), 10058
vendor: 888 bytes, lines 10059-10079
10059/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js": 10060/*!*************************************************************************************!*\ 10061 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js ***! 10062 \*************************************************************************************/ 10063/*! no static exports found */ 10064/***/ (function(module, exports, __webpack_require__) { 10065 10066// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 10067var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10068 10069$export($export.S, 'Math', { 10070 iaddh: function iaddh(x0, x1, y0, y1) { 10071 var $x0 = x0 >>> 0; 10072 var $x1 = x1 >>> 0; 10073 var $y0 = y0 >>> 0; 10074 return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0; 10075 } 10076}); 10077 10078/***/ }), 10079
vendor: 993 bytes, lines 10080-10105
10080/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js": 10081/*!*************************************************************************************!*\ 10082 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js ***! 10083 \*************************************************************************************/ 10084/*! no static exports found */ 10085/***/ (function(module, exports, __webpack_require__) { 10086 10087// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 10088var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10089 10090$export($export.S, 'Math', { 10091 imulh: function imulh(u, v) { 10092 var UINT16 = 0xffff; 10093 var $u = +u; 10094 var $v = +v; 10095 var u0 = $u & UINT16; 10096 var v0 = $v & UINT16; 10097 var u1 = $u >> 16; 10098 var v1 = $v >> 16; 10099 var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16); 10100 return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16); 10101 } 10102}); 10103 10104/***/ }), 10105
vendor: 887 bytes, lines 10106-10126
10106/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js": 10107/*!*************************************************************************************!*\ 10108 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js ***! 10109 \*************************************************************************************/ 10110/*! no static exports found */ 10111/***/ (function(module, exports, __webpack_require__) { 10112 10113// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 10114var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10115 10116$export($export.S, 'Math', { 10117 isubh: function isubh(x0, x1, y0, y1) { 10118 var $x0 = x0 >>> 0; 10119 var $x1 = x1 >>> 0; 10120 var $y0 = y0 >>> 0; 10121 return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0; 10122 } 10123}); 10124 10125/***/ }), 10126
vendor: 728 bytes, lines 10127-10142
10127/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js": 10128/*!*******************************************************************************************!*\ 10129 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js ***! 10130 \*******************************************************************************************/ 10131/*! no static exports found */ 10132/***/ (function(module, exports, __webpack_require__) { 10133 10134// https://rwaldron.github.io/proposal-math-extensions/ 10135var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10136 10137$export($export.S, 'Math', { 10138 RAD_PER_DEG: 180 / Math.PI 10139}); 10140 10141/***/ }), 10142
vendor: 793 bytes, lines 10143-10161
10143/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js": 10144/*!***************************************************************************************!*\ 10145 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js ***! 10146 \***************************************************************************************/ 10147/*! no static exports found */ 10148/***/ (function(module, exports, __webpack_require__) { 10149 10150// https://rwaldron.github.io/proposal-math-extensions/ 10151var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10152 10153var DEG_PER_RAD = Math.PI / 180; 10154$export($export.S, 'Math', { 10155 radians: function radians(degrees) { 10156 return degrees * DEG_PER_RAD; 10157 } 10158}); 10159 10160/***/ }), 10161
vendor: 803 bytes, lines 10162-10177
10162/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js": 10163/*!*************************************************************************************!*\ 10164 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js ***! 10165 \*************************************************************************************/ 10166/*! no static exports found */ 10167/***/ (function(module, exports, __webpack_require__) { 10168 10169// https://rwaldron.github.io/proposal-math-extensions/ 10170var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10171 10172$export($export.S, 'Math', { 10173 scale: __webpack_require__(/*! ./_math-scale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js") 10174}); 10175 10176/***/ }), 10177
vendor: 834 bytes, lines 10178-10196
10178/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js": 10179/*!***************************************************************************************!*\ 10180 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js ***! 10181 \***************************************************************************************/ 10182/*! no static exports found */ 10183/***/ (function(module, exports, __webpack_require__) { 10184 10185// http://jfbastien.github.io/papers/Math.signbit.html 10186var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10187 10188$export($export.S, 'Math', { 10189 signbit: function signbit(x) { 10190 // eslint-disable-next-line no-self-compare 10191 return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0; 10192 } 10193}); 10194 10195/***/ }), 10196
vendor: 997 bytes, lines 10197-10222
10197/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js": 10198/*!*************************************************************************************!*\ 10199 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js ***! 10200 \*************************************************************************************/ 10201/*! no static exports found */ 10202/***/ (function(module, exports, __webpack_require__) { 10203 10204// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 10205var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10206 10207$export($export.S, 'Math', { 10208 umulh: function umulh(u, v) { 10209 var UINT16 = 0xffff; 10210 var $u = +u; 10211 var $v = +v; 10212 var u0 = $u & UINT16; 10213 var v0 = $v & UINT16; 10214 var u1 = $u >>> 16; 10215 var v1 = $v >>> 16; 10216 var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16); 10217 return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16); 10218 } 10219}); 10220 10221/***/ }), 10222
vendor: 1,598 bytes, lines 10223-10253
10223/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js": 10224/*!***********************************************************************************************!*\ 10225 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js ***! 10226 \***********************************************************************************************/ 10227/*! no static exports found */ 10228/***/ (function(module, exports, __webpack_require__) { 10229 10230"use strict"; 10231 10232 10233var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10234 10235var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 10236 10237var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 10238 10239var $defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); // B.2.2.2 Object.prototype.__defineGetter__(P, getter) 10240 10241 10242__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { 10243 __defineGetter__: function __defineGetter__(P, getter) { 10244 $defineProperty.f(toObject(this), P, { 10245 get: aFunction(getter), 10246 enumerable: true, 10247 configurable: true 10248 }); 10249 } 10250}); 10251 10252/***/ }), 10253
vendor: 1,598 bytes, lines 10254-10284
10254/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js": 10255/*!***********************************************************************************************!*\ 10256 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js ***! 10257 \***********************************************************************************************/ 10258/*! no static exports found */ 10259/***/ (function(module, exports, __webpack_require__) { 10260 10261"use strict"; 10262 10263 10264var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10265 10266var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 10267 10268var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 10269 10270var $defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); // B.2.2.3 Object.prototype.__defineSetter__(P, setter) 10271 10272 10273__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { 10274 __defineSetter__: function __defineSetter__(P, setter) { 10275 $defineProperty.f(toObject(this), P, { 10276 set: aFunction(setter), 10277 enumerable: true, 10278 configurable: true 10279 }); 10280 } 10281}); 10282 10283/***/ }), 10284
vendor: 910 bytes, lines 10285-10304
10285/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js": 10286/*!*****************************************************************************************!*\ 10287 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js ***! 10288 \*****************************************************************************************/ 10289/*! no static exports found */ 10290/***/ (function(module, exports, __webpack_require__) { 10291 10292// https://github.com/tc39/proposal-object-values-entries 10293var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10294 10295var $entries = __webpack_require__(/*! ./_object-to-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js")(true); 10296 10297$export($export.S, 'Object', { 10298 entries: function entries(it) { 10299 return $entries(it); 10300 } 10301}); 10302 10303/***/ }), 10304
vendor: 1,725 bytes, lines 10305-10342
10305/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js": 10306/*!**************************************************************************************************************!*\ 10307 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js ***! 10308 \**************************************************************************************************************/ 10309/*! no static exports found */ 10310/***/ (function(module, exports, __webpack_require__) { 10311 10312// https://github.com/tc39/proposal-object-getownpropertydescriptors 10313var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10314 10315var ownKeys = __webpack_require__(/*! ./_own-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js"); 10316 10317var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); 10318 10319var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js"); 10320 10321var createProperty = __webpack_require__(/*! ./_create-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js"); 10322 10323$export($export.S, 'Object', { 10324 getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) { 10325 var O = toIObject(object); 10326 var getDesc = gOPD.f; 10327 var keys = ownKeys(O); 10328 var result = {}; 10329 var i = 0; 10330 var key, desc; 10331 10332 while (keys.length > i) { 10333 desc = getDesc(O, key = keys[i++]); 10334 if (desc !== undefined) createProperty(result, key, desc); 10335 } 10336 10337 return result; 10338 } 10339}); 10340 10341/***/ }), 10342
vendor: 1,795 bytes, lines 10343-10377
10343/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js": 10344/*!***********************************************************************************************!*\ 10345 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js ***! 10346 \***********************************************************************************************/ 10347/*! no static exports found */ 10348/***/ (function(module, exports, __webpack_require__) { 10349 10350"use strict"; 10351 10352 10353var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10354 10355var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 10356 10357var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 10358 10359var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 10360 10361var getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; // B.2.2.4 Object.prototype.__lookupGetter__(P) 10362 10363 10364__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { 10365 __lookupGetter__: function __lookupGetter__(P) { 10366 var O = toObject(this); 10367 var K = toPrimitive(P, true); 10368 var D; 10369 10370 do { 10371 if (D = getOwnPropertyDescriptor(O, K)) return D.get; 10372 } while (O = getPrototypeOf(O)); 10373 } 10374}); 10375 10376/***/ }), 10377
vendor: 1,795 bytes, lines 10378-10412
10378/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js": 10379/*!***********************************************************************************************!*\ 10380 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js ***! 10381 \***********************************************************************************************/ 10382/*! no static exports found */ 10383/***/ (function(module, exports, __webpack_require__) { 10384 10385"use strict"; 10386 10387 10388var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10389 10390var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js"); 10391 10392var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); 10393 10394var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 10395 10396var getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; // B.2.2.5 Object.prototype.__lookupSetter__(P) 10397 10398 10399__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { 10400 __lookupSetter__: function __lookupSetter__(P) { 10401 var O = toObject(this); 10402 var K = toPrimitive(P, true); 10403 var D; 10404 10405 do { 10406 if (D = getOwnPropertyDescriptor(O, K)) return D.set; 10407 } while (O = getPrototypeOf(O)); 10408 } 10409}); 10410 10411/***/ }), 10412
vendor: 903 bytes, lines 10413-10432
10413/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js": 10414/*!****************************************************************************************!*\ 10415 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js ***! 10416 \****************************************************************************************/ 10417/*! no static exports found */ 10418/***/ (function(module, exports, __webpack_require__) { 10419 10420// https://github.com/tc39/proposal-object-values-entries 10421var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10422 10423var $values = __webpack_require__(/*! ./_object-to-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js")(false); 10424 10425$export($export.S, 'Object', { 10426 values: function values(it) { 10427 return $values(it); 10428 } 10429}); 10430 10431/***/ }), 10432
vendor: 7,298 bytes, lines 10433-10684
10433/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js": 10434/*!*************************************************************************************!*\ 10435 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js ***! 10436 \*************************************************************************************/ 10437/*! no static exports found */ 10438/***/ (function(module, exports, __webpack_require__) { 10439 10440"use strict"; 10441 // https://github.com/zenparsing/es-observable 10442 10443var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10444 10445var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 10446 10447var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 10448 10449var microtask = __webpack_require__(/*! ./_microtask */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js")(); 10450 10451var OBSERVABLE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('observable'); 10452 10453var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 10454 10455var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10456 10457var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js"); 10458 10459var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js"); 10460 10461var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 10462 10463var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js"); 10464 10465var RETURN = forOf.RETURN; 10466 10467var getMethod = function getMethod(fn) { 10468 return fn == null ? undefined : aFunction(fn); 10469}; 10470 10471var cleanupSubscription = function cleanupSubscription(subscription) { 10472 var cleanup = subscription._c; 10473 10474 if (cleanup) { 10475 subscription._c = undefined; 10476 cleanup(); 10477 } 10478}; 10479 10480var subscriptionClosed = function subscriptionClosed(subscription) { 10481 return subscription._o === undefined; 10482}; 10483 10484var closeSubscription = function closeSubscription(subscription) { 10485 if (!subscriptionClosed(subscription)) { 10486 subscription._o = undefined; 10487 cleanupSubscription(subscription); 10488 } 10489}; 10490 10491var Subscription = function Subscription(observer, subscriber) { 10492 anObject(observer); 10493 this._c = undefined; 10494 this._o = observer; 10495 observer = new SubscriptionObserver(this); 10496 10497 try { 10498 var cleanup = subscriber(observer); 10499 var subscription = cleanup; 10500 10501 if (cleanup != null) { 10502 if (typeof cleanup.unsubscribe === 'function') cleanup = function cleanup() { 10503 subscription.unsubscribe(); 10504 };else aFunction(cleanup); 10505 this._c = cleanup; 10506 } 10507 } catch (e) { 10508 observer.error(e); 10509 return; 10510 } 10511 10512 if (subscriptionClosed(this)) cleanupSubscription(this); 10513}; 10514 10515Subscription.prototype = redefineAll({}, { 10516 unsubscribe: function unsubscribe() { 10517 closeSubscription(this); 10518 } 10519}); 10520 10521var SubscriptionObserver = function SubscriptionObserver(subscription) { 10522 this._s = subscription; 10523}; 10524 10525SubscriptionObserver.prototype = redefineAll({}, { 10526 next: function next(value) { 10527 var subscription = this._s; 10528 10529 if (!subscriptionClosed(subscription)) { 10530 var observer = subscription._o; 10531 10532 try { 10533 var m = getMethod(observer.next); 10534 if (m) return m.call(observer, value); 10535 } catch (e) { 10536 try { 10537 closeSubscription(subscription); 10538 } finally { 10539 throw e; 10540 } 10541 } 10542 } 10543 }, 10544 error: function error(value) { 10545 var subscription = this._s; 10546 if (subscriptionClosed(subscription)) throw value; 10547 var observer = subscription._o; 10548 subscription._o = undefined; 10549 10550 try { 10551 var m = getMethod(observer.error); 10552 if (!m) throw value; 10553 value = m.call(observer, value); 10554 } catch (e) { 10555 try { 10556 cleanupSubscription(subscription); 10557 } finally { 10558 throw e; 10559 } 10560 } 10561 10562 cleanupSubscription(subscription); 10563 return value; 10564 }, 10565 complete: function complete(value) { 10566 var subscription = this._s; 10567 10568 if (!subscriptionClosed(subscription)) { 10569 var observer = subscription._o; 10570 subscription._o = undefined; 10571 10572 try { 10573 var m = getMethod(observer.complete); 10574 value = m ? m.call(observer, value) : undefined; 10575 } catch (e) { 10576 try { 10577 cleanupSubscription(subscription); 10578 } finally { 10579 throw e; 10580 } 10581 } 10582 10583 cleanupSubscription(subscription); 10584 return value; 10585 } 10586 } 10587}); 10588 10589var $Observable = function Observable(subscriber) { 10590 anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber); 10591}; 10592 10593redefineAll($Observable.prototype, { 10594 subscribe: function subscribe(observer) { 10595 return new Subscription(observer, this._f); 10596 }, 10597 forEach: function forEach(fn) { 10598 var that = this; 10599 return new (core.Promise || global.Promise)(function (resolve, reject) { 10600 aFunction(fn); 10601 var subscription = that.subscribe({ 10602 next: function next(value) { 10603 try { 10604 return fn(value); 10605 } catch (e) { 10606 reject(e); 10607 subscription.unsubscribe(); 10608 } 10609 }, 10610 error: reject, 10611 complete: resolve 10612 }); 10613 }); 10614 } 10615}); 10616redefineAll($Observable, { 10617 from: function from(x) { 10618 var C = typeof this === 'function' ? this : $Observable; 10619 var method = getMethod(anObject(x)[OBSERVABLE]); 10620 10621 if (method) { 10622 var observable = anObject(method.call(x)); 10623 return observable.constructor === C ? observable : new C(function (observer) { 10624 return observable.subscribe(observer); 10625 }); 10626 } 10627 10628 return new C(function (observer) { 10629 var done = false; 10630 microtask(function () { 10631 if (!done) { 10632 try { 10633 if (forOf(x, false, function (it) { 10634 observer.next(it); 10635 if (done) return RETURN; 10636 }) === RETURN) return; 10637 } catch (e) { 10638 if (done) throw e; 10639 observer.error(e); 10640 return; 10641 } 10642 10643 observer.complete(); 10644 } 10645 }); 10646 return function () { 10647 done = true; 10648 }; 10649 }); 10650 }, 10651 of: function of() { 10652 for (var i = 0, l = arguments.length, items = new Array(l); i < l;) { 10653 items[i] = arguments[i++]; 10654 } 10655 10656 return new (typeof this === 'function' ? this : $Observable)(function (observer) { 10657 var done = false; 10658 microtask(function () { 10659 if (!done) { 10660 for (var j = 0; j < items.length; ++j) { 10661 observer.next(items[j]); 10662 if (done) return; 10663 } 10664 10665 observer.complete(); 10666 } 10667 }); 10668 return function () { 10669 done = true; 10670 }; 10671 }); 10672 } 10673}); 10674hide($Observable.prototype, OBSERVABLE, function () { 10675 return this; 10676}); 10677$export($export.G, { 10678 Observable: $Observable 10679}); 10680 10681__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")('Observable'); 10682 10683/***/ }), 10684
vendor: 1,752 bytes, lines 10685-10723
10685/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js": 10686/*!******************************************************************************************!*\ 10687 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js ***! 10688 \******************************************************************************************/ 10689/*! no static exports found */ 10690/***/ (function(module, exports, __webpack_require__) { 10691 10692"use strict"; 10693// https://github.com/tc39/proposal-promise-finally 10694 10695 10696var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10697 10698var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 10699 10700var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 10701 10702var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js"); 10703 10704var promiseResolve = __webpack_require__(/*! ./_promise-resolve */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js"); 10705 10706$export($export.P + $export.R, 'Promise', { 10707 'finally': function _finally(onFinally) { 10708 var C = speciesConstructor(this, core.Promise || global.Promise); 10709 var isFunction = typeof onFinally == 'function'; 10710 return this.then(isFunction ? function (x) { 10711 return promiseResolve(C, onFinally()).then(function () { 10712 return x; 10713 }); 10714 } : onFinally, isFunction ? function (e) { 10715 return promiseResolve(C, onFinally()).then(function () { 10716 throw e; 10717 }); 10718 } : onFinally); 10719 } 10720}); 10721 10722/***/ }), 10723
vendor: 1,247 bytes, lines 10724-10750
10724/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js": 10725/*!**************************************************************************************!*\ 10726 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js ***! 10727 \**************************************************************************************/ 10728/*! no static exports found */ 10729/***/ (function(module, exports, __webpack_require__) { 10730 10731"use strict"; 10732 // https://github.com/tc39/proposal-promise-try 10733 10734var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 10735 10736var newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js"); 10737 10738var perform = __webpack_require__(/*! ./_perform */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js"); 10739 10740$export($export.S, 'Promise', { 10741 'try': function _try(callbackfn) { 10742 var promiseCapability = newPromiseCapability.f(this); 10743 var result = perform(callbackfn); 10744 (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); 10745 return promiseCapability.promise; 10746 } 10747}); 10748 10749/***/ }), 10750
vendor: 1,066 bytes, lines 10751-10771
10751/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js": 10752/*!**************************************************************************************************!*\ 10753 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js ***! 10754 \**************************************************************************************************/ 10755/*! no static exports found */ 10756/***/ (function(module, exports, __webpack_require__) { 10757 10758var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10759 10760var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10761 10762var toMetaKey = metadata.key; 10763var ordinaryDefineOwnMetadata = metadata.set; 10764metadata.exp({ 10765 defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) { 10766 ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey)); 10767 } 10768}); 10769 10770/***/ }), 10771
vendor: 1,424 bytes, lines 10772-10801
10772/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js": 10773/*!**************************************************************************************************!*\ 10774 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js ***! 10775 \**************************************************************************************************/ 10776/*! no static exports found */ 10777/***/ (function(module, exports, __webpack_require__) { 10778 10779var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10780 10781var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10782 10783var toMetaKey = metadata.key; 10784var getOrCreateMetadataMap = metadata.map; 10785var store = metadata.store; 10786metadata.exp({ 10787 deleteMetadata: function deleteMetadata(metadataKey, target 10788 /* , targetKey */ 10789 ) { 10790 var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]); 10791 var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false); 10792 if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false; 10793 if (metadataMap.size) return true; 10794 var targetMetadata = store.get(target); 10795 targetMetadata['delete'](targetKey); 10796 return !!targetMetadata.size || store['delete'](target); 10797 } 10798}); 10799 10800/***/ }), 10801
vendor: 1,810 bytes, lines 10802-10839
10802/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js": 10803/*!****************************************************************************************************!*\ 10804 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js ***! 10805 \****************************************************************************************************/ 10806/*! no static exports found */ 10807/***/ (function(module, exports, __webpack_require__) { 10808 10809var Set = __webpack_require__(/*! ./es6.set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js"); 10810 10811var from = __webpack_require__(/*! ./_array-from-iterable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js"); 10812 10813var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10814 10815var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10816 10817var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 10818 10819var ordinaryOwnMetadataKeys = metadata.keys; 10820var toMetaKey = metadata.key; 10821 10822var ordinaryMetadataKeys = function ordinaryMetadataKeys(O, P) { 10823 var oKeys = ordinaryOwnMetadataKeys(O, P); 10824 var parent = getPrototypeOf(O); 10825 if (parent === null) return oKeys; 10826 var pKeys = ordinaryMetadataKeys(parent, P); 10827 return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys; 10828}; 10829 10830metadata.exp({ 10831 getMetadataKeys: function getMetadataKeys(target 10832 /* , targetKey */ 10833 ) { 10834 return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1])); 10835 } 10836}); 10837 10838/***/ }), 10839
vendor: 1,572 bytes, lines 10840-10873
10840/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js": 10841/*!***********************************************************************************************!*\ 10842 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js ***! 10843 \***********************************************************************************************/ 10844/*! no static exports found */ 10845/***/ (function(module, exports, __webpack_require__) { 10846 10847var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10848 10849var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10850 10851var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 10852 10853var ordinaryHasOwnMetadata = metadata.has; 10854var ordinaryGetOwnMetadata = metadata.get; 10855var toMetaKey = metadata.key; 10856 10857var ordinaryGetMetadata = function ordinaryGetMetadata(MetadataKey, O, P) { 10858 var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); 10859 if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P); 10860 var parent = getPrototypeOf(O); 10861 return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined; 10862}; 10863 10864metadata.exp({ 10865 getMetadata: function getMetadata(metadataKey, target 10866 /* , targetKey */ 10867 ) { 10868 return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); 10869 } 10870}); 10871 10872/***/ }), 10873
vendor: 1,096 bytes, lines 10874-10896
10874/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js": 10875/*!********************************************************************************************************!*\ 10876 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js ***! 10877 \********************************************************************************************************/ 10878/*! no static exports found */ 10879/***/ (function(module, exports, __webpack_require__) { 10880 10881var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10882 10883var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10884 10885var ordinaryOwnMetadataKeys = metadata.keys; 10886var toMetaKey = metadata.key; 10887metadata.exp({ 10888 getOwnMetadataKeys: function getOwnMetadataKeys(target 10889 /* , targetKey */ 10890 ) { 10891 return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1])); 10892 } 10893}); 10894 10895/***/ }), 10896
vendor: 1,091 bytes, lines 10897-10919
10897/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js": 10898/*!***************************************************************************************************!*\ 10899 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js ***! 10900 \***************************************************************************************************/ 10901/*! no static exports found */ 10902/***/ (function(module, exports, __webpack_require__) { 10903 10904var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10905 10906var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10907 10908var ordinaryGetOwnMetadata = metadata.get; 10909var toMetaKey = metadata.key; 10910metadata.exp({ 10911 getOwnMetadata: function getOwnMetadata(metadataKey, target 10912 /* , targetKey */ 10913 ) { 10914 return ordinaryGetOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); 10915 } 10916}); 10917 10918/***/ }), 10919
vendor: 1,488 bytes, lines 10920-10952
10920/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js": 10921/*!***********************************************************************************************!*\ 10922 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js ***! 10923 \***********************************************************************************************/ 10924/*! no static exports found */ 10925/***/ (function(module, exports, __webpack_require__) { 10926 10927var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10928 10929var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10930 10931var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js"); 10932 10933var ordinaryHasOwnMetadata = metadata.has; 10934var toMetaKey = metadata.key; 10935 10936var ordinaryHasMetadata = function ordinaryHasMetadata(MetadataKey, O, P) { 10937 var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); 10938 if (hasOwn) return true; 10939 var parent = getPrototypeOf(O); 10940 return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false; 10941}; 10942 10943metadata.exp({ 10944 hasMetadata: function hasMetadata(metadataKey, target 10945 /* , targetKey */ 10946 ) { 10947 return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); 10948 } 10949}); 10950 10951/***/ }), 10952
vendor: 1,091 bytes, lines 10953-10975
10953/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js": 10954/*!***************************************************************************************************!*\ 10955 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js ***! 10956 \***************************************************************************************************/ 10957/*! no static exports found */ 10958/***/ (function(module, exports, __webpack_require__) { 10959 10960var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10961 10962var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10963 10964var ordinaryHasOwnMetadata = metadata.has; 10965var toMetaKey = metadata.key; 10966metadata.exp({ 10967 hasOwnMetadata: function hasOwnMetadata(metadataKey, target 10968 /* , targetKey */ 10969 ) { 10970 return ordinaryHasOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); 10971 } 10972}); 10973 10974/***/ }), 10975
vendor: 1,248 bytes, lines 10976-11000
10976/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js": 10977/*!*******************************************************************************************!*\ 10978 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js ***! 10979 \*******************************************************************************************/ 10980/*! no static exports found */ 10981/***/ (function(module, exports, __webpack_require__) { 10982 10983var $metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js"); 10984 10985var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js"); 10986 10987var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js"); 10988 10989var toMetaKey = $metadata.key; 10990var ordinaryDefineOwnMetadata = $metadata.set; 10991$metadata.exp({ 10992 metadata: function metadata(metadataKey, metadataValue) { 10993 return function decorator(target, targetKey) { 10994 ordinaryDefineOwnMetadata(metadataKey, metadataValue, (targetKey !== undefined ? anObject : aFunction)(target), toMetaKey(targetKey)); 10995 }; 10996 } 10997}); 10998 10999/***/ }), 11000
vendor: 659 bytes, lines 11001-11012
11001/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js": 11002/*!***********************************************************************************!*\ 11003 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js ***! 11004 \***********************************************************************************/ 11005/*! no static exports found */ 11006/***/ (function(module, exports, __webpack_require__) { 11007 11008// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from 11009__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('Set'); 11010 11011/***/ }), 11012
vendor: 645 bytes, lines 11013-11024
11013/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js": 11014/*!*********************************************************************************!*\ 11015 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js ***! 11016 \*********************************************************************************/ 11017/*! no static exports found */ 11018/***/ (function(module, exports, __webpack_require__) { 11019 11020// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of 11021__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('Set'); 11022 11023/***/ }), 11024
vendor: 845 bytes, lines 11025-11040
11025/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js": 11026/*!**************************************************************************************!*\ 11027 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js ***! 11028 \**************************************************************************************/ 11029/*! no static exports found */ 11030/***/ (function(module, exports, __webpack_require__) { 11031 11032// https://github.com/DavidBruant/Map-Set.prototype.toJSON 11033var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11034 11035$export($export.P + $export.R, 'Set', { 11036 toJSON: __webpack_require__(/*! ./_collection-to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js")('Set') 11037}); 11038 11039/***/ }), 11040
vendor: 880 bytes, lines 11041-11062
11041/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js": 11042/*!************************************************************************************!*\ 11043 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js ***! 11044 \************************************************************************************/ 11045/*! no static exports found */ 11046/***/ (function(module, exports, __webpack_require__) { 11047 11048"use strict"; 11049 // https://github.com/mathiasbynens/String.prototype.at 11050 11051var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11052 11053var $at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(true); 11054 11055$export($export.P, 'String', { 11056 at: function at(pos) { 11057 return $at(this, pos); 11058 } 11059}); 11060 11061/***/ }), 11062
vendor: 2,101 bytes, lines 11063-11112
11063/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js": 11064/*!*******************************************************************************************!*\ 11065 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js ***! 11066 \*******************************************************************************************/ 11067/*! no static exports found */ 11068/***/ (function(module, exports, __webpack_require__) { 11069 11070"use strict"; 11071 // https://tc39.github.io/String.prototype.matchAll/ 11072 11073var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11074 11075var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); 11076 11077var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js"); 11078 11079var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js"); 11080 11081var getFlags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js"); 11082 11083var RegExpProto = RegExp.prototype; 11084 11085var $RegExpStringIterator = function $RegExpStringIterator(regexp, string) { 11086 this._r = regexp; 11087 this._s = string; 11088}; 11089 11090__webpack_require__(/*! ./_iter-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js")($RegExpStringIterator, 'RegExp String', function next() { 11091 var match = this._r.exec(this._s); 11092 11093 return { 11094 value: match, 11095 done: match === null 11096 }; 11097}); 11098 11099$export($export.P, 'String', { 11100 matchAll: function matchAll(regexp) { 11101 defined(this); 11102 if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!'); 11103 var S = String(this); 11104 var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp); 11105 var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags); 11106 rx.lastIndex = toLength(regexp.lastIndex); 11107 return new $RegExpStringIterator(rx, S); 11108 } 11109}); 11110 11111/***/ }), 11112
vendor: 1,303 bytes, lines 11113-11140
11113/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js": 11114/*!*****************************************************************************************!*\ 11115 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js ***! 11116 \*****************************************************************************************/ 11117/*! no static exports found */ 11118/***/ (function(module, exports, __webpack_require__) { 11119 11120"use strict"; 11121 // https://github.com/tc39/proposal-string-pad-start-end 11122 11123var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11124 11125var $pad = __webpack_require__(/*! ./_string-pad */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js"); 11126 11127var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js"); // https://github.com/zloirock/core-js/issues/280 11128 11129 11130var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); 11131$export($export.P + $export.F * WEBKIT_BUG, 'String', { 11132 padEnd: function padEnd(maxLength 11133 /* , fillString = ' ' */ 11134 ) { 11135 return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false); 11136 } 11137}); 11138 11139/***/ }), 11140
vendor: 1,314 bytes, lines 11141-11168
11141/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js": 11142/*!*******************************************************************************************!*\ 11143 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js ***! 11144 \*******************************************************************************************/ 11145/*! no static exports found */ 11146/***/ (function(module, exports, __webpack_require__) { 11147 11148"use strict"; 11149 // https://github.com/tc39/proposal-string-pad-start-end 11150 11151var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11152 11153var $pad = __webpack_require__(/*! ./_string-pad */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js"); 11154 11155var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js"); // https://github.com/zloirock/core-js/issues/280 11156 11157 11158var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); 11159$export($export.P + $export.F * WEBKIT_BUG, 'String', { 11160 padStart: function padStart(maxLength 11161 /* , fillString = ' ' */ 11162 ) { 11163 return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true); 11164 } 11165}); 11166 11167/***/ }), 11168
vendor: 799 bytes, lines 11169-11186
11169/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js": 11170/*!*******************************************************************************************!*\ 11171 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js ***! 11172 \*******************************************************************************************/ 11173/*! no static exports found */ 11174/***/ (function(module, exports, __webpack_require__) { 11175 11176"use strict"; 11177 // https://github.com/sebmarkbage/ecmascript-string-left-right-trim 11178 11179__webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js")('trimLeft', function ($trim) { 11180 return function trimLeft() { 11181 return $trim(this, 1); 11182 }; 11183}, 'trimStart'); 11184 11185/***/ }), 11186
vendor: 803 bytes, lines 11187-11204
11187/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js": 11188/*!********************************************************************************************!*\ 11189 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js ***! 11190 \********************************************************************************************/ 11191/*! no static exports found */ 11192/***/ (function(module, exports, __webpack_require__) { 11193 11194"use strict"; 11195 // https://github.com/sebmarkbage/ecmascript-string-left-right-trim 11196 11197__webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js")('trimRight', function ($trim) { 11198 return function trimRight() { 11199 return $trim(this, 2); 11200 }; 11201}, 'trimEnd'); 11202 11203/***/ }), 11204
vendor: 640 bytes, lines 11205-11215
11205/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js": 11206/*!************************************************************************************************!*\ 11207 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js ***! 11208 \************************************************************************************************/ 11209/*! no static exports found */ 11210/***/ (function(module, exports, __webpack_require__) { 11211 11212__webpack_require__(/*! ./_wks-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js")('asyncIterator'); 11213 11214/***/ }), 11215
vendor: 621 bytes, lines 11216-11226
11216/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js": 11217/*!********************************************************************************************!*\ 11218 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js ***! 11219 \********************************************************************************************/ 11220/*! no static exports found */ 11221/***/ (function(module, exports, __webpack_require__) { 11222 11223__webpack_require__(/*! ./_wks-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js")('observable'); 11224 11225/***/ }), 11226
vendor: 797 bytes, lines 11227-11242
11227/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js": 11228/*!****************************************************************************************!*\ 11229 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js ***! 11230 \****************************************************************************************/ 11231/*! no static exports found */ 11232/***/ (function(module, exports, __webpack_require__) { 11233 11234// https://github.com/tc39/proposal-global 11235var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11236 11237$export($export.S, 'System', { 11238 global: __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js") 11239}); 11240 11241/***/ }), 11242
vendor: 687 bytes, lines 11243-11254
11243/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js": 11244/*!****************************************************************************************!*\ 11245 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js ***! 11246 \****************************************************************************************/ 11247/*! no static exports found */ 11248/***/ (function(module, exports, __webpack_require__) { 11249 11250// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from 11251__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('WeakMap'); 11252 11253/***/ }), 11254
vendor: 673 bytes, lines 11255-11266
11255/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js": 11256/*!**************************************************************************************!*\ 11257 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js ***! 11258 \**************************************************************************************/ 11259/*! no static exports found */ 11260/***/ (function(module, exports, __webpack_require__) { 11261 11262// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of 11263__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('WeakMap'); 11264 11265/***/ }), 11266
vendor: 687 bytes, lines 11267-11278
11267/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js": 11268/*!****************************************************************************************!*\ 11269 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js ***! 11270 \****************************************************************************************/ 11271/*! no static exports found */ 11272/***/ (function(module, exports, __webpack_require__) { 11273 11274// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from 11275__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('WeakSet'); 11276 11277/***/ }), 11278
vendor: 673 bytes, lines 11279-11290
11279/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js": 11280/*!**************************************************************************************!*\ 11281 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js ***! 11282 \**************************************************************************************/ 11283/*! no static exports found */ 11284/***/ (function(module, exports, __webpack_require__) { 11285 11286// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of 11287__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('WeakSet'); 11288 11289/***/ }), 11290
vendor: 2,950 bytes, lines 11291-11370
11291/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js": 11292/*!***************************************************************************************!*\ 11293 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js ***! 11294 \***************************************************************************************/ 11295/*! no static exports found */ 11296/***/ (function(module, exports, __webpack_require__) { 11297 11298var $iterators = __webpack_require__(/*! ./es6.array.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js"); 11299 11300var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js"); 11301 11302var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js"); 11303 11304var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 11305 11306var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js"); 11307 11308var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js"); 11309 11310var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js"); 11311 11312var ITERATOR = wks('iterator'); 11313var TO_STRING_TAG = wks('toStringTag'); 11314var ArrayValues = Iterators.Array; 11315var DOMIterables = { 11316 CSSRuleList: true, 11317 // TODO: Not spec compliant, should be false. 11318 CSSStyleDeclaration: false, 11319 CSSValueList: false, 11320 ClientRectList: false, 11321 DOMRectList: false, 11322 DOMStringList: false, 11323 DOMTokenList: true, 11324 DataTransferItemList: false, 11325 FileList: false, 11326 HTMLAllCollection: false, 11327 HTMLCollection: false, 11328 HTMLFormElement: false, 11329 HTMLSelectElement: false, 11330 MediaList: true, 11331 // TODO: Not spec compliant, should be false. 11332 MimeTypeArray: false, 11333 NamedNodeMap: false, 11334 NodeList: true, 11335 PaintRequestList: false, 11336 Plugin: false, 11337 PluginArray: false, 11338 SVGLengthList: false, 11339 SVGNumberList: false, 11340 SVGPathSegList: false, 11341 SVGPointList: false, 11342 SVGStringList: false, 11343 SVGTransformList: false, 11344 SourceBufferList: false, 11345 StyleSheetList: true, 11346 // TODO: Not spec compliant, should be false. 11347 TextTrackCueList: false, 11348 TextTrackList: false, 11349 TouchList: false 11350}; 11351 11352for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { 11353 var NAME = collections[i]; 11354 var explicit = DOMIterables[NAME]; 11355 var Collection = global[NAME]; 11356 var proto = Collection && Collection.prototype; 11357 var key; 11358 11359 if (proto) { 11360 if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); 11361 if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); 11362 Iterators[NAME] = ArrayValues; 11363 if (explicit) for (key in $iterators) { 11364 if (!proto[key]) redefine(proto, key, $iterators[key], true); 11365 } 11366 } 11367} 11368 11369/***/ }), 11370
vendor: 797 bytes, lines 11371-11388
11371/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js": 11372/*!************************************************************************************!*\ 11373 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js ***! 11374 \************************************************************************************/ 11375/*! no static exports found */ 11376/***/ (function(module, exports, __webpack_require__) { 11377 11378var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11379 11380var $task = __webpack_require__(/*! ./_task */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js"); 11381 11382$export($export.G + $export.B, { 11383 setImmediate: $task.set, 11384 clearImmediate: $task.clear 11385}); 11386 11387/***/ }), 11388
vendor: 1,485 bytes, lines 11389-11425
11389/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js": 11390/*!*********************************************************************************!*\ 11391 !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js ***! 11392 \*********************************************************************************/ 11393/*! no static exports found */ 11394/***/ (function(module, exports, __webpack_require__) { 11395 11396// ie9- setTimeout & setInterval additional parameters fix 11397var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js"); 11398 11399var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); 11400 11401var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js"); 11402 11403var slice = [].slice; 11404var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check 11405 11406var wrap = function wrap(set) { 11407 return function (fn, time 11408 /* , ...args */ 11409 ) { 11410 var boundArgs = arguments.length > 2; 11411 var args = boundArgs ? slice.call(arguments, 2) : false; 11412 return set(boundArgs ? function () { 11413 // eslint-disable-next-line no-new-func 11414 (typeof fn == 'function' ? fn : Function(fn)).apply(this, args); 11415 } : fn, time); 11416 }; 11417}; 11418 11419$export($export.G + $export.B + $export.F * MSIE, { 11420 setTimeout: wrap(global.setTimeout), 11421 setInterval: wrap(global.setInterval) 11422}); 11423 11424/***/ }), 11425
vendor: 28,889 bytes, lines 11426-11830
11426/***/ "../node_modules/babel-polyfill/node_modules/core-js/shim.js": 11427/*!*******************************************************************!*\ 11428 !*** ../node_modules/babel-polyfill/node_modules/core-js/shim.js ***! 11429 \*******************************************************************/ 11430/*! no static exports found */ 11431/***/ (function(module, exports, __webpack_require__) { 11432 11433__webpack_require__(/*! ./modules/es6.symbol */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js"); 11434 11435__webpack_require__(/*! ./modules/es6.object.create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js"); 11436 11437__webpack_require__(/*! ./modules/es6.object.define-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js"); 11438 11439__webpack_require__(/*! ./modules/es6.object.define-properties */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js"); 11440 11441__webpack_require__(/*! ./modules/es6.object.get-own-property-descriptor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js"); 11442 11443__webpack_require__(/*! ./modules/es6.object.get-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js"); 11444 11445__webpack_require__(/*! ./modules/es6.object.keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js"); 11446 11447__webpack_require__(/*! ./modules/es6.object.get-own-property-names */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js"); 11448 11449__webpack_require__(/*! ./modules/es6.object.freeze */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js"); 11450 11451__webpack_require__(/*! ./modules/es6.object.seal */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js"); 11452 11453__webpack_require__(/*! ./modules/es6.object.prevent-extensions */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js"); 11454 11455__webpack_require__(/*! ./modules/es6.object.is-frozen */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js"); 11456 11457__webpack_require__(/*! ./modules/es6.object.is-sealed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js"); 11458 11459__webpack_require__(/*! ./modules/es6.object.is-extensible */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js"); 11460 11461__webpack_require__(/*! ./modules/es6.object.assign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js"); 11462 11463__webpack_require__(/*! ./modules/es6.object.is */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js"); 11464 11465__webpack_require__(/*! ./modules/es6.object.set-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js"); 11466 11467__webpack_require__(/*! ./modules/es6.object.to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js"); 11468 11469__webpack_require__(/*! ./modules/es6.function.bind */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js"); 11470 11471__webpack_require__(/*! ./modules/es6.function.name */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js"); 11472 11473__webpack_require__(/*! ./modules/es6.function.has-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js"); 11474 11475__webpack_require__(/*! ./modules/es6.parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js"); 11476 11477__webpack_require__(/*! ./modules/es6.parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js"); 11478 11479__webpack_require__(/*! ./modules/es6.number.constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js"); 11480 11481__webpack_require__(/*! ./modules/es6.number.to-fixed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js"); 11482 11483__webpack_require__(/*! ./modules/es6.number.to-precision */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js"); 11484 11485__webpack_require__(/*! ./modules/es6.number.epsilon */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js"); 11486 11487__webpack_require__(/*! ./modules/es6.number.is-finite */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js"); 11488 11489__webpack_require__(/*! ./modules/es6.number.is-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js"); 11490 11491__webpack_require__(/*! ./modules/es6.number.is-nan */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js"); 11492 11493__webpack_require__(/*! ./modules/es6.number.is-safe-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js"); 11494 11495__webpack_require__(/*! ./modules/es6.number.max-safe-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js"); 11496 11497__webpack_require__(/*! ./modules/es6.number.min-safe-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js"); 11498 11499__webpack_require__(/*! ./modules/es6.number.parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js"); 11500 11501__webpack_require__(/*! ./modules/es6.number.parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js"); 11502 11503__webpack_require__(/*! ./modules/es6.math.acosh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js"); 11504 11505__webpack_require__(/*! ./modules/es6.math.asinh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js"); 11506 11507__webpack_require__(/*! ./modules/es6.math.atanh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js"); 11508 11509__webpack_require__(/*! ./modules/es6.math.cbrt */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js"); 11510 11511__webpack_require__(/*! ./modules/es6.math.clz32 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js"); 11512 11513__webpack_require__(/*! ./modules/es6.math.cosh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js"); 11514 11515__webpack_require__(/*! ./modules/es6.math.expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js"); 11516 11517__webpack_require__(/*! ./modules/es6.math.fround */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js"); 11518 11519__webpack_require__(/*! ./modules/es6.math.hypot */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js"); 11520 11521__webpack_require__(/*! ./modules/es6.math.imul */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js"); 11522 11523__webpack_require__(/*! ./modules/es6.math.log10 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js"); 11524 11525__webpack_require__(/*! ./modules/es6.math.log1p */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js"); 11526 11527__webpack_require__(/*! ./modules/es6.math.log2 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js"); 11528 11529__webpack_require__(/*! ./modules/es6.math.sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js"); 11530 11531__webpack_require__(/*! ./modules/es6.math.sinh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js"); 11532 11533__webpack_require__(/*! ./modules/es6.math.tanh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js"); 11534 11535__webpack_require__(/*! ./modules/es6.math.trunc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js"); 11536 11537__webpack_require__(/*! ./modules/es6.string.from-code-point */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js"); 11538 11539__webpack_require__(/*! ./modules/es6.string.raw */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js"); 11540 11541__webpack_require__(/*! ./modules/es6.string.trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js"); 11542 11543__webpack_require__(/*! ./modules/es6.string.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js"); 11544 11545__webpack_require__(/*! ./modules/es6.string.code-point-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js"); 11546 11547__webpack_require__(/*! ./modules/es6.string.ends-with */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js"); 11548 11549__webpack_require__(/*! ./modules/es6.string.includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js"); 11550 11551__webpack_require__(/*! ./modules/es6.string.repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js"); 11552 11553__webpack_require__(/*! ./modules/es6.string.starts-with */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js"); 11554 11555__webpack_require__(/*! ./modules/es6.string.anchor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js"); 11556 11557__webpack_require__(/*! ./modules/es6.string.big */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js"); 11558 11559__webpack_require__(/*! ./modules/es6.string.blink */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js"); 11560 11561__webpack_require__(/*! ./modules/es6.string.bold */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js"); 11562 11563__webpack_require__(/*! ./modules/es6.string.fixed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js"); 11564 11565__webpack_require__(/*! ./modules/es6.string.fontcolor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js"); 11566 11567__webpack_require__(/*! ./modules/es6.string.fontsize */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js"); 11568 11569__webpack_require__(/*! ./modules/es6.string.italics */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js"); 11570 11571__webpack_require__(/*! ./modules/es6.string.link */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js"); 11572 11573__webpack_require__(/*! ./modules/es6.string.small */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js"); 11574 11575__webpack_require__(/*! ./modules/es6.string.strike */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js"); 11576 11577__webpack_require__(/*! ./modules/es6.string.sub */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js"); 11578 11579__webpack_require__(/*! ./modules/es6.string.sup */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js"); 11580 11581__webpack_require__(/*! ./modules/es6.date.now */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js"); 11582 11583__webpack_require__(/*! ./modules/es6.date.to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js"); 11584 11585__webpack_require__(/*! ./modules/es6.date.to-iso-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js"); 11586 11587__webpack_require__(/*! ./modules/es6.date.to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js"); 11588 11589__webpack_require__(/*! ./modules/es6.date.to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js"); 11590 11591__webpack_require__(/*! ./modules/es6.array.is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js"); 11592 11593__webpack_require__(/*! ./modules/es6.array.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js"); 11594 11595__webpack_require__(/*! ./modules/es6.array.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js"); 11596 11597__webpack_require__(/*! ./modules/es6.array.join */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js"); 11598 11599__webpack_require__(/*! ./modules/es6.array.slice */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js"); 11600 11601__webpack_require__(/*! ./modules/es6.array.sort */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js"); 11602 11603__webpack_require__(/*! ./modules/es6.array.for-each */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js"); 11604 11605__webpack_require__(/*! ./modules/es6.array.map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js"); 11606 11607__webpack_require__(/*! ./modules/es6.array.filter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js"); 11608 11609__webpack_require__(/*! ./modules/es6.array.some */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js"); 11610 11611__webpack_require__(/*! ./modules/es6.array.every */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js"); 11612 11613__webpack_require__(/*! ./modules/es6.array.reduce */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js"); 11614 11615__webpack_require__(/*! ./modules/es6.array.reduce-right */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js"); 11616 11617__webpack_require__(/*! ./modules/es6.array.index-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js"); 11618 11619__webpack_require__(/*! ./modules/es6.array.last-index-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js"); 11620 11621__webpack_require__(/*! ./modules/es6.array.copy-within */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js"); 11622 11623__webpack_require__(/*! ./modules/es6.array.fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js"); 11624 11625__webpack_require__(/*! ./modules/es6.array.find */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js"); 11626 11627__webpack_require__(/*! ./modules/es6.array.find-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js"); 11628 11629__webpack_require__(/*! ./modules/es6.array.species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js"); 11630 11631__webpack_require__(/*! ./modules/es6.array.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js"); 11632 11633__webpack_require__(/*! ./modules/es6.regexp.constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js"); 11634 11635__webpack_require__(/*! ./modules/es6.regexp.exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js"); 11636 11637__webpack_require__(/*! ./modules/es6.regexp.to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js"); 11638 11639__webpack_require__(/*! ./modules/es6.regexp.flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js"); 11640 11641__webpack_require__(/*! ./modules/es6.regexp.match */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js"); 11642 11643__webpack_require__(/*! ./modules/es6.regexp.replace */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js"); 11644 11645__webpack_require__(/*! ./modules/es6.regexp.search */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js"); 11646 11647__webpack_require__(/*! ./modules/es6.regexp.split */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js"); 11648 11649__webpack_require__(/*! ./modules/es6.promise */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js"); 11650 11651__webpack_require__(/*! ./modules/es6.map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js"); 11652 11653__webpack_require__(/*! ./modules/es6.set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js"); 11654 11655__webpack_require__(/*! ./modules/es6.weak-map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js"); 11656 11657__webpack_require__(/*! ./modules/es6.weak-set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js"); 11658 11659__webpack_require__(/*! ./modules/es6.typed.array-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js"); 11660 11661__webpack_require__(/*! ./modules/es6.typed.data-view */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js"); 11662 11663__webpack_require__(/*! ./modules/es6.typed.int8-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js"); 11664 11665__webpack_require__(/*! ./modules/es6.typed.uint8-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js"); 11666 11667__webpack_require__(/*! ./modules/es6.typed.uint8-clamped-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js"); 11668 11669__webpack_require__(/*! ./modules/es6.typed.int16-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js"); 11670 11671__webpack_require__(/*! ./modules/es6.typed.uint16-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js"); 11672 11673__webpack_require__(/*! ./modules/es6.typed.int32-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js"); 11674 11675__webpack_require__(/*! ./modules/es6.typed.uint32-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js"); 11676 11677__webpack_require__(/*! ./modules/es6.typed.float32-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js"); 11678 11679__webpack_require__(/*! ./modules/es6.typed.float64-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js"); 11680 11681__webpack_require__(/*! ./modules/es6.reflect.apply */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js"); 11682 11683__webpack_require__(/*! ./modules/es6.reflect.construct */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js"); 11684 11685__webpack_require__(/*! ./modules/es6.reflect.define-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js"); 11686 11687__webpack_require__(/*! ./modules/es6.reflect.delete-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js"); 11688 11689__webpack_require__(/*! ./modules/es6.reflect.enumerate */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js"); 11690 11691__webpack_require__(/*! ./modules/es6.reflect.get */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js"); 11692 11693__webpack_require__(/*! ./modules/es6.reflect.get-own-property-descriptor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js"); 11694 11695__webpack_require__(/*! ./modules/es6.reflect.get-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js"); 11696 11697__webpack_require__(/*! ./modules/es6.reflect.has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js"); 11698 11699__webpack_require__(/*! ./modules/es6.reflect.is-extensible */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js"); 11700 11701__webpack_require__(/*! ./modules/es6.reflect.own-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js"); 11702 11703__webpack_require__(/*! ./modules/es6.reflect.prevent-extensions */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js"); 11704 11705__webpack_require__(/*! ./modules/es6.reflect.set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js"); 11706 11707__webpack_require__(/*! ./modules/es6.reflect.set-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js"); 11708 11709__webpack_require__(/*! ./modules/es7.array.includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js"); 11710 11711__webpack_require__(/*! ./modules/es7.array.flat-map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js"); 11712 11713__webpack_require__(/*! ./modules/es7.array.flatten */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js"); 11714 11715__webpack_require__(/*! ./modules/es7.string.at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js"); 11716 11717__webpack_require__(/*! ./modules/es7.string.pad-start */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js"); 11718 11719__webpack_require__(/*! ./modules/es7.string.pad-end */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js"); 11720 11721__webpack_require__(/*! ./modules/es7.string.trim-left */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js"); 11722 11723__webpack_require__(/*! ./modules/es7.string.trim-right */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js"); 11724 11725__webpack_require__(/*! ./modules/es7.string.match-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js"); 11726 11727__webpack_require__(/*! ./modules/es7.symbol.async-iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js"); 11728 11729__webpack_require__(/*! ./modules/es7.symbol.observable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js"); 11730 11731__webpack_require__(/*! ./modules/es7.object.get-own-property-descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js"); 11732 11733__webpack_require__(/*! ./modules/es7.object.values */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js"); 11734 11735__webpack_require__(/*! ./modules/es7.object.entries */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js"); 11736 11737__webpack_require__(/*! ./modules/es7.object.define-getter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js"); 11738 11739__webpack_require__(/*! ./modules/es7.object.define-setter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js"); 11740 11741__webpack_require__(/*! ./modules/es7.object.lookup-getter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js"); 11742 11743__webpack_require__(/*! ./modules/es7.object.lookup-setter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js"); 11744 11745__webpack_require__(/*! ./modules/es7.map.to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js"); 11746 11747__webpack_require__(/*! ./modules/es7.set.to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js"); 11748 11749__webpack_require__(/*! ./modules/es7.map.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js"); 11750 11751__webpack_require__(/*! ./modules/es7.set.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js"); 11752 11753__webpack_require__(/*! ./modules/es7.weak-map.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js"); 11754 11755__webpack_require__(/*! ./modules/es7.weak-set.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js"); 11756 11757__webpack_require__(/*! ./modules/es7.map.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js"); 11758 11759__webpack_require__(/*! ./modules/es7.set.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js"); 11760 11761__webpack_require__(/*! ./modules/es7.weak-map.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js"); 11762 11763__webpack_require__(/*! ./modules/es7.weak-set.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js"); 11764 11765__webpack_require__(/*! ./modules/es7.global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js"); 11766 11767__webpack_require__(/*! ./modules/es7.system.global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js"); 11768 11769__webpack_require__(/*! ./modules/es7.error.is-error */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js"); 11770 11771__webpack_require__(/*! ./modules/es7.math.clamp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js"); 11772 11773__webpack_require__(/*! ./modules/es7.math.deg-per-rad */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js"); 11774 11775__webpack_require__(/*! ./modules/es7.math.degrees */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js"); 11776 11777__webpack_require__(/*! ./modules/es7.math.fscale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js"); 11778 11779__webpack_require__(/*! ./modules/es7.math.iaddh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js"); 11780 11781__webpack_require__(/*! ./modules/es7.math.isubh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js"); 11782 11783__webpack_require__(/*! ./modules/es7.math.imulh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js"); 11784 11785__webpack_require__(/*! ./modules/es7.math.rad-per-deg */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js"); 11786 11787__webpack_require__(/*! ./modules/es7.math.radians */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js"); 11788 11789__webpack_require__(/*! ./modules/es7.math.scale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js"); 11790 11791__webpack_require__(/*! ./modules/es7.math.umulh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js"); 11792 11793__webpack_require__(/*! ./modules/es7.math.signbit */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js"); 11794 11795__webpack_require__(/*! ./modules/es7.promise.finally */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js"); 11796 11797__webpack_require__(/*! ./modules/es7.promise.try */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js"); 11798 11799__webpack_require__(/*! ./modules/es7.reflect.define-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js"); 11800 11801__webpack_require__(/*! ./modules/es7.reflect.delete-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js"); 11802 11803__webpack_require__(/*! ./modules/es7.reflect.get-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js"); 11804 11805__webpack_require__(/*! ./modules/es7.reflect.get-metadata-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js"); 11806 11807__webpack_require__(/*! ./modules/es7.reflect.get-own-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js"); 11808 11809__webpack_require__(/*! ./modules/es7.reflect.get-own-metadata-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js"); 11810 11811__webpack_require__(/*! ./modules/es7.reflect.has-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js"); 11812 11813__webpack_require__(/*! ./modules/es7.reflect.has-own-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js"); 11814 11815__webpack_require__(/*! ./modules/es7.reflect.metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js"); 11816 11817__webpack_require__(/*! ./modules/es7.asap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js"); 11818 11819__webpack_require__(/*! ./modules/es7.observable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js"); 11820 11821__webpack_require__(/*! ./modules/web.timers */ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js"); 11822 11823__webpack_require__(/*! ./modules/web.immediate */ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js"); 11824 11825__webpack_require__(/*! ./modules/web.dom.iterable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js"); 11826 11827module.exports = __webpack_require__(/*! ./modules/_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js"); 11828 11829/***/ }), 11830
vendor: 73,733 bytes, lines 11831-14485
11831/***/ "../node_modules/hammerjs/hammer.js": 11832/*!******************************************!*\ 11833 !*** ../node_modules/hammerjs/hammer.js ***! 11834 \******************************************/ 11835/*! no static exports found */ 11836/***/ (function(module, exports, __webpack_require__) { 11837 11838var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 11839 11840/*! Hammer.JS - v2.0.7 - 2016-04-22 11841 * http://hammerjs.github.io/ 11842 * 11843 * Copyright (c) 2016 Jorik Tangelder; 11844 * Licensed under the MIT license */ 11845(function (window, document, exportName, undefined) { 11846 'use strict'; 11847 11848 var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; 11849 var TEST_ELEMENT = document.createElement('div'); 11850 var TYPE_FUNCTION = 'function'; 11851 var round = Math.round; 11852 var abs = Math.abs; 11853 var now = Date.now; 11854 /** 11855 * set a timeout with a given scope 11856 * @param {Function} fn 11857 * @param {Number} timeout 11858 * @param {Object} context 11859 * @returns {number} 11860 */ 11861 11862 function setTimeoutContext(fn, timeout, context) { 11863 return setTimeout(bindFn(fn, context), timeout); 11864 } 11865 /** 11866 * if the argument is an array, we want to execute the fn on each entry 11867 * if it aint an array we don't want to do a thing. 11868 * this is used by all the methods that accept a single and array argument. 11869 * @param {*|Array} arg 11870 * @param {String} fn 11871 * @param {Object} [context] 11872 * @returns {Boolean} 11873 */ 11874 11875 11876 function invokeArrayArg(arg, fn, context) { 11877 if (Array.isArray(arg)) { 11878 each(arg, context[fn], context); 11879 return true; 11880 } 11881 11882 return false; 11883 } 11884 /** 11885 * walk objects and arrays 11886 * @param {Object} obj 11887 * @param {Function} iterator 11888 * @param {Object} context 11889 */ 11890 11891 11892 function each(obj, iterator, context) { 11893 var i; 11894 11895 if (!obj) { 11896 return; 11897 } 11898 11899 if (obj.forEach) { 11900 obj.forEach(iterator, context); 11901 } else if (obj.length !== undefined) { 11902 i = 0; 11903 11904 while (i < obj.length) { 11905 iterator.call(context, obj[i], i, obj); 11906 i++; 11907 } 11908 } else { 11909 for (i in obj) { 11910 obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); 11911 } 11912 } 11913 } 11914 /** 11915 * wrap a method with a deprecation warning and stack trace 11916 * @param {Function} method 11917 * @param {String} name 11918 * @param {String} message 11919 * @returns {Function} A new function wrapping the supplied method. 11920 */ 11921 11922 11923 function deprecate(method, name, message) { 11924 var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n'; 11925 return function () { 11926 var e = new Error('get-stack-trace'); 11927 var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '').replace(/^\s+at\s+/gm, '').replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace'; 11928 var log = window.console && (window.console.warn || window.console.log); 11929 11930 if (log) { 11931 log.call(window.console, deprecationMessage, stack); 11932 } 11933 11934 return method.apply(this, arguments); 11935 }; 11936 } 11937 /** 11938 * extend object. 11939 * means that properties in dest will be overwritten by the ones in src. 11940 * @param {Object} target 11941 * @param {...Object} objects_to_assign 11942 * @returns {Object} target 11943 */ 11944 11945 11946 var assign; 11947 11948 if (typeof Object.assign !== 'function') { 11949 assign = function assign(target) { 11950 if (target === undefined || target === null) { 11951 throw new TypeError('Cannot convert undefined or null to object'); 11952 } 11953 11954 var output = Object(target); 11955 11956 for (var index = 1; index < arguments.length; index++) { 11957 var source = arguments[index]; 11958 11959 if (source !== undefined && source !== null) { 11960 for (var nextKey in source) { 11961 if (source.hasOwnProperty(nextKey)) { 11962 output[nextKey] = source[nextKey]; 11963 } 11964 } 11965 } 11966 } 11967 11968 return output; 11969 }; 11970 } else { 11971 assign = Object.assign; 11972 } 11973 /** 11974 * extend object. 11975 * means that properties in dest will be overwritten by the ones in src. 11976 * @param {Object} dest 11977 * @param {Object} src 11978 * @param {Boolean} [merge=false] 11979 * @returns {Object} dest 11980 */ 11981 11982 11983 var extend = deprecate(function extend(dest, src, merge) { 11984 var keys = Object.keys(src); 11985 var i = 0; 11986 11987 while (i < keys.length) { 11988 if (!merge || merge && dest[keys[i]] === undefined) { 11989 dest[keys[i]] = src[keys[i]]; 11990 } 11991 11992 i++; 11993 } 11994 11995 return dest; 11996 }, 'extend', 'Use `assign`.'); 11997 /** 11998 * merge the values from src in the dest. 11999 * means that properties that exist in dest will not be overwritten by src 12000 * @param {Object} dest 12001 * @param {Object} src 12002 * @returns {Object} dest 12003 */ 12004 12005 var merge = deprecate(function merge(dest, src) { 12006 return extend(dest, src, true); 12007 }, 'merge', 'Use `assign`.'); 12008 /** 12009 * simple class inheritance 12010 * @param {Function} child 12011 * @param {Function} base 12012 * @param {Object} [properties] 12013 */ 12014 12015 function inherit(child, base, properties) { 12016 var baseP = base.prototype, 12017 childP; 12018 childP = child.prototype = Object.create(baseP); 12019 childP.constructor = child; 12020 childP._super = baseP; 12021 12022 if (properties) { 12023 assign(childP, properties); 12024 } 12025 } 12026 /** 12027 * simple function bind 12028 * @param {Function} fn 12029 * @param {Object} context 12030 * @returns {Function} 12031 */ 12032 12033 12034 function bindFn(fn, context) { 12035 return function boundFn() { 12036 return fn.apply(context, arguments); 12037 }; 12038 } 12039 /** 12040 * let a boolean value also be a function that must return a boolean 12041 * this first item in args will be used as the context 12042 * @param {Boolean|Function} val 12043 * @param {Array} [args] 12044 * @returns {Boolean} 12045 */ 12046 12047 12048 function boolOrFn(val, args) { 12049 if (_typeof(val) == TYPE_FUNCTION) { 12050 return val.apply(args ? args[0] || undefined : undefined, args); 12051 } 12052 12053 return val; 12054 } 12055 /** 12056 * use the val2 when val1 is undefined 12057 * @param {*} val1 12058 * @param {*} val2 12059 * @returns {*} 12060 */ 12061 12062 12063 function ifUndefined(val1, val2) { 12064 return val1 === undefined ? val2 : val1; 12065 } 12066 /** 12067 * addEventListener with multiple events at once 12068 * @param {EventTarget} target 12069 * @param {String} types 12070 * @param {Function} handler 12071 */ 12072 12073 12074 function addEventListeners(target, types, handler) { 12075 each(splitStr(types), function (type) { 12076 target.addEventListener(type, handler, false); 12077 }); 12078 } 12079 /** 12080 * removeEventListener with multiple events at once 12081 * @param {EventTarget} target 12082 * @param {String} types 12083 * @param {Function} handler 12084 */ 12085 12086 12087 function removeEventListeners(target, types, handler) { 12088 each(splitStr(types), function (type) { 12089 target.removeEventListener(type, handler, false); 12090 }); 12091 } 12092 /** 12093 * find if a node is in the given parent 12094 * @method hasParent 12095 * @param {HTMLElement} node 12096 * @param {HTMLElement} parent 12097 * @return {Boolean} found 12098 */ 12099 12100 12101 function hasParent(node, parent) { 12102 while (node) { 12103 if (node == parent) { 12104 return true; 12105 } 12106 12107 node = node.parentNode; 12108 } 12109 12110 return false; 12111 } 12112 /** 12113 * small indexOf wrapper 12114 * @param {String} str 12115 * @param {String} find 12116 * @returns {Boolean} found 12117 */ 12118 12119 12120 function inStr(str, find) { 12121 return str.indexOf(find) > -1; 12122 } 12123 /** 12124 * split string on whitespace 12125 * @param {String} str 12126 * @returns {Array} words 12127 */ 12128 12129 12130 function splitStr(str) { 12131 return str.trim().split(/\s+/g); 12132 } 12133 /** 12134 * find if a array contains the object using indexOf or a simple polyFill 12135 * @param {Array} src 12136 * @param {String} find 12137 * @param {String} [findByKey] 12138 * @return {Boolean|Number} false when not found, or the index 12139 */ 12140 12141 12142 function inArray(src, find, findByKey) { 12143 if (src.indexOf && !findByKey) { 12144 return src.indexOf(find); 12145 } else { 12146 var i = 0; 12147 12148 while (i < src.length) { 12149 if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) { 12150 return i; 12151 } 12152 12153 i++; 12154 } 12155 12156 return -1; 12157 } 12158 } 12159 /** 12160 * convert array-like objects to real arrays 12161 * @param {Object} obj 12162 * @returns {Array} 12163 */ 12164 12165 12166 function toArray(obj) { 12167 return Array.prototype.slice.call(obj, 0); 12168 } 12169 /** 12170 * unique array with objects based on a key (like 'id') or just by the array's value 12171 * @param {Array} src [{id:1},{id:2},{id:1}] 12172 * @param {String} [key] 12173 * @param {Boolean} [sort=False] 12174 * @returns {Array} [{id:1},{id:2}] 12175 */ 12176 12177 12178 function uniqueArray(src, key, sort) { 12179 var results = []; 12180 var values = []; 12181 var i = 0; 12182 12183 while (i < src.length) { 12184 var val = key ? src[i][key] : src[i]; 12185 12186 if (inArray(values, val) < 0) { 12187 results.push(src[i]); 12188 } 12189 12190 values[i] = val; 12191 i++; 12192 } 12193 12194 if (sort) { 12195 if (!key) { 12196 results = results.sort(); 12197 } else { 12198 results = results.sort(function sortUniqueArray(a, b) { 12199 return a[key] > b[key]; 12200 }); 12201 } 12202 } 12203 12204 return results; 12205 } 12206 /** 12207 * get the prefixed property 12208 * @param {Object} obj 12209 * @param {String} property 12210 * @returns {String|Undefined} prefixed 12211 */ 12212 12213 12214 function prefixed(obj, property) { 12215 var prefix, prop; 12216 var camelProp = property[0].toUpperCase() + property.slice(1); 12217 var i = 0; 12218 12219 while (i < VENDOR_PREFIXES.length) { 12220 prefix = VENDOR_PREFIXES[i]; 12221 prop = prefix ? prefix + camelProp : property; 12222 12223 if (prop in obj) { 12224 return prop; 12225 } 12226 12227 i++; 12228 } 12229 12230 return undefined; 12231 } 12232 /** 12233 * get a unique id 12234 * @returns {number} uniqueId 12235 */ 12236 12237 12238 var _uniqueId = 1; 12239 12240 function uniqueId() { 12241 return _uniqueId++; 12242 } 12243 /** 12244 * get the window object of an element 12245 * @param {HTMLElement} element 12246 * @returns {DocumentView|Window} 12247 */ 12248 12249 12250 function getWindowForElement(element) { 12251 var doc = element.ownerDocument || element; 12252 return doc.defaultView || doc.parentWindow || window; 12253 } 12254 12255 var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; 12256 var SUPPORT_TOUCH = 'ontouchstart' in window; 12257 var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined; 12258 var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); 12259 var INPUT_TYPE_TOUCH = 'touch'; 12260 var INPUT_TYPE_PEN = 'pen'; 12261 var INPUT_TYPE_MOUSE = 'mouse'; 12262 var INPUT_TYPE_KINECT = 'kinect'; 12263 var COMPUTE_INTERVAL = 25; 12264 var INPUT_START = 1; 12265 var INPUT_MOVE = 2; 12266 var INPUT_END = 4; 12267 var INPUT_CANCEL = 8; 12268 var DIRECTION_NONE = 1; 12269 var DIRECTION_LEFT = 2; 12270 var DIRECTION_RIGHT = 4; 12271 var DIRECTION_UP = 8; 12272 var DIRECTION_DOWN = 16; 12273 var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; 12274 var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; 12275 var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; 12276 var PROPS_XY = ['x', 'y']; 12277 var PROPS_CLIENT_XY = ['clientX', 'clientY']; 12278 /** 12279 * create new input type manager 12280 * @param {Manager} manager 12281 * @param {Function} callback 12282 * @returns {Input} 12283 * @constructor 12284 */ 12285 12286 function Input(manager, callback) { 12287 var self = this; 12288 this.manager = manager; 12289 this.callback = callback; 12290 this.element = manager.element; 12291 this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager, 12292 // so when disabled the input events are completely bypassed. 12293 12294 this.domHandler = function (ev) { 12295 if (boolOrFn(manager.options.enable, [manager])) { 12296 self.handler(ev); 12297 } 12298 }; 12299 12300 this.init(); 12301 } 12302 12303 Input.prototype = { 12304 /** 12305 * should handle the inputEvent data and trigger the callback 12306 * @virtual 12307 */ 12308 handler: function handler() {}, 12309 12310 /** 12311 * bind the events 12312 */ 12313 init: function init() { 12314 this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); 12315 this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); 12316 this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); 12317 }, 12318 12319 /** 12320 * unbind the events 12321 */ 12322 destroy: function destroy() { 12323 this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); 12324 this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); 12325 this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); 12326 } 12327 }; 12328 /** 12329 * create new input type manager 12330 * called by the Manager constructor 12331 * @param {Hammer} manager 12332 * @returns {Input} 12333 */ 12334 12335 function createInputInstance(manager) { 12336 var Type; 12337 var inputClass = manager.options.inputClass; 12338 12339 if (inputClass) { 12340 Type = inputClass; 12341 } else if (SUPPORT_POINTER_EVENTS) { 12342 Type = PointerEventInput; 12343 } else if (SUPPORT_ONLY_TOUCH) { 12344 Type = TouchInput; 12345 } else if (!SUPPORT_TOUCH) { 12346 Type = MouseInput; 12347 } else { 12348 Type = TouchMouseInput; 12349 } 12350 12351 return new Type(manager, inputHandler); 12352 } 12353 /** 12354 * handle input events 12355 * @param {Manager} manager 12356 * @param {String} eventType 12357 * @param {Object} input 12358 */ 12359 12360 12361 function inputHandler(manager, eventType, input) { 12362 var pointersLen = input.pointers.length; 12363 var changedPointersLen = input.changedPointers.length; 12364 var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0; 12365 var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0; 12366 input.isFirst = !!isFirst; 12367 input.isFinal = !!isFinal; 12368 12369 if (isFirst) { 12370 manager.session = {}; 12371 } // source event is the normalized value of the domEvents 12372 // like 'touchstart, mouseup, pointerdown' 12373 12374 12375 input.eventType = eventType; // compute scale, rotation etc 12376 12377 computeInputData(manager, input); // emit secret event 12378 12379 manager.emit('hammer.input', input); 12380 manager.recognize(input); 12381 manager.session.prevInput = input; 12382 } 12383 /** 12384 * extend the data with some usable properties like scale, rotate, velocity etc 12385 * @param {Object} manager 12386 * @param {Object} input 12387 */ 12388 12389 12390 function computeInputData(manager, input) { 12391 var session = manager.session; 12392 var pointers = input.pointers; 12393 var pointersLength = pointers.length; // store the first input to calculate the distance and direction 12394 12395 if (!session.firstInput) { 12396 session.firstInput = simpleCloneInputData(input); 12397 } // to compute scale and rotation we need to store the multiple touches 12398 12399 12400 if (pointersLength > 1 && !session.firstMultiple) { 12401 session.firstMultiple = simpleCloneInputData(input); 12402 } else if (pointersLength === 1) { 12403 session.firstMultiple = false; 12404 } 12405 12406 var firstInput = session.firstInput; 12407 var firstMultiple = session.firstMultiple; 12408 var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; 12409 var center = input.center = getCenter(pointers); 12410 input.timeStamp = now(); 12411 input.deltaTime = input.timeStamp - firstInput.timeStamp; 12412 input.angle = getAngle(offsetCenter, center); 12413 input.distance = getDistance(offsetCenter, center); 12414 computeDeltaXY(session, input); 12415 input.offsetDirection = getDirection(input.deltaX, input.deltaY); 12416 var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); 12417 input.overallVelocityX = overallVelocity.x; 12418 input.overallVelocityY = overallVelocity.y; 12419 input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y; 12420 input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; 12421 input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; 12422 input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers; 12423 computeIntervalInputData(session, input); // find the correct target 12424 12425 var target = manager.element; 12426 12427 if (hasParent(input.srcEvent.target, target)) { 12428 target = input.srcEvent.target; 12429 } 12430 12431 input.target = target; 12432 } 12433 12434 function computeDeltaXY(session, input) { 12435 var center = input.center; 12436 var offset = session.offsetDelta || {}; 12437 var prevDelta = session.prevDelta || {}; 12438 var prevInput = session.prevInput || {}; 12439 12440 if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { 12441 prevDelta = session.prevDelta = { 12442 x: prevInput.deltaX || 0, 12443 y: prevInput.deltaY || 0 12444 }; 12445 offset = session.offsetDelta = { 12446 x: center.x, 12447 y: center.y 12448 }; 12449 } 12450 12451 input.deltaX = prevDelta.x + (center.x - offset.x); 12452 input.deltaY = prevDelta.y + (center.y - offset.y); 12453 } 12454 /** 12455 * velocity is calculated every x ms 12456 * @param {Object} session 12457 * @param {Object} input 12458 */ 12459 12460 12461 function computeIntervalInputData(session, input) { 12462 var last = session.lastInterval || input, 12463 deltaTime = input.timeStamp - last.timeStamp, 12464 velocity, 12465 velocityX, 12466 velocityY, 12467 direction; 12468 12469 if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { 12470 var deltaX = input.deltaX - last.deltaX; 12471 var deltaY = input.deltaY - last.deltaY; 12472 var v = getVelocity(deltaTime, deltaX, deltaY); 12473 velocityX = v.x; 12474 velocityY = v.y; 12475 velocity = abs(v.x) > abs(v.y) ? v.x : v.y; 12476 direction = getDirection(deltaX, deltaY); 12477 session.lastInterval = input; 12478 } else { 12479 // use latest velocity info if it doesn't overtake a minimum period 12480 velocity = last.velocity; 12481 velocityX = last.velocityX; 12482 velocityY = last.velocityY; 12483 direction = last.direction; 12484 } 12485 12486 input.velocity = velocity; 12487 input.velocityX = velocityX; 12488 input.velocityY = velocityY; 12489 input.direction = direction; 12490 } 12491 /** 12492 * create a simple clone from the input used for storage of firstInput and firstMultiple 12493 * @param {Object} input 12494 * @returns {Object} clonedInputData 12495 */ 12496 12497 12498 function simpleCloneInputData(input) { 12499 // make a simple copy of the pointers because we will get a reference if we don't 12500 // we only need clientXY for the calculations 12501 var pointers = []; 12502 var i = 0; 12503 12504 while (i < input.pointers.length) { 12505 pointers[i] = { 12506 clientX: round(input.pointers[i].clientX), 12507 clientY: round(input.pointers[i].clientY) 12508 }; 12509 i++; 12510 } 12511 12512 return { 12513 timeStamp: now(), 12514 pointers: pointers, 12515 center: getCenter(pointers), 12516 deltaX: input.deltaX, 12517 deltaY: input.deltaY 12518 }; 12519 } 12520 /** 12521 * get the center of all the pointers 12522 * @param {Array} pointers 12523 * @return {Object} center contains `x` and `y` properties 12524 */ 12525 12526 12527 function getCenter(pointers) { 12528 var pointersLength = pointers.length; // no need to loop when only one touch 12529 12530 if (pointersLength === 1) { 12531 return { 12532 x: round(pointers[0].clientX), 12533 y: round(pointers[0].clientY) 12534 }; 12535 } 12536 12537 var x = 0, 12538 y = 0, 12539 i = 0; 12540 12541 while (i < pointersLength) { 12542 x += pointers[i].clientX; 12543 y += pointers[i].clientY; 12544 i++; 12545 } 12546 12547 return { 12548 x: round(x / pointersLength), 12549 y: round(y / pointersLength) 12550 }; 12551 } 12552 /** 12553 * calculate the velocity between two points. unit is in px per ms. 12554 * @param {Number} deltaTime 12555 * @param {Number} x 12556 * @param {Number} y 12557 * @return {Object} velocity `x` and `y` 12558 */ 12559 12560 12561 function getVelocity(deltaTime, x, y) { 12562 return { 12563 x: x / deltaTime || 0, 12564 y: y / deltaTime || 0 12565 }; 12566 } 12567 /** 12568 * get the direction between two points 12569 * @param {Number} x 12570 * @param {Number} y 12571 * @return {Number} direction 12572 */ 12573 12574 12575 function getDirection(x, y) { 12576 if (x === y) { 12577 return DIRECTION_NONE; 12578 } 12579 12580 if (abs(x) >= abs(y)) { 12581 return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; 12582 } 12583 12584 return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; 12585 } 12586 /** 12587 * calculate the absolute distance between two points 12588 * @param {Object} p1 {x, y} 12589 * @param {Object} p2 {x, y} 12590 * @param {Array} [props] containing x and y keys 12591 * @return {Number} distance 12592 */ 12593 12594 12595 function getDistance(p1, p2, props) { 12596 if (!props) { 12597 props = PROPS_XY; 12598 } 12599 12600 var x = p2[props[0]] - p1[props[0]], 12601 y = p2[props[1]] - p1[props[1]]; 12602 return Math.sqrt(x * x + y * y); 12603 } 12604 /** 12605 * calculate the angle between two coordinates 12606 * @param {Object} p1 12607 * @param {Object} p2 12608 * @param {Array} [props] containing x and y keys 12609 * @return {Number} angle 12610 */ 12611 12612 12613 function getAngle(p1, p2, props) { 12614 if (!props) { 12615 props = PROPS_XY; 12616 } 12617 12618 var x = p2[props[0]] - p1[props[0]], 12619 y = p2[props[1]] - p1[props[1]]; 12620 return Math.atan2(y, x) * 180 / Math.PI; 12621 } 12622 /** 12623 * calculate the rotation degrees between two pointersets 12624 * @param {Array} start array of pointers 12625 * @param {Array} end array of pointers 12626 * @return {Number} rotation 12627 */ 12628 12629 12630 function getRotation(start, end) { 12631 return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); 12632 } 12633 /** 12634 * calculate the scale factor between two pointersets 12635 * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out 12636 * @param {Array} start array of pointers 12637 * @param {Array} end array of pointers 12638 * @return {Number} scale 12639 */ 12640 12641 12642 function getScale(start, end) { 12643 return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); 12644 } 12645 12646 var MOUSE_INPUT_MAP = { 12647 mousedown: INPUT_START, 12648 mousemove: INPUT_MOVE, 12649 mouseup: INPUT_END 12650 }; 12651 var MOUSE_ELEMENT_EVENTS = 'mousedown'; 12652 var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; 12653 /** 12654 * Mouse events input 12655 * @constructor 12656 * @extends Input 12657 */ 12658 12659 function MouseInput() { 12660 this.evEl = MOUSE_ELEMENT_EVENTS; 12661 this.evWin = MOUSE_WINDOW_EVENTS; 12662 this.pressed = false; // mousedown state 12663 12664 Input.apply(this, arguments); 12665 } 12666 12667 inherit(MouseInput, Input, { 12668 /** 12669 * handle mouse events 12670 * @param {Object} ev 12671 */ 12672 handler: function MEhandler(ev) { 12673 var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down 12674 12675 if (eventType & INPUT_START && ev.button === 0) { 12676 this.pressed = true; 12677 } 12678 12679 if (eventType & INPUT_MOVE && ev.which !== 1) { 12680 eventType = INPUT_END; 12681 } // mouse must be down 12682 12683 12684 if (!this.pressed) { 12685 return; 12686 } 12687 12688 if (eventType & INPUT_END) { 12689 this.pressed = false; 12690 } 12691 12692 this.callback(this.manager, eventType, { 12693 pointers: [ev], 12694 changedPointers: [ev], 12695 pointerType: INPUT_TYPE_MOUSE, 12696 srcEvent: ev 12697 }); 12698 } 12699 }); 12700 var POINTER_INPUT_MAP = { 12701 pointerdown: INPUT_START, 12702 pointermove: INPUT_MOVE, 12703 pointerup: INPUT_END, 12704 pointercancel: INPUT_CANCEL, 12705 pointerout: INPUT_CANCEL 12706 }; // in IE10 the pointer types is defined as an enum 12707 12708 var IE10_POINTER_TYPE_ENUM = { 12709 2: INPUT_TYPE_TOUCH, 12710 3: INPUT_TYPE_PEN, 12711 4: INPUT_TYPE_MOUSE, 12712 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 12713 12714 }; 12715 var POINTER_ELEMENT_EVENTS = 'pointerdown'; 12716 var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive 12717 12718 if (window.MSPointerEvent && !window.PointerEvent) { 12719 POINTER_ELEMENT_EVENTS = 'MSPointerDown'; 12720 POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; 12721 } 12722 /** 12723 * Pointer events input 12724 * @constructor 12725 * @extends Input 12726 */ 12727 12728 12729 function PointerEventInput() { 12730 this.evEl = POINTER_ELEMENT_EVENTS; 12731 this.evWin = POINTER_WINDOW_EVENTS; 12732 Input.apply(this, arguments); 12733 this.store = this.manager.session.pointerEvents = []; 12734 } 12735 12736 inherit(PointerEventInput, Input, { 12737 /** 12738 * handle mouse events 12739 * @param {Object} ev 12740 */ 12741 handler: function PEhandler(ev) { 12742 var store = this.store; 12743 var removePointer = false; 12744 var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); 12745 var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; 12746 var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; 12747 var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store 12748 12749 var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down 12750 12751 if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { 12752 if (storeIndex < 0) { 12753 store.push(ev); 12754 storeIndex = store.length - 1; 12755 } 12756 } else if (eventType & (INPUT_END | INPUT_CANCEL)) { 12757 removePointer = true; 12758 } // it not found, so the pointer hasn't been down (so it's probably a hover) 12759 12760 12761 if (storeIndex < 0) { 12762 return; 12763 } // update the event in the store 12764 12765 12766 store[storeIndex] = ev; 12767 this.callback(this.manager, eventType, { 12768 pointers: store, 12769 changedPointers: [ev], 12770 pointerType: pointerType, 12771 srcEvent: ev 12772 }); 12773 12774 if (removePointer) { 12775 // remove from the store 12776 store.splice(storeIndex, 1); 12777 } 12778 } 12779 }); 12780 var SINGLE_TOUCH_INPUT_MAP = { 12781 touchstart: INPUT_START, 12782 touchmove: INPUT_MOVE, 12783 touchend: INPUT_END, 12784 touchcancel: INPUT_CANCEL 12785 }; 12786 var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart'; 12787 var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel'; 12788 /** 12789 * Touch events input 12790 * @constructor 12791 * @extends Input 12792 */ 12793 12794 function SingleTouchInput() { 12795 this.evTarget = SINGLE_TOUCH_TARGET_EVENTS; 12796 this.evWin = SINGLE_TOUCH_WINDOW_EVENTS; 12797 this.started = false; 12798 Input.apply(this, arguments); 12799 } 12800 12801 inherit(SingleTouchInput, Input, { 12802 handler: function TEhandler(ev) { 12803 var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events? 12804 12805 if (type === INPUT_START) { 12806 this.started = true; 12807 } 12808 12809 if (!this.started) { 12810 return; 12811 } 12812 12813 var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state 12814 12815 if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) { 12816 this.started = false; 12817 } 12818 12819 this.callback(this.manager, type, { 12820 pointers: touches[0], 12821 changedPointers: touches[1], 12822 pointerType: INPUT_TYPE_TOUCH, 12823 srcEvent: ev 12824 }); 12825 } 12826 }); 12827 /** 12828 * @this {TouchInput} 12829 * @param {Object} ev 12830 * @param {Number} type flag 12831 * @returns {undefined|Array} [all, changed] 12832 */ 12833 12834 function normalizeSingleTouches(ev, type) { 12835 var all = toArray(ev.touches); 12836 var changed = toArray(ev.changedTouches); 12837 12838 if (type & (INPUT_END | INPUT_CANCEL)) { 12839 all = uniqueArray(all.concat(changed), 'identifier', true); 12840 } 12841 12842 return [all, changed]; 12843 } 12844 12845 var TOUCH_INPUT_MAP = { 12846 touchstart: INPUT_START, 12847 touchmove: INPUT_MOVE, 12848 touchend: INPUT_END, 12849 touchcancel: INPUT_CANCEL 12850 }; 12851 var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; 12852 /** 12853 * Multi-user touch events input 12854 * @constructor 12855 * @extends Input 12856 */ 12857 12858 function TouchInput() { 12859 this.evTarget = TOUCH_TARGET_EVENTS; 12860 this.targetIds = {}; 12861 Input.apply(this, arguments); 12862 } 12863 12864 inherit(TouchInput, Input, { 12865 handler: function MTEhandler(ev) { 12866 var type = TOUCH_INPUT_MAP[ev.type]; 12867 var touches = getTouches.call(this, ev, type); 12868 12869 if (!touches) { 12870 return; 12871 } 12872 12873 this.callback(this.manager, type, { 12874 pointers: touches[0], 12875 changedPointers: touches[1], 12876 pointerType: INPUT_TYPE_TOUCH, 12877 srcEvent: ev 12878 }); 12879 } 12880 }); 12881 /** 12882 * @this {TouchInput} 12883 * @param {Object} ev 12884 * @param {Number} type flag 12885 * @returns {undefined|Array} [all, changed] 12886 */ 12887 12888 function getTouches(ev, type) { 12889 var allTouches = toArray(ev.touches); 12890 var targetIds = this.targetIds; // when there is only one touch, the process can be simplified 12891 12892 if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { 12893 targetIds[allTouches[0].identifier] = true; 12894 return [allTouches, allTouches]; 12895 } 12896 12897 var i, 12898 targetTouches, 12899 changedTouches = toArray(ev.changedTouches), 12900 changedTargetTouches = [], 12901 target = this.target; // get target touches from touches 12902 12903 targetTouches = allTouches.filter(function (touch) { 12904 return hasParent(touch.target, target); 12905 }); // collect touches 12906 12907 if (type === INPUT_START) { 12908 i = 0; 12909 12910 while (i < targetTouches.length) { 12911 targetIds[targetTouches[i].identifier] = true; 12912 i++; 12913 } 12914 } // filter changed touches to only contain touches that exist in the collected target ids 12915 12916 12917 i = 0; 12918 12919 while (i < changedTouches.length) { 12920 if (targetIds[changedTouches[i].identifier]) { 12921 changedTargetTouches.push(changedTouches[i]); 12922 } // cleanup removed touches 12923 12924 12925 if (type & (INPUT_END | INPUT_CANCEL)) { 12926 delete targetIds[changedTouches[i].identifier]; 12927 } 12928 12929 i++; 12930 } 12931 12932 if (!changedTargetTouches.length) { 12933 return; 12934 } 12935 12936 return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' 12937 uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches]; 12938 } 12939 /** 12940 * Combined touch and mouse input 12941 * 12942 * Touch has a higher priority then mouse, and while touching no mouse events are allowed. 12943 * This because touch devices also emit mouse events while doing a touch. 12944 * 12945 * @constructor 12946 * @extends Input 12947 */ 12948 12949 12950 var DEDUP_TIMEOUT = 2500; 12951 var DEDUP_DISTANCE = 25; 12952 12953 function TouchMouseInput() { 12954 Input.apply(this, arguments); 12955 var handler = bindFn(this.handler, this); 12956 this.touch = new TouchInput(this.manager, handler); 12957 this.mouse = new MouseInput(this.manager, handler); 12958 this.primaryTouch = null; 12959 this.lastTouches = []; 12960 } 12961 12962 inherit(TouchMouseInput, Input, { 12963 /** 12964 * handle mouse and touch events 12965 * @param {Hammer} manager 12966 * @param {String} inputEvent 12967 * @param {Object} inputData 12968 */ 12969 handler: function TMEhandler(manager, inputEvent, inputData) { 12970 var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH, 12971 isMouse = inputData.pointerType == INPUT_TYPE_MOUSE; 12972 12973 if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) { 12974 return; 12975 } // when we're in a touch event, record touches to de-dupe synthetic mouse event 12976 12977 12978 if (isTouch) { 12979 recordTouches.call(this, inputEvent, inputData); 12980 } else if (isMouse && isSyntheticEvent.call(this, inputData)) { 12981 return; 12982 } 12983 12984 this.callback(manager, inputEvent, inputData); 12985 }, 12986 12987 /** 12988 * remove the event listeners 12989 */ 12990 destroy: function destroy() { 12991 this.touch.destroy(); 12992 this.mouse.destroy(); 12993 } 12994 }); 12995 12996 function recordTouches(eventType, eventData) { 12997 if (eventType & INPUT_START) { 12998 this.primaryTouch = eventData.changedPointers[0].identifier; 12999 setLastTouch.call(this, eventData); 13000 } else if (eventType & (INPUT_END | INPUT_CANCEL)) { 13001 setLastTouch.call(this, eventData); 13002 } 13003 } 13004 13005 function setLastTouch(eventData) { 13006 var touch = eventData.changedPointers[0]; 13007 13008 if (touch.identifier === this.primaryTouch) { 13009 var lastTouch = { 13010 x: touch.clientX, 13011 y: touch.clientY 13012 }; 13013 this.lastTouches.push(lastTouch); 13014 var lts = this.lastTouches; 13015 13016 var removeLastTouch = function removeLastTouch() { 13017 var i = lts.indexOf(lastTouch); 13018 13019 if (i > -1) { 13020 lts.splice(i, 1); 13021 } 13022 }; 13023 13024 setTimeout(removeLastTouch, DEDUP_TIMEOUT); 13025 } 13026 } 13027 13028 function isSyntheticEvent(eventData) { 13029 var x = eventData.srcEvent.clientX, 13030 y = eventData.srcEvent.clientY; 13031 13032 for (var i = 0; i < this.lastTouches.length; i++) { 13033 var t = this.lastTouches[i]; 13034 var dx = Math.abs(x - t.x), 13035 dy = Math.abs(y - t.y); 13036 13037 if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) { 13038 return true; 13039 } 13040 } 13041 13042 return false; 13043 } 13044 13045 var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); 13046 var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value 13047 13048 var TOUCH_ACTION_COMPUTE = 'compute'; 13049 var TOUCH_ACTION_AUTO = 'auto'; 13050 var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented 13051 13052 var TOUCH_ACTION_NONE = 'none'; 13053 var TOUCH_ACTION_PAN_X = 'pan-x'; 13054 var TOUCH_ACTION_PAN_Y = 'pan-y'; 13055 var TOUCH_ACTION_MAP = getTouchActionProps(); 13056 /** 13057 * Touch Action 13058 * sets the touchAction property or uses the js alternative 13059 * @param {Manager} manager 13060 * @param {String} value 13061 * @constructor 13062 */ 13063 13064 function TouchAction(manager, value) { 13065 this.manager = manager; 13066 this.set(value); 13067 } 13068 13069 TouchAction.prototype = { 13070 /** 13071 * set the touchAction value on the element or enable the polyfill 13072 * @param {String} value 13073 */ 13074 set: function set(value) { 13075 // find out the touch-action by the event handlers 13076 if (value == TOUCH_ACTION_COMPUTE) { 13077 value = this.compute(); 13078 } 13079 13080 if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) { 13081 this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; 13082 } 13083 13084 this.actions = value.toLowerCase().trim(); 13085 }, 13086 13087 /** 13088 * just re-set the touchAction value 13089 */ 13090 update: function update() { 13091 this.set(this.manager.options.touchAction); 13092 }, 13093 13094 /** 13095 * compute the value for the touchAction property based on the recognizer's settings 13096 * @returns {String} value 13097 */ 13098 compute: function compute() { 13099 var actions = []; 13100 each(this.manager.recognizers, function (recognizer) { 13101 if (boolOrFn(recognizer.options.enable, [recognizer])) { 13102 actions = actions.concat(recognizer.getTouchAction()); 13103 } 13104 }); 13105 return cleanTouchActions(actions.join(' ')); 13106 }, 13107 13108 /** 13109 * this method is called on each input cycle and provides the preventing of the browser behavior 13110 * @param {Object} input 13111 */ 13112 preventDefaults: function preventDefaults(input) { 13113 var srcEvent = input.srcEvent; 13114 var direction = input.offsetDirection; // if the touch action did prevented once this session 13115 13116 if (this.manager.session.prevented) { 13117 srcEvent.preventDefault(); 13118 return; 13119 } 13120 13121 var actions = this.actions; 13122 var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE]; 13123 var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y]; 13124 var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X]; 13125 13126 if (hasNone) { 13127 //do not prevent defaults if this is a tap gesture 13128 var isTapPointer = input.pointers.length === 1; 13129 var isTapMovement = input.distance < 2; 13130 var isTapTouchTime = input.deltaTime < 250; 13131 13132 if (isTapPointer && isTapMovement && isTapTouchTime) { 13133 return; 13134 } 13135 } 13136 13137 if (hasPanX && hasPanY) { 13138 // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent 13139 return; 13140 } 13141 13142 if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) { 13143 return this.preventSrc(srcEvent); 13144 } 13145 }, 13146 13147 /** 13148 * call preventDefault to prevent the browser's default behavior (scrolling in most cases) 13149 * @param {Object} srcEvent 13150 */ 13151 preventSrc: function preventSrc(srcEvent) { 13152 this.manager.session.prevented = true; 13153 srcEvent.preventDefault(); 13154 } 13155 }; 13156 /** 13157 * when the touchActions are collected they are not a valid value, so we need to clean things up. * 13158 * @param {String} actions 13159 * @returns {*} 13160 */ 13161 13162 function cleanTouchActions(actions) { 13163 // none 13164 if (inStr(actions, TOUCH_ACTION_NONE)) { 13165 return TOUCH_ACTION_NONE; 13166 } 13167 13168 var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); 13169 var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers 13170 // for different directions, e.g. horizontal pan but vertical swipe?) 13171 // we need none (as otherwise with pan-x pan-y combined none of these 13172 // recognizers will work, since the browser would handle all panning 13173 13174 if (hasPanX && hasPanY) { 13175 return TOUCH_ACTION_NONE; 13176 } // pan-x OR pan-y 13177 13178 13179 if (hasPanX || hasPanY) { 13180 return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; 13181 } // manipulation 13182 13183 13184 if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { 13185 return TOUCH_ACTION_MANIPULATION; 13186 } 13187 13188 return TOUCH_ACTION_AUTO; 13189 } 13190 13191 function getTouchActionProps() { 13192 if (!NATIVE_TOUCH_ACTION) { 13193 return false; 13194 } 13195 13196 var touchMap = {}; 13197 var cssSupports = window.CSS && window.CSS.supports; 13198 ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) { 13199 // If css.supports is not supported but there is native touch-action assume it supports 13200 // all values. This is the case for IE 10 and 11. 13201 touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true; 13202 }); 13203 return touchMap; 13204 } 13205 /** 13206 * Recognizer flow explained; * 13207 * All recognizers have the initial state of POSSIBLE when a input session starts. 13208 * The definition of a input session is from the first input until the last input, with all it's movement in it. * 13209 * Example session for mouse-input: mousedown -> mousemove -> mouseup 13210 * 13211 * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed 13212 * which determines with state it should be. 13213 * 13214 * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to 13215 * POSSIBLE to give it another change on the next cycle. 13216 * 13217 * Possible 13218 * | 13219 * +-----+---------------+ 13220 * | | 13221 * +-----+-----+ | 13222 * | | | 13223 * Failed Cancelled | 13224 * +-------+------+ 13225 * | | 13226 * Recognized Began 13227 * | 13228 * Changed 13229 * | 13230 * Ended/Recognized 13231 */ 13232 13233 13234 var STATE_POSSIBLE = 1; 13235 var STATE_BEGAN = 2; 13236 var STATE_CHANGED = 4; 13237 var STATE_ENDED = 8; 13238 var STATE_RECOGNIZED = STATE_ENDED; 13239 var STATE_CANCELLED = 16; 13240 var STATE_FAILED = 32; 13241 /** 13242 * Recognizer 13243 * Every recognizer needs to extend from this class. 13244 * @constructor 13245 * @param {Object} options 13246 */ 13247 13248 function Recognizer(options) { 13249 this.options = assign({}, this.defaults, options || {}); 13250 this.id = uniqueId(); 13251 this.manager = null; // default is enable true 13252 13253 this.options.enable = ifUndefined(this.options.enable, true); 13254 this.state = STATE_POSSIBLE; 13255 this.simultaneous = {}; 13256 this.requireFail = []; 13257 } 13258 13259 Recognizer.prototype = { 13260 /** 13261 * @virtual 13262 * @type {Object} 13263 */ 13264 defaults: {}, 13265 13266 /** 13267 * set options 13268 * @param {Object} options 13269 * @return {Recognizer} 13270 */ 13271 set: function set(options) { 13272 assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state 13273 13274 this.manager && this.manager.touchAction.update(); 13275 return this; 13276 }, 13277 13278 /** 13279 * recognize simultaneous with an other recognizer. 13280 * @param {Recognizer} otherRecognizer 13281 * @returns {Recognizer} this 13282 */ 13283 recognizeWith: function recognizeWith(otherRecognizer) { 13284 if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { 13285 return this; 13286 } 13287 13288 var simultaneous = this.simultaneous; 13289 otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); 13290 13291 if (!simultaneous[otherRecognizer.id]) { 13292 simultaneous[otherRecognizer.id] = otherRecognizer; 13293 otherRecognizer.recognizeWith(this); 13294 } 13295 13296 return this; 13297 }, 13298 13299 /** 13300 * drop the simultaneous link. it doesnt remove the link on the other recognizer. 13301 * @param {Recognizer} otherRecognizer 13302 * @returns {Recognizer} this 13303 */ 13304 dropRecognizeWith: function dropRecognizeWith(otherRecognizer) { 13305 if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { 13306 return this; 13307 } 13308 13309 otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); 13310 delete this.simultaneous[otherRecognizer.id]; 13311 return this; 13312 }, 13313 13314 /** 13315 * recognizer can only run when an other is failing 13316 * @param {Recognizer} otherRecognizer 13317 * @returns {Recognizer} this 13318 */ 13319 requireFailure: function requireFailure(otherRecognizer) { 13320 if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { 13321 return this; 13322 } 13323 13324 var requireFail = this.requireFail; 13325 otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); 13326 13327 if (inArray(requireFail, otherRecognizer) === -1) { 13328 requireFail.push(otherRecognizer); 13329 otherRecognizer.requireFailure(this); 13330 } 13331 13332 return this; 13333 }, 13334 13335 /** 13336 * drop the requireFailure link. it does not remove the link on the other recognizer. 13337 * @param {Recognizer} otherRecognizer 13338 * @returns {Recognizer} this 13339 */ 13340 dropRequireFailure: function dropRequireFailure(otherRecognizer) { 13341 if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { 13342 return this; 13343 } 13344 13345 otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); 13346 var index = inArray(this.requireFail, otherRecognizer); 13347 13348 if (index > -1) { 13349 this.requireFail.splice(index, 1); 13350 } 13351 13352 return this; 13353 }, 13354 13355 /** 13356 * has require failures boolean 13357 * @returns {boolean} 13358 */ 13359 hasRequireFailures: function hasRequireFailures() { 13360 return this.requireFail.length > 0; 13361 }, 13362 13363 /** 13364 * if the recognizer can recognize simultaneous with an other recognizer 13365 * @param {Recognizer} otherRecognizer 13366 * @returns {Boolean} 13367 */ 13368 canRecognizeWith: function canRecognizeWith(otherRecognizer) { 13369 return !!this.simultaneous[otherRecognizer.id]; 13370 }, 13371 13372 /** 13373 * You should use `tryEmit` instead of `emit` directly to check 13374 * that all the needed recognizers has failed before emitting. 13375 * @param {Object} input 13376 */ 13377 emit: function emit(input) { 13378 var self = this; 13379 var state = this.state; 13380 13381 function emit(event) { 13382 self.manager.emit(event, input); 13383 } // 'panstart' and 'panmove' 13384 13385 13386 if (state < STATE_ENDED) { 13387 emit(self.options.event + stateStr(state)); 13388 } 13389 13390 emit(self.options.event); // simple 'eventName' events 13391 13392 if (input.additionalEvent) { 13393 // additional event(panleft, panright, pinchin, pinchout...) 13394 emit(input.additionalEvent); 13395 } // panend and pancancel 13396 13397 13398 if (state >= STATE_ENDED) { 13399 emit(self.options.event + stateStr(state)); 13400 } 13401 }, 13402 13403 /** 13404 * Check that all the require failure recognizers has failed, 13405 * if true, it emits a gesture event, 13406 * otherwise, setup the state to FAILED. 13407 * @param {Object} input 13408 */ 13409 tryEmit: function tryEmit(input) { 13410 if (this.canEmit()) { 13411 return this.emit(input); 13412 } // it's failing anyway 13413 13414 13415 this.state = STATE_FAILED; 13416 }, 13417 13418 /** 13419 * can we emit? 13420 * @returns {boolean} 13421 */ 13422 canEmit: function canEmit() { 13423 var i = 0; 13424 13425 while (i < this.requireFail.length) { 13426 if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { 13427 return false; 13428 } 13429 13430 i++; 13431 } 13432 13433 return true; 13434 }, 13435 13436 /** 13437 * update the recognizer 13438 * @param {Object} inputData 13439 */ 13440 recognize: function recognize(inputData) { 13441 // make a new copy of the inputData 13442 // so we can change the inputData without messing up the other recognizers 13443 var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing? 13444 13445 if (!boolOrFn(this.options.enable, [this, inputDataClone])) { 13446 this.reset(); 13447 this.state = STATE_FAILED; 13448 return; 13449 } // reset when we've reached the end 13450 13451 13452 if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { 13453 this.state = STATE_POSSIBLE; 13454 } 13455 13456 this.state = this.process(inputDataClone); // the recognizer has recognized a gesture 13457 // so trigger an event 13458 13459 if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { 13460 this.tryEmit(inputDataClone); 13461 } 13462 }, 13463 13464 /** 13465 * return the state of the recognizer 13466 * the actual recognizing happens in this method 13467 * @virtual 13468 * @param {Object} inputData 13469 * @returns {Const} STATE 13470 */ 13471 process: function process(inputData) {}, 13472 // jshint ignore:line 13473 13474 /** 13475 * return the preferred touch-action 13476 * @virtual 13477 * @returns {Array} 13478 */ 13479 getTouchAction: function getTouchAction() {}, 13480 13481 /** 13482 * called when the gesture isn't allowed to recognize 13483 * like when another is being recognized or it is disabled 13484 * @virtual 13485 */ 13486 reset: function reset() {} 13487 }; 13488 /** 13489 * get a usable string, used as event postfix 13490 * @param {Const} state 13491 * @returns {String} state 13492 */ 13493 13494 function stateStr(state) { 13495 if (state & STATE_CANCELLED) { 13496 return 'cancel'; 13497 } else if (state & STATE_ENDED) { 13498 return 'end'; 13499 } else if (state & STATE_CHANGED) { 13500 return 'move'; 13501 } else if (state & STATE_BEGAN) { 13502 return 'start'; 13503 } 13504 13505 return ''; 13506 } 13507 /** 13508 * direction cons to string 13509 * @param {Const} direction 13510 * @returns {String} 13511 */ 13512 13513 13514 function directionStr(direction) { 13515 if (direction == DIRECTION_DOWN) { 13516 return 'down'; 13517 } else if (direction == DIRECTION_UP) { 13518 return 'up'; 13519 } else if (direction == DIRECTION_LEFT) { 13520 return 'left'; 13521 } else if (direction == DIRECTION_RIGHT) { 13522 return 'right'; 13523 } 13524 13525 return ''; 13526 } 13527 /** 13528 * get a recognizer by name if it is bound to a manager 13529 * @param {Recognizer|String} otherRecognizer 13530 * @param {Recognizer} recognizer 13531 * @returns {Recognizer} 13532 */ 13533 13534 13535 function getRecognizerByNameIfManager(otherRecognizer, recognizer) { 13536 var manager = recognizer.manager; 13537 13538 if (manager) { 13539 return manager.get(otherRecognizer); 13540 } 13541 13542 return otherRecognizer; 13543 } 13544 /** 13545 * This recognizer is just used as a base for the simple attribute recognizers. 13546 * @constructor 13547 * @extends Recognizer 13548 */ 13549 13550 13551 function AttrRecognizer() { 13552 Recognizer.apply(this, arguments); 13553 } 13554 13555 inherit(AttrRecognizer, Recognizer, { 13556 /** 13557 * @namespace 13558 * @memberof AttrRecognizer 13559 */ 13560 defaults: { 13561 /** 13562 * @type {Number} 13563 * @default 1 13564 */ 13565 pointers: 1 13566 }, 13567 13568 /** 13569 * Used to check if it the recognizer receives valid input, like input.distance > 10. 13570 * @memberof AttrRecognizer 13571 * @param {Object} input 13572 * @returns {Boolean} recognized 13573 */ 13574 attrTest: function attrTest(input) { 13575 var optionPointers = this.options.pointers; 13576 return optionPointers === 0 || input.pointers.length === optionPointers; 13577 }, 13578 13579 /** 13580 * Process the input and return the state for the recognizer 13581 * @memberof AttrRecognizer 13582 * @param {Object} input 13583 * @returns {*} State 13584 */ 13585 process: function process(input) { 13586 var state = this.state; 13587 var eventType = input.eventType; 13588 var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); 13589 var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED 13590 13591 if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { 13592 return state | STATE_CANCELLED; 13593 } else if (isRecognized || isValid) { 13594 if (eventType & INPUT_END) { 13595 return state | STATE_ENDED; 13596 } else if (!(state & STATE_BEGAN)) { 13597 return STATE_BEGAN; 13598 } 13599 13600 return state | STATE_CHANGED; 13601 } 13602 13603 return STATE_FAILED; 13604 } 13605 }); 13606 /** 13607 * Pan 13608 * Recognized when the pointer is down and moved in the allowed direction. 13609 * @constructor 13610 * @extends AttrRecognizer 13611 */ 13612 13613 function PanRecognizer() { 13614 AttrRecognizer.apply(this, arguments); 13615 this.pX = null; 13616 this.pY = null; 13617 } 13618 13619 inherit(PanRecognizer, AttrRecognizer, { 13620 /** 13621 * @namespace 13622 * @memberof PanRecognizer 13623 */ 13624 defaults: { 13625 event: 'pan', 13626 threshold: 10, 13627 pointers: 1, 13628 direction: DIRECTION_ALL 13629 }, 13630 getTouchAction: function getTouchAction() { 13631 var direction = this.options.direction; 13632 var actions = []; 13633 13634 if (direction & DIRECTION_HORIZONTAL) { 13635 actions.push(TOUCH_ACTION_PAN_Y); 13636 } 13637 13638 if (direction & DIRECTION_VERTICAL) { 13639 actions.push(TOUCH_ACTION_PAN_X); 13640 } 13641 13642 return actions; 13643 }, 13644 directionTest: function directionTest(input) { 13645 var options = this.options; 13646 var hasMoved = true; 13647 var distance = input.distance; 13648 var direction = input.direction; 13649 var x = input.deltaX; 13650 var y = input.deltaY; // lock to axis? 13651 13652 if (!(direction & options.direction)) { 13653 if (options.direction & DIRECTION_HORIZONTAL) { 13654 direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; 13655 hasMoved = x != this.pX; 13656 distance = Math.abs(input.deltaX); 13657 } else { 13658 direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN; 13659 hasMoved = y != this.pY; 13660 distance = Math.abs(input.deltaY); 13661 } 13662 } 13663 13664 input.direction = direction; 13665 return hasMoved && distance > options.threshold && direction & options.direction; 13666 }, 13667 attrTest: function attrTest(input) { 13668 return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input)); 13669 }, 13670 emit: function emit(input) { 13671 this.pX = input.deltaX; 13672 this.pY = input.deltaY; 13673 var direction = directionStr(input.direction); 13674 13675 if (direction) { 13676 input.additionalEvent = this.options.event + direction; 13677 } 13678 13679 this._super.emit.call(this, input); 13680 } 13681 }); 13682 /** 13683 * Pinch 13684 * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out). 13685 * @constructor 13686 * @extends AttrRecognizer 13687 */ 13688 13689 function PinchRecognizer() { 13690 AttrRecognizer.apply(this, arguments); 13691 } 13692 13693 inherit(PinchRecognizer, AttrRecognizer, { 13694 /** 13695 * @namespace 13696 * @memberof PinchRecognizer 13697 */ 13698 defaults: { 13699 event: 'pinch', 13700 threshold: 0, 13701 pointers: 2 13702 }, 13703 getTouchAction: function getTouchAction() { 13704 return [TOUCH_ACTION_NONE]; 13705 }, 13706 attrTest: function attrTest(input) { 13707 return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN); 13708 }, 13709 emit: function emit(input) { 13710 if (input.scale !== 1) { 13711 var inOut = input.scale < 1 ? 'in' : 'out'; 13712 input.additionalEvent = this.options.event + inOut; 13713 } 13714 13715 this._super.emit.call(this, input); 13716 } 13717 }); 13718 /** 13719 * Press 13720 * Recognized when the pointer is down for x ms without any movement. 13721 * @constructor 13722 * @extends Recognizer 13723 */ 13724 13725 function PressRecognizer() { 13726 Recognizer.apply(this, arguments); 13727 this._timer = null; 13728 this._input = null; 13729 } 13730 13731 inherit(PressRecognizer, Recognizer, { 13732 /** 13733 * @namespace 13734 * @memberof PressRecognizer 13735 */ 13736 defaults: { 13737 event: 'press', 13738 pointers: 1, 13739 time: 251, 13740 // minimal time of the pointer to be pressed 13741 threshold: 9 // a minimal movement is ok, but keep it low 13742 13743 }, 13744 getTouchAction: function getTouchAction() { 13745 return [TOUCH_ACTION_AUTO]; 13746 }, 13747 process: function process(input) { 13748 var options = this.options; 13749 var validPointers = input.pointers.length === options.pointers; 13750 var validMovement = input.distance < options.threshold; 13751 var validTime = input.deltaTime > options.time; 13752 this._input = input; // we only allow little movement 13753 // and we've reached an end event, so a tap is possible 13754 13755 if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) { 13756 this.reset(); 13757 } else if (input.eventType & INPUT_START) { 13758 this.reset(); 13759 this._timer = setTimeoutContext(function () { 13760 this.state = STATE_RECOGNIZED; 13761 this.tryEmit(); 13762 }, options.time, this); 13763 } else if (input.eventType & INPUT_END) { 13764 return STATE_RECOGNIZED; 13765 } 13766 13767 return STATE_FAILED; 13768 }, 13769 reset: function reset() { 13770 clearTimeout(this._timer); 13771 }, 13772 emit: function emit(input) { 13773 if (this.state !== STATE_RECOGNIZED) { 13774 return; 13775 } 13776 13777 if (input && input.eventType & INPUT_END) { 13778 this.manager.emit(this.options.event + 'up', input); 13779 } else { 13780 this._input.timeStamp = now(); 13781 this.manager.emit(this.options.event, this._input); 13782 } 13783 } 13784 }); 13785 /** 13786 * Rotate 13787 * Recognized when two or more pointer are moving in a circular motion. 13788 * @constructor 13789 * @extends AttrRecognizer 13790 */ 13791 13792 function RotateRecognizer() { 13793 AttrRecognizer.apply(this, arguments); 13794 } 13795 13796 inherit(RotateRecognizer, AttrRecognizer, { 13797 /** 13798 * @namespace 13799 * @memberof RotateRecognizer 13800 */ 13801 defaults: { 13802 event: 'rotate', 13803 threshold: 0, 13804 pointers: 2 13805 }, 13806 getTouchAction: function getTouchAction() { 13807 return [TOUCH_ACTION_NONE]; 13808 }, 13809 attrTest: function attrTest(input) { 13810 return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN); 13811 } 13812 }); 13813 /** 13814 * Swipe 13815 * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction. 13816 * @constructor 13817 * @extends AttrRecognizer 13818 */ 13819 13820 function SwipeRecognizer() { 13821 AttrRecognizer.apply(this, arguments); 13822 } 13823 13824 inherit(SwipeRecognizer, AttrRecognizer, { 13825 /** 13826 * @namespace 13827 * @memberof SwipeRecognizer 13828 */ 13829 defaults: { 13830 event: 'swipe', 13831 threshold: 10, 13832 velocity: 0.3, 13833 direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, 13834 pointers: 1 13835 }, 13836 getTouchAction: function getTouchAction() { 13837 return PanRecognizer.prototype.getTouchAction.call(this); 13838 }, 13839 attrTest: function attrTest(input) { 13840 var direction = this.options.direction; 13841 var velocity; 13842 13843 if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { 13844 velocity = input.overallVelocity; 13845 } else if (direction & DIRECTION_HORIZONTAL) { 13846 velocity = input.overallVelocityX; 13847 } else if (direction & DIRECTION_VERTICAL) { 13848 velocity = input.overallVelocityY; 13849 } 13850 13851 return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END; 13852 }, 13853 emit: function emit(input) { 13854 var direction = directionStr(input.offsetDirection); 13855 13856 if (direction) { 13857 this.manager.emit(this.options.event + direction, input); 13858 } 13859 13860 this.manager.emit(this.options.event, input); 13861 } 13862 }); 13863 /** 13864 * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur 13865 * between the given interval and position. The delay option can be used to recognize multi-taps without firing 13866 * a single tap. 13867 * 13868 * The eventData from the emitted event contains the property `tapCount`, which contains the amount of 13869 * multi-taps being recognized. 13870 * @constructor 13871 * @extends Recognizer 13872 */ 13873 13874 function TapRecognizer() { 13875 Recognizer.apply(this, arguments); // previous time and center, 13876 // used for tap counting 13877 13878 this.pTime = false; 13879 this.pCenter = false; 13880 this._timer = null; 13881 this._input = null; 13882 this.count = 0; 13883 } 13884 13885 inherit(TapRecognizer, Recognizer, { 13886 /** 13887 * @namespace 13888 * @memberof PinchRecognizer 13889 */ 13890 defaults: { 13891 event: 'tap', 13892 pointers: 1, 13893 taps: 1, 13894 interval: 300, 13895 // max time between the multi-tap taps 13896 time: 250, 13897 // max time of the pointer to be down (like finger on the screen) 13898 threshold: 9, 13899 // a minimal movement is ok, but keep it low 13900 posThreshold: 10 // a multi-tap can be a bit off the initial position 13901 13902 }, 13903 getTouchAction: function getTouchAction() { 13904 return [TOUCH_ACTION_MANIPULATION]; 13905 }, 13906 process: function process(input) { 13907 var options = this.options; 13908 var validPointers = input.pointers.length === options.pointers; 13909 var validMovement = input.distance < options.threshold; 13910 var validTouchTime = input.deltaTime < options.time; 13911 this.reset(); 13912 13913 if (input.eventType & INPUT_START && this.count === 0) { 13914 return this.failTimeout(); 13915 } // we only allow little movement 13916 // and we've reached an end event, so a tap is possible 13917 13918 13919 if (validMovement && validTouchTime && validPointers) { 13920 if (input.eventType != INPUT_END) { 13921 return this.failTimeout(); 13922 } 13923 13924 var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true; 13925 var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold; 13926 this.pTime = input.timeStamp; 13927 this.pCenter = input.center; 13928 13929 if (!validMultiTap || !validInterval) { 13930 this.count = 1; 13931 } else { 13932 this.count += 1; 13933 } 13934 13935 this._input = input; // if tap count matches we have recognized it, 13936 // else it has began recognizing... 13937 13938 var tapCount = this.count % options.taps; 13939 13940 if (tapCount === 0) { 13941 // no failing requirements, immediately trigger the tap event 13942 // or wait as long as the multitap interval to trigger 13943 if (!this.hasRequireFailures()) { 13944 return STATE_RECOGNIZED; 13945 } else { 13946 this._timer = setTimeoutContext(function () { 13947 this.state = STATE_RECOGNIZED; 13948 this.tryEmit(); 13949 }, options.interval, this); 13950 return STATE_BEGAN; 13951 } 13952 } 13953 } 13954 13955 return STATE_FAILED; 13956 }, 13957 failTimeout: function failTimeout() { 13958 this._timer = setTimeoutContext(function () { 13959 this.state = STATE_FAILED; 13960 }, this.options.interval, this); 13961 return STATE_FAILED; 13962 }, 13963 reset: function reset() { 13964 clearTimeout(this._timer); 13965 }, 13966 emit: function emit() { 13967 if (this.state == STATE_RECOGNIZED) { 13968 this._input.tapCount = this.count; 13969 this.manager.emit(this.options.event, this._input); 13970 } 13971 } 13972 }); 13973 /** 13974 * Simple way to create a manager with a default set of recognizers. 13975 * @param {HTMLElement} element 13976 * @param {Object} [options] 13977 * @constructor 13978 */ 13979 13980 function Hammer(element, options) { 13981 options = options || {}; 13982 options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset); 13983 return new Manager(element, options); 13984 } 13985 /** 13986 * @const {string} 13987 */ 13988 13989 13990 Hammer.VERSION = '2.0.7'; 13991 /** 13992 * default settings 13993 * @namespace 13994 */ 13995 13996 Hammer.defaults = { 13997 /** 13998 * set if DOM events are being triggered. 13999 * But this is slower and unused by simple implementations, so disabled by default. 14000 * @type {Boolean} 14001 * @default false 14002 */ 14003 domEvents: false, 14004 14005 /** 14006 * The value for the touchAction property/fallback. 14007 * When set to `compute` it will magically set the correct value based on the added recognizers. 14008 * @type {String} 14009 * @default compute 14010 */ 14011 touchAction: TOUCH_ACTION_COMPUTE, 14012 14013 /** 14014 * @type {Boolean} 14015 * @default true 14016 */ 14017 enable: true, 14018 14019 /** 14020 * EXPERIMENTAL FEATURE -- can be removed/changed 14021 * Change the parent input target element. 14022 * If Null, then it is being set the to main element. 14023 * @type {Null|EventTarget} 14024 * @default null 14025 */ 14026 inputTarget: null, 14027 14028 /** 14029 * force an input class 14030 * @type {Null|Function} 14031 * @default null 14032 */ 14033 inputClass: null, 14034 14035 /** 14036 * Default recognizer setup when calling `Hammer()` 14037 * When creating a new Manager these will be skipped. 14038 * @type {Array} 14039 */ 14040 preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...] 14041 [RotateRecognizer, { 14042 enable: false 14043 }], [PinchRecognizer, { 14044 enable: false 14045 }, ['rotate']], [SwipeRecognizer, { 14046 direction: DIRECTION_HORIZONTAL 14047 }], [PanRecognizer, { 14048 direction: DIRECTION_HORIZONTAL 14049 }, ['swipe']], [TapRecognizer], [TapRecognizer, { 14050 event: 'doubletap', 14051 taps: 2 14052 }, ['tap']], [PressRecognizer]], 14053 14054 /** 14055 * Some CSS properties can be used to improve the working of Hammer. 14056 * Add them to this method and they will be set when creating a new Manager. 14057 * @namespace 14058 */ 14059 cssProps: { 14060 /** 14061 * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. 14062 * @type {String} 14063 * @default 'none' 14064 */ 14065 userSelect: 'none', 14066 14067 /** 14068 * Disable the Windows Phone grippers when pressing an element. 14069 * @type {String} 14070 * @default 'none' 14071 */ 14072 touchSelect: 'none', 14073 14074 /** 14075 * Disables the default callout shown when you touch and hold a touch target. 14076 * On iOS, when you touch and hold a touch target such as a link, Safari displays 14077 * a callout containing information about the link. This property allows you to disable that callout. 14078 * @type {String} 14079 * @default 'none' 14080 */ 14081 touchCallout: 'none', 14082 14083 /** 14084 * Specifies whether zooming is enabled. Used by IE10> 14085 * @type {String} 14086 * @default 'none' 14087 */ 14088 contentZooming: 'none', 14089 14090 /** 14091 * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. 14092 * @type {String} 14093 * @default 'none' 14094 */ 14095 userDrag: 'none', 14096 14097 /** 14098 * Overrides the highlight color shown when the user taps a link or a JavaScript 14099 * clickable element in iOS. This property obeys the alpha value, if specified. 14100 * @type {String} 14101 * @default 'rgba(0,0,0,0)' 14102 */ 14103 tapHighlightColor: 'rgba(0,0,0,0)' 14104 } 14105 }; 14106 var STOP = 1; 14107 var FORCED_STOP = 2; 14108 /** 14109 * Manager 14110 * @param {HTMLElement} element 14111 * @param {Object} [options] 14112 * @constructor 14113 */ 14114 14115 function Manager(element, options) { 14116 this.options = assign({}, Hammer.defaults, options || {}); 14117 this.options.inputTarget = this.options.inputTarget || element; 14118 this.handlers = {}; 14119 this.session = {}; 14120 this.recognizers = []; 14121 this.oldCssProps = {}; 14122 this.element = element; 14123 this.input = createInputInstance(this); 14124 this.touchAction = new TouchAction(this, this.options.touchAction); 14125 toggleCssProps(this, true); 14126 each(this.options.recognizers, function (item) { 14127 var recognizer = this.add(new item[0](item[1])); 14128 item[2] && recognizer.recognizeWith(item[2]); 14129 item[3] && recognizer.requireFailure(item[3]); 14130 }, this); 14131 } 14132 14133 Manager.prototype = { 14134 /** 14135 * set options 14136 * @param {Object} options 14137 * @returns {Manager} 14138 */ 14139 set: function set(options) { 14140 assign(this.options, options); // Options that need a little more setup 14141 14142 if (options.touchAction) { 14143 this.touchAction.update(); 14144 } 14145 14146 if (options.inputTarget) { 14147 // Clean up existing event listeners and reinitialize 14148 this.input.destroy(); 14149 this.input.target = options.inputTarget; 14150 this.input.init(); 14151 } 14152 14153 return this; 14154 }, 14155 14156 /** 14157 * stop recognizing for this session. 14158 * This session will be discarded, when a new [input]start event is fired. 14159 * When forced, the recognizer cycle is stopped immediately. 14160 * @param {Boolean} [force] 14161 */ 14162 stop: function stop(force) { 14163 this.session.stopped = force ? FORCED_STOP : STOP; 14164 }, 14165 14166 /** 14167 * run the recognizers! 14168 * called by the inputHandler function on every movement of the pointers (touches) 14169 * it walks through all the recognizers and tries to detect the gesture that is being made 14170 * @param {Object} inputData 14171 */ 14172 recognize: function recognize(inputData) { 14173 var session = this.session; 14174 14175 if (session.stopped) { 14176 return; 14177 } // run the touch-action polyfill 14178 14179 14180 this.touchAction.preventDefaults(inputData); 14181 var recognizer; 14182 var recognizers = this.recognizers; // this holds the recognizer that is being recognized. 14183 // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED 14184 // if no recognizer is detecting a thing, it is set to `null` 14185 14186 var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized 14187 // or when we're in a new session 14188 14189 if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) { 14190 curRecognizer = session.curRecognizer = null; 14191 } 14192 14193 var i = 0; 14194 14195 while (i < recognizers.length) { 14196 recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one. 14197 // 1. allow if the session is NOT forced stopped (see the .stop() method) 14198 // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one 14199 // that is being recognized. 14200 // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. 14201 // this can be setup with the `recognizeWith()` method on the recognizer. 14202 14203 if (session.stopped !== FORCED_STOP && ( // 1 14204 !curRecognizer || recognizer == curRecognizer || // 2 14205 recognizer.canRecognizeWith(curRecognizer))) { 14206 // 3 14207 recognizer.recognize(inputData); 14208 } else { 14209 recognizer.reset(); 14210 } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the 14211 // current active recognizer. but only if we don't already have an active recognizer 14212 14213 14214 if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { 14215 curRecognizer = session.curRecognizer = recognizer; 14216 } 14217 14218 i++; 14219 } 14220 }, 14221 14222 /** 14223 * get a recognizer by its event name. 14224 * @param {Recognizer|String} recognizer 14225 * @returns {Recognizer|Null} 14226 */ 14227 get: function get(recognizer) { 14228 if (recognizer instanceof Recognizer) { 14229 return recognizer; 14230 } 14231 14232 var recognizers = this.recognizers; 14233 14234 for (var i = 0; i < recognizers.length; i++) { 14235 if (recognizers[i].options.event == recognizer) { 14236 return recognizers[i]; 14237 } 14238 } 14239 14240 return null; 14241 }, 14242 14243 /** 14244 * add a recognizer to the manager 14245 * existing recognizers with the same event name will be removed 14246 * @param {Recognizer} recognizer 14247 * @returns {Recognizer|Manager} 14248 */ 14249 add: function add(recognizer) { 14250 if (invokeArrayArg(recognizer, 'add', this)) { 14251 return this; 14252 } // remove existing 14253 14254 14255 var existing = this.get(recognizer.options.event); 14256 14257 if (existing) { 14258 this.remove(existing); 14259 } 14260 14261 this.recognizers.push(recognizer); 14262 recognizer.manager = this; 14263 this.touchAction.update(); 14264 return recognizer; 14265 }, 14266 14267 /** 14268 * remove a recognizer by name or instance 14269 * @param {Recognizer|String} recognizer 14270 * @returns {Manager} 14271 */ 14272 remove: function remove(recognizer) { 14273 if (invokeArrayArg(recognizer, 'remove', this)) { 14274 return this; 14275 } 14276 14277 recognizer = this.get(recognizer); // let's make sure this recognizer exists 14278 14279 if (recognizer) { 14280 var recognizers = this.recognizers; 14281 var index = inArray(recognizers, recognizer); 14282 14283 if (index !== -1) { 14284 recognizers.splice(index, 1); 14285 this.touchAction.update(); 14286 } 14287 } 14288 14289 return this; 14290 }, 14291 14292 /** 14293 * bind event 14294 * @param {String} events 14295 * @param {Function} handler 14296 * @returns {EventEmitter} this 14297 */ 14298 on: function on(events, handler) { 14299 if (events === undefined) { 14300 return; 14301 } 14302 14303 if (handler === undefined) { 14304 return; 14305 } 14306 14307 var handlers = this.handlers; 14308 each(splitStr(events), function (event) { 14309 handlers[event] = handlers[event] || []; 14310 handlers[event].push(handler); 14311 }); 14312 return this; 14313 }, 14314 14315 /** 14316 * unbind event, leave emit blank to remove all handlers 14317 * @param {String} events 14318 * @param {Function} [handler] 14319 * @returns {EventEmitter} this 14320 */ 14321 off: function off(events, handler) { 14322 if (events === undefined) { 14323 return; 14324 } 14325 14326 var handlers = this.handlers; 14327 each(splitStr(events), function (event) { 14328 if (!handler) { 14329 delete handlers[event]; 14330 } else { 14331 handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); 14332 } 14333 }); 14334 return this; 14335 }, 14336 14337 /** 14338 * emit event to the listeners 14339 * @param {String} event 14340 * @param {Object} data 14341 */ 14342 emit: function emit(event, data) { 14343 // we also want to trigger dom events 14344 if (this.options.domEvents) { 14345 triggerDomEvent(event, data); 14346 } // no handlers, so skip it all 14347 14348 14349 var handlers = this.handlers[event] && this.handlers[event].slice(); 14350 14351 if (!handlers || !handlers.length) { 14352 return; 14353 } 14354 14355 data.type = event; 14356 14357 data.preventDefault = function () { 14358 data.srcEvent.preventDefault(); 14359 }; 14360 14361 var i = 0; 14362 14363 while (i < handlers.length) { 14364 handlers[i](data); 14365 i++; 14366 } 14367 }, 14368 14369 /** 14370 * destroy the manager and unbinds all events 14371 * it doesn't unbind dom events, that is the user own responsibility 14372 */ 14373 destroy: function destroy() { 14374 this.element && toggleCssProps(this, false); 14375 this.handlers = {}; 14376 this.session = {}; 14377 this.input.destroy(); 14378 this.element = null; 14379 } 14380 }; 14381 /** 14382 * add/remove the css properties as defined in manager.options.cssProps 14383 * @param {Manager} manager 14384 * @param {Boolean} add 14385 */ 14386 14387 function toggleCssProps(manager, add) { 14388 var element = manager.element; 14389 14390 if (!element.style) { 14391 return; 14392 } 14393 14394 var prop; 14395 each(manager.options.cssProps, function (value, name) { 14396 prop = prefixed(element.style, name); 14397 14398 if (add) { 14399 manager.oldCssProps[prop] = element.style[prop]; 14400 element.style[prop] = value; 14401 } else { 14402 element.style[prop] = manager.oldCssProps[prop] || ''; 14403 } 14404 }); 14405 14406 if (!add) { 14407 manager.oldCssProps = {}; 14408 } 14409 } 14410 /** 14411 * trigger dom event 14412 * @param {String} event 14413 * @param {Object} data 14414 */ 14415 14416 14417 function triggerDomEvent(event, data) { 14418 var gestureEvent = document.createEvent('Event'); 14419 gestureEvent.initEvent(event, true, true); 14420 gestureEvent.gesture = data; 14421 data.target.dispatchEvent(gestureEvent); 14422 } 14423 14424 assign(Hammer, { 14425 INPUT_START: INPUT_START, 14426 INPUT_MOVE: INPUT_MOVE, 14427 INPUT_END: INPUT_END, 14428 INPUT_CANCEL: INPUT_CANCEL, 14429 STATE_POSSIBLE: STATE_POSSIBLE, 14430 STATE_BEGAN: STATE_BEGAN, 14431 STATE_CHANGED: STATE_CHANGED, 14432 STATE_ENDED: STATE_ENDED, 14433 STATE_RECOGNIZED: STATE_RECOGNIZED, 14434 STATE_CANCELLED: STATE_CANCELLED, 14435 STATE_FAILED: STATE_FAILED, 14436 DIRECTION_NONE: DIRECTION_NONE, 14437 DIRECTION_LEFT: DIRECTION_LEFT, 14438 DIRECTION_RIGHT: DIRECTION_RIGHT, 14439 DIRECTION_UP: DIRECTION_UP, 14440 DIRECTION_DOWN: DIRECTION_DOWN, 14441 DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL, 14442 DIRECTION_VERTICAL: DIRECTION_VERTICAL, 14443 DIRECTION_ALL: DIRECTION_ALL, 14444 Manager: Manager, 14445 Input: Input, 14446 TouchAction: TouchAction, 14447 TouchInput: TouchInput, 14448 MouseInput: MouseInput, 14449 PointerEventInput: PointerEventInput, 14450 TouchMouseInput: TouchMouseInput, 14451 SingleTouchInput: SingleTouchInput, 14452 Recognizer: Recognizer, 14453 AttrRecognizer: AttrRecognizer, 14454 Tap: TapRecognizer, 14455 Pan: PanRecognizer, 14456 Swipe: SwipeRecognizer, 14457 Pinch: PinchRecognizer, 14458 Rotate: RotateRecognizer, 14459 Press: PressRecognizer, 14460 on: addEventListeners, 14461 off: removeEventListeners, 14462 each: each, 14463 merge: merge, 14464 extend: extend, 14465 assign: assign, 14466 inherit: inherit, 14467 bindFn: bindFn, 14468 prefixed: prefixed 14469 }); // this prevents errors when Hammer is loaded in the presence of an AMD 14470 // style loader but by script tag, not by the loader. 14471 14472 var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line 14473 14474 freeGlobal.Hammer = Hammer; 14475 14476 if (true) { 14477 !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { 14478 return Hammer; 14479 }).call(exports, __webpack_require__, exports, module), 14480 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 14481 } else {} 14482})(window, document, 'Hammer'); 14483 14484/***/ }), 14485
vendor: 2,055 bytes, lines 14486-14555
14486/***/ "../node_modules/hyperform/src/components/custom_messages.js": 14487/*!*******************************************************************!*\ 14488 !*** ../node_modules/hyperform/src/components/custom_messages.js ***! 14489 \*******************************************************************/ 14490/*! exports provided: default */ 14491/***/ (function(module, __webpack_exports__, __webpack_require__) { 14492 14493"use strict"; 14494__webpack_require__.r(__webpack_exports__); 14495 14496/** 14497 * internal storage for custom error messages 14498 */ 14499 14500var store = new WeakMap(); 14501/** 14502 * register custom error messages per element 14503 */ 14504 14505var custom_messages = { 14506 set: function set(element, validator, message) { 14507 var messages = store.get(element) || {}; 14508 messages[validator] = message; 14509 store.set(element, messages); 14510 return custom_messages; 14511 }, 14512 get: function get(element, validator) { 14513 var _default = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; 14514 14515 var messages = store.get(element); 14516 14517 if (messages === undefined || !(validator in messages)) { 14518 var data_id = 'data-' + validator.replace(/[A-Z]/g, '-$&').toLowerCase(); 14519 14520 if (element.hasAttribute(data_id)) { 14521 /* if the element has a data-validator attribute, use this as fallback. 14522 * E.g., if validator == 'valueMissing', the element can specify a 14523 * custom validation message like this: 14524 * <input data-value-missing="Oh noes!"> 14525 */ 14526 return element.getAttribute(data_id); 14527 } 14528 14529 return _default; 14530 } 14531 14532 return messages[validator]; 14533 }, 14534 delete: function _delete(element) { 14535 var validator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; 14536 14537 if (!validator) { 14538 return store.delete(element); 14539 } 14540 14541 var messages = store.get(element) || {}; 14542 14543 if (validator in messages) { 14544 delete messages[validator]; 14545 store.set(element, messages); 14546 return true; 14547 } 14548 14549 return false; 14550 } 14551}; 14552/* harmony default export */ __webpack_exports__["default"] = (custom_messages); 14553 14554/***/ }), 14555
vendor: 3,182 bytes, lines 14556-14658
14556/***/ "../node_modules/hyperform/src/components/hooks.js": 14557/*!*********************************************************!*\ 14558 !*** ../node_modules/hyperform/src/components/hooks.js ***! 14559 \*********************************************************/ 14560/*! exports provided: call_hook, do_filter, remove_hook, remove_filter, add_hook, add_filter */ 14561/***/ (function(module, __webpack_exports__, __webpack_require__) { 14562 14563"use strict"; 14564__webpack_require__.r(__webpack_exports__); 14565/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "call_hook", function() { return call_hook; }); 14566/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "do_filter", function() { return do_filter; }); 14567/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "remove_hook", function() { return remove_hook; }); 14568/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "remove_filter", function() { return remove_hook; }); 14569/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add_hook", function() { return add_hook; }); 14570/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add_filter", function() { return add_hook; }); 14571 14572 14573var registry = Object.create(null); 14574/** 14575 * run all actions registered for a hook 14576 * 14577 * Every action gets called with a state object as `this` argument and with the 14578 * hook's call arguments as call arguments. 14579 * 14580 * @return mixed the returned value of the action calls or undefined 14581 */ 14582 14583function call_hook(hook) { 14584 var result; 14585 var call_args = Array.prototype.slice.call(arguments, 1); 14586 14587 if (hook in registry) { 14588 result = registry[hook].reduce(function (args) { 14589 return function (previousResult, currentAction) { 14590 var interimResult = currentAction.apply({ 14591 state: previousResult, 14592 hook: hook 14593 }, args); 14594 return interimResult !== undefined ? interimResult : previousResult; 14595 }; 14596 }(call_args), result); 14597 } 14598 14599 return result; 14600} 14601/** 14602 * Filter a value through hooked functions 14603 * 14604 * Allows for additional parameters: 14605 * js> do_filter('foo', null, current_element) 14606 */ 14607 14608function do_filter(hook, initial_value) { 14609 var result = initial_value; 14610 var call_args = Array.prototype.slice.call(arguments, 1); 14611 14612 if (hook in registry) { 14613 result = registry[hook].reduce(function (previousResult, currentAction) { 14614 call_args[0] = previousResult; 14615 var interimResult = currentAction.apply({ 14616 state: previousResult, 14617 hook: hook 14618 }, call_args); 14619 return interimResult !== undefined ? interimResult : previousResult; 14620 }, result); 14621 } 14622 14623 return result; 14624} 14625/** 14626 * remove an action again 14627 */ 14628 14629function remove_hook(hook, action) { 14630 if (hook in registry) { 14631 for (var i = 0; i < registry[hook].length; i++) { 14632 if (registry[hook][i] === action) { 14633 registry[hook].splice(i, 1); 14634 break; 14635 } 14636 } 14637 } 14638} 14639 14640/** 14641 * add an action to a hook 14642 */ 14643 14644function add_hook(hook, action, position) { 14645 if (!(hook in registry)) { 14646 registry[hook] = []; 14647 } 14648 14649 if (position === undefined) { 14650 position = registry[hook].length; 14651 } 14652 14653 registry[hook].splice(position, 0, action); 14654} 14655 14656 14657/***/ }), 14658
vendor: 3,439 bytes, lines 14659-14753
14659/***/ "../node_modules/hyperform/src/components/localization.js": 14660/*!****************************************************************!*\ 14661 !*** ../node_modules/hyperform/src/components/localization.js ***! 14662 \****************************************************************/ 14663/*! exports provided: set_language, add_translation, default */ 14664/***/ (function(module, __webpack_exports__, __webpack_require__) { 14665 14666"use strict"; 14667__webpack_require__.r(__webpack_exports__); 14668/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set_language", function() { return set_language; }); 14669/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add_translation", function() { return add_translation; }); 14670 14671/** 14672 * the following validation messages are from Firefox source, 14673 * http://mxr.mozilla.org/mozilla-central/source/dom/locales/en-US/chrome/dom/dom.properties 14674 * released under MPL license, http://mozilla.org/MPL/2.0/. 14675 */ 14676 14677var catalog = { 14678 en: { 14679 TextTooLong: 'Please shorten this text to %l characters or less (you are currently using %l characters).', 14680 ValueMissing: 'Please fill out this field.', 14681 CheckboxMissing: 'Please check this box if you want to proceed.', 14682 RadioMissing: 'Please select one of these options.', 14683 FileMissing: 'Please select a file.', 14684 SelectMissing: 'Please select an item in the list.', 14685 InvalidEmail: 'Please enter an email address.', 14686 InvalidURL: 'Please enter a URL.', 14687 PatternMismatch: 'Please match the requested format.', 14688 PatternMismatchWithTitle: 'Please match the requested format: %l.', 14689 NumberRangeOverflow: 'Please select a value that is no more than %l.', 14690 DateRangeOverflow: 'Please select a value that is no later than %l.', 14691 TimeRangeOverflow: 'Please select a value that is no later than %l.', 14692 NumberRangeUnderflow: 'Please select a value that is no less than %l.', 14693 DateRangeUnderflow: 'Please select a value that is no earlier than %l.', 14694 TimeRangeUnderflow: 'Please select a value that is no earlier than %l.', 14695 StepMismatch: 'Please select a valid value. The two nearest valid values are %l and %l.', 14696 StepMismatchOneValue: 'Please select a valid value. The nearest valid value is %l.', 14697 BadInputNumber: 'Please enter a number.' 14698 } 14699}; 14700/** 14701 * the global language Hyperform will use 14702 */ 14703 14704var language = 'en'; 14705/** 14706 * the base language according to BCP47, i.e., only the piece before the first hyphen 14707 */ 14708 14709var base_lang = 'en'; 14710/** 14711 * set the language for Hyperformâs messages 14712 */ 14713 14714function set_language(newlang) { 14715 language = newlang; 14716 base_lang = newlang.replace(/[-_].*/, ''); 14717} 14718/** 14719 * add a lookup catalog "string: translation" for a language 14720 */ 14721 14722function add_translation(lang, new_catalog) { 14723 if (!(lang in catalog)) { 14724 catalog[lang] = {}; 14725 } 14726 14727 for (var key in new_catalog) { 14728 if (new_catalog.hasOwnProperty(key)) { 14729 catalog[lang][key] = new_catalog[key]; 14730 } 14731 } 14732} 14733/** 14734 * return `s` translated into the current language 14735 * 14736 * Defaults to the base language and then English if the former has no 14737 * translation for `s`. 14738 */ 14739 14740/* harmony default export */ __webpack_exports__["default"] = (function (s) { 14741 if (language in catalog && s in catalog[language]) { 14742 return catalog[language][s]; 14743 } else if (base_lang in catalog && s in catalog[base_lang]) { 14744 return catalog[base_lang][s]; 14745 } else if (s in catalog.en) { 14746 return catalog.en[s]; 14747 } 14748 14749 return s; 14750}); 14751 14752/***/ }), 14753
vendor: 2,981 bytes, lines 14754-14850
14754/***/ "../node_modules/hyperform/src/components/message_store.js": 14755/*!*****************************************************************!*\ 14756 !*** ../node_modules/hyperform/src/components/message_store.js ***! 14757 \*****************************************************************/ 14758/*! exports provided: message_store */ 14759/***/ (function(module, __webpack_exports__, __webpack_require__) { 14760 14761"use strict"; 14762__webpack_require__.r(__webpack_exports__); 14763/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "message_store", function() { return message_store; }); 14764/* harmony import */ var _wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 14765/* harmony import */ var _tools_mark__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/mark */ "../node_modules/hyperform/src/tools/mark.js"); 14766 14767 14768 14769 14770/** 14771 * the internal storage for messages 14772 */ 14773 14774var store = new WeakMap(); 14775/* jshint -W053 */ 14776 14777/* allow new String() */ 14778 14779/** 14780 * handle validation messages 14781 * 14782 * Falls back to browser-native errors, if any are available. The messages 14783 * are String objects so that we can mark() them. 14784 */ 14785 14786var message_store = { 14787 set: function set(element, message) { 14788 var is_custom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 14789 14790 if (element instanceof window.HTMLFieldSetElement) { 14791 var wrapped_form = Object(_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(element); 14792 14793 if (wrapped_form && !wrapped_form.settings.extendFieldset) { 14794 /* make this a no-op for <fieldset> in strict mode */ 14795 return message_store; 14796 } 14797 } 14798 14799 if (typeof message === 'string') { 14800 message = new String(message); 14801 } 14802 14803 if (is_custom) { 14804 message.is_custom = true; 14805 } 14806 14807 Object(_tools_mark__WEBPACK_IMPORTED_MODULE_1__["default"])(message); 14808 store.set(element, message); 14809 /* allow the :invalid selector to match */ 14810 14811 if ('_original_setCustomValidity' in element) { 14812 element._original_setCustomValidity(message.toString()); 14813 } 14814 14815 return message_store; 14816 }, 14817 get: function get(element) { 14818 var message = store.get(element); 14819 14820 if (message === undefined && '_original_validationMessage' in element) { 14821 /* get the browser's validation message, if we have none. Maybe it 14822 * knows more than we. */ 14823 message = new String(element._original_validationMessage); 14824 } 14825 14826 return message ? message : new String(''); 14827 }, 14828 delete: function _delete(element) { 14829 var is_custom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 14830 14831 if ('_original_setCustomValidity' in element) { 14832 element._original_setCustomValidity(''); 14833 } 14834 14835 var message = store.get(element); 14836 14837 if (message && is_custom && !message.is_custom) { 14838 /* do not delete "native" messages, if asked */ 14839 return false; 14840 } 14841 14842 return store.delete(element); 14843 } 14844}; 14845/* jshint +W053 */ 14846 14847 14848 14849/***/ }), 14850
vendor: 1,148 bytes, lines 14851-14887
14851/***/ "../node_modules/hyperform/src/components/registry.js": 14852/*!************************************************************!*\ 14853 !*** ../node_modules/hyperform/src/components/registry.js ***! 14854 \************************************************************/ 14855/*! exports provided: default */ 14856/***/ (function(module, __webpack_exports__, __webpack_require__) { 14857 14858"use strict"; 14859__webpack_require__.r(__webpack_exports__); 14860 14861 14862var internal_registry = new WeakMap(); 14863/** 14864 * A registry for custom validators 14865 * 14866 * slim wrapper around a WeakMap to ensure the values are arrays 14867 * (hence allowing > 1 validators per element) 14868 */ 14869 14870var custom_validator_registry = { 14871 set: function set(element, validator) { 14872 var current = internal_registry.get(element) || []; 14873 current.push(validator); 14874 internal_registry.set(element, current); 14875 return custom_validator_registry; 14876 }, 14877 get: function get(element) { 14878 return internal_registry.get(element) || []; 14879 }, 14880 delete: function _delete(element) { 14881 return internal_registry.delete(element); 14882 } 14883}; 14884/* harmony default export */ __webpack_exports__["default"] = (custom_validator_registry); 14885 14886/***/ }), 14887
vendor: 4,794 bytes, lines 14888-15013
14888/***/ "../node_modules/hyperform/src/components/renderer.js": 14889/*!************************************************************!*\ 14890 !*** ../node_modules/hyperform/src/components/renderer.js ***! 14891 \************************************************************/ 14892/*! exports provided: default */ 14893/***/ (function(module, __webpack_exports__, __webpack_require__) { 14894 14895"use strict"; 14896__webpack_require__.r(__webpack_exports__); 14897/* harmony import */ var _message_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./message_store */ "../node_modules/hyperform/src/components/message_store.js"); 14898/* harmony import */ var _wrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 14899/* harmony import */ var _tools_generate_id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/generate_id */ "../node_modules/hyperform/src/tools/generate_id.js"); 14900/* harmony import */ var _tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/get_radiogroup */ "../node_modules/hyperform/src/tools/get_radiogroup.js"); 14901 14902 14903 14904 14905 14906 14907var warningsCache = new WeakMap(); 14908var DefaultRenderer = { 14909 /** 14910 * called when a warning should become visible 14911 */ 14912 attachWarning: function attachWarning(warning, element) { 14913 /* should also work, if element is last, 14914 * http://stackoverflow.com/a/4793630/113195 */ 14915 element.parentNode.insertBefore(warning, element.nextSibling); 14916 }, 14917 14918 /** 14919 * called when a warning should vanish 14920 */ 14921 detachWarning: function detachWarning(warning, element) { 14922 /* be conservative here, since an overwritten attachWarning() might not 14923 * actually have attached the warning. */ 14924 if (warning.parentNode) { 14925 warning.parentNode.removeChild(warning); 14926 } 14927 }, 14928 14929 /** 14930 * called when feedback to an element's state should be handled 14931 * 14932 * i.e., showing and hiding warnings 14933 */ 14934 showWarning: function showWarning(element) { 14935 var whole_form_validated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 14936 14937 /* don't render error messages on subsequent radio buttons of the 14938 * same group. This assumes, that element.validity.valueMissing is the only 14939 * possible validation failure for radio buttons. */ 14940 if (whole_form_validated && element.type === 'radio' && Object(_tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_3__["get_radiogroup"])(element)[0] !== element) { 14941 return; 14942 } 14943 14944 var msg = _message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].get(element).toString(); 14945 var warning = warningsCache.get(element); 14946 14947 if (msg) { 14948 if (!warning) { 14949 var wrapper = Object(_wrapper__WEBPACK_IMPORTED_MODULE_1__["get_wrapper"])(element); 14950 warning = document.createElement('div'); 14951 warning.className = wrapper && wrapper.settings.classes.warning || 'hf-warning'; 14952 warning.id = Object(_tools_generate_id__WEBPACK_IMPORTED_MODULE_2__["default"])(); 14953 warning.setAttribute('aria-live', 'polite'); 14954 warningsCache.set(element, warning); 14955 } 14956 14957 element.setAttribute('aria-errormessage', warning.id); 14958 14959 if (!element.hasAttribute('aria-describedby')) { 14960 element.setAttribute('aria-describedby', warning.id); 14961 } 14962 14963 Renderer.setMessage(warning, msg, element); 14964 Renderer.attachWarning(warning, element); 14965 } else if (warning && warning.parentNode) { 14966 if (element.getAttribute('aria-describedby') === warning.id) { 14967 element.removeAttribute('aria-describedby'); 14968 } 14969 14970 element.removeAttribute('aria-errormessage'); 14971 Renderer.detachWarning(warning, element); 14972 } 14973 }, 14974 14975 /** 14976 * set the warning's content 14977 * 14978 * Overwrite this method, if you want, e.g., to allow HTML in warnings 14979 * or preprocess the content. 14980 */ 14981 setMessage: function setMessage(warning, message, element) { 14982 warning.textContent = message; 14983 } 14984}; 14985var Renderer = { 14986 attachWarning: DefaultRenderer.attachWarning, 14987 detachWarning: DefaultRenderer.detachWarning, 14988 showWarning: DefaultRenderer.showWarning, 14989 setMessage: DefaultRenderer.setMessage, 14990 set: function set(renderer, action) { 14991 if (renderer.indexOf('_') > -1) { 14992 /* global console */ 14993 // TODO delete before next non-patch version 14994 console.log('Renderer.set: please use camelCase names. ' + renderer + ' will be removed in the next non-patch release.'); 14995 renderer = renderer.replace(/_([a-z])/g, function (g) { 14996 return g[1].toUpperCase(); 14997 }); 14998 } 14999 15000 if (!action) { 15001 action = DefaultRenderer[renderer]; 15002 } 15003 15004 Renderer[renderer] = action; 15005 }, 15006 getWarning: function getWarning(element) { 15007 return warningsCache.get(element); 15008 } 15009}; 15010/* harmony default export */ __webpack_exports__["default"] = (Renderer); 15011 15012/***/ }), 15013
vendor: 1,494 bytes, lines 15014-15053
15014/***/ "../node_modules/hyperform/src/components/step_defaults.js": 15015/*!*****************************************************************!*\ 15016 !*** ../node_modules/hyperform/src/components/step_defaults.js ***! 15017 \*****************************************************************/ 15018/*! exports provided: default_step, step_scale_factor, default_step_base, default_min, default_max */ 15019/***/ (function(module, __webpack_exports__, __webpack_require__) { 15020 15021"use strict"; 15022__webpack_require__.r(__webpack_exports__); 15023/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_step", function() { return default_step; }); 15024/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "step_scale_factor", function() { return step_scale_factor; }); 15025/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_step_base", function() { return default_step_base; }); 15026/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_min", function() { return default_min; }); 15027/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_max", function() { return default_max; }); 15028 15029 15030var default_step = { 15031 'datetime-local': 60, 15032 datetime: 60, 15033 time: 60 15034}; 15035var step_scale_factor = { 15036 'datetime-local': 1000, 15037 datetime: 1000, 15038 date: 86400000, 15039 week: 604800000, 15040 time: 1000 15041}; 15042var default_step_base = { 15043 week: -259200000 15044}; 15045var default_min = { 15046 range: 0 15047}; 15048var default_max = { 15049 range: 100 15050}; 15051 15052/***/ }), 15053
vendor: 2,854 bytes, lines 15054-15102
15054/***/ "../node_modules/hyperform/src/components/types.js": 15055/*!*********************************************************!*\ 15056 !*** ../node_modules/hyperform/src/components/types.js ***! 15057 \*********************************************************/ 15058/*! exports provided: dates, plain_numbers, numbers, type_checked, input_checked, text, validation_candidates, inputs, non_inputs */ 15059/***/ (function(module, __webpack_exports__, __webpack_require__) { 15060 15061"use strict"; 15062__webpack_require__.r(__webpack_exports__); 15063/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dates", function() { return dates; }); 15064/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "plain_numbers", function() { return plain_numbers; }); 15065/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "numbers", function() { return numbers; }); 15066/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "type_checked", function() { return type_checked; }); 15067/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "input_checked", function() { return input_checked; }); 15068/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "text", function() { return text; }); 15069/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validation_candidates", function() { return validation_candidates; }); 15070/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inputs", function() { return inputs; }); 15071/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "non_inputs", function() { return non_inputs; }); 15072 15073/* and datetime-local? Spec says âNah!â */ 15074 15075var dates = ['datetime', 'date', 'month', 'week', 'time']; 15076var plain_numbers = ['number', 'range']; 15077/* everything that returns something meaningful for valueAsNumber and 15078 * can have the step attribute */ 15079 15080var numbers = dates.concat(plain_numbers, 'datetime-local'); 15081/* the spec says to only check those for syntax in validity.typeMismatch. 15082 * ¯\_(ã)_/¯ */ 15083 15084var type_checked = ['email', 'url']; 15085/* check these for validity.badInput */ 15086 15087var input_checked = ['email', 'date', 'month', 'week', 'time', 'datetime', 'datetime-local', 'number', 'range', 'color']; 15088var text = ['text', 'search', 'tel', 'password'].concat(type_checked); 15089/* input element types, that are candidates for the validation API. 15090 * Missing from this set are: button, hidden, menu (from <button>), reset and 15091 * the types for non-<input> elements. */ 15092 15093var validation_candidates = ['checkbox', 'color', 'file', 'image', 'radio', 'submit'].concat(numbers, text); 15094/* all known types of <input> */ 15095 15096var inputs = ['button', 'hidden', 'reset'].concat(validation_candidates); 15097/* apparently <select> and <textarea> have types of their own */ 15098 15099var non_inputs = ['select-one', 'select-multiple', 'textarea']; 15100 15101/***/ }), 15102
vendor: 8,204 bytes, lines 15103-15291
15103/***/ "../node_modules/hyperform/src/components/wrapper.js": 15104/*!***********************************************************!*\ 15105 !*** ../node_modules/hyperform/src/components/wrapper.js ***! 15106 \***********************************************************/ 15107/*! exports provided: default, get_wrapper */ 15108/***/ (function(module, __webpack_exports__, __webpack_require__) { 15109 15110"use strict"; 15111__webpack_require__.r(__webpack_exports__); 15112/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Wrapper; }); 15113/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get_wrapper", function() { return get_wrapper; }); 15114/* harmony import */ var _tools_catch_submit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/catch_submit */ "../node_modules/hyperform/src/tools/catch_submit.js"); 15115/* harmony import */ var _polyfills_validityState__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../polyfills/validityState */ "../node_modules/hyperform/src/polyfills/validityState.js"); 15116/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js"); 15117/* harmony import */ var _tools_property_uninstaller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/property_uninstaller */ "../node_modules/hyperform/src/tools/property_uninstaller.js"); 15118/* harmony import */ var _tools_polyfill__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tools/polyfill */ "../node_modules/hyperform/src/tools/polyfill.js"); 15119/* harmony import */ var _tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tools/polyunfill */ "../node_modules/hyperform/src/tools/polyunfill.js"); 15120 15121 15122 15123 15124 15125 15126 15127 15128var instances = new WeakMap(); 15129/** 15130 * wrap <form>s, window or document, that get treated with the global 15131 * hyperform() 15132 */ 15133 15134function Wrapper(form, settings) { 15135 /* do not allow more than one instance per form. Otherwise we'd end 15136 * up with double event handlers, polyfills re-applied, ... */ 15137 var existing = instances.get(form); 15138 15139 if (existing) { 15140 existing.settings = settings; 15141 return existing; 15142 } 15143 15144 this.form = form; 15145 this.settings = settings; 15146 this.revalidator = this.revalidate.bind(this); 15147 instances.set(form, this); 15148 Object(_tools_catch_submit__WEBPACK_IMPORTED_MODULE_0__["catch_submit"])(form, settings.revalidate === 'never'); 15149 15150 if (form === window || form.nodeType === 9) { 15151 /* install on the prototypes, when called for the whole document */ 15152 this.install([window.HTMLButtonElement.prototype, window.HTMLInputElement.prototype, window.HTMLSelectElement.prototype, window.HTMLTextAreaElement.prototype, window.HTMLFieldSetElement.prototype]); 15153 Object(_tools_polyfill__WEBPACK_IMPORTED_MODULE_4__["default"])(window.HTMLFormElement); 15154 } else if (form instanceof window.HTMLFormElement || form instanceof window.HTMLFieldSetElement) { 15155 this.install(form.elements); 15156 15157 if (form instanceof window.HTMLFormElement) { 15158 Object(_tools_polyfill__WEBPACK_IMPORTED_MODULE_4__["default"])(form); 15159 } 15160 } 15161 15162 if (settings.revalidate === 'oninput' || settings.revalidate === 'hybrid') { 15163 /* in a perfect world we'd just bind to "input", but support here is 15164 * abysmal: http://caniuse.com/#feat=input-event */ 15165 form.addEventListener('keyup', this.revalidator); 15166 form.addEventListener('change', this.revalidator); 15167 } 15168 15169 if (settings.revalidate === 'onblur' || settings.revalidate === 'hybrid') { 15170 /* useCapture=true, because `blur` doesn't bubble. See 15171 * https://developer.mozilla.org/en-US/docs/Web/Events/blur#Event_delegation 15172 * for a discussion */ 15173 form.addEventListener('blur', this.revalidator, true); 15174 } 15175} 15176Wrapper.prototype = { 15177 destroy: function destroy() { 15178 Object(_tools_catch_submit__WEBPACK_IMPORTED_MODULE_0__["uncatch_submit"])(this.form); 15179 instances.delete(this.form); 15180 this.form.removeEventListener('keyup', this.revalidator); 15181 this.form.removeEventListener('change', this.revalidator); 15182 this.form.removeEventListener('blur', this.revalidator, true); 15183 15184 if (this.form === window || this.form.nodeType === 9) { 15185 this.uninstall([window.HTMLButtonElement.prototype, window.HTMLInputElement.prototype, window.HTMLSelectElement.prototype, window.HTMLTextAreaElement.prototype, window.HTMLFieldSetElement.prototype]); 15186 Object(_tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__["default"])(window.HTMLFormElement); 15187 } else if (this.form instanceof window.HTMLFormElement || this.form instanceof window.HTMLFieldSetElement) { 15188 this.uninstall(this.form.elements); 15189 15190 if (this.form instanceof window.HTMLFormElement) { 15191 Object(_tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__["default"])(this.form); 15192 } 15193 } 15194 }, 15195 15196 /** 15197 * revalidate an input element 15198 */ 15199 revalidate: function revalidate(event) { 15200 if (event.target instanceof window.HTMLButtonElement || event.target instanceof window.HTMLTextAreaElement || event.target instanceof window.HTMLSelectElement || event.target instanceof window.HTMLInputElement) { 15201 if (this.settings.revalidate === 'hybrid') { 15202 /* "hybrid" somewhat simulates what browsers do. See for example 15203 * Firefox's :-moz-ui-invalid pseudo-class: 15204 * https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-ui-invalid */ 15205 if (event.type === 'blur' && event.target.value !== event.target.defaultValue || Object(_polyfills_validityState__WEBPACK_IMPORTED_MODULE_1__["default"])(event.target).valid) { 15206 /* on blur, update the report when the value has changed from the 15207 * default or when the element is valid (possibly removing a still 15208 * standing invalidity report). */ 15209 Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__["default"])(event.target); 15210 } else if (event.type === 'keyup' && event.keyCode !== 9 || event.type === 'change') { 15211 if (Object(_polyfills_validityState__WEBPACK_IMPORTED_MODULE_1__["default"])(event.target).valid) { 15212 // report instantly, when an element becomes valid, 15213 // postpone report to blur event, when an element is invalid 15214 Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__["default"])(event.target); 15215 } 15216 } 15217 } else if (event.type !== 'keyup' || event.keyCode !== 9) { 15218 /* do _not_ validate, when the user "tabbed" into the field initially, 15219 * i.e., a keyup event with keyCode 9 */ 15220 Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__["default"])(event.target); 15221 } 15222 } 15223 }, 15224 15225 /** 15226 * install the polyfills on each given element 15227 * 15228 * If you add elements dynamically, you have to call install() on them 15229 * yourself: 15230 * 15231 * js> var form = hyperform(document.forms[0]); 15232 * js> document.forms[0].appendChild(input); 15233 * js> form.install(input); 15234 * 15235 * You can skip this, if you called hyperform on window or document. 15236 */ 15237 install: function install(els) { 15238 if (els instanceof window.Element) { 15239 els = [els]; 15240 } 15241 15242 var els_length = els.length; 15243 15244 for (var i = 0; i < els_length; i++) { 15245 Object(_tools_polyfill__WEBPACK_IMPORTED_MODULE_4__["default"])(els[i]); 15246 } 15247 }, 15248 uninstall: function uninstall(els) { 15249 if (els instanceof window.Element) { 15250 els = [els]; 15251 } 15252 15253 var els_length = els.length; 15254 15255 for (var i = 0; i < els_length; i++) { 15256 Object(_tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__["default"])(els[i]); 15257 } 15258 } 15259}; 15260/** 15261 * try to get the appropriate wrapper for a specific element by looking up 15262 * its parent chain 15263 * 15264 * @return Wrapper | undefined 15265 */ 15266 15267function get_wrapper(element) { 15268 var wrapped; 15269 15270 if (element.form) { 15271 /* try a shortcut with the element's <form> */ 15272 wrapped = instances.get(element.form); 15273 } 15274 /* walk up the parent nodes until document (including) */ 15275 15276 15277 while (!wrapped && element) { 15278 wrapped = instances.get(element); 15279 element = element.parentNode; 15280 } 15281 15282 if (!wrapped) { 15283 /* try the global instance, if exists. This may also be undefined. */ 15284 wrapped = instances.get(window); 15285 } 15286 15287 return wrapped; 15288} 15289 15290/***/ }), 15291
vendor: 10,628 bytes, lines 15292-15537
15292/***/ "../node_modules/hyperform/src/hyperform.js": 15293/*!**************************************************!*\ 15294 !*** ../node_modules/hyperform/src/hyperform.js ***! 15295 \**************************************************/ 15296/*! exports provided: default */ 15297/***/ (function(module, __webpack_exports__, __webpack_require__) { 15298 15299"use strict"; 15300__webpack_require__.r(__webpack_exports__); 15301/* harmony import */ var _polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polyfills/checkValidity */ "../node_modules/hyperform/src/polyfills/checkValidity.js"); 15302/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js"); 15303/* harmony import */ var _polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./polyfills/setCustomValidity */ "../node_modules/hyperform/src/polyfills/setCustomValidity.js"); 15304/* harmony import */ var _polyfills_stepDown__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./polyfills/stepDown */ "../node_modules/hyperform/src/polyfills/stepDown.js"); 15305/* harmony import */ var _polyfills_stepUp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./polyfills/stepUp */ "../node_modules/hyperform/src/polyfills/stepUp.js"); 15306/* harmony import */ var _polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./polyfills/validationMessage */ "../node_modules/hyperform/src/polyfills/validationMessage.js"); 15307/* harmony import */ var _polyfills_validityState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./polyfills/validityState */ "../node_modules/hyperform/src/polyfills/validityState.js"); 15308/* harmony import */ var _polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./polyfills/valueAsDate */ "../node_modules/hyperform/src/polyfills/valueAsDate.js"); 15309/* harmony import */ var _polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./polyfills/valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js"); 15310/* harmony import */ var _polyfills_willValidate__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./polyfills/willValidate */ "../node_modules/hyperform/src/polyfills/willValidate.js"); 15311/* harmony import */ var _components_custom_messages__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/custom_messages */ "../node_modules/hyperform/src/components/custom_messages.js"); 15312/* harmony import */ var _components_hooks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/hooks */ "../node_modules/hyperform/src/components/hooks.js"); 15313/* harmony import */ var _components_localization__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/localization */ "../node_modules/hyperform/src/components/localization.js"); 15314/* harmony import */ var _components_registry__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/registry */ "../node_modules/hyperform/src/components/registry.js"); 15315/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./components/renderer */ "../node_modules/hyperform/src/components/renderer.js"); 15316/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 15317/* harmony import */ var _tools_sprintf__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tools/sprintf */ "../node_modules/hyperform/src/tools/sprintf.js"); 15318/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./version */ "../node_modules/hyperform/src/version.js"); 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339/* deprecate the old snake_case names 15340 * TODO: delme before next non-patch release 15341 */ 15342 15343function w(name) { 15344 var deprecated_message = 'Please use camelCase method names! The name "%s" is deprecated and will be removed in the next non-patch release.'; 15345 /* global console */ 15346 15347 console.log(Object(_tools_sprintf__WEBPACK_IMPORTED_MODULE_16__["default"])(deprecated_message, name)); 15348} 15349/** 15350 * public hyperform interface: 15351 */ 15352 15353 15354function hyperform(form) { 15355 var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, 15356 classes = _ref.classes, 15357 _ref$debug = _ref.debug, 15358 debug = _ref$debug === void 0 ? false : _ref$debug, 15359 extend_fieldset = _ref.extend_fieldset, 15360 extendFieldset = _ref.extendFieldset, 15361 novalidate_on_elements = _ref.novalidate_on_elements, 15362 novalidateOnElements = _ref.novalidateOnElements, 15363 prevent_implicit_submit = _ref.prevent_implicit_submit, 15364 preventImplicitSubmit = _ref.preventImplicitSubmit, 15365 revalidate = _ref.revalidate, 15366 _ref$strict = _ref.strict, 15367 strict = _ref$strict === void 0 ? false : _ref$strict, 15368 valid_event = _ref.valid_event, 15369 validEvent = _ref.validEvent, 15370 _ref$validateNameless = _ref.validateNameless, 15371 validateNameless = _ref$validateNameless === void 0 ? false : _ref$validateNameless; 15372 15373 if (!classes) { 15374 classes = {}; 15375 } // TODO: clean up before next non-patch release 15376 15377 15378 if (extendFieldset === undefined) { 15379 if (extend_fieldset === undefined) { 15380 extendFieldset = !strict; 15381 } else { 15382 w('extend_fieldset'); 15383 extendFieldset = extend_fieldset; 15384 } 15385 } 15386 15387 if (novalidateOnElements === undefined) { 15388 if (novalidate_on_elements === undefined) { 15389 novalidateOnElements = !strict; 15390 } else { 15391 w('novalidate_on_elements'); 15392 novalidateOnElements = novalidate_on_elements; 15393 } 15394 } 15395 15396 if (preventImplicitSubmit === undefined) { 15397 if (prevent_implicit_submit === undefined) { 15398 preventImplicitSubmit = false; 15399 } else { 15400 w('prevent_implicit_submit'); 15401 preventImplicitSubmit = prevent_implicit_submit; 15402 } 15403 } 15404 15405 if (revalidate === undefined) { 15406 /* other recognized values: 'oninput', 'onblur', 'onsubmit' and 'never' */ 15407 revalidate = strict ? 'onsubmit' : 'hybrid'; 15408 } 15409 15410 if (validEvent === undefined) { 15411 if (valid_event === undefined) { 15412 validEvent = !strict; 15413 } else { 15414 w('valid_event'); 15415 validEvent = valid_event; 15416 } 15417 } 15418 15419 var settings = { 15420 debug: debug, 15421 strict: strict, 15422 preventImplicitSubmit: preventImplicitSubmit, 15423 revalidate: revalidate, 15424 validEvent: validEvent, 15425 extendFieldset: extendFieldset, 15426 classes: classes, 15427 novalidateOnElements: novalidateOnElements, 15428 validateNameless: validateNameless 15429 }; 15430 15431 if (form instanceof window.NodeList || form instanceof window.HTMLCollection || form instanceof Array) { 15432 return Array.prototype.map.call(form, function (element) { 15433 return hyperform(element, settings); 15434 }); 15435 } 15436 15437 return new _components_wrapper__WEBPACK_IMPORTED_MODULE_15__["default"](form, settings); 15438} 15439 15440hyperform.version = _version__WEBPACK_IMPORTED_MODULE_17__["default"]; 15441hyperform.checkValidity = _polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_0__["default"]; 15442hyperform.reportValidity = _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_1__["default"]; 15443hyperform.setCustomValidity = _polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_2__["default"]; 15444hyperform.stepDown = _polyfills_stepDown__WEBPACK_IMPORTED_MODULE_3__["default"]; 15445hyperform.stepUp = _polyfills_stepUp__WEBPACK_IMPORTED_MODULE_4__["default"]; 15446hyperform.validationMessage = _polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_5__["default"]; 15447hyperform.ValidityState = _polyfills_validityState__WEBPACK_IMPORTED_MODULE_6__["default"]; 15448hyperform.valueAsDate = _polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_7__["default"]; 15449hyperform.valueAsNumber = _polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_8__["default"]; 15450hyperform.willValidate = _polyfills_willValidate__WEBPACK_IMPORTED_MODULE_9__["default"]; 15451 15452hyperform.setLanguage = function (lang) { 15453 Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["set_language"])(lang); 15454 return hyperform; 15455}; 15456 15457hyperform.addTranslation = function (lang, catalog) { 15458 Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["add_translation"])(lang, catalog); 15459 return hyperform; 15460}; 15461 15462hyperform.setRenderer = function (renderer, action) { 15463 _components_renderer__WEBPACK_IMPORTED_MODULE_14__["default"].set(renderer, action); 15464 return hyperform; 15465}; 15466 15467hyperform.addValidator = function (element, validator) { 15468 _components_registry__WEBPACK_IMPORTED_MODULE_13__["default"].set(element, validator); 15469 return hyperform; 15470}; 15471 15472hyperform.setMessage = function (element, validator, message) { 15473 _components_custom_messages__WEBPACK_IMPORTED_MODULE_10__["default"].set(element, validator, message); 15474 return hyperform; 15475}; 15476 15477hyperform.addHook = function (hook, action, position) { 15478 Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["add_hook"])(hook, action, position); 15479 return hyperform; 15480}; 15481 15482hyperform.removeHook = function (hook, action) { 15483 Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["remove_hook"])(hook, action); 15484 return hyperform; 15485}; // TODO: Remove in next non-patch version 15486 15487 15488hyperform.set_language = function (lang) { 15489 w('set_language'); 15490 Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["set_language"])(lang); 15491 return hyperform; 15492}; 15493 15494hyperform.add_translation = function (lang, catalog) { 15495 w('add_translation'); 15496 Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["add_translation"])(lang, catalog); 15497 return hyperform; 15498}; 15499 15500hyperform.set_renderer = function (renderer, action) { 15501 w('set_renderer'); 15502 _components_renderer__WEBPACK_IMPORTED_MODULE_14__["default"].set(renderer, action); 15503 return hyperform; 15504}; 15505 15506hyperform.add_validator = function (element, validator) { 15507 w('add_validator'); 15508 _components_registry__WEBPACK_IMPORTED_MODULE_13__["default"].set(element, validator); 15509 return hyperform; 15510}; 15511 15512hyperform.set_message = function (element, validator, message) { 15513 w('set_message'); 15514 _components_custom_messages__WEBPACK_IMPORTED_MODULE_10__["default"].set(element, validator, message); 15515 return hyperform; 15516}; 15517 15518hyperform.add_hook = function (hook, action, position) { 15519 w('add_hook'); 15520 Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["add_hook"])(hook, action, position); 15521 return hyperform; 15522}; 15523 15524hyperform.remove_hook = function (hook, action) { 15525 w('remove_hook'); 15526 Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["remove_hook"])(hook, action); 15527 return hyperform; 15528}; 15529 15530if (document.currentScript && document.currentScript.hasAttribute('data-hf-autoload')) { 15531 hyperform(window); 15532} 15533 15534/* harmony default export */ __webpack_exports__["default"] = (hyperform); 15535 15536/***/ }), 15537
vendor: 2,577 bytes, lines 15538-15592
15538/***/ "../node_modules/hyperform/src/polyfills/checkValidity.js": 15539/*!****************************************************************!*\ 15540 !*** ../node_modules/hyperform/src/polyfills/checkValidity.js ***! 15541 \****************************************************************/ 15542/*! exports provided: default */ 15543/***/ (function(module, __webpack_exports__, __webpack_require__) { 15544 15545"use strict"; 15546__webpack_require__.r(__webpack_exports__); 15547/* harmony import */ var _tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_validated_elements */ "../node_modules/hyperform/src/tools/get_validated_elements.js"); 15548/* harmony import */ var _tools_return_hook_or__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/return_hook_or */ "../node_modules/hyperform/src/tools/return_hook_or.js"); 15549/* harmony import */ var _tools_trigger_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/trigger_event */ "../node_modules/hyperform/src/tools/trigger_event.js"); 15550/* harmony import */ var _validityState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validityState */ "../node_modules/hyperform/src/polyfills/validityState.js"); 15551/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 15552 15553 15554 15555 15556 15557 15558 15559/** 15560 * check an element's validity with respect to it's form 15561 */ 15562 15563var checkValidity = Object(_tools_return_hook_or__WEBPACK_IMPORTED_MODULE_1__["default"])('checkValidity', function (element) { 15564 /* if this is a <form>, check validity of all child inputs */ 15565 if (element instanceof window.HTMLFormElement) { 15566 return Object(_tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__["get_validated_elements"])(element).map(checkValidity).every(function (b) { 15567 return b; 15568 }); 15569 } 15570 /* default is true, also for elements that are no validation candidates */ 15571 15572 15573 var valid = Object(_validityState__WEBPACK_IMPORTED_MODULE_3__["default"])(element).valid; 15574 15575 if (valid) { 15576 var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_4__["get_wrapper"])(element); 15577 15578 if (wrapped_form && wrapped_form.settings.validEvent) { 15579 Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_2__["default"])(element, 'valid'); 15580 } 15581 } else { 15582 Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_2__["default"])(element, 'invalid', { 15583 cancelable: true 15584 }); 15585 } 15586 15587 return valid; 15588}); 15589/* harmony default export */ __webpack_exports__["default"] = (checkValidity); 15590 15591/***/ }), 15592
vendor: 3,948 bytes, lines 15593-15693
15593/***/ "../node_modules/hyperform/src/polyfills/properties.js": 15594/*!*************************************************************!*\ 15595 !*** ../node_modules/hyperform/src/polyfills/properties.js ***! 15596 \*************************************************************/ 15597/*! exports provided: install_properties, uninstall_properties */ 15598/***/ (function(module, __webpack_exports__, __webpack_require__) { 15599 15600"use strict"; 15601__webpack_require__.r(__webpack_exports__); 15602/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "install_properties", function() { return install_properties; }); 15603/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uninstall_properties", function() { return uninstall_properties; }); 15604/* harmony import */ var _tools_property_installer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/property_installer */ "../node_modules/hyperform/src/tools/property_installer.js"); 15605/* harmony import */ var _tools_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/property_uninstaller */ "../node_modules/hyperform/src/tools/property_uninstaller.js"); 15606/* harmony import */ var _components_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/hooks */ "../node_modules/hyperform/src/components/hooks.js"); 15607 15608 15609 15610 15611 15612 15613var gA = function gA(prop) { 15614 return function () { 15615 return Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_get_' + prop, this.getAttribute(prop), this); 15616 }; 15617}; 15618 15619var sA = function sA(prop) { 15620 return function (value) { 15621 this.setAttribute(prop, Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_set_' + prop, value, this)); 15622 }; 15623}; 15624 15625var gAb = function gAb(prop) { 15626 return function () { 15627 return Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_get_' + prop, this.hasAttribute(prop), this); 15628 }; 15629}; 15630 15631var sAb = function sAb(prop) { 15632 return function (value) { 15633 if (Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_set_' + prop, value, this)) { 15634 this.setAttribute(prop, prop); 15635 } else { 15636 this.removeAttribute(prop); 15637 } 15638 }; 15639}; 15640 15641var gAn = function gAn(prop) { 15642 return function () { 15643 return Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_get_' + prop, Math.max(0, Number(this.getAttribute(prop))), this); 15644 }; 15645}; 15646 15647var sAn = function sAn(prop) { 15648 return function (value) { 15649 value = Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_set_' + prop, value, this); 15650 15651 if (/^[0-9]+$/.test(value)) { 15652 this.setAttribute(prop, value); 15653 } 15654 }; 15655}; 15656 15657function install_properties(element) { 15658 for (var _i = 0, _arr = ['accept', 'max', 'min', 'pattern', 'placeholder', 'step']; _i < _arr.length; _i++) { 15659 var prop = _arr[_i]; 15660 Object(_tools_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, prop, { 15661 get: gA(prop), 15662 set: sA(prop) 15663 }); 15664 } 15665 15666 for (var _i2 = 0, _arr2 = ['multiple', 'required', 'readOnly']; _i2 < _arr2.length; _i2++) { 15667 var _prop = _arr2[_i2]; 15668 Object(_tools_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, _prop, { 15669 get: gAb(_prop.toLowerCase()), 15670 set: sAb(_prop.toLowerCase()) 15671 }); 15672 } 15673 15674 for (var _i3 = 0, _arr3 = ['minLength', 'maxLength']; _i3 < _arr3.length; _i3++) { 15675 var _prop2 = _arr3[_i3]; 15676 Object(_tools_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, _prop2, { 15677 get: gAn(_prop2.toLowerCase()), 15678 set: sAn(_prop2.toLowerCase()) 15679 }); 15680 } 15681} 15682 15683function uninstall_properties(element) { 15684 for (var _i4 = 0, _arr4 = ['accept', 'max', 'min', 'pattern', 'placeholder', 'step', 'multiple', 'required', 'readOnly', 'minLength', 'maxLength']; _i4 < _arr4.length; _i4++) { 15685 var prop = _arr4[_i4]; 15686 Object(_tools_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, prop); 15687 } 15688} 15689 15690 15691 15692/***/ }), 15693
vendor: 2,915 bytes, lines 15694-15759
15694/***/ "../node_modules/hyperform/src/polyfills/reportValidity.js": 15695/*!*****************************************************************!*\ 15696 !*** ../node_modules/hyperform/src/polyfills/reportValidity.js ***! 15697 \*****************************************************************/ 15698/*! exports provided: default */ 15699/***/ (function(module, __webpack_exports__, __webpack_require__) { 15700 15701"use strict"; 15702__webpack_require__.r(__webpack_exports__); 15703/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reportValidity; }); 15704/* harmony import */ var _tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_validated_elements */ "../node_modules/hyperform/src/tools/get_validated_elements.js"); 15705/* harmony import */ var _tools_trigger_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/trigger_event */ "../node_modules/hyperform/src/tools/trigger_event.js"); 15706/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/renderer */ "../node_modules/hyperform/src/components/renderer.js"); 15707/* harmony import */ var _validityState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validityState */ "../node_modules/hyperform/src/polyfills/validityState.js"); 15708/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 15709 15710 15711 15712 15713 15714 15715 15716/** 15717 * check element's validity and report an error back to the user 15718 */ 15719 15720function reportValidity(element) { 15721 /* if this is a <form>, report validity of all child inputs */ 15722 if (element instanceof window.HTMLFormElement) { 15723 element.__hf_form_validation = true; 15724 var form_valid = Object(_tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__["get_validated_elements"])(element).map(reportValidity).every(function (b) { 15725 return b; 15726 }); 15727 delete element.__hf_form_validation; 15728 return form_valid; 15729 } 15730 /* we copy checkValidity() here, b/c we have to check if the "invalid" 15731 * event was canceled. */ 15732 15733 15734 var valid = Object(_validityState__WEBPACK_IMPORTED_MODULE_3__["default"])(element).valid; 15735 var event; 15736 15737 if (valid) { 15738 var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_4__["get_wrapper"])(element); 15739 15740 if (wrapped_form && wrapped_form.settings.validEvent) { 15741 event = Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'valid', { 15742 cancelable: true 15743 }); 15744 } 15745 } else { 15746 event = Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'invalid', { 15747 cancelable: true 15748 }); 15749 } 15750 15751 if (!event || !event.defaultPrevented) { 15752 _components_renderer__WEBPACK_IMPORTED_MODULE_2__["default"].showWarning(element, !!element.form.__hf_form_validation); 15753 } 15754 15755 return valid; 15756} 15757 15758/***/ }), 15759
vendor: 1,945 bytes, lines 15760-15803
15760/***/ "../node_modules/hyperform/src/polyfills/setCustomValidity.js": 15761/*!********************************************************************!*\ 15762 !*** ../node_modules/hyperform/src/polyfills/setCustomValidity.js ***! 15763 \********************************************************************/ 15764/*! exports provided: default */ 15765/***/ (function(module, __webpack_exports__, __webpack_require__) { 15766 15767"use strict"; 15768__webpack_require__.r(__webpack_exports__); 15769/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return setCustomValidity; }); 15770/* harmony import */ var _components_message_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/message_store */ "../node_modules/hyperform/src/components/message_store.js"); 15771/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/renderer */ "../node_modules/hyperform/src/components/renderer.js"); 15772/* harmony import */ var _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/validity_state_checkers */ "../node_modules/hyperform/src/tools/validity_state_checkers.js"); 15773 15774 15775 15776 15777 15778/** 15779 * set a custom validity message or delete it with an empty string 15780 */ 15781 15782function setCustomValidity(element, msg) { 15783 if (!msg) { 15784 _components_message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].delete(element, true); 15785 } else { 15786 _components_message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].set(element, msg, true); 15787 } 15788 /* live-update the warning */ 15789 15790 15791 var warning = _components_renderer__WEBPACK_IMPORTED_MODULE_1__["default"].getWarning(element); 15792 15793 if (warning) { 15794 _components_renderer__WEBPACK_IMPORTED_MODULE_1__["default"].setMessage(warning, msg, element); 15795 } 15796 /* update any classes if the validity state changes */ 15797 15798 15799 _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__["default"].valid(element); 15800} 15801 15802/***/ }), 15803
vendor: 2,013 bytes, lines 15804-15847
15804/***/ "../node_modules/hyperform/src/polyfills/stepDown.js": 15805/*!***********************************************************!*\ 15806 !*** ../node_modules/hyperform/src/polyfills/stepDown.js ***! 15807 \***********************************************************/ 15808/*! exports provided: default */ 15809/***/ (function(module, __webpack_exports__, __webpack_require__) { 15810 15811"use strict"; 15812__webpack_require__.r(__webpack_exports__); 15813/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return stepDown; }); 15814/* harmony import */ var _tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_next_valid */ "../node_modules/hyperform/src/tools/get_next_valid.js"); 15815/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 15816/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 15817/* harmony import */ var _valueAsNumber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js"); 15818 15819 15820 15821 15822 15823 15824/** 15825 * 15826 */ 15827 15828function stepDown(element) { 15829 var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 15830 15831 if (_components_types__WEBPACK_IMPORTED_MODULE_2__["numbers"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) === -1) { 15832 throw new window.DOMException('stepDown encountered invalid type', 'InvalidStateError'); 15833 } 15834 15835 if ((element.getAttribute('step') || '').toLowerCase() === 'any') { 15836 throw new window.DOMException('stepDown encountered step "any"', 'InvalidStateError'); 15837 } 15838 15839 var prev = Object(_tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__["default"])(element, n)[0]; 15840 15841 if (prev !== null) { 15842 Object(_valueAsNumber__WEBPACK_IMPORTED_MODULE_3__["default"])(element, prev); 15843 } 15844} 15845 15846/***/ }), 15847
vendor: 1,997 bytes, lines 15848-15891
15848/***/ "../node_modules/hyperform/src/polyfills/stepUp.js": 15849/*!*********************************************************!*\ 15850 !*** ../node_modules/hyperform/src/polyfills/stepUp.js ***! 15851 \*********************************************************/ 15852/*! exports provided: default */ 15853/***/ (function(module, __webpack_exports__, __webpack_require__) { 15854 15855"use strict"; 15856__webpack_require__.r(__webpack_exports__); 15857/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return stepUp; }); 15858/* harmony import */ var _tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_next_valid */ "../node_modules/hyperform/src/tools/get_next_valid.js"); 15859/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 15860/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 15861/* harmony import */ var _valueAsNumber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js"); 15862 15863 15864 15865 15866 15867 15868/** 15869 * 15870 */ 15871 15872function stepUp(element) { 15873 var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 15874 15875 if (_components_types__WEBPACK_IMPORTED_MODULE_2__["numbers"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) === -1) { 15876 throw new window.DOMException('stepUp encountered invalid type', 'InvalidStateError'); 15877 } 15878 15879 if ((element.getAttribute('step') || '').toLowerCase() === 'any') { 15880 throw new window.DOMException('stepUp encountered step "any"', 'InvalidStateError'); 15881 } 15882 15883 var next = Object(_tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__["default"])(element, n)[1]; 15884 15885 if (next !== null) { 15886 Object(_valueAsNumber__WEBPACK_IMPORTED_MODULE_3__["default"])(element, next); 15887 } 15888} 15889 15890/***/ }), 15891
vendor: 1,179 bytes, lines 15892-15924
15892/***/ "../node_modules/hyperform/src/polyfills/validationMessage.js": 15893/*!********************************************************************!*\ 15894 !*** ../node_modules/hyperform/src/polyfills/validationMessage.js ***! 15895 \********************************************************************/ 15896/*! exports provided: default */ 15897/***/ (function(module, __webpack_exports__, __webpack_require__) { 15898 15899"use strict"; 15900__webpack_require__.r(__webpack_exports__); 15901/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return validationMessage; }); 15902/* harmony import */ var _components_message_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/message_store */ "../node_modules/hyperform/src/components/message_store.js"); 15903 15904 15905 15906/** 15907 * get the validation message for an element, empty string, if the element 15908 * satisfies all constraints. 15909 */ 15910 15911function validationMessage(element) { 15912 var msg = _components_message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].get(element); 15913 15914 if (!msg) { 15915 return ''; 15916 } 15917 /* make it a primitive again, since message_store returns String(). */ 15918 15919 15920 return msg.toString(); 15921} 15922 15923/***/ }), 15924
vendor: 2,897 bytes, lines 15925-16009
15925/***/ "../node_modules/hyperform/src/polyfills/validityState.js": 15926/*!****************************************************************!*\ 15927 !*** ../node_modules/hyperform/src/polyfills/validityState.js ***! 15928 \****************************************************************/ 15929/*! exports provided: default */ 15930/***/ (function(module, __webpack_exports__, __webpack_require__) { 15931 15932"use strict"; 15933__webpack_require__.r(__webpack_exports__); 15934/* harmony import */ var _tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/is_validation_candidate */ "../node_modules/hyperform/src/tools/is_validation_candidate.js"); 15935/* harmony import */ var _tools_mark__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/mark */ "../node_modules/hyperform/src/tools/mark.js"); 15936/* harmony import */ var _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/validity_state_checkers */ "../node_modules/hyperform/src/tools/validity_state_checkers.js"); 15937 15938 15939 15940 15941 15942/** 15943 * the validity state constructor 15944 */ 15945 15946var ValidityState = function ValidityState(element) { 15947 if (!(element instanceof window.HTMLElement)) { 15948 throw new Error('cannot create a ValidityState for a non-element'); 15949 } 15950 15951 var cached = ValidityState.cache.get(element); 15952 15953 if (cached) { 15954 return cached; 15955 } 15956 15957 if (!(this instanceof ValidityState)) { 15958 /* working around a forgotten `new` */ 15959 return new ValidityState(element); 15960 } 15961 15962 this.element = element; 15963 ValidityState.cache.set(element, this); 15964}; 15965/** 15966 * the prototype for new validityState instances 15967 */ 15968 15969 15970var ValidityStatePrototype = {}; 15971ValidityState.prototype = ValidityStatePrototype; 15972ValidityState.cache = new WeakMap(); 15973/* small wrapper around the actual validator to check if the validator 15974 * should actually be called. `this` refers to the ValidityState object. */ 15975 15976var checker_getter = function checker_getter(func) { 15977 return function () { 15978 if (!Object(_tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__["default"])(this.element)) { 15979 /* not being validated == valid by default */ 15980 return true; 15981 } 15982 15983 return func(this.element); 15984 }; 15985}; 15986/** 15987 * copy functionality from the validity checkers to the ValidityState 15988 * prototype 15989 */ 15990 15991 15992for (var prop in _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__["default"]) { 15993 Object.defineProperty(ValidityStatePrototype, prop, { 15994 configurable: true, 15995 enumerable: true, 15996 get: checker_getter(_tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__["default"][prop]), 15997 set: undefined 15998 }); 15999} 16000/** 16001 * mark the validity prototype, because that is what the client-facing 16002 * code deals with mostly, not the property descriptor thing */ 16003 16004 16005Object(_tools_mark__WEBPACK_IMPORTED_MODULE_1__["default"])(ValidityStatePrototype); 16006/* harmony default export */ __webpack_exports__["default"] = (ValidityState); 16007 16008/***/ }), 16009
vendor: 2,644 bytes, lines 16010-16069
16010/***/ "../node_modules/hyperform/src/polyfills/valueAsDate.js": 16011/*!**************************************************************!*\ 16012 !*** ../node_modules/hyperform/src/polyfills/valueAsDate.js ***! 16013 \**************************************************************/ 16014/*! exports provided: default */ 16015/***/ (function(module, __webpack_exports__, __webpack_require__) { 16016 16017"use strict"; 16018__webpack_require__.r(__webpack_exports__); 16019/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return valueAsDate; }); 16020/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 16021/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js"); 16022/* harmony import */ var _tools_date_to_string__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/date_to_string */ "../node_modules/hyperform/src/tools/date_to_string.js"); 16023/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 16024 16025 16026 16027 16028 16029 16030/** 16031 * implement the valueAsDate functionality 16032 * 16033 * @see https://html.spec.whatwg.org/multipage/forms.html#dom-input-valueasdate 16034 */ 16035 16036function valueAsDate(element) { 16037 var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; 16038 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 16039 16040 if (_components_types__WEBPACK_IMPORTED_MODULE_3__["dates"].indexOf(type) > -1) { 16041 if (value !== undefined) { 16042 /* setter: value must be null or a Date() */ 16043 if (value === null) { 16044 element.value = ''; 16045 } else if (value instanceof Date) { 16046 if (isNaN(value.getTime())) { 16047 element.value = ''; 16048 } else { 16049 element.value = Object(_tools_date_to_string__WEBPACK_IMPORTED_MODULE_2__["default"])(value, type); 16050 } 16051 } else { 16052 throw new window.DOMException('valueAsDate setter encountered invalid value', 'TypeError'); 16053 } 16054 16055 return; 16056 } 16057 16058 var value_date = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value, type); 16059 return value_date instanceof Date ? value_date : null; 16060 } else if (value !== undefined) { 16061 /* trying to set a date on a not-date input fails */ 16062 throw new window.DOMException('valueAsDate setter cannot set date on this element', 'InvalidStateError'); 16063 } 16064 16065 return null; 16066} 16067 16068/***/ }), 16069
vendor: 3,023 bytes, lines 16070-16141
16070/***/ "../node_modules/hyperform/src/polyfills/valueAsNumber.js": 16071/*!****************************************************************!*\ 16072 !*** ../node_modules/hyperform/src/polyfills/valueAsNumber.js ***! 16073 \****************************************************************/ 16074/*! exports provided: default */ 16075/***/ (function(module, __webpack_exports__, __webpack_require__) { 16076 16077"use strict"; 16078__webpack_require__.r(__webpack_exports__); 16079/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return valueAsNumber; }); 16080/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 16081/* harmony import */ var _tools_string_to_number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js"); 16082/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 16083/* harmony import */ var _valueAsDate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./valueAsDate */ "../node_modules/hyperform/src/polyfills/valueAsDate.js"); 16084 16085 16086 16087 16088 16089 16090/** 16091 * implement the valueAsNumber functionality 16092 * 16093 * @see https://html.spec.whatwg.org/multipage/forms.html#dom-input-valueasnumber 16094 */ 16095 16096function valueAsNumber(element) { 16097 var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; 16098 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 16099 16100 if (_components_types__WEBPACK_IMPORTED_MODULE_2__["numbers"].indexOf(type) > -1) { 16101 if (type === 'range' && element.hasAttribute('multiple')) { 16102 /* @see https://html.spec.whatwg.org/multipage/forms.html#do-not-apply */ 16103 return NaN; 16104 } 16105 16106 if (value !== undefined) { 16107 /* setter: value must be NaN or a finite number */ 16108 if (isNaN(value)) { 16109 element.value = ''; 16110 } else if (typeof value === 'number' && window.isFinite(value)) { 16111 try { 16112 /* try setting as a date, but... */ 16113 Object(_valueAsDate__WEBPACK_IMPORTED_MODULE_3__["default"])(element, new Date(value)); 16114 } catch (e) { 16115 /* ... when valueAsDate is not responsible, ... */ 16116 if (!(e instanceof window.DOMException)) { 16117 throw e; 16118 } 16119 /* ... set it via Number.toString(). */ 16120 16121 16122 element.value = value.toString(); 16123 } 16124 } else { 16125 throw new window.DOMException('valueAsNumber setter encountered invalid value', 'TypeError'); 16126 } 16127 16128 return; 16129 } 16130 16131 return Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value, type); 16132 } else if (value !== undefined) { 16133 /* trying to set a number on a not-number input fails */ 16134 throw new window.DOMException('valueAsNumber setter cannot set number on this element', 'InvalidStateError'); 16135 } 16136 16137 return NaN; 16138} 16139 16140/***/ }), 16141
vendor: 992 bytes, lines 16142-16165
16142/***/ "../node_modules/hyperform/src/polyfills/willValidate.js": 16143/*!***************************************************************!*\ 16144 !*** ../node_modules/hyperform/src/polyfills/willValidate.js ***! 16145 \***************************************************************/ 16146/*! exports provided: default */ 16147/***/ (function(module, __webpack_exports__, __webpack_require__) { 16148 16149"use strict"; 16150__webpack_require__.r(__webpack_exports__); 16151/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return willValidate; }); 16152/* harmony import */ var _tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/is_validation_candidate */ "../node_modules/hyperform/src/tools/is_validation_candidate.js"); 16153 16154 16155 16156/** 16157 * check, if an element will be subject to HTML5 validation at all 16158 */ 16159 16160function willValidate(element) { 16161 return Object(_tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 16162} 16163 16164/***/ }), 16165
vendor: 11,324 bytes, lines 16166-16497
16166/***/ "../node_modules/hyperform/src/tools/catch_submit.js": 16167/*!***********************************************************!*\ 16168 !*** ../node_modules/hyperform/src/tools/catch_submit.js ***! 16169 \***********************************************************/ 16170/*! exports provided: catch_submit, uncatch_submit */ 16171/***/ (function(module, __webpack_exports__, __webpack_require__) { 16172 16173"use strict"; 16174__webpack_require__.r(__webpack_exports__); 16175/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catch_submit", function() { return catch_submit; }); 16176/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uncatch_submit", function() { return uncatch_submit; }); 16177/* harmony import */ var _trigger_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trigger_event */ "../node_modules/hyperform/src/tools/trigger_event.js"); 16178/* harmony import */ var _matches__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./matches */ "../node_modules/hyperform/src/tools/matches.js"); 16179/* harmony import */ var _get_validated_elements__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get_validated_elements */ "../node_modules/hyperform/src/tools/get_validated_elements.js"); 16180/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js"); 16181/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 16182/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 16183 16184 16185 16186 16187 16188 16189 16190 16191/** 16192 * submit a form, because `element` triggered it 16193 * 16194 * This method also dispatches a submit event on the form prior to the 16195 * submission. The event contains the trigger element as `submittedVia`. 16196 * 16197 * If the element is a button with a name, the name=value pair will be added 16198 * to the submitted data. 16199 */ 16200 16201function submit_form_via(element) { 16202 /* apparently, the submit event is not triggered in most browsers on 16203 * the submit() method, so we do it manually here to model a natural 16204 * submit as closely as possible. 16205 * Now to the fun fact: If you trigger a submit event from a form, what 16206 * do you think should happen? 16207 * 1) the form will be automagically submitted by the browser, or 16208 * 2) nothing. 16209 * And as you already suspected, the correct answer is: both! Firefox 16210 * opts for 1), Chrome for 2). Yay! */ 16211 var event_got_cancelled; 16212 var submit_event = Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["create_event"])('submit', { 16213 cancelable: true 16214 }); 16215 /* force Firefox to not submit the form, then fake preventDefault() */ 16216 16217 submit_event.preventDefault(); 16218 Object.defineProperty(submit_event, 'defaultPrevented', { 16219 value: false, 16220 writable: true 16221 }); 16222 Object.defineProperty(submit_event, 'preventDefault', { 16223 value: function value() { 16224 return submit_event.defaultPrevented = event_got_cancelled = true; 16225 }, 16226 writable: true 16227 }); 16228 Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["default"])(element.form, submit_event, {}, { 16229 submittedVia: element 16230 }); 16231 16232 if (!event_got_cancelled) { 16233 add_submit_field(element); 16234 window.HTMLFormElement.prototype.submit.call(element.form); 16235 window.setTimeout(function () { 16236 return remove_submit_field(element); 16237 }); 16238 } 16239} 16240/** 16241 * if a submit button was clicked, add its name=value by means of a type=hidden 16242 * input field 16243 */ 16244 16245 16246function add_submit_field(button) { 16247 if (['image', 'submit'].indexOf(button.type) > -1 && button.name) { 16248 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_5__["get_wrapper"])(button.form) || {}; 16249 var submit_helper = wrapper.submit_helper; 16250 16251 if (submit_helper) { 16252 if (submit_helper.parentNode) { 16253 submit_helper.parentNode.removeChild(submit_helper); 16254 } 16255 } else { 16256 submit_helper = document.createElement('input'); 16257 submit_helper.type = 'hidden'; 16258 wrapper.submit_helper = submit_helper; 16259 } 16260 16261 submit_helper.name = button.name; 16262 submit_helper.value = button.value; 16263 button.form.appendChild(submit_helper); 16264 } 16265} 16266/** 16267 * remove a possible helper input, that was added by `add_submit_field` 16268 */ 16269 16270 16271function remove_submit_field(button) { 16272 if (['image', 'submit'].indexOf(button.type) > -1 && button.name) { 16273 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_5__["get_wrapper"])(button.form) || {}; 16274 var submit_helper = wrapper.submit_helper; 16275 16276 if (submit_helper && submit_helper.parentNode) { 16277 submit_helper.parentNode.removeChild(submit_helper); 16278 } 16279 } 16280} 16281/** 16282 * check a form's validity and submit it 16283 * 16284 * The method triggers a cancellable `validate` event on the form. If the 16285 * event is cancelled, form submission will be aborted, too. 16286 * 16287 * If the form is found to contain invalid fields, focus the first field. 16288 */ 16289 16290 16291function check(button) { 16292 /* trigger a "validate" event on the form to be submitted */ 16293 var val_event = Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["default"])(button.form, 'validate', { 16294 cancelable: true 16295 }); 16296 16297 if (val_event.defaultPrevented) { 16298 /* skip the whole submit thing, if the validation is canceled. A user 16299 * can still call form.submit() afterwards. */ 16300 return; 16301 } 16302 16303 var valid = true; 16304 var first_invalid; 16305 button.form.__hf_form_validation = true; 16306 Object(_get_validated_elements__WEBPACK_IMPORTED_MODULE_2__["get_validated_elements"])(button.form).map(function (element) { 16307 if (!Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_3__["default"])(element)) { 16308 valid = false; 16309 16310 if (!first_invalid && 'focus' in element) { 16311 first_invalid = element; 16312 } 16313 } 16314 }); 16315 delete button.form.__hf_form_validation; 16316 16317 if (valid) { 16318 submit_form_via(button); 16319 } else if (first_invalid) { 16320 /* focus the first invalid element, if validation went south */ 16321 first_invalid.focus(); 16322 /* tell the tale, if anyone wants to react to it */ 16323 16324 Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["default"])(button.form, 'forminvalid'); 16325 } 16326} 16327/** 16328 * test if node is a submit button 16329 */ 16330 16331 16332function is_submit_button(node) { 16333 return ( 16334 /* must be an input or button element... */ 16335 (node.nodeName === 'INPUT' || node.nodeName === 'BUTTON') && ( 16336 /* ...and have a submitting type */ 16337 node.type === 'image' || node.type === 'submit') 16338 ); 16339} 16340/** 16341 * test, if the click event would trigger a submit 16342 */ 16343 16344 16345function is_submitting_click(event, button) { 16346 return ( 16347 /* prevented default: won't trigger a submit */ 16348 !event.defaultPrevented && ( 16349 /* left button or middle button (submits in Chrome) */ 16350 !('button' in event) || event.button < 2) && 16351 /* must be a submit button... */ 16352 is_submit_button(button) && 16353 /* the button needs a form, that's going to be submitted */ 16354 button.form && 16355 /* again, if the form should not be validated, we're out of the game */ 16356 !button.form.hasAttribute('novalidate') 16357 ); 16358} 16359/** 16360 * test, if the keypress event would trigger a submit 16361 */ 16362 16363 16364function is_submitting_keypress(event) { 16365 return ( 16366 /* prevented default: won't trigger a submit */ 16367 !event.defaultPrevented && ( 16368 /* ...and <Enter> was pressed... */ 16369 event.keyCode === 13 && 16370 /* ...on an <input> that is... */ 16371 event.target.nodeName === 'INPUT' && 16372 /* ...a standard text input field (not checkbox, ...) */ 16373 _components_types__WEBPACK_IMPORTED_MODULE_4__["text"].indexOf(event.target.type) > -1 || 16374 /* or <Enter> or <Space> was pressed... */ 16375 (event.keyCode === 13 || event.keyCode === 32) && 16376 /* ...on a submit button */ 16377 is_submit_button(event.target)) && 16378 /* there's a form... */ 16379 event.target.form && 16380 /* ...and the form allows validation */ 16381 !event.target.form.hasAttribute('novalidate') 16382 ); 16383} 16384/** 16385 * catch clicks to children of <button>s 16386 */ 16387 16388 16389function get_clicked_button(element) { 16390 if (is_submit_button(element)) { 16391 return element; 16392 } else if (Object(_matches__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'button:not([type]) *, button[type="submit"] *')) { 16393 return get_clicked_button(element.parentNode); 16394 } else { 16395 return null; 16396 } 16397} 16398/** 16399 * return event handler to catch explicit submission by click on a button 16400 */ 16401 16402 16403function get_click_handler() { 16404 var ignore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; 16405 return function (event) { 16406 var button = get_clicked_button(event.target); 16407 16408 if (button && is_submitting_click(event, button)) { 16409 event.preventDefault(); 16410 16411 if (ignore || button.hasAttribute('formnovalidate')) { 16412 /* if validation should be ignored, we're not interested in any checks */ 16413 submit_form_via(button); 16414 } else { 16415 check(button); 16416 } 16417 } 16418 }; 16419} 16420 16421var click_handler = get_click_handler(); 16422var ignored_click_handler = get_click_handler(true); 16423/** 16424 * catch implicit submission by pressing <Enter> in some situations 16425 */ 16426 16427function get_keypress_handler(ignore) { 16428 return function keypress_handler(event) { 16429 if (is_submitting_keypress(event)) { 16430 event.preventDefault(); 16431 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_5__["get_wrapper"])(event.target.form) || { 16432 settings: {} 16433 }; 16434 16435 if (wrapper.settings.preventImplicitSubmit) { 16436 /* user doesn't want an implicit submit. Cancel here. */ 16437 return; 16438 } 16439 /* check, that there is no submit button in the form. Otherwise 16440 * that should be clicked. */ 16441 16442 16443 var el = event.target.form.elements.length; 16444 var submit; 16445 16446 for (var i = 0; i < el; i++) { 16447 if (['image', 'submit'].indexOf(event.target.form.elements[i].type) > -1) { 16448 submit = event.target.form.elements[i]; 16449 break; 16450 } 16451 } 16452 16453 if (submit) { 16454 submit.click(); 16455 } else if (ignore) { 16456 submit_form_via(event.target); 16457 } else { 16458 check(event.target); 16459 } 16460 } 16461 }; 16462} 16463 16464var keypress_handler = get_keypress_handler(); 16465var ignored_keypress_handler = get_keypress_handler(true); 16466/** 16467 * catch all relevant events _prior_ to a form being submitted 16468 * 16469 * @param bool ignore bypass validation, when an attempt to submit the 16470 * form is detected. True, when the wrapper's revalidate 16471 * setting is 'never'. 16472 */ 16473 16474function catch_submit(listening_node) { 16475 var ignore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 16476 16477 if (ignore) { 16478 listening_node.addEventListener('click', ignored_click_handler); 16479 listening_node.addEventListener('keypress', ignored_keypress_handler); 16480 } else { 16481 listening_node.addEventListener('click', click_handler); 16482 listening_node.addEventListener('keypress', keypress_handler); 16483 } 16484} 16485/** 16486 * decommission the event listeners from catch_submit() again 16487 */ 16488 16489function uncatch_submit(listening_node) { 16490 listening_node.removeEventListener('click', ignored_click_handler); 16491 listening_node.removeEventListener('keypress', ignored_keypress_handler); 16492 listening_node.removeEventListener('click', click_handler); 16493 listening_node.removeEventListener('keypress', keypress_handler); 16494} 16495 16496/***/ }), 16497
vendor: 1,020 bytes, lines 16498-16528
16498/***/ "../node_modules/hyperform/src/tools/comma_split.js": 16499/*!**********************************************************!*\ 16500 !*** ../node_modules/hyperform/src/tools/comma_split.js ***! 16501 \**********************************************************/ 16502/*! exports provided: default */ 16503/***/ (function(module, __webpack_exports__, __webpack_require__) { 16504 16505"use strict"; 16506__webpack_require__.r(__webpack_exports__); 16507/* harmony import */ var _trim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trim */ "../node_modules/hyperform/src/tools/trim.js"); 16508 16509 16510 16511/** 16512 * split a string on comma and trim the components 16513 * 16514 * As specified at 16515 * https://html.spec.whatwg.org/multipage/infrastructure.html#split-a-string-on-commas 16516 * plus removing empty entries. 16517 */ 16518 16519/* harmony default export */ __webpack_exports__["default"] = (function (str) { 16520 return str.split(',').map(function (item) { 16521 return Object(_trim__WEBPACK_IMPORTED_MODULE_0__["default"])(item); 16522 }).filter(function (b) { 16523 return b; 16524 }); 16525}); 16526 16527/***/ }), 16528
vendor: 2,515 bytes, lines 16529-16591
16529/***/ "../node_modules/hyperform/src/tools/date_to_string.js": 16530/*!*************************************************************!*\ 16531 !*** ../node_modules/hyperform/src/tools/date_to_string.js ***! 16532 \*************************************************************/ 16533/*! exports provided: default */ 16534/***/ (function(module, __webpack_exports__, __webpack_require__) { 16535 16536"use strict"; 16537__webpack_require__.r(__webpack_exports__); 16538/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return date_to_string; }); 16539/* harmony import */ var _sprintf__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sprintf */ "../node_modules/hyperform/src/tools/sprintf.js"); 16540/* harmony import */ var _get_week_of_year__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get_week_of_year */ "../node_modules/hyperform/src/tools/get_week_of_year.js"); 16541 16542 16543 16544 16545 16546function pad(num) { 16547 var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; 16548 var s = num + ''; 16549 16550 while (s.length < size) { 16551 s = '0' + s; 16552 } 16553 16554 return s; 16555} 16556/** 16557 * calculate a string from a date according to HTML5 16558 */ 16559 16560 16561function date_to_string(date, element_type) { 16562 if (!(date instanceof Date)) { 16563 return null; 16564 } 16565 16566 switch (element_type) { 16567 case 'datetime': 16568 return date_to_string(date, 'date') + 'T' + date_to_string(date, 'time'); 16569 16570 case 'datetime-local': 16571 return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s-%s-%sT%s:%s:%s.%s', date.getFullYear(), pad(date.getMonth() + 1), pad(date.getDate()), pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds()), pad(date.getMilliseconds(), 3)).replace(/(:00)?\.000$/, ''); 16572 16573 case 'date': 16574 return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s-%s-%s', date.getUTCFullYear(), pad(date.getUTCMonth() + 1), pad(date.getUTCDate())); 16575 16576 case 'month': 16577 return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s-%s', date.getUTCFullYear(), pad(date.getUTCMonth() + 1)); 16578 16579 case 'week': 16580 var params = Object(_get_week_of_year__WEBPACK_IMPORTED_MODULE_1__["default"])(date); 16581 return _sprintf__WEBPACK_IMPORTED_MODULE_0__["default"].call(null, '%s-W%s', params[0], pad(params[1])); 16582 16583 case 'time': 16584 return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s:%s:%s.%s', pad(date.getUTCHours()), pad(date.getUTCMinutes()), pad(date.getUTCSeconds()), pad(date.getUTCMilliseconds(), 3)).replace(/(:00)?\.000$/, ''); 16585 } 16586 16587 return null; 16588} 16589 16590/***/ }), 16591
vendor: 1,096 bytes, lines 16592-16627
16592/***/ "../node_modules/hyperform/src/tools/format_date.js": 16593/*!**********************************************************!*\ 16594 !*** ../node_modules/hyperform/src/tools/format_date.js ***! 16595 \**********************************************************/ 16596/*! exports provided: default */ 16597/***/ (function(module, __webpack_exports__, __webpack_require__) { 16598 16599"use strict"; 16600__webpack_require__.r(__webpack_exports__); 16601 16602 16603/* harmony default export */ __webpack_exports__["default"] = (function (date) { 16604 var part = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; 16605 16606 switch (part) { 16607 case 'date': 16608 return (date.toLocaleDateString || date.toDateString).call(date); 16609 16610 case 'time': 16611 return (date.toLocaleTimeString || date.toTimeString).call(date); 16612 16613 case 'month': 16614 return 'toLocaleDateString' in date ? date.toLocaleDateString(undefined, { 16615 year: 'numeric', 16616 month: '2-digit' 16617 }) : date.toDateString(); 16618 // case 'week': 16619 // TODO 16620 16621 default: 16622 return (date.toLocaleString || date.toString).call(date); 16623 } 16624}); 16625 16626/***/ }), 16627
vendor: 967 bytes, lines 16628-16658
16628/***/ "../node_modules/hyperform/src/tools/generate_id.js": 16629/*!**********************************************************!*\ 16630 !*** ../node_modules/hyperform/src/tools/generate_id.js ***! 16631 \**********************************************************/ 16632/*! exports provided: default */ 16633/***/ (function(module, __webpack_exports__, __webpack_require__) { 16634 16635"use strict"; 16636__webpack_require__.r(__webpack_exports__); 16637 16638/** 16639 * counter that will be incremented with every call 16640 * 16641 * Will enforce uniqueness, as long as no more than 1 hyperform scripts 16642 * are loaded. (In that case we still have the "random" part below.) 16643 */ 16644 16645var uid = 0; 16646/** 16647 * generate a random ID 16648 * 16649 * @see https://gist.github.com/gordonbrander/2230317 16650 */ 16651 16652/* harmony default export */ __webpack_exports__["default"] = (function () { 16653 var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hf_'; 16654 return prefix + uid++ + Math.random().toString(36).substr(2); 16655}); 16656 16657/***/ }), 16658
vendor: 948 bytes, lines 16659-16690
16659/***/ "../node_modules/hyperform/src/tools/get_date_from_week.js": 16660/*!*****************************************************************!*\ 16661 !*** ../node_modules/hyperform/src/tools/get_date_from_week.js ***! 16662 \*****************************************************************/ 16663/*! exports provided: default */ 16664/***/ (function(module, __webpack_exports__, __webpack_require__) { 16665 16666"use strict"; 16667__webpack_require__.r(__webpack_exports__); 16668 16669/** 16670 * return a new Date() representing the ISO date for a week number 16671 * 16672 * @see http://stackoverflow.com/a/16591175/113195 16673 */ 16674 16675/* harmony default export */ __webpack_exports__["default"] = (function (week, year) { 16676 var date = new Date(Date.UTC(year, 0, 1 + (week - 1) * 7)); 16677 16678 if (date.getUTCDay() <= 4 16679 /* thursday */ 16680 ) { 16681 date.setUTCDate(date.getUTCDate() - date.getUTCDay() + 1); 16682 } else { 16683 date.setUTCDate(date.getUTCDate() + 8 - date.getUTCDay()); 16684 } 16685 16686 return date; 16687}); 16688 16689/***/ }), 16690
vendor: 4,606 bytes, lines 16691-16793
16691/***/ "../node_modules/hyperform/src/tools/get_next_valid.js": 16692/*!*************************************************************!*\ 16693 !*** ../node_modules/hyperform/src/tools/get_next_valid.js ***! 16694 \*************************************************************/ 16695/*! exports provided: default */ 16696/***/ (function(module, __webpack_exports__, __webpack_require__) { 16697 16698"use strict"; 16699__webpack_require__.r(__webpack_exports__); 16700/* harmony import */ var _date_to_string__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./date_to_string */ "../node_modules/hyperform/src/tools/date_to_string.js"); 16701/* harmony import */ var _string_to_number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js"); 16702/* harmony import */ var _get_type__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 16703/* harmony import */ var _components_localization__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/localization */ "../node_modules/hyperform/src/components/localization.js"); 16704/* harmony import */ var _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/step_defaults */ "../node_modules/hyperform/src/components/step_defaults.js"); 16705/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 16706 16707 16708 16709 16710 16711 16712 16713 16714/** 16715 * get previous and next valid values for a stepped input element 16716 */ 16717 16718/* harmony default export */ __webpack_exports__["default"] = (function (element) { 16719 var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 16720 var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element); 16721 var aMin = element.getAttribute('min'); 16722 var min = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_min"][type] || NaN; 16723 16724 if (aMin) { 16725 var pMin = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(aMin, type); 16726 16727 if (!isNaN(pMin)) { 16728 min = pMin; 16729 } 16730 } 16731 16732 var aMax = element.getAttribute('max'); 16733 var max = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_max"][type] || NaN; 16734 16735 if (aMax) { 16736 var pMax = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(aMax, type); 16737 16738 if (!isNaN(pMax)) { 16739 max = pMax; 16740 } 16741 } 16742 16743 var aStep = element.getAttribute('step'); 16744 var step = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_step"][type] || 1; 16745 16746 if (aStep && aStep.toLowerCase() === 'any') { 16747 /* quick return: we cannot calculate prev and next */ 16748 return [Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any value'), Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any value')]; 16749 } else if (aStep) { 16750 var pStep = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(aStep, type); 16751 16752 if (!isNaN(pStep)) { 16753 step = pStep; 16754 } 16755 } 16756 16757 var default_value = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(element.getAttribute('value'), type); 16758 var value = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value || element.getAttribute('value'), type); 16759 16760 if (isNaN(value)) { 16761 /* quick return: we cannot calculate without a solid base */ 16762 return [Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any valid value'), Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any valid value')]; 16763 } 16764 16765 var step_base = !isNaN(min) ? min : !isNaN(default_value) ? default_value : _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_step_base"][type] || 0; 16766 var scale = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["step_scale_factor"][type] || 1; 16767 var prev = step_base + Math.floor((value - step_base) / (step * scale)) * (step * scale) * n; 16768 var next = step_base + (Math.floor((value - step_base) / (step * scale)) + 1) * (step * scale) * n; 16769 16770 if (prev < min) { 16771 prev = null; 16772 } else if (prev > max) { 16773 prev = max; 16774 } 16775 16776 if (next > max) { 16777 next = null; 16778 } else if (next < min) { 16779 next = min; 16780 } 16781 /* convert to date objects, if appropriate */ 16782 16783 16784 if (_components_types__WEBPACK_IMPORTED_MODULE_5__["dates"].indexOf(type) > -1) { 16785 prev = Object(_date_to_string__WEBPACK_IMPORTED_MODULE_0__["default"])(new Date(prev), type); 16786 next = Object(_date_to_string__WEBPACK_IMPORTED_MODULE_0__["default"])(new Date(next), type); 16787 } 16788 16789 return [prev, next]; 16790}); 16791 16792/***/ }), 16793
vendor: 912 bytes, lines 16794-16821
16794/***/ "../node_modules/hyperform/src/tools/get_radiogroup.js": 16795/*!*************************************************************!*\ 16796 !*** ../node_modules/hyperform/src/tools/get_radiogroup.js ***! 16797 \*************************************************************/ 16798/*! exports provided: get_radiogroup */ 16799/***/ (function(module, __webpack_exports__, __webpack_require__) { 16800 16801"use strict"; 16802__webpack_require__.r(__webpack_exports__); 16803/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get_radiogroup", function() { return get_radiogroup; }); 16804 16805/** 16806 * get all radio buttons (including `element`) that belong to element's 16807 * radio group 16808 */ 16809 16810function get_radiogroup(element) { 16811 if (element.form) { 16812 return Array.prototype.filter.call(element.form.elements, function (radio) { 16813 return radio.type === 'radio' && radio.name === element.name; 16814 }); 16815 } 16816 16817 return [element]; 16818} 16819 16820/***/ }), 16821
vendor: 1,500 bytes, lines 16822-16862
16822/***/ "../node_modules/hyperform/src/tools/get_type.js": 16823/*!*******************************************************!*\ 16824 !*** ../node_modules/hyperform/src/tools/get_type.js ***! 16825 \*******************************************************/ 16826/*! exports provided: default */ 16827/***/ (function(module, __webpack_exports__, __webpack_require__) { 16828 16829"use strict"; 16830__webpack_require__.r(__webpack_exports__); 16831/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 16832 16833 16834 16835/** 16836 * get the element's type in a backwards-compatible way 16837 */ 16838 16839/* harmony default export */ __webpack_exports__["default"] = (function (element) { 16840 if (element instanceof window.HTMLTextAreaElement) { 16841 return 'textarea'; 16842 } else if (element instanceof window.HTMLSelectElement) { 16843 return element.hasAttribute('multiple') ? 'select-multiple' : 'select-one'; 16844 } else if (element instanceof window.HTMLButtonElement) { 16845 return (element.getAttribute('type') || 'submit').toLowerCase(); 16846 } else if (element instanceof window.HTMLInputElement) { 16847 var attr = (element.getAttribute('type') || '').toLowerCase(); 16848 16849 if (attr && _components_types__WEBPACK_IMPORTED_MODULE_0__["inputs"].indexOf(attr) > -1) { 16850 return attr; 16851 } else { 16852 /* perhaps the DOM has in-depth knowledge. Take that before returning 16853 * 'text'. */ 16854 return element.type || 'text'; 16855 } 16856 } 16857 16858 return ''; 16859}); 16860 16861/***/ }), 16862
vendor: 1,381 bytes, lines 16863-16897
16863/***/ "../node_modules/hyperform/src/tools/get_validated_elements.js": 16864/*!*********************************************************************!*\ 16865 !*** ../node_modules/hyperform/src/tools/get_validated_elements.js ***! 16866 \*********************************************************************/ 16867/*! exports provided: get_validated_elements */ 16868/***/ (function(module, __webpack_exports__, __webpack_require__) { 16869 16870"use strict"; 16871__webpack_require__.r(__webpack_exports__); 16872/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get_validated_elements", function() { return get_validated_elements; }); 16873/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 16874 16875 16876 16877/** 16878 * filter a form's elements for the ones needing validation prior to 16879 * a submit 16880 * 16881 * Returns an array of form elements. 16882 */ 16883 16884function get_validated_elements(form) { 16885 var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(form); 16886 return Array.prototype.filter.call(form.elements, function (element) { 16887 /* it must have a name (or validating nameless inputs is allowed) */ 16888 if (element.getAttribute('name') || wrapped_form && wrapped_form.settings.validateNameless) { 16889 return true; 16890 } 16891 16892 return false; 16893 }); 16894} 16895 16896/***/ }), 16897
vendor: 1,613 bytes, lines 16898-16947
16898/***/ "../node_modules/hyperform/src/tools/get_week_of_year.js": 16899/*!***************************************************************!*\ 16900 !*** ../node_modules/hyperform/src/tools/get_week_of_year.js ***! 16901 \***************************************************************/ 16902/*! exports provided: default */ 16903/***/ (function(module, __webpack_exports__, __webpack_require__) { 16904 16905"use strict"; 16906__webpack_require__.r(__webpack_exports__); 16907 16908/* For a given date, get the ISO week number 16909 * 16910 * Source: http://stackoverflow.com/a/6117889/113195 16911 * 16912 * Based on information at: 16913 * 16914 * http://www.merlyn.demon.co.uk/weekcalc.htm#WNR 16915 * 16916 * Algorithm is to find nearest thursday, it's year 16917 * is the year of the week number. Then get weeks 16918 * between that date and the first day of that year. 16919 * 16920 * Note that dates in one year can be weeks of previous 16921 * or next year, overlap is up to 3 days. 16922 * 16923 * e.g. 2014/12/29 is Monday in week 1 of 2015 16924 * 2012/1/1 is Sunday in week 52 of 2011 16925 */ 16926 16927/* harmony default export */ __webpack_exports__["default"] = (function (d) { 16928 /* Copy date so don't modify original */ 16929 d = new Date(+d); 16930 d.setUTCHours(0, 0, 0); 16931 /* Set to nearest Thursday: current date + 4 - current day number 16932 * Make Sunday's day number 7 */ 16933 16934 d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7)); 16935 /* Get first day of year */ 16936 16937 var yearStart = new Date(d.getUTCFullYear(), 0, 1); 16938 /* Calculate full weeks to nearest Thursday */ 16939 16940 var weekNo = Math.ceil(((d - yearStart) / 86400000 + 1) / 7); 16941 /* Return array of year and week number */ 16942 16943 return [d.getUTCFullYear(), weekNo]; 16944}); 16945 16946/***/ }), 16947
vendor: 999 bytes, lines 16948-16964
16948/***/ "../node_modules/hyperform/src/tools/is_field.js": 16949/*!*******************************************************!*\ 16950 !*** ../node_modules/hyperform/src/tools/is_field.js ***! 16951 \*******************************************************/ 16952/*! exports provided: default */ 16953/***/ (function(module, __webpack_exports__, __webpack_require__) { 16954 16955"use strict"; 16956__webpack_require__.r(__webpack_exports__); 16957 16958 16959/* harmony default export */ __webpack_exports__["default"] = (function (element) { 16960 return element instanceof window.HTMLButtonElement || element instanceof window.HTMLInputElement || element instanceof window.HTMLSelectElement || element instanceof window.HTMLTextAreaElement || element instanceof window.HTMLFieldSetElement || element === window.HTMLButtonElement.prototype || element === window.HTMLInputElement.prototype || element === window.HTMLSelectElement.prototype || element === window.HTMLTextAreaElement.prototype || element === window.HTMLFieldSetElement.prototype; 16961}); 16962 16963/***/ }), 16964
vendor: 3,984 bytes, lines 16965-17061
16965/***/ "../node_modules/hyperform/src/tools/is_validation_candidate.js": 16966/*!**********************************************************************!*\ 16967 !*** ../node_modules/hyperform/src/tools/is_validation_candidate.js ***! 16968 \**********************************************************************/ 16969/*! exports provided: default */ 16970/***/ (function(module, __webpack_exports__, __webpack_require__) { 16971 16972"use strict"; 16973__webpack_require__.r(__webpack_exports__); 16974/* harmony import */ var _components_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/hooks */ "../node_modules/hyperform/src/components/hooks.js"); 16975/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 16976/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 16977/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 16978 16979 16980 16981 16982 16983 16984/** 16985 * check if an element should be ignored due to any of its parents 16986 * 16987 * Checks <fieldset disabled> and <datalist>. 16988 */ 16989 16990function is_in_disallowed_parent(element) { 16991 var p = element.parentNode; 16992 16993 while (p && p.nodeType === 1) { 16994 if (p instanceof window.HTMLFieldSetElement && p.hasAttribute('disabled')) { 16995 /* quick return, if it's a child of a disabled fieldset */ 16996 return true; 16997 } else if (p.nodeName.toUpperCase() === 'DATALIST') { 16998 /* quick return, if it's a child of a datalist 16999 * Do not use HTMLDataListElement to support older browsers, 17000 * too. 17001 * @see https://html.spec.whatwg.org/multipage/forms.html#the-datalist-element:barred-from-constraint-validation 17002 */ 17003 return true; 17004 } else if (p === element.form) { 17005 /* the outer boundary. We can stop looking for relevant elements. */ 17006 break; 17007 } 17008 17009 p = p.parentNode; 17010 } 17011 17012 return false; 17013} 17014/** 17015 * check if an element is a candidate for constraint validation 17016 * 17017 * @see https://html.spec.whatwg.org/multipage/forms.html#barred-from-constraint-validation 17018 */ 17019 17020 17021/* harmony default export */ __webpack_exports__["default"] = (function (element) { 17022 /* allow a shortcut via filters, e.g. to validate type=hidden fields */ 17023 var filtered = Object(_components_hooks__WEBPACK_IMPORTED_MODULE_0__["do_filter"])('is_validation_candidate', null, element); 17024 17025 if (filtered !== null) { 17026 return !!filtered; 17027 } 17028 /* it must be any of those elements */ 17029 17030 17031 if (element instanceof window.HTMLSelectElement || element instanceof window.HTMLTextAreaElement || element instanceof window.HTMLButtonElement || element instanceof window.HTMLInputElement) { 17032 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_3__["default"])(element); 17033 /* its type must be in the whitelist */ 17034 17035 if (_components_types__WEBPACK_IMPORTED_MODULE_1__["non_inputs"].indexOf(type) > -1 || _components_types__WEBPACK_IMPORTED_MODULE_1__["validation_candidates"].indexOf(type) > -1) { 17036 /* it mustn't be disabled or readonly */ 17037 if (!element.hasAttribute('disabled') && !element.hasAttribute('readonly')) { 17038 var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_2__["get_wrapper"])(element); 17039 17040 if ( 17041 /* the parent form doesn't allow non-standard "novalidate" attributes... */ 17042 wrapped_form && !wrapped_form.settings.novalidateOnElements || 17043 /* ...or it doesn't have such an attribute/property */ 17044 !element.hasAttribute('novalidate') && !element.noValidate) { 17045 /* it isn't part of a <fieldset disabled> */ 17046 if (!is_in_disallowed_parent(element)) { 17047 /* then it's a candidate */ 17048 return true; 17049 } 17050 } 17051 } 17052 } 17053 } 17054 /* this is no HTML5 validation candidate... */ 17055 17056 17057 return false; 17058}); 17059 17060/***/ }), 17061
vendor: 1,261 bytes, lines 17062-17096
17062/***/ "../node_modules/hyperform/src/tools/mark.js": 17063/*!***************************************************!*\ 17064 !*** ../node_modules/hyperform/src/tools/mark.js ***! 17065 \***************************************************/ 17066/*! exports provided: default */ 17067/***/ (function(module, __webpack_exports__, __webpack_require__) { 17068 17069"use strict"; 17070__webpack_require__.r(__webpack_exports__); 17071 17072/** 17073 * mark an object with a '__hyperform=true' property 17074 * 17075 * We use this to distinguish our properties from the native ones. Usage: 17076 * js> mark(obj); 17077 * js> assert(obj.__hyperform === true) 17078 */ 17079 17080function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 17081 17082/* harmony default export */ __webpack_exports__["default"] = (function (obj) { 17083 if (['object', 'function'].indexOf(_typeof(obj)) > -1) { 17084 delete obj.__hyperform; 17085 Object.defineProperty(obj, '__hyperform', { 17086 configurable: true, 17087 enumerable: false, 17088 value: true 17089 }); 17090 } 17091 17092 return obj; 17093}); 17094 17095/***/ }), 17096
vendor: 746 bytes, lines 17097-17116
17097/***/ "../node_modules/hyperform/src/tools/matches.js": 17098/*!******************************************************!*\ 17099 !*** ../node_modules/hyperform/src/tools/matches.js ***! 17100 \******************************************************/ 17101/*! exports provided: default */ 17102/***/ (function(module, __webpack_exports__, __webpack_require__) { 17103 17104"use strict"; 17105__webpack_require__.r(__webpack_exports__); 17106 17107/* shim layer for the Element.matches method */ 17108 17109var ep = window.Element.prototype; 17110var native_matches = ep.matches || ep.matchesSelector || ep.msMatchesSelector || ep.webkitMatchesSelector; 17111/* harmony default export */ __webpack_exports__["default"] = (function (element, selector) { 17112 return native_matches.call(element, selector); 17113}); 17114 17115/***/ }), 17116
vendor: 6,390 bytes, lines 17117-17230
17117/***/ "../node_modules/hyperform/src/tools/polyfill.js": 17118/*!*******************************************************!*\ 17119 !*** ../node_modules/hyperform/src/tools/polyfill.js ***! 17120 \*******************************************************/ 17121/*! exports provided: default */ 17122/***/ (function(module, __webpack_exports__, __webpack_require__) { 17123 17124"use strict"; 17125__webpack_require__.r(__webpack_exports__); 17126/* harmony import */ var _property_installer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./property_installer */ "../node_modules/hyperform/src/tools/property_installer.js"); 17127/* harmony import */ var _is_field__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is_field */ "../node_modules/hyperform/src/tools/is_field.js"); 17128/* harmony import */ var _mark__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mark */ "../node_modules/hyperform/src/tools/mark.js"); 17129/* harmony import */ var _polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../polyfills/checkValidity */ "../node_modules/hyperform/src/polyfills/checkValidity.js"); 17130/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js"); 17131/* harmony import */ var _polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../polyfills/setCustomValidity */ "../node_modules/hyperform/src/polyfills/setCustomValidity.js"); 17132/* harmony import */ var _polyfills_stepDown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../polyfills/stepDown */ "../node_modules/hyperform/src/polyfills/stepDown.js"); 17133/* harmony import */ var _polyfills_stepUp__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../polyfills/stepUp */ "../node_modules/hyperform/src/polyfills/stepUp.js"); 17134/* harmony import */ var _polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../polyfills/validationMessage */ "../node_modules/hyperform/src/polyfills/validationMessage.js"); 17135/* harmony import */ var _polyfills_validityState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../polyfills/validityState */ "../node_modules/hyperform/src/polyfills/validityState.js"); 17136/* harmony import */ var _polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../polyfills/valueAsDate */ "../node_modules/hyperform/src/polyfills/valueAsDate.js"); 17137/* harmony import */ var _polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../polyfills/valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js"); 17138/* harmony import */ var _polyfills_willValidate__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../polyfills/willValidate */ "../node_modules/hyperform/src/polyfills/willValidate.js"); 17139/* harmony import */ var _polyfills_properties__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../polyfills/properties */ "../node_modules/hyperform/src/polyfills/properties.js"); 17140 17141 17142 17143 17144 17145 17146 17147 17148 17149 17150 17151 17152 17153 17154 17155 17156var polyfills = { 17157 checkValidity: { 17158 value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17159 return Object(_polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_3__["default"])(this); 17160 }) 17161 }, 17162 reportValidity: { 17163 value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17164 return Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_4__["default"])(this); 17165 }) 17166 }, 17167 setCustomValidity: { 17168 value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function (msg) { 17169 return Object(_polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_5__["default"])(this, msg); 17170 }) 17171 }, 17172 stepDown: { 17173 value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17174 var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; 17175 return Object(_polyfills_stepDown__WEBPACK_IMPORTED_MODULE_6__["default"])(this, n); 17176 }) 17177 }, 17178 stepUp: { 17179 value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17180 var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; 17181 return Object(_polyfills_stepUp__WEBPACK_IMPORTED_MODULE_7__["default"])(this, n); 17182 }) 17183 }, 17184 validationMessage: { 17185 get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17186 return Object(_polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_8__["default"])(this); 17187 }) 17188 }, 17189 validity: { 17190 get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17191 return Object(_polyfills_validityState__WEBPACK_IMPORTED_MODULE_9__["default"])(this); 17192 }) 17193 }, 17194 valueAsDate: { 17195 get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17196 return Object(_polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_10__["default"])(this); 17197 }), 17198 set: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function (value) { 17199 Object(_polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_10__["default"])(this, value); 17200 }) 17201 }, 17202 valueAsNumber: { 17203 get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17204 return Object(_polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_11__["default"])(this); 17205 }), 17206 set: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function (value) { 17207 Object(_polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_11__["default"])(this, value); 17208 }) 17209 }, 17210 willValidate: { 17211 get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { 17212 return Object(_polyfills_willValidate__WEBPACK_IMPORTED_MODULE_12__["default"])(this); 17213 }) 17214 } 17215}; 17216/* harmony default export */ __webpack_exports__["default"] = (function (element) { 17217 if (Object(_is_field__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) { 17218 for (var prop in polyfills) { 17219 Object(_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, prop, polyfills[prop]); 17220 } 17221 17222 Object(_polyfills_properties__WEBPACK_IMPORTED_MODULE_13__["install_properties"])(element); 17223 } else if (element instanceof window.HTMLFormElement || element === window.HTMLFormElement.prototype) { 17224 Object(_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, 'checkValidity', polyfills.checkValidity); 17225 Object(_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, 'reportValidity', polyfills.reportValidity); 17226 } 17227}); 17228 17229/***/ }), 17230
vendor: 2,484 bytes, lines 17231-17268
17231/***/ "../node_modules/hyperform/src/tools/polyunfill.js": 17232/*!*********************************************************!*\ 17233 !*** ../node_modules/hyperform/src/tools/polyunfill.js ***! 17234 \*********************************************************/ 17235/*! exports provided: default */ 17236/***/ (function(module, __webpack_exports__, __webpack_require__) { 17237 17238"use strict"; 17239__webpack_require__.r(__webpack_exports__); 17240/* harmony import */ var _is_field__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is_field */ "../node_modules/hyperform/src/tools/is_field.js"); 17241/* harmony import */ var _property_uninstaller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./property_uninstaller */ "../node_modules/hyperform/src/tools/property_uninstaller.js"); 17242/* harmony import */ var _polyfills_properties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../polyfills/properties */ "../node_modules/hyperform/src/polyfills/properties.js"); 17243 17244 17245 17246 17247 17248/* harmony default export */ __webpack_exports__["default"] = (function (element) { 17249 if (Object(_is_field__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) { 17250 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'checkValidity'); 17251 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'reportValidity'); 17252 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'setCustomValidity'); 17253 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'stepDown'); 17254 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'stepUp'); 17255 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'validationMessage'); 17256 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'validity'); 17257 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'valueAsDate'); 17258 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'valueAsNumber'); 17259 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'willValidate'); 17260 Object(_polyfills_properties__WEBPACK_IMPORTED_MODULE_2__["uninstall_properties"])(element); 17261 } else if (element instanceof window.HTMLFormElement) { 17262 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'checkValidity'); 17263 Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'reportValidity'); 17264 } 17265}); 17266 17267/***/ }), 17268
vendor: 2,606 bytes, lines 17269-17342
17269/***/ "../node_modules/hyperform/src/tools/property_installer.js": 17270/*!*****************************************************************!*\ 17271 !*** ../node_modules/hyperform/src/tools/property_installer.js ***! 17272 \*****************************************************************/ 17273/*! exports provided: default */ 17274/***/ (function(module, __webpack_exports__, __webpack_require__) { 17275 17276"use strict"; 17277__webpack_require__.r(__webpack_exports__); 17278/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 17279 17280 17281 17282/** 17283 * add `property` to an element 17284 * 17285 * ATTENTION! This function will search for an equally named property on the 17286 * *prototype* of an element, if element is a concrete DOM node. Do not use 17287 * it as general-purpose property installer. 17288 * 17289 * js> installer(element, 'foo', { value: 'bar' }); 17290 * js> assert(element.foo === 'bar'); 17291 */ 17292 17293/* harmony default export */ __webpack_exports__["default"] = (function (element, property, descriptor) { 17294 descriptor.configurable = true; 17295 descriptor.enumerable = true; 17296 17297 if ('value' in descriptor) { 17298 descriptor.writable = true; 17299 } 17300 /* on concrete instances, i.e., <input> elements, the naive lookup 17301 * yields undefined. We have to look on its prototype then. On elements 17302 * like the actual HTMLInputElement object the first line works. */ 17303 17304 17305 var original_descriptor = Object.getOwnPropertyDescriptor(element, property); 17306 17307 if (original_descriptor === undefined) { 17308 original_descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), property); 17309 } 17310 17311 if (original_descriptor) { 17312 if (original_descriptor.configurable === false) { 17313 /* Safari <= 9 and PhantomJS will end up here :-( Nothing to do except 17314 * warning */ 17315 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(element); 17316 17317 if (wrapper && wrapper.settings.debug) { 17318 /* global console */ 17319 console.log('[hyperform] cannot install custom property ' + property); 17320 } 17321 17322 return false; 17323 } 17324 /* we already installed that property... */ 17325 17326 17327 if (original_descriptor.get && original_descriptor.get.__hyperform || original_descriptor.value && original_descriptor.value.__hyperform) { 17328 return; 17329 } 17330 /* publish existing property under new name, if it's not from us */ 17331 17332 17333 Object.defineProperty(element, '_original_' + property, original_descriptor); 17334 } 17335 17336 delete element[property]; 17337 Object.defineProperty(element, property, descriptor); 17338 return true; 17339}); 17340 17341/***/ }), 17342
vendor: 1,452 bytes, lines 17343-17384
17343/***/ "../node_modules/hyperform/src/tools/property_uninstaller.js": 17344/*!*******************************************************************!*\ 17345 !*** ../node_modules/hyperform/src/tools/property_uninstaller.js ***! 17346 \*******************************************************************/ 17347/*! exports provided: default */ 17348/***/ (function(module, __webpack_exports__, __webpack_require__) { 17349 17350"use strict"; 17351__webpack_require__.r(__webpack_exports__); 17352/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 17353 17354 17355 17356/** 17357 * remove `property` from element and restore _original_property, if present 17358 */ 17359 17360/* harmony default export */ __webpack_exports__["default"] = (function (element, property) { 17361 try { 17362 delete element[property]; 17363 } catch (e) { 17364 /* Safari <= 9 and PhantomJS will end up here :-( Nothing to do except 17365 * warning */ 17366 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(element); 17367 17368 if (wrapper && wrapper.settings.debug) { 17369 /* global console */ 17370 console.log('[hyperform] cannot uninstall custom property ' + property); 17371 } 17372 17373 return false; 17374 } 17375 17376 var original_descriptor = Object.getOwnPropertyDescriptor(element, '_original_' + property); 17377 17378 if (original_descriptor) { 17379 Object.defineProperty(element, property, original_descriptor); 17380 } 17381}); 17382 17383/***/ }), 17384
vendor: 1,132 bytes, lines 17385-17418
17385/***/ "../node_modules/hyperform/src/tools/return_hook_or.js": 17386/*!*************************************************************!*\ 17387 !*** ../node_modules/hyperform/src/tools/return_hook_or.js ***! 17388 \*************************************************************/ 17389/*! exports provided: default */ 17390/***/ (function(module, __webpack_exports__, __webpack_require__) { 17391 17392"use strict"; 17393__webpack_require__.r(__webpack_exports__); 17394/* harmony import */ var _components_hooks_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/hooks.js */ "../node_modules/hyperform/src/components/hooks.js"); 17395 17396 17397 17398/** 17399 * return either the data of a hook call or the result of action, if the 17400 * former is undefined 17401 * 17402 * @return function a function wrapper around action 17403 */ 17404 17405/* harmony default export */ __webpack_exports__["default"] = (function (hook, action) { 17406 return function () { 17407 var data = Object(_components_hooks_js__WEBPACK_IMPORTED_MODULE_0__["call_hook"])(hook, Array.prototype.slice.call(arguments)); 17408 17409 if (data !== undefined) { 17410 return data; 17411 } 17412 17413 return action.apply(this, arguments); 17414 }; 17415}); 17416 17417/***/ }), 17418
vendor: 1,390 bytes, lines 17419-17466
17419/***/ "../node_modules/hyperform/src/tools/sprintf.js": 17420/*!******************************************************!*\ 17421 !*** ../node_modules/hyperform/src/tools/sprintf.js ***! 17422 \******************************************************/ 17423/*! exports provided: default */ 17424/***/ (function(module, __webpack_exports__, __webpack_require__) { 17425 17426"use strict"; 17427__webpack_require__.r(__webpack_exports__); 17428 17429 17430/* harmony default export */ __webpack_exports__["default"] = (function (str) { 17431 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 17432 args[_key - 1] = arguments[_key]; 17433 } 17434 17435 var args_length = args.length; 17436 var global_index = 0; 17437 return str.replace(/%([0-9]+\$)?([sl])/g, function (match, position, type) { 17438 var local_index = global_index; 17439 17440 if (position) { 17441 local_index = Number(position.replace(/\$$/, '')) - 1; 17442 } 17443 17444 global_index += 1; 17445 var arg = ''; 17446 17447 if (args_length > local_index) { 17448 arg = args[local_index]; 17449 } 17450 17451 if (arg instanceof Date || typeof arg === 'number' || arg instanceof Number) { 17452 /* try getting a localized representation of dates and numbers, if the 17453 * browser supports this */ 17454 if (type === 'l') { 17455 arg = (arg.toLocaleString || arg.toString).call(arg); 17456 } else { 17457 arg = arg.toString(); 17458 } 17459 } 17460 17461 return arg; 17462 }); 17463}); 17464 17465/***/ }), 17466
vendor: 1,995 bytes, lines 17467-17532
17467/***/ "../node_modules/hyperform/src/tools/string_to_date.js": 17468/*!*************************************************************!*\ 17469 !*** ../node_modules/hyperform/src/tools/string_to_date.js ***! 17470 \*************************************************************/ 17471/*! exports provided: default */ 17472/***/ (function(module, __webpack_exports__, __webpack_require__) { 17473 17474"use strict"; 17475__webpack_require__.r(__webpack_exports__); 17476/* harmony import */ var _get_date_from_week__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./get_date_from_week */ "../node_modules/hyperform/src/tools/get_date_from_week.js"); 17477 17478 17479 17480/** 17481 * calculate a date from a string according to HTML5 17482 */ 17483 17484/* harmony default export */ __webpack_exports__["default"] = (function (string, element_type) { 17485 var date; 17486 17487 switch (element_type) { 17488 case 'datetime': 17489 if (!/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9])(?:\.([0-9]{1,3}))?)?$/.test(string)) { 17490 return null; 17491 } 17492 17493 date = new Date(string + 'z'); 17494 return isNaN(date.valueOf()) ? null : date; 17495 17496 case 'date': 17497 if (!/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/.test(string)) { 17498 return null; 17499 } 17500 17501 date = new Date(string); 17502 return isNaN(date.valueOf()) ? null : date; 17503 17504 case 'month': 17505 if (!/^([0-9]{4})-(0[1-9]|1[012])$/.test(string)) { 17506 return null; 17507 } 17508 17509 date = new Date(string); 17510 return isNaN(date.valueOf()) ? null : date; 17511 17512 case 'week': 17513 if (!/^([0-9]{4})-W(0[1-9]|[1234][0-9]|5[0-3])$/.test(string)) { 17514 return null; 17515 } 17516 17517 return Object(_get_date_from_week__WEBPACK_IMPORTED_MODULE_0__["default"])(Number(RegExp.$2), Number(RegExp.$1)); 17518 17519 case 'time': 17520 if (!/^([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9])(?:\.([0-9]{1,3}))?)?$/.test(string)) { 17521 return null; 17522 } 17523 17524 date = new Date('1970-01-01T' + string + 'z'); 17525 return date; 17526 } 17527 17528 return null; 17529}); 17530 17531/***/ }), 17532
vendor: 1,035 bytes, lines 17533-17563
17533/***/ "../node_modules/hyperform/src/tools/string_to_number.js": 17534/*!***************************************************************!*\ 17535 !*** ../node_modules/hyperform/src/tools/string_to_number.js ***! 17536 \***************************************************************/ 17537/*! exports provided: default */ 17538/***/ (function(module, __webpack_exports__, __webpack_require__) { 17539 17540"use strict"; 17541__webpack_require__.r(__webpack_exports__); 17542/* harmony import */ var _string_to_date__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js"); 17543 17544 17545 17546/** 17547 * calculate a number from a string according to HTML5 17548 */ 17549 17550/* harmony default export */ __webpack_exports__["default"] = (function (string, element_type) { 17551 var rval = Object(_string_to_date__WEBPACK_IMPORTED_MODULE_0__["default"])(string, element_type); 17552 17553 if (rval !== null) { 17554 return +rval; 17555 } 17556 /* not parseFloat, because we want NaN for invalid values like "1.2xxy" */ 17557 17558 17559 return Number(string); 17560}); 17561 17562/***/ }), 17563
vendor: 2,813 bytes, lines 17564-17647
17564/***/ "../node_modules/hyperform/src/tools/trigger_event.js": 17565/*!************************************************************!*\ 17566 !*** ../node_modules/hyperform/src/tools/trigger_event.js ***! 17567 \************************************************************/ 17568/*! exports provided: create_event, default */ 17569/***/ (function(module, __webpack_exports__, __webpack_require__) { 17570 17571"use strict"; 17572__webpack_require__.r(__webpack_exports__); 17573/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create_event", function() { return create_event; }); 17574 17575/* the following code is borrowed from the WebComponents project, licensed 17576 * under the BSD license. Source: 17577 * <https://github.com/webcomponents/webcomponentsjs/blob/5283db1459fa2323e5bfc8b9b5cc1753ed85e3d0/src/WebComponents/dom.js#L53-L78> 17578 */ 17579// defaultPrevented is broken in IE. 17580// https://connect.microsoft.com/IE/feedback/details/790389/event-defaultprevented-returns-false-after-preventdefault-was-called 17581 17582var workingDefaultPrevented = function () { 17583 var e = document.createEvent('Event'); 17584 e.initEvent('foo', true, true); 17585 e.preventDefault(); 17586 return e.defaultPrevented; 17587}(); 17588 17589if (!workingDefaultPrevented) { 17590 var origPreventDefault = window.Event.prototype.preventDefault; 17591 17592 window.Event.prototype.preventDefault = function () { 17593 if (!this.cancelable) { 17594 return; 17595 } 17596 17597 origPreventDefault.call(this); 17598 Object.defineProperty(this, 'defaultPrevented', { 17599 get: function get() { 17600 return true; 17601 }, 17602 configurable: true 17603 }); 17604 }; 17605} 17606/* end of borrowed code */ 17607 17608 17609function create_event(name) { 17610 var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, 17611 _ref$bubbles = _ref.bubbles, 17612 bubbles = _ref$bubbles === void 0 ? true : _ref$bubbles, 17613 _ref$cancelable = _ref.cancelable, 17614 cancelable = _ref$cancelable === void 0 ? false : _ref$cancelable; 17615 17616 var event = document.createEvent('Event'); 17617 event.initEvent(name, bubbles, cancelable); 17618 return event; 17619} 17620/* harmony default export */ __webpack_exports__["default"] = (function (element, event) { 17621 var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, 17622 _ref2$bubbles = _ref2.bubbles, 17623 bubbles = _ref2$bubbles === void 0 ? true : _ref2$bubbles, 17624 _ref2$cancelable = _ref2.cancelable, 17625 cancelable = _ref2$cancelable === void 0 ? false : _ref2$cancelable; 17626 17627 var payload = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 17628 17629 if (!(event instanceof window.Event)) { 17630 event = create_event(event, { 17631 bubbles: bubbles, 17632 cancelable: cancelable 17633 }); 17634 } 17635 17636 for (var key in payload) { 17637 if (payload.hasOwnProperty(key)) { 17638 event[key] = payload[key]; 17639 } 17640 } 17641 17642 element.dispatchEvent(event); 17643 return event; 17644}); 17645 17646/***/ }), 17647
vendor: 698 bytes, lines 17648-17671
17648/***/ "../node_modules/hyperform/src/tools/trim.js": 17649/*!***************************************************!*\ 17650 !*** ../node_modules/hyperform/src/tools/trim.js ***! 17651 \***************************************************/ 17652/*! exports provided: default */ 17653/***/ (function(module, __webpack_exports__, __webpack_require__) { 17654 17655"use strict"; 17656__webpack_require__.r(__webpack_exports__); 17657 17658 17659var ws_on_start_or_end = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 17660/** 17661 * trim a string of whitespace 17662 * 17663 * We don't use String.trim() to remove the need to polyfill it. 17664 */ 17665 17666/* harmony default export */ __webpack_exports__["default"] = (function (str) { 17667 return str.replace(ws_on_start_or_end, ''); 17668}); 17669 17670/***/ }), 17671
vendor: 938 bytes, lines 17672-17695
17672/***/ "../node_modules/hyperform/src/tools/unicode_string_length.js": 17673/*!********************************************************************!*\ 17674 !*** ../node_modules/hyperform/src/tools/unicode_string_length.js ***! 17675 \********************************************************************/ 17676/*! exports provided: default */ 17677/***/ (function(module, __webpack_exports__, __webpack_require__) { 17678 17679"use strict"; 17680__webpack_require__.r(__webpack_exports__); 17681 17682/** 17683 * patch String.length to account for non-BMP characters 17684 * 17685 * @see https://mathiasbynens.be/notes/javascript-unicode 17686 * We do not use the simple [...str].length, because it needs a ton of 17687 * polyfills in older browsers. 17688 */ 17689 17690/* harmony default export */ __webpack_exports__["default"] = (function (str) { 17691 return str.match(/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g).length; 17692}); 17693 17694/***/ }), 17695
vendor: 17,125 bytes, lines 17696-18031
17696/***/ "../node_modules/hyperform/src/tools/validity_state_checkers.js": 17697/*!**********************************************************************!*\ 17698 !*** ../node_modules/hyperform/src/tools/validity_state_checkers.js ***! 17699 \**********************************************************************/ 17700/*! exports provided: default */ 17701/***/ (function(module, __webpack_exports__, __webpack_require__) { 17702 17703"use strict"; 17704__webpack_require__.r(__webpack_exports__); 17705/* harmony import */ var _format_date__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./format_date */ "../node_modules/hyperform/src/tools/format_date.js"); 17706/* harmony import */ var _get_next_valid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get_next_valid */ "../node_modules/hyperform/src/tools/get_next_valid.js"); 17707/* harmony import */ var _get_type__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 17708/* harmony import */ var _sprintf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sprintf */ "../node_modules/hyperform/src/tools/sprintf.js"); 17709/* harmony import */ var _string_to_number__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js"); 17710/* harmony import */ var _string_to_date__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js"); 17711/* harmony import */ var _unicode_string_length__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./unicode_string_length */ "../node_modules/hyperform/src/tools/unicode_string_length.js"); 17712/* harmony import */ var _components_custom_messages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/custom_messages */ "../node_modules/hyperform/src/components/custom_messages.js"); 17713/* harmony import */ var _components_localization__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/localization */ "../node_modules/hyperform/src/components/localization.js"); 17714/* harmony import */ var _components_message_store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/message_store */ "../node_modules/hyperform/src/components/message_store.js"); 17715/* harmony import */ var _components_registry__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/registry */ "../node_modules/hyperform/src/components/registry.js"); 17716/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js"); 17717/* harmony import */ var _validators_bad_input__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../validators/bad_input */ "../node_modules/hyperform/src/validators/bad_input.js"); 17718/* harmony import */ var _validators_max__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../validators/max */ "../node_modules/hyperform/src/validators/max.js"); 17719/* harmony import */ var _validators_maxlength__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../validators/maxlength */ "../node_modules/hyperform/src/validators/maxlength.js"); 17720/* harmony import */ var _validators_min__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../validators/min */ "../node_modules/hyperform/src/validators/min.js"); 17721/* harmony import */ var _validators_minlength__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../validators/minlength */ "../node_modules/hyperform/src/validators/minlength.js"); 17722/* harmony import */ var _validators_pattern__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../validators/pattern */ "../node_modules/hyperform/src/validators/pattern.js"); 17723/* harmony import */ var _validators_required__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../validators/required */ "../node_modules/hyperform/src/validators/required.js"); 17724/* harmony import */ var _validators_step__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../validators/step */ "../node_modules/hyperform/src/validators/step.js"); 17725/* harmony import */ var _validators_type__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../validators/type */ "../node_modules/hyperform/src/validators/type.js"); 17726 17727/** 17728 * Implement constraint checking functionality defined in the HTML5 standard 17729 * 17730 * @see https://html.spec.whatwg.org/multipage/forms.html#dom-cva-validity 17731 * @return bool true if the test fails [!], false otherwise 17732 */ 17733 17734 17735 17736 17737 17738 17739 17740 17741 17742 17743 17744 17745 17746 17747 17748 17749 17750 17751 17752 17753 17754 17755/** 17756 * boilerplate function for all tests but customError 17757 */ 17758 17759function check(test, react) { 17760 return function (element) { 17761 var invalid = !test(element); 17762 17763 if (invalid) { 17764 react(element); 17765 } 17766 17767 return invalid; 17768 }; 17769} 17770/** 17771 * create a common function to set error messages 17772 */ 17773 17774 17775function set_msg(element, msgtype, _default) { 17776 _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].set(element, _components_custom_messages__WEBPACK_IMPORTED_MODULE_7__["default"].get(element, msgtype, _default)); 17777} 17778 17779var badInput = check(_validators_bad_input__WEBPACK_IMPORTED_MODULE_12__["default"], function (element) { 17780 return set_msg(element, 'badInput', Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please match the requested type.')); 17781}); 17782 17783function customError(element) { 17784 /* prevent infinite loops when the custom validators call setCustomValidity(), 17785 * which in turn calls this code again. We check, if there is an already set 17786 * custom validity message there. */ 17787 if (element.__hf_custom_validation_running) { 17788 var msg = _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].get(element); 17789 return msg && msg.is_custom; 17790 } 17791 /* check, if there are custom validators in the registry, and call 17792 * them. */ 17793 17794 17795 var custom_validators = _components_registry__WEBPACK_IMPORTED_MODULE_10__["default"].get(element); 17796 var cvl = custom_validators.length; 17797 var valid = true; 17798 17799 if (cvl) { 17800 element.__hf_custom_validation_running = true; 17801 17802 for (var i = 0; i < cvl; i++) { 17803 var result = custom_validators[i](element); 17804 17805 if (result !== undefined && !result) { 17806 valid = false; 17807 /* break on first invalid response */ 17808 17809 break; 17810 } 17811 } 17812 17813 delete element.__hf_custom_validation_running; 17814 } 17815 /* check, if there are other validity messages already */ 17816 17817 17818 if (valid) { 17819 var _msg = _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].get(element); 17820 17821 valid = !(_msg.toString() && 'is_custom' in _msg); 17822 } 17823 17824 return !valid; 17825} 17826 17827var patternMismatch = check(_validators_pattern__WEBPACK_IMPORTED_MODULE_17__["default"], function (element) { 17828 set_msg(element, 'patternMismatch', element.title ? Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('PatternMismatchWithTitle'), element.title) : Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('PatternMismatch')); 17829}); 17830/** 17831 * TODO: when rangeOverflow and rangeUnderflow are both called directly and 17832 * successful, the inRange and outOfRange classes won't get removed, unless 17833 * element.validityState.valid is queried, too. 17834 */ 17835 17836var rangeOverflow = check(_validators_max__WEBPACK_IMPORTED_MODULE_13__["default"], function (element) { 17837 var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element); 17838 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_11__["get_wrapper"])(element); 17839 var outOfRangeClass = wrapper && wrapper.settings.classes.outOfRange || 'hf-out-of-range'; 17840 var inRangeClass = wrapper && wrapper.settings.classes.inRange || 'hf-in-range'; 17841 var msg; 17842 17843 switch (type) { 17844 case 'date': 17845 case 'datetime': 17846 case 'datetime-local': 17847 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('DateRangeOverflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('max'), type), type)); 17848 break; 17849 17850 case 'time': 17851 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('TimeRangeOverflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('max'), type), type)); 17852 break; 17853 // case 'number': 17854 17855 default: 17856 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('NumberRangeOverflow'), Object(_string_to_number__WEBPACK_IMPORTED_MODULE_4__["default"])(element.getAttribute('max'), type)); 17857 break; 17858 } 17859 17860 set_msg(element, 'rangeOverflow', msg); 17861 element.classList.add(outOfRangeClass); 17862 element.classList.remove(inRangeClass); 17863}); 17864var rangeUnderflow = check(_validators_min__WEBPACK_IMPORTED_MODULE_15__["default"], function (element) { 17865 var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element); 17866 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_11__["get_wrapper"])(element); 17867 var outOfRangeClass = wrapper && wrapper.settings.classes.outOfRange || 'hf-out-of-range'; 17868 var inRangeClass = wrapper && wrapper.settings.classes.inRange || 'hf-in-range'; 17869 var msg; 17870 17871 switch (type) { 17872 case 'date': 17873 case 'datetime': 17874 case 'datetime-local': 17875 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('DateRangeUnderflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('min'), type), type)); 17876 break; 17877 17878 case 'time': 17879 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('TimeRangeUnderflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('min'), type), type)); 17880 break; 17881 // case 'number': 17882 17883 default: 17884 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('NumberRangeUnderflow'), Object(_string_to_number__WEBPACK_IMPORTED_MODULE_4__["default"])(element.getAttribute('min'), type)); 17885 break; 17886 } 17887 17888 set_msg(element, 'rangeUnderflow', msg); 17889 element.classList.add(outOfRangeClass); 17890 element.classList.remove(inRangeClass); 17891}); 17892var stepMismatch = check(_validators_step__WEBPACK_IMPORTED_MODULE_19__["default"], function (element) { 17893 var list = Object(_get_next_valid__WEBPACK_IMPORTED_MODULE_1__["default"])(element); 17894 var min = list[0]; 17895 var max = list[1]; 17896 var sole = false; 17897 var msg; 17898 17899 if (min === null) { 17900 sole = max; 17901 } else if (max === null) { 17902 sole = min; 17903 } 17904 17905 if (sole !== false) { 17906 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('StepMismatchOneValue'), sole); 17907 } else { 17908 msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('StepMismatch'), min, max); 17909 } 17910 17911 set_msg(element, 'stepMismatch', msg); 17912}); 17913var tooLong = check(_validators_maxlength__WEBPACK_IMPORTED_MODULE_14__["default"], function (element) { 17914 set_msg(element, 'tooLong', Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('TextTooLong'), element.getAttribute('maxlength'), Object(_unicode_string_length__WEBPACK_IMPORTED_MODULE_6__["default"])(element.value))); 17915}); 17916var tooShort = check(_validators_minlength__WEBPACK_IMPORTED_MODULE_16__["default"], function (element) { 17917 set_msg(element, 'tooShort', Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please lengthen this text to %l characters or more (you are currently using %l characters).'), element.getAttribute('minlength'), Object(_unicode_string_length__WEBPACK_IMPORTED_MODULE_6__["default"])(element.value))); 17918}); 17919var typeMismatch = check(_validators_type__WEBPACK_IMPORTED_MODULE_20__["default"], function (element) { 17920 var msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please use the appropriate format.'); 17921 17922 var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element); 17923 17924 if (type === 'email') { 17925 if (element.hasAttribute('multiple')) { 17926 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please enter a comma separated list of email addresses.'); 17927 } else { 17928 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('InvalidEmail'); 17929 } 17930 } else if (type === 'url') { 17931 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('InvalidURL'); 17932 } else if (type === 'file') { 17933 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please select a file of the correct type.'); 17934 } 17935 17936 set_msg(element, 'typeMismatch', msg); 17937}); 17938var valueMissing = check(_validators_required__WEBPACK_IMPORTED_MODULE_18__["default"], function (element) { 17939 var msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('ValueMissing'); 17940 17941 var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element); 17942 17943 if (type === 'checkbox') { 17944 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('CheckboxMissing'); 17945 } else if (type === 'radio') { 17946 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('RadioMissing'); 17947 } else if (type === 'file') { 17948 if (element.hasAttribute('multiple')) { 17949 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please select one or more files.'); 17950 } else { 17951 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('FileMissing'); 17952 } 17953 } else if (element instanceof window.HTMLSelectElement) { 17954 msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('SelectMissing'); 17955 } 17956 17957 set_msg(element, 'valueMissing', msg); 17958}); 17959/** 17960 * the "valid" property calls all other validity checkers and returns true, 17961 * if all those return false. 17962 * 17963 * This is the major access point for _all_ other API methods, namely 17964 * (check|report)Validity(). 17965 */ 17966 17967var valid = function valid(element) { 17968 var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_11__["get_wrapper"])(element); 17969 var validClass = wrapper && wrapper.settings.classes.valid || 'hf-valid'; 17970 var invalidClass = wrapper && wrapper.settings.classes.invalid || 'hf-invalid'; 17971 var userInvalidClass = wrapper && wrapper.settings.classes.userInvalid || 'hf-user-invalid'; 17972 var userValidClass = wrapper && wrapper.settings.classes.userValid || 'hf-user-valid'; 17973 var inRangeClass = wrapper && wrapper.settings.classes.inRange || 'hf-in-range'; 17974 var outOfRangeClass = wrapper && wrapper.settings.classes.outOfRange || 'hf-out-of-range'; 17975 var validatedClass = wrapper && wrapper.settings.classes.validated || 'hf-validated'; 17976 element.classList.add(validatedClass); 17977 17978 for (var _i = 0, _arr = [badInput, customError, patternMismatch, rangeOverflow, rangeUnderflow, stepMismatch, tooLong, tooShort, typeMismatch, valueMissing]; _i < _arr.length; _i++) { 17979 var checker = _arr[_i]; 17980 17981 if (checker(element)) { 17982 element.classList.add(invalidClass); 17983 element.classList.remove(validClass); 17984 element.classList.remove(userValidClass); 17985 17986 if ((element.type === 'checkbox' || element.type === 'radio') && element.checked !== element.defaultChecked || 17987 /* the following test is trivially false for checkboxes/radios */ 17988 element.value !== element.defaultValue) { 17989 element.classList.add(userInvalidClass); 17990 } else { 17991 element.classList.remove(userInvalidClass); 17992 } 17993 17994 element.setAttribute('aria-invalid', 'true'); 17995 return false; 17996 } 17997 } 17998 17999 _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].delete(element); 18000 element.classList.remove(invalidClass); 18001 element.classList.remove(userInvalidClass); 18002 element.classList.remove(outOfRangeClass); 18003 element.classList.add(validClass); 18004 element.classList.add(inRangeClass); 18005 18006 if (element.value !== element.defaultValue) { 18007 element.classList.add(userValidClass); 18008 } else { 18009 element.classList.remove(userValidClass); 18010 } 18011 18012 element.setAttribute('aria-invalid', 'false'); 18013 return true; 18014}; 18015 18016/* harmony default export */ __webpack_exports__["default"] = ({ 18017 badInput: badInput, 18018 customError: customError, 18019 patternMismatch: patternMismatch, 18020 rangeOverflow: rangeOverflow, 18021 rangeUnderflow: rangeUnderflow, 18022 stepMismatch: stepMismatch, 18023 tooLong: tooLong, 18024 tooShort: tooShort, 18025 typeMismatch: typeMismatch, 18026 valueMissing: valueMissing, 18027 valid: valid 18028}); 18029 18030/***/ }), 18031
vendor: 2,869 bytes, lines 18032-18115
18032/***/ "../node_modules/hyperform/src/validators/bad_input.js": 18033/*!*************************************************************!*\ 18034 !*** ../node_modules/hyperform/src/validators/bad_input.js ***! 18035 \*************************************************************/ 18036/*! exports provided: default */ 18037/***/ (function(module, __webpack_exports__, __webpack_require__) { 18038 18039"use strict"; 18040__webpack_require__.r(__webpack_exports__); 18041/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18042/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js"); 18043/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18044 18045 18046 18047 18048 18049/** 18050 * test whether the element suffers from bad input 18051 */ 18052 18053/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18054 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 18055 18056 if (_components_types__WEBPACK_IMPORTED_MODULE_2__["input_checked"].indexOf(type) === -1) { 18057 /* we're not interested, thanks! */ 18058 return true; 18059 } 18060 /* the browser hides some bad input from the DOM, e.g. malformed numbers, 18061 * email addresses with invalid punycode representation, ... We try to resort 18062 * to the original method here. The assumption is, that a browser hiding 18063 * bad input will hopefully also always support a proper 18064 * ValidityState.badInput */ 18065 18066 18067 if (!element.value) { 18068 if ('_original_validity' in element && !element._original_validity.__hyperform) { 18069 return !element._original_validity.badInput; 18070 } 18071 /* no value and no original badInput: Assume all's right. */ 18072 18073 18074 return true; 18075 } 18076 18077 var result = true; 18078 18079 switch (type) { 18080 case 'color': 18081 result = /^#[a-f0-9]{6}$/.test(element.value); 18082 break; 18083 18084 case 'number': 18085 case 'range': 18086 result = !isNaN(Number(element.value)); 18087 break; 18088 18089 case 'datetime': 18090 case 'date': 18091 case 'month': 18092 case 'week': 18093 case 'time': 18094 result = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value, type) !== null; 18095 break; 18096 18097 case 'datetime-local': 18098 result = /^([0-9]{4,})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9])(?:\.([0-9]{1,3}))?)?$/.test(element.value); 18099 break; 18100 18101 case 'tel': 18102 /* spec says No! Phone numbers can have all kinds of formats, so this 18103 * is expected to be a free-text field. */ 18104 // TODO we could allow a setting 'phone_regex' to be evaluated here. 18105 break; 18106 18107 case 'email': 18108 break; 18109 } 18110 18111 return result; 18112}); 18113 18114/***/ }), 18115
vendor: 2,035 bytes, lines 18116-18166
18116/***/ "../node_modules/hyperform/src/validators/max.js": 18117/*!*******************************************************!*\ 18118 !*** ../node_modules/hyperform/src/validators/max.js ***! 18119 \*******************************************************/ 18120/*! exports provided: default */ 18121/***/ (function(module, __webpack_exports__, __webpack_require__) { 18122 18123"use strict"; 18124__webpack_require__.r(__webpack_exports__); 18125/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18126/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18127/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js"); 18128 18129 18130 18131 18132 18133/** 18134 * test the max attribute 18135 * 18136 * we use Number() instead of parseFloat(), because an invalid attribute 18137 * value like "123abc" should result in an error. 18138 */ 18139 18140/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18141 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 18142 18143 if (!element.value || !element.hasAttribute('max')) { 18144 /* we're not responsible here */ 18145 return true; 18146 } 18147 18148 var value, max; 18149 18150 if (_components_types__WEBPACK_IMPORTED_MODULE_1__["dates"].indexOf(type) > -1) { 18151 value = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value, type); 18152 value = value === null ? NaN : +value; 18153 max = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.getAttribute('max'), type); 18154 max = max === null ? NaN : +max; 18155 } else { 18156 value = Number(element.value); 18157 max = Number(element.getAttribute('max')); 18158 } 18159 /* we cannot validate invalid values and trust on badInput, if isNaN(value) */ 18160 18161 18162 return isNaN(max) || isNaN(value) || value <= max; 18163}); 18164 18165/***/ }), 18166
vendor: 1,804 bytes, lines 18167-18207
18167/***/ "../node_modules/hyperform/src/validators/maxlength.js": 18168/*!*************************************************************!*\ 18169 !*** ../node_modules/hyperform/src/validators/maxlength.js ***! 18170 \*************************************************************/ 18171/*! exports provided: default */ 18172/***/ (function(module, __webpack_exports__, __webpack_require__) { 18173 18174"use strict"; 18175__webpack_require__.r(__webpack_exports__); 18176/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18177/* harmony import */ var _tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/unicode_string_length */ "../node_modules/hyperform/src/tools/unicode_string_length.js"); 18178/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18179 18180 18181 18182 18183 18184/** 18185 * test the maxlength attribute 18186 */ 18187 18188/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18189 if (!element.value || _components_types__WEBPACK_IMPORTED_MODULE_2__["text"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) === -1 || !element.hasAttribute('maxlength') || !element.getAttribute('maxlength') // catch maxlength="" 18190 ) { 18191 return true; 18192 } 18193 18194 var maxlength = parseInt(element.getAttribute('maxlength'), 10); 18195 /* check, if the maxlength value is usable at all. 18196 * We allow maxlength === 0 to basically disable input (Firefox does, too). 18197 */ 18198 18199 if (isNaN(maxlength) || maxlength < 0) { 18200 return true; 18201 } 18202 18203 return Object(_tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value) <= maxlength; 18204}); 18205 18206/***/ }), 18207
vendor: 2,035 bytes, lines 18208-18258
18208/***/ "../node_modules/hyperform/src/validators/min.js": 18209/*!*******************************************************!*\ 18210 !*** ../node_modules/hyperform/src/validators/min.js ***! 18211 \*******************************************************/ 18212/*! exports provided: default */ 18213/***/ (function(module, __webpack_exports__, __webpack_require__) { 18214 18215"use strict"; 18216__webpack_require__.r(__webpack_exports__); 18217/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18218/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18219/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js"); 18220 18221 18222 18223 18224 18225/** 18226 * test the min attribute 18227 * 18228 * we use Number() instead of parseFloat(), because an invalid attribute 18229 * value like "123abc" should result in an error. 18230 */ 18231 18232/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18233 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 18234 18235 if (!element.value || !element.hasAttribute('min')) { 18236 /* we're not responsible here */ 18237 return true; 18238 } 18239 18240 var value, min; 18241 18242 if (_components_types__WEBPACK_IMPORTED_MODULE_1__["dates"].indexOf(type) > -1) { 18243 value = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value, type); 18244 value = value === null ? NaN : +value; 18245 min = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.getAttribute('min'), type); 18246 min = min === null ? NaN : +min; 18247 } else { 18248 value = Number(element.value); 18249 min = Number(element.getAttribute('min')); 18250 } 18251 /* we cannot validate invalid values and trust on badInput, if isNaN(value) */ 18252 18253 18254 return isNaN(min) || isNaN(value) || value >= min; 18255}); 18256 18257/***/ }), 18258
vendor: 1,723 bytes, lines 18259-18297
18259/***/ "../node_modules/hyperform/src/validators/minlength.js": 18260/*!*************************************************************!*\ 18261 !*** ../node_modules/hyperform/src/validators/minlength.js ***! 18262 \*************************************************************/ 18263/*! exports provided: default */ 18264/***/ (function(module, __webpack_exports__, __webpack_require__) { 18265 18266"use strict"; 18267__webpack_require__.r(__webpack_exports__); 18268/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18269/* harmony import */ var _tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/unicode_string_length */ "../node_modules/hyperform/src/tools/unicode_string_length.js"); 18270/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18271 18272 18273 18274 18275 18276/** 18277 * test the minlength attribute 18278 */ 18279 18280/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18281 if (!element.value || _components_types__WEBPACK_IMPORTED_MODULE_2__["text"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) === -1 || !element.hasAttribute('minlength') || !element.getAttribute('minlength') // catch minlength="" 18282 ) { 18283 return true; 18284 } 18285 18286 var minlength = parseInt(element.getAttribute('minlength'), 10); 18287 /* check, if the minlength value is usable at all. */ 18288 18289 if (isNaN(minlength) || minlength < 0) { 18290 return true; 18291 } 18292 18293 return Object(_tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value) >= minlength; 18294}); 18295 18296/***/ }), 18297
vendor: 699 bytes, lines 18298-18317
18298/***/ "../node_modules/hyperform/src/validators/pattern.js": 18299/*!***********************************************************!*\ 18300 !*** ../node_modules/hyperform/src/validators/pattern.js ***! 18301 \***********************************************************/ 18302/*! exports provided: default */ 18303/***/ (function(module, __webpack_exports__, __webpack_require__) { 18304 18305"use strict"; 18306__webpack_require__.r(__webpack_exports__); 18307 18308/** 18309 * test the pattern attribute 18310 */ 18311 18312/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18313 return !element.value || !element.hasAttribute('pattern') || new RegExp('^(?:' + element.getAttribute('pattern') + ')$').test(element.value); 18314}); 18315 18316/***/ }), 18317
vendor: 2,671 bytes, lines 18318-18396
18318/***/ "../node_modules/hyperform/src/validators/required.js": 18319/*!************************************************************!*\ 18320 !*** ../node_modules/hyperform/src/validators/required.js ***! 18321 \************************************************************/ 18322/*! exports provided: default */ 18323/***/ (function(module, __webpack_exports__, __webpack_require__) { 18324 18325"use strict"; 18326__webpack_require__.r(__webpack_exports__); 18327/* harmony import */ var _tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_radiogroup */ "../node_modules/hyperform/src/tools/get_radiogroup.js"); 18328 18329 18330 18331 18332function has_submittable_option(select) { 18333 /* Definition of the placeholder label option: 18334 * https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-select-required 18335 * Being required (the first constraint in the spec) is trivially true, since 18336 * this function is only called for such selects. 18337 */ 18338 var has_placeholder_option = !select.multiple && select.size <= 1 && select.options.length > 0 && select.options[0].parentNode == select && select.options[0].value === ''; 18339 return ( 18340 /* anything selected at all? That's redundant with the .some() call below, 18341 * but more performant in the most probable error case. */ 18342 select.selectedIndex > -1 && Array.prototype.some.call(select.options, function (option) { 18343 return ( 18344 /* it isn't the placeholder option */ 18345 (!has_placeholder_option || option.index !== 0) && 18346 /* it isn't disabled */ 18347 !option.disabled && 18348 /* and it is, in fact, selected */ 18349 option.selected 18350 ); 18351 }) 18352 ); 18353} 18354/** 18355 * test the required attribute 18356 */ 18357 18358 18359/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18360 if (element.type === 'radio') { 18361 /* the happy (and quick) path for radios: */ 18362 if (element.hasAttribute('required') && element.checked) { 18363 return true; 18364 } 18365 18366 var radiogroup = Object(_tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_0__["get_radiogroup"])(element); 18367 /* if any radio in the group is required, we need any (not necessarily the 18368 * same) radio to be checked */ 18369 18370 if (radiogroup.some(function (radio) { 18371 return radio.hasAttribute('required'); 18372 })) { 18373 return radiogroup.some(function (radio) { 18374 return radio.checked; 18375 }); 18376 } 18377 /* not required, validation passes */ 18378 18379 18380 return true; 18381 } 18382 18383 if (!element.hasAttribute('required')) { 18384 /* nothing to do */ 18385 return true; 18386 } 18387 18388 if (element instanceof window.HTMLSelectElement) { 18389 return has_submittable_option(element); 18390 } 18391 18392 return element.type === 'checkbox' ? element.checked : !!element.value; 18393}); 18394 18395/***/ }), 18396
vendor: 3,263 bytes, lines 18397-18472
18397/***/ "../node_modules/hyperform/src/validators/step.js": 18398/*!********************************************************!*\ 18399 !*** ../node_modules/hyperform/src/validators/step.js ***! 18400 \********************************************************/ 18401/*! exports provided: default */ 18402/***/ (function(module, __webpack_exports__, __webpack_require__) { 18403 18404"use strict"; 18405__webpack_require__.r(__webpack_exports__); 18406/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18407/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18408/* harmony import */ var _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/step_defaults */ "../node_modules/hyperform/src/components/step_defaults.js"); 18409/* harmony import */ var _tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js"); 18410 18411 18412 18413 18414 18415 18416/** 18417 * test the step attribute 18418 */ 18419 18420/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18421 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 18422 18423 if (!element.value || _components_types__WEBPACK_IMPORTED_MODULE_1__["numbers"].indexOf(type) === -1 || (element.getAttribute('step') || '').toLowerCase() === 'any') { 18424 /* we're not responsible here. Note: If no step attribute is given, we 18425 * need to validate against the default step as per spec. */ 18426 return true; 18427 } 18428 18429 var step = element.getAttribute('step'); 18430 18431 if (step) { 18432 step = Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__["default"])(step, type); 18433 } else { 18434 step = _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__["default_step"][type] || 1; 18435 } 18436 18437 if (step <= 0 || isNaN(step)) { 18438 /* error in specified "step". We cannot validate against it, so the value 18439 * is true. */ 18440 return true; 18441 } 18442 18443 var scale = _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__["step_scale_factor"][type] || 1; 18444 var value = Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__["default"])(element.value, type); 18445 var min = Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__["default"])(element.getAttribute('min') || element.getAttribute('value') || '', type); 18446 18447 if (isNaN(value)) { 18448 /* we cannot compare an invalid value and trust that the badInput validator 18449 * takes over from here */ 18450 return true; 18451 } 18452 18453 if (isNaN(min)) { 18454 min = _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__["default_step_base"][type] || 0; 18455 } 18456 18457 if (type === 'month') { 18458 /* type=month has month-wide steps. See 18459 * https://html.spec.whatwg.org/multipage/forms.html#month-state-%28type=month%29 18460 */ 18461 min = new Date(min).getUTCFullYear() * 12 + new Date(min).getUTCMonth(); 18462 value = new Date(value).getUTCFullYear() * 12 + new Date(value).getUTCMonth(); 18463 } 18464 18465 var result = Math.abs(min - value) % (step * scale); 18466 return result < 0.00000001 || 18467 /* crappy floating-point arithmetics! */ 18468 result > step * scale - 0.00000001; 18469}); 18470 18471/***/ }), 18472
vendor: 4,249 bytes, lines 18473-18589
18473/***/ "../node_modules/hyperform/src/validators/type.js": 18474/*!********************************************************!*\ 18475 !*** ../node_modules/hyperform/src/validators/type.js ***! 18476 \********************************************************/ 18477/*! exports provided: default */ 18478/***/ (function(module, __webpack_exports__, __webpack_require__) { 18479 18480"use strict"; 18481__webpack_require__.r(__webpack_exports__); 18482/* harmony import */ var _tools_comma_split__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/comma_split */ "../node_modules/hyperform/src/tools/comma_split.js"); 18483/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js"); 18484/* harmony import */ var _tools_trim__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/trim */ "../node_modules/hyperform/src/tools/trim.js"); 18485/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js"); 18486 18487 18488 18489 18490 18491 18492/* we use a dummy <a> where we set the href to test URL validity 18493 * The definition is out of the "global" scope so that JSDOM can be instantiated 18494 * after loading Hyperform for tests. 18495 */ 18496 18497var url_canary; 18498/* see https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address */ 18499 18500var email_pattern = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; 18501/** 18502 * test the type-inherent syntax 18503 */ 18504 18505/* harmony default export */ __webpack_exports__["default"] = (function (element) { 18506 var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_1__["default"])(element); 18507 18508 if (type !== 'file' && !element.value || type !== 'file' && _components_types__WEBPACK_IMPORTED_MODULE_3__["type_checked"].indexOf(type) === -1) { 18509 /* we're not responsible for this element */ 18510 return true; 18511 } 18512 18513 var is_valid = true; 18514 18515 switch (type) { 18516 case 'url': 18517 if (!url_canary) { 18518 url_canary = document.createElement('a'); 18519 } 18520 18521 var value = Object(_tools_trim__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value); 18522 url_canary.href = value; 18523 is_valid = url_canary.href === value || url_canary.href === value + '/'; 18524 break; 18525 18526 case 'email': 18527 if (element.hasAttribute('multiple')) { 18528 is_valid = Object(_tools_comma_split__WEBPACK_IMPORTED_MODULE_0__["default"])(element.value).every(function (value) { 18529 return email_pattern.test(value); 18530 }); 18531 } else { 18532 is_valid = email_pattern.test(Object(_tools_trim__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value)); 18533 } 18534 18535 break; 18536 18537 case 'file': 18538 if ('files' in element && element.files.length && element.hasAttribute('accept')) { 18539 var patterns = Object(_tools_comma_split__WEBPACK_IMPORTED_MODULE_0__["default"])(element.getAttribute('accept')).map(function (pattern) { 18540 if (/^(audio|video|image)\/\*$/.test(pattern)) { 18541 pattern = new RegExp('^' + RegExp.$1 + '/.+$'); 18542 } 18543 18544 return pattern; 18545 }); 18546 18547 if (!patterns.length) { 18548 break; 18549 } 18550 18551 fileloop: for (var i = 0; i < element.files.length; i++) { 18552 /* we need to match a whitelist, so pre-set with false */ 18553 var file_valid = false; 18554 18555 patternloop: for (var j = 0; j < patterns.length; j++) { 18556 var file = element.files[i]; 18557 var pattern = patterns[j]; 18558 var fileprop = file.type; 18559 18560 if (typeof pattern === 'string' && pattern.substr(0, 1) === '.') { 18561 if (file.name.search('.') === -1) { 18562 /* no match with any file ending */ 18563 continue patternloop; 18564 } 18565 18566 fileprop = file.name.substr(file.name.lastIndexOf('.')); 18567 } 18568 18569 if (fileprop.search(pattern) === 0) { 18570 /* we found one match and can quit looking */ 18571 file_valid = true; 18572 break patternloop; 18573 } 18574 } 18575 18576 if (!file_valid) { 18577 is_valid = false; 18578 break fileloop; 18579 } 18580 } 18581 } 18582 18583 } 18584 18585 return is_valid; 18586}); 18587 18588/***/ }), 18589
vendor: 459 bytes, lines 18590-18604
18590/***/ "../node_modules/hyperform/src/version.js": 18591/*!************************************************!*\ 18592 !*** ../node_modules/hyperform/src/version.js ***! 18593 \************************************************/ 18594/*! exports provided: default */ 18595/***/ (function(module, __webpack_exports__, __webpack_require__) { 18596 18597"use strict"; 18598__webpack_require__.r(__webpack_exports__); 18599 18600 18601/* harmony default export */ __webpack_exports__["default"] = ('0.9.23'); 18602 18603/***/ }), 18604
vendor: 12,269 bytes, lines 18605-19002
18605/***/ "../node_modules/inputmask/dist/inputmask/dependencyLibs/inputmask.dependencyLib.js": 18606/*!******************************************************************************************!*\ 18607 !*** ../node_modules/inputmask/dist/inputmask/dependencyLibs/inputmask.dependencyLib.js ***! 18608 \******************************************************************************************/ 18609/*! no static exports found */ 18610/***/ (function(module, exports, __webpack_require__) { 18611 18612var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 18613 18614/*! 18615* dependencyLibs/inputmask.dependencyLib.js 18616* https://github.com/RobinHerbots/Inputmask 18617* Copyright (c) 2010 - 2019 Robin Herbots 18618* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 18619* Version: 4.0.6 18620*/ 18621(function (factory) { 18622 if (true) { 18623 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../global/window */ "../node_modules/inputmask/dist/inputmask/global/window.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 18624 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 18625 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 18626 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 18627 } else {} 18628})(function (window) { 18629 var document = window.document; 18630 18631 function indexOf(list, elem) { 18632 var i = 0, 18633 len = list.length; 18634 18635 for (; i < len; i++) { 18636 if (list[i] === elem) { 18637 return i; 18638 } 18639 } 18640 18641 return -1; 18642 } 18643 18644 function isWindow(obj) { 18645 return obj != null && obj === obj.window; 18646 } 18647 18648 function isArraylike(obj) { 18649 var length = "length" in obj && obj.length, 18650 ltype = _typeof(obj); 18651 18652 if (ltype === "function" || isWindow(obj)) { 18653 return false; 18654 } 18655 18656 if (obj.nodeType === 1 && length) { 18657 return true; 18658 } 18659 18660 return ltype === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; 18661 } 18662 18663 function isValidElement(elem) { 18664 return elem instanceof Element; 18665 } 18666 18667 function DependencyLib(elem) { 18668 if (elem instanceof DependencyLib) { 18669 return elem; 18670 } 18671 18672 if (!(this instanceof DependencyLib)) { 18673 return new DependencyLib(elem); 18674 } 18675 18676 if (elem !== undefined && elem !== null && elem !== window) { 18677 this[0] = elem.nodeName ? elem : elem[0] !== undefined && elem[0].nodeName ? elem[0] : document.querySelector(elem); 18678 18679 if (this[0] !== undefined && this[0] !== null) { 18680 this[0].eventRegistry = this[0].eventRegistry || {}; 18681 } 18682 } 18683 } 18684 18685 function getWindow(elem) { 18686 return isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false; 18687 } 18688 18689 DependencyLib.prototype = { 18690 on: function on(events, handler) { 18691 if (isValidElement(this[0])) { 18692 var addEvent = function addEvent(ev, namespace) { 18693 if (elem.addEventListener) { 18694 elem.addEventListener(ev, handler, false); 18695 } else if (elem.attachEvent) { 18696 elem.attachEvent("on" + ev, handler); 18697 } 18698 18699 eventRegistry[ev] = eventRegistry[ev] || {}; 18700 eventRegistry[ev][namespace] = eventRegistry[ev][namespace] || []; 18701 eventRegistry[ev][namespace].push(handler); 18702 }; 18703 18704 var eventRegistry = this[0].eventRegistry, 18705 elem = this[0]; 18706 18707 var _events = events.split(" "); 18708 18709 for (var endx = 0; endx < _events.length; endx++) { 18710 var nsEvent = _events[endx].split("."), 18711 ev = nsEvent[0], 18712 namespace = nsEvent[1] || "global"; 18713 18714 addEvent(ev, namespace); 18715 } 18716 } 18717 18718 return this; 18719 }, 18720 off: function off(events, handler) { 18721 if (isValidElement(this[0])) { 18722 var removeEvent = function removeEvent(ev, namespace, handler) { 18723 if (ev in eventRegistry === true) { 18724 if (elem.removeEventListener) { 18725 elem.removeEventListener(ev, handler, false); 18726 } else if (elem.detachEvent) { 18727 elem.detachEvent("on" + ev, handler); 18728 } 18729 18730 if (namespace === "global") { 18731 for (var nmsp in eventRegistry[ev]) { 18732 eventRegistry[ev][nmsp].splice(eventRegistry[ev][nmsp].indexOf(handler), 1); 18733 } 18734 } else { 18735 eventRegistry[ev][namespace].splice(eventRegistry[ev][namespace].indexOf(handler), 1); 18736 } 18737 } 18738 }; 18739 18740 var resolveNamespace = function resolveNamespace(ev, namespace) { 18741 var evts = [], 18742 hndx, 18743 hndL; 18744 18745 if (ev.length > 0) { 18746 if (handler === undefined) { 18747 for (hndx = 0, hndL = eventRegistry[ev][namespace].length; hndx < hndL; hndx++) { 18748 evts.push({ 18749 ev: ev, 18750 namespace: namespace && namespace.length > 0 ? namespace : "global", 18751 handler: eventRegistry[ev][namespace][hndx] 18752 }); 18753 } 18754 } else { 18755 evts.push({ 18756 ev: ev, 18757 namespace: namespace && namespace.length > 0 ? namespace : "global", 18758 handler: handler 18759 }); 18760 } 18761 } else if (namespace.length > 0) { 18762 for (var evNdx in eventRegistry) { 18763 for (var nmsp in eventRegistry[evNdx]) { 18764 if (nmsp === namespace) { 18765 if (handler === undefined) { 18766 for (hndx = 0, hndL = eventRegistry[evNdx][nmsp].length; hndx < hndL; hndx++) { 18767 evts.push({ 18768 ev: evNdx, 18769 namespace: nmsp, 18770 handler: eventRegistry[evNdx][nmsp][hndx] 18771 }); 18772 } 18773 } else { 18774 evts.push({ 18775 ev: evNdx, 18776 namespace: nmsp, 18777 handler: handler 18778 }); 18779 } 18780 } 18781 } 18782 } 18783 } 18784 18785 return evts; 18786 }; 18787 18788 var eventRegistry = this[0].eventRegistry, 18789 elem = this[0]; 18790 18791 var _events = events.split(" "); 18792 18793 for (var endx = 0; endx < _events.length; endx++) { 18794 var nsEvent = _events[endx].split("."), 18795 offEvents = resolveNamespace(nsEvent[0], nsEvent[1]); 18796 18797 for (var i = 0, offEventsL = offEvents.length; i < offEventsL; i++) { 18798 removeEvent(offEvents[i].ev, offEvents[i].namespace, offEvents[i].handler); 18799 } 18800 } 18801 } 18802 18803 return this; 18804 }, 18805 trigger: function trigger(events) { 18806 if (isValidElement(this[0])) { 18807 var eventRegistry = this[0].eventRegistry, 18808 elem = this[0]; 18809 18810 var _events = typeof events === "string" ? events.split(" ") : [events.type]; 18811 18812 for (var endx = 0; endx < _events.length; endx++) { 18813 var nsEvent = _events[endx].split("."), 18814 ev = nsEvent[0], 18815 namespace = nsEvent[1] || "global"; 18816 18817 if (document !== undefined && namespace === "global") { 18818 var evnt, 18819 i, 18820 params = { 18821 bubbles: true, 18822 cancelable: true, 18823 detail: arguments[1] 18824 }; 18825 18826 if (document.createEvent) { 18827 try { 18828 evnt = new CustomEvent(ev, params); 18829 } catch (e) { 18830 evnt = document.createEvent("CustomEvent"); 18831 evnt.initCustomEvent(ev, params.bubbles, params.cancelable, params.detail); 18832 } 18833 18834 if (events.type) DependencyLib.extend(evnt, events); 18835 elem.dispatchEvent(evnt); 18836 } else { 18837 evnt = document.createEventObject(); 18838 evnt.eventType = ev; 18839 evnt.detail = arguments[1]; 18840 if (events.type) DependencyLib.extend(evnt, events); 18841 elem.fireEvent("on" + evnt.eventType, evnt); 18842 } 18843 } else if (eventRegistry[ev] !== undefined) { 18844 arguments[0] = arguments[0].type ? arguments[0] : DependencyLib.Event(arguments[0]); 18845 18846 if (namespace === "global") { 18847 for (var nmsp in eventRegistry[ev]) { 18848 for (i = 0; i < eventRegistry[ev][nmsp].length; i++) { 18849 eventRegistry[ev][nmsp][i].apply(elem, arguments); 18850 } 18851 } 18852 } else { 18853 for (i = 0; i < eventRegistry[ev][namespace].length; i++) { 18854 eventRegistry[ev][namespace][i].apply(elem, arguments); 18855 } 18856 } 18857 } 18858 } 18859 } 18860 18861 return this; 18862 } 18863 }; 18864 18865 DependencyLib.isFunction = function (obj) { 18866 return typeof obj === "function"; 18867 }; 18868 18869 DependencyLib.noop = function () {}; 18870 18871 DependencyLib.isArray = Array.isArray; 18872 18873 DependencyLib.inArray = function (elem, arr, i) { 18874 return arr == null ? -1 : indexOf(arr, elem, i); 18875 }; 18876 18877 DependencyLib.valHooks = undefined; 18878 18879 DependencyLib.isPlainObject = function (obj) { 18880 if (_typeof(obj) !== "object" || obj.nodeType || isWindow(obj)) { 18881 return false; 18882 } 18883 18884 if (obj.constructor && !Object.hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf")) { 18885 return false; 18886 } 18887 18888 return true; 18889 }; 18890 18891 DependencyLib.extend = function () { 18892 var options, 18893 name, 18894 src, 18895 copy, 18896 copyIsArray, 18897 clone, 18898 target = arguments[0] || {}, 18899 i = 1, 18900 length = arguments.length, 18901 deep = false; 18902 18903 if (typeof target === "boolean") { 18904 deep = target; 18905 target = arguments[i] || {}; 18906 i++; 18907 } 18908 18909 if (_typeof(target) !== "object" && !DependencyLib.isFunction(target)) { 18910 target = {}; 18911 } 18912 18913 if (i === length) { 18914 target = this; 18915 i--; 18916 } 18917 18918 for (; i < length; i++) { 18919 if ((options = arguments[i]) != null) { 18920 for (name in options) { 18921 src = target[name]; 18922 copy = options[name]; 18923 18924 if (target === copy) { 18925 continue; 18926 } 18927 18928 if (deep && copy && (DependencyLib.isPlainObject(copy) || (copyIsArray = DependencyLib.isArray(copy)))) { 18929 if (copyIsArray) { 18930 copyIsArray = false; 18931 clone = src && DependencyLib.isArray(src) ? src : []; 18932 } else { 18933 clone = src && DependencyLib.isPlainObject(src) ? src : {}; 18934 } 18935 18936 target[name] = DependencyLib.extend(deep, clone, copy); 18937 } else if (copy !== undefined) { 18938 target[name] = copy; 18939 } 18940 } 18941 } 18942 } 18943 18944 return target; 18945 }; 18946 18947 DependencyLib.each = function (obj, callback) { 18948 var value, 18949 i = 0; 18950 18951 if (isArraylike(obj)) { 18952 for (var length = obj.length; i < length; i++) { 18953 value = callback.call(obj[i], i, obj[i]); 18954 18955 if (value === false) { 18956 break; 18957 } 18958 } 18959 } else { 18960 for (i in obj) { 18961 value = callback.call(obj[i], i, obj[i]); 18962 18963 if (value === false) { 18964 break; 18965 } 18966 } 18967 } 18968 18969 return obj; 18970 }; 18971 18972 DependencyLib.data = function (owner, key, value) { 18973 if (value === undefined) { 18974 return owner.__data ? owner.__data[key] : null; 18975 } else { 18976 owner.__data = owner.__data || {}; 18977 owner.__data[key] = value; 18978 } 18979 }; 18980 18981 if (typeof window.CustomEvent === "function") { 18982 DependencyLib.Event = window.CustomEvent; 18983 } else { 18984 DependencyLib.Event = function (event, params) { 18985 params = params || { 18986 bubbles: false, 18987 cancelable: false, 18988 detail: undefined 18989 }; 18990 var evt = document.createEvent("CustomEvent"); 18991 evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); 18992 return evt; 18993 }; 18994 18995 DependencyLib.Event.prototype = window.Event.prototype; 18996 } 18997 18998 return DependencyLib; 18999}); 19000 19001/***/ }), 19002
vendor: 1,304 bytes, lines 19003-19025
19003/***/ "../node_modules/inputmask/dist/inputmask/global/window.js": 19004/*!*****************************************************************!*\ 19005 !*** ../node_modules/inputmask/dist/inputmask/global/window.js ***! 19006 \*****************************************************************/ 19007/*! no static exports found */ 19008/***/ (function(module, exports, __webpack_require__) { 19009 19010var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 19011 19012/*! 19013* global/window.js 19014* https://github.com/RobinHerbots/Inputmask 19015* Copyright (c) 2010 - 2019 Robin Herbots 19016* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 19017* Version: 4.0.6 19018*/ 19019if (true) !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { 19020 return typeof window !== "undefined" ? window : new (eval("require('jsdom').JSDOM"))("").window; 19021}).call(exports, __webpack_require__, exports, module), 19022 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {} 19023 19024/***/ }), 19025
vendor: 11,905 bytes, lines 19026-19336
19026/***/ "../node_modules/inputmask/dist/inputmask/inputmask.date.extensions.js": 19027/*!*****************************************************************************!*\ 19028 !*** ../node_modules/inputmask/dist/inputmask/inputmask.date.extensions.js ***! 19029 \*****************************************************************************/ 19030/*! no static exports found */ 19031/***/ (function(module, exports, __webpack_require__) { 19032 19033var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 19034 19035/*! 19036* inputmask.date.extensions.js 19037* https://github.com/RobinHerbots/Inputmask 19038* Copyright (c) 2010 - 2019 Robin Herbots 19039* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 19040* Version: 4.0.6 19041*/ 19042(function (factory) { 19043 if (true) { 19044 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./inputmask */ "../node_modules/inputmask/dist/inputmask/inputmask.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 19045 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 19046 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 19047 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 19048 } else {} 19049})(function (Inputmask) { 19050 var $ = Inputmask.dependencyLib; 19051 var formatCode = { 19052 d: ["[1-9]|[12][0-9]|3[01]", Date.prototype.setDate, "day", Date.prototype.getDate], 19053 dd: ["0[1-9]|[12][0-9]|3[01]", Date.prototype.setDate, "day", function () { 19054 return pad(Date.prototype.getDate.call(this), 2); 19055 }], 19056 ddd: [""], 19057 dddd: [""], 19058 m: ["[1-9]|1[012]", Date.prototype.setMonth, "month", function () { 19059 return Date.prototype.getMonth.call(this) + 1; 19060 }], 19061 mm: ["0[1-9]|1[012]", Date.prototype.setMonth, "month", function () { 19062 return pad(Date.prototype.getMonth.call(this) + 1, 2); 19063 }], 19064 mmm: [""], 19065 mmmm: [""], 19066 yy: ["[0-9]{2}", Date.prototype.setFullYear, "year", function () { 19067 return pad(Date.prototype.getFullYear.call(this), 2); 19068 }], 19069 yyyy: ["[0-9]{4}", Date.prototype.setFullYear, "year", function () { 19070 return pad(Date.prototype.getFullYear.call(this), 4); 19071 }], 19072 h: ["[1-9]|1[0-2]", Date.prototype.setHours, "hours", Date.prototype.getHours], 19073 hh: ["0[1-9]|1[0-2]", Date.prototype.setHours, "hours", function () { 19074 return pad(Date.prototype.getHours.call(this), 2); 19075 }], 19076 hhh: ["[0-9]+", Date.prototype.setHours, "hours", Date.prototype.getHours], 19077 H: ["1?[0-9]|2[0-3]", Date.prototype.setHours, "hours", Date.prototype.getHours], 19078 HH: ["0[0-9]|1[0-9]|2[0-3]", Date.prototype.setHours, "hours", function () { 19079 return pad(Date.prototype.getHours.call(this), 2); 19080 }], 19081 HHH: ["[0-9]+", Date.prototype.setHours, "hours", Date.prototype.getHours], 19082 M: ["[1-5]?[0-9]", Date.prototype.setMinutes, "minutes", Date.prototype.getMinutes], 19083 MM: ["0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]", Date.prototype.setMinutes, "minutes", function () { 19084 return pad(Date.prototype.getMinutes.call(this), 2); 19085 }], 19086 ss: ["[0-5][0-9]", Date.prototype.setSeconds, "seconds", function () { 19087 return pad(Date.prototype.getSeconds.call(this), 2); 19088 }], 19089 l: ["[0-9]{3}", Date.prototype.setMilliseconds, "milliseconds", function () { 19090 return pad(Date.prototype.getMilliseconds.call(this), 3); 19091 }], 19092 L: ["[0-9]{2}", Date.prototype.setMilliseconds, "milliseconds", function () { 19093 return pad(Date.prototype.getMilliseconds.call(this), 2); 19094 }], 19095 t: ["[ap]"], 19096 tt: ["[ap]m"], 19097 T: ["[AP]"], 19098 TT: ["[AP]M"], 19099 Z: [""], 19100 o: [""], 19101 S: [""] 19102 }, 19103 formatAlias = { 19104 isoDate: "yyyy-mm-dd", 19105 isoTime: "HH:MM:ss", 19106 isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", 19107 isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" 19108 }; 19109 19110 function getTokenizer(opts) { 19111 if (!opts.tokenizer) { 19112 var tokens = []; 19113 19114 for (var ndx in formatCode) { 19115 if (tokens.indexOf(ndx[0]) === -1) tokens.push(ndx[0]); 19116 } 19117 19118 opts.tokenizer = "(" + tokens.join("+|") + ")+?|."; 19119 opts.tokenizer = new RegExp(opts.tokenizer, "g"); 19120 } 19121 19122 return opts.tokenizer; 19123 } 19124 19125 function isValidDate(dateParts, currentResult) { 19126 return !isFinite(dateParts.rawday) || dateParts.day == "29" && !isFinite(dateParts.rawyear) || new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day ? currentResult : false; 19127 } 19128 19129 function isDateInRange(dateParts, opts) { 19130 var result = true; 19131 19132 if (opts.min) { 19133 if (dateParts["rawyear"]) { 19134 var rawYear = dateParts["rawyear"].replace(/[^0-9]/g, ""), 19135 minYear = opts.min.year.substr(0, rawYear.length); 19136 result = minYear <= rawYear; 19137 } 19138 19139 if (dateParts["year"] === dateParts["rawyear"]) { 19140 if (opts.min.date.getTime() === opts.min.date.getTime()) { 19141 result = opts.min.date.getTime() <= dateParts.date.getTime(); 19142 } 19143 } 19144 } 19145 19146 if (result && opts.max && opts.max.date.getTime() === opts.max.date.getTime()) { 19147 result = opts.max.date.getTime() >= dateParts.date.getTime(); 19148 } 19149 19150 return result; 19151 } 19152 19153 function parse(format, dateObjValue, opts, raw) { 19154 var mask = "", 19155 match; 19156 19157 while (match = getTokenizer(opts).exec(format)) { 19158 if (dateObjValue === undefined) { 19159 if (formatCode[match[0]]) { 19160 mask += "(" + formatCode[match[0]][0] + ")"; 19161 } else { 19162 switch (match[0]) { 19163 case "[": 19164 mask += "("; 19165 break; 19166 19167 case "]": 19168 mask += ")?"; 19169 break; 19170 19171 default: 19172 mask += Inputmask.escapeRegex(match[0]); 19173 } 19174 } 19175 } else { 19176 if (formatCode[match[0]]) { 19177 if (raw !== true && formatCode[match[0]][3]) { 19178 var getFn = formatCode[match[0]][3]; 19179 mask += getFn.call(dateObjValue.date); 19180 } else if (formatCode[match[0]][2]) mask += dateObjValue["raw" + formatCode[match[0]][2]];else mask += match[0]; 19181 } else mask += match[0]; 19182 } 19183 } 19184 19185 return mask; 19186 } 19187 19188 function pad(val, len) { 19189 val = String(val); 19190 len = len || 2; 19191 19192 while (val.length < len) { 19193 val = "0" + val; 19194 } 19195 19196 return val; 19197 } 19198 19199 function analyseMask(maskString, format, opts) { 19200 var dateObj = { 19201 date: new Date(1, 0, 1) 19202 }, 19203 targetProp, 19204 mask = maskString, 19205 match, 19206 dateOperation, 19207 targetValidator; 19208 19209 function extendProperty(value) { 19210 var correctedValue = value.replace(/[^0-9]/g, "0"); 19211 19212 if (correctedValue != value) { 19213 var enteredPart = value.replace(/[^0-9]/g, ""), 19214 min = (opts.min && opts.min[targetProp] || value).toString(), 19215 max = (opts.max && opts.max[targetProp] || value).toString(); 19216 correctedValue = enteredPart + (enteredPart < min.slice(0, enteredPart.length) ? min.slice(enteredPart.length) : enteredPart > max.slice(0, enteredPart.length) ? max.slice(enteredPart.length) : correctedValue.toString().slice(enteredPart.length)); 19217 } 19218 19219 return correctedValue; 19220 } 19221 19222 function setValue(dateObj, value, opts) { 19223 dateObj[targetProp] = extendProperty(value); 19224 dateObj["raw" + targetProp] = value; 19225 if (dateOperation !== undefined) dateOperation.call(dateObj.date, targetProp == "month" ? parseInt(dateObj[targetProp]) - 1 : dateObj[targetProp]); 19226 } 19227 19228 if (typeof mask === "string") { 19229 while (match = getTokenizer(opts).exec(format)) { 19230 var value = mask.slice(0, match[0].length); 19231 19232 if (formatCode.hasOwnProperty(match[0])) { 19233 targetValidator = formatCode[match[0]][0]; 19234 targetProp = formatCode[match[0]][2]; 19235 dateOperation = formatCode[match[0]][1]; 19236 setValue(dateObj, value, opts); 19237 } 19238 19239 mask = mask.slice(value.length); 19240 } 19241 19242 return dateObj; 19243 } else if (mask && _typeof(mask) === "object" && mask.hasOwnProperty("date")) { 19244 return mask; 19245 } 19246 19247 return undefined; 19248 } 19249 19250 Inputmask.extendAliases({ 19251 datetime: { 19252 mask: function mask(opts) { 19253 formatCode.S = opts.i18n.ordinalSuffix.join("|"); 19254 opts.inputFormat = formatAlias[opts.inputFormat] || opts.inputFormat; 19255 opts.displayFormat = formatAlias[opts.displayFormat] || opts.displayFormat || opts.inputFormat; 19256 opts.outputFormat = formatAlias[opts.outputFormat] || opts.outputFormat || opts.inputFormat; 19257 opts.placeholder = opts.placeholder !== "" ? opts.placeholder : opts.inputFormat.replace(/[\[\]]/, ""); 19258 opts.regex = parse(opts.inputFormat, undefined, opts); 19259 return null; 19260 }, 19261 placeholder: "", 19262 inputFormat: "isoDateTime", 19263 displayFormat: undefined, 19264 outputFormat: undefined, 19265 min: null, 19266 max: null, 19267 i18n: { 19268 dayNames: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], 19269 monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], 19270 ordinalSuffix: ["st", "nd", "rd", "th"] 19271 }, 19272 postValidation: function postValidation(buffer, pos, currentResult, opts) { 19273 opts.min = analyseMask(opts.min, opts.inputFormat, opts); 19274 opts.max = analyseMask(opts.max, opts.inputFormat, opts); 19275 var result = currentResult, 19276 dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts); 19277 19278 if (result && dateParts.date.getTime() === dateParts.date.getTime()) { 19279 result = isValidDate(dateParts, result); 19280 result = result && isDateInRange(dateParts, opts); 19281 } 19282 19283 if (pos && result && currentResult.pos !== pos) { 19284 return { 19285 buffer: parse(opts.inputFormat, dateParts, opts), 19286 refreshFromBuffer: { 19287 start: pos, 19288 end: currentResult.pos 19289 } 19290 }; 19291 } 19292 19293 return result; 19294 }, 19295 onKeyDown: function onKeyDown(e, buffer, caretPos, opts) { 19296 var input = this; 19297 19298 if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { 19299 var today = new Date(), 19300 match, 19301 date = ""; 19302 19303 while (match = getTokenizer(opts).exec(opts.inputFormat)) { 19304 if (match[0].charAt(0) === "d") { 19305 date += pad(today.getDate(), match[0].length); 19306 } else if (match[0].charAt(0) === "m") { 19307 date += pad(today.getMonth() + 1, match[0].length); 19308 } else if (match[0] === "yyyy") { 19309 date += today.getFullYear().toString(); 19310 } else if (match[0].charAt(0) === "y") { 19311 date += pad(today.getYear(), match[0].length); 19312 } 19313 } 19314 19315 input.inputmask._valueSet(date); 19316 19317 $(input).trigger("setvalue"); 19318 } 19319 }, 19320 onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) { 19321 return parse(opts.outputFormat, analyseMask(maskedValue, opts.inputFormat, opts), opts, true); 19322 }, 19323 casing: function casing(elem, test, pos, validPositions) { 19324 if (test.nativeDef.indexOf("[ap]") == 0) return elem.toLowerCase(); 19325 if (test.nativeDef.indexOf("[AP]") == 0) return elem.toUpperCase(); 19326 return elem; 19327 }, 19328 insertMode: false, 19329 shiftPositions: false 19330 } 19331 }); 19332 return Inputmask; 19333}); 19334 19335/***/ }), 19336
vendor: 3,891 bytes, lines 19337-19445
19337/***/ "../node_modules/inputmask/dist/inputmask/inputmask.extensions.js": 19338/*!************************************************************************!*\ 19339 !*** ../node_modules/inputmask/dist/inputmask/inputmask.extensions.js ***! 19340 \************************************************************************/ 19341/*! no static exports found */ 19342/***/ (function(module, exports, __webpack_require__) { 19343 19344var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 19345 19346/*! 19347* inputmask.extensions.js 19348* https://github.com/RobinHerbots/Inputmask 19349* Copyright (c) 2010 - 2019 Robin Herbots 19350* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 19351* Version: 4.0.6 19352*/ 19353(function (factory) { 19354 if (true) { 19355 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./inputmask */ "../node_modules/inputmask/dist/inputmask/inputmask.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 19356 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 19357 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 19358 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 19359 } else {} 19360})(function (Inputmask) { 19361 Inputmask.extendDefinitions({ 19362 A: { 19363 validator: "[A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]", 19364 casing: "upper" 19365 }, 19366 "&": { 19367 validator: "[0-9A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]", 19368 casing: "upper" 19369 }, 19370 "#": { 19371 validator: "[0-9A-Fa-f]", 19372 casing: "upper" 19373 } 19374 }); 19375 Inputmask.extendAliases({ 19376 cssunit: { 19377 regex: "[+-]?[0-9]+\\.?([0-9]+)?(px|em|rem|ex|%|in|cm|mm|pt|pc)" 19378 }, 19379 url: { 19380 regex: "(https?|ftp)//.*", 19381 autoUnmask: false 19382 }, 19383 ip: { 19384 mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]", 19385 definitions: { 19386 i: { 19387 validator: function validator(chrs, maskset, pos, strict, opts) { 19388 if (pos - 1 > -1 && maskset.buffer[pos - 1] !== ".") { 19389 chrs = maskset.buffer[pos - 1] + chrs; 19390 19391 if (pos - 2 > -1 && maskset.buffer[pos - 2] !== ".") { 19392 chrs = maskset.buffer[pos - 2] + chrs; 19393 } else chrs = "0" + chrs; 19394 } else chrs = "00" + chrs; 19395 19396 return new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs); 19397 } 19398 } 19399 }, 19400 onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) { 19401 return maskedValue; 19402 }, 19403 inputmode: "numeric" 19404 }, 19405 email: { 19406 mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,63}]@-{1,63}.-{1,63}[.-{1,63}][.-{1,63}]", 19407 greedy: false, 19408 casing: "lower", 19409 onBeforePaste: function onBeforePaste(pastedValue, opts) { 19410 pastedValue = pastedValue.toLowerCase(); 19411 return pastedValue.replace("mailto:", ""); 19412 }, 19413 definitions: { 19414 "*": { 19415 validator: "[0-9\uFF11-\uFF19A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5!#$%&'*+/=?^_`{|}~-]" 19416 }, 19417 "-": { 19418 validator: "[0-9A-Za-z-]" 19419 } 19420 }, 19421 onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) { 19422 return maskedValue; 19423 }, 19424 inputmode: "email" 19425 }, 19426 mac: { 19427 mask: "##:##:##:##:##:##" 19428 }, 19429 vin: { 19430 mask: "V{13}9{4}", 19431 definitions: { 19432 V: { 19433 validator: "[A-HJ-NPR-Za-hj-npr-z\\d]", 19434 casing: "upper" 19435 } 19436 }, 19437 clearIncomplete: true, 19438 autoUnmask: true 19439 } 19440 }); 19441 return Inputmask; 19442}); 19443 19444/***/ }), 19445
vendor: 126,181 bytes, lines 19446-22924
19446/***/ "../node_modules/inputmask/dist/inputmask/inputmask.js": 19447/*!*************************************************************!*\ 19448 !*** ../node_modules/inputmask/dist/inputmask/inputmask.js ***! 19449 \*************************************************************/ 19450/*! no static exports found */ 19451/***/ (function(module, exports, __webpack_require__) { 19452 19453var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 19454 19455/*! 19456* inputmask.js 19457* https://github.com/RobinHerbots/Inputmask 19458* Copyright (c) 2010 - 2019 Robin Herbots 19459* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 19460* Version: 4.0.6 19461*/ 19462(function (factory) { 19463 if (true) { 19464 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./dependencyLibs/inputmask.dependencyLib */ "../node_modules/inputmask/dist/inputmask/dependencyLibs/inputmask.dependencyLib.js"), __webpack_require__(/*! ./global/window */ "../node_modules/inputmask/dist/inputmask/global/window.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 19465 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 19466 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 19467 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 19468 } else {} 19469})(function ($, window, undefined) { 19470 var document = window.document, 19471 ua = navigator.userAgent, 19472 ie = ua.indexOf("MSIE ") > 0 || ua.indexOf("Trident/") > 0, 19473 mobile = isInputEventSupported("touchstart"), 19474 iemobile = /iemobile/i.test(ua), 19475 iphone = /iphone/i.test(ua) && !iemobile; 19476 19477 function Inputmask(alias, options, internal) { 19478 if (!(this instanceof Inputmask)) { 19479 return new Inputmask(alias, options, internal); 19480 } 19481 19482 this.el = undefined; 19483 this.events = {}; 19484 this.maskset = undefined; 19485 this.refreshValue = false; 19486 19487 if (internal !== true) { 19488 if ($.isPlainObject(alias)) { 19489 options = alias; 19490 } else { 19491 options = options || {}; 19492 if (alias) options.alias = alias; 19493 } 19494 19495 this.opts = $.extend(true, {}, this.defaults, options); 19496 this.noMasksCache = options && options.definitions !== undefined; 19497 this.userOptions = options || {}; 19498 this.isRTL = this.opts.numericInput; 19499 resolveAlias(this.opts.alias, options, this.opts); 19500 } 19501 } 19502 19503 Inputmask.prototype = { 19504 dataAttribute: "data-inputmask", 19505 defaults: { 19506 placeholder: "_", 19507 optionalmarker: ["[", "]"], 19508 quantifiermarker: ["{", "}"], 19509 groupmarker: ["(", ")"], 19510 alternatormarker: "|", 19511 escapeChar: "\\", 19512 mask: null, 19513 regex: null, 19514 oncomplete: $.noop, 19515 onincomplete: $.noop, 19516 oncleared: $.noop, 19517 repeat: 0, 19518 greedy: false, 19519 autoUnmask: false, 19520 removeMaskOnSubmit: false, 19521 clearMaskOnLostFocus: true, 19522 insertMode: true, 19523 clearIncomplete: false, 19524 alias: null, 19525 onKeyDown: $.noop, 19526 onBeforeMask: null, 19527 onBeforePaste: function onBeforePaste(pastedValue, opts) { 19528 return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(this, pastedValue, opts) : pastedValue; 19529 }, 19530 onBeforeWrite: null, 19531 onUnMask: null, 19532 showMaskOnFocus: true, 19533 showMaskOnHover: true, 19534 onKeyValidation: $.noop, 19535 skipOptionalPartCharacter: " ", 19536 numericInput: false, 19537 rightAlign: false, 19538 undoOnEscape: true, 19539 radixPoint: "", 19540 _radixDance: false, 19541 groupSeparator: "", 19542 keepStatic: null, 19543 positionCaretOnTab: true, 19544 tabThrough: false, 19545 supportsInputType: ["text", "tel", "url", "password", "search"], 19546 ignorables: [8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 0, 229], 19547 isComplete: null, 19548 preValidation: null, 19549 postValidation: null, 19550 staticDefinitionSymbol: undefined, 19551 jitMasking: false, 19552 nullable: true, 19553 inputEventOnly: false, 19554 noValuePatching: false, 19555 positionCaretOnClick: "lvp", 19556 casing: null, 19557 inputmode: "verbatim", 19558 colorMask: false, 19559 disablePredictiveText: false, 19560 importDataAttributes: true, 19561 shiftPositions: true 19562 }, 19563 definitions: { 19564 9: { 19565 validator: "[0-9\uFF11-\uFF19]", 19566 definitionSymbol: "*" 19567 }, 19568 a: { 19569 validator: "[A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]", 19570 definitionSymbol: "*" 19571 }, 19572 "*": { 19573 validator: "[0-9\uFF11-\uFF19A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]" 19574 } 19575 }, 19576 aliases: {}, 19577 masksCache: {}, 19578 mask: function mask(elems) { 19579 var that = this; 19580 19581 function importAttributeOptions(npt, opts, userOptions, dataAttribute) { 19582 if (opts.importDataAttributes === true) { 19583 var importOption = function importOption(option, optionData) { 19584 optionData = optionData !== undefined ? optionData : npt.getAttribute(dataAttribute + "-" + option); 19585 19586 if (optionData !== null) { 19587 if (typeof optionData === "string") { 19588 if (option.indexOf("on") === 0) optionData = window[optionData];else if (optionData === "false") optionData = false;else if (optionData === "true") optionData = true; 19589 } 19590 19591 userOptions[option] = optionData; 19592 } 19593 }; 19594 19595 var attrOptions = npt.getAttribute(dataAttribute), 19596 option, 19597 dataoptions, 19598 optionData, 19599 p; 19600 19601 if (attrOptions && attrOptions !== "") { 19602 attrOptions = attrOptions.replace(/'/g, '"'); 19603 dataoptions = JSON.parse("{" + attrOptions + "}"); 19604 } 19605 19606 if (dataoptions) { 19607 optionData = undefined; 19608 19609 for (p in dataoptions) { 19610 if (p.toLowerCase() === "alias") { 19611 optionData = dataoptions[p]; 19612 break; 19613 } 19614 } 19615 } 19616 19617 importOption("alias", optionData); 19618 19619 if (userOptions.alias) { 19620 resolveAlias(userOptions.alias, userOptions, opts); 19621 } 19622 19623 for (option in opts) { 19624 if (dataoptions) { 19625 optionData = undefined; 19626 19627 for (p in dataoptions) { 19628 if (p.toLowerCase() === option.toLowerCase()) { 19629 optionData = dataoptions[p]; 19630 break; 19631 } 19632 } 19633 } 19634 19635 importOption(option, optionData); 19636 } 19637 } 19638 19639 $.extend(true, opts, userOptions); 19640 19641 if (npt.dir === "rtl" || opts.rightAlign) { 19642 npt.style.textAlign = "right"; 19643 } 19644 19645 if (npt.dir === "rtl" || opts.numericInput) { 19646 npt.dir = "ltr"; 19647 npt.removeAttribute("dir"); 19648 opts.isRTL = true; 19649 } 19650 19651 return Object.keys(userOptions).length; 19652 } 19653 19654 if (typeof elems === "string") { 19655 elems = document.getElementById(elems) || document.querySelectorAll(elems); 19656 } 19657 19658 elems = elems.nodeName ? [elems] : elems; 19659 $.each(elems, function (ndx, el) { 19660 var scopedOpts = $.extend(true, {}, that.opts); 19661 19662 if (importAttributeOptions(el, scopedOpts, $.extend(true, {}, that.userOptions), that.dataAttribute)) { 19663 var maskset = generateMaskSet(scopedOpts, that.noMasksCache); 19664 19665 if (maskset !== undefined) { 19666 if (el.inputmask !== undefined) { 19667 el.inputmask.opts.autoUnmask = true; 19668 el.inputmask.remove(); 19669 } 19670 19671 el.inputmask = new Inputmask(undefined, undefined, true); 19672 el.inputmask.opts = scopedOpts; 19673 el.inputmask.noMasksCache = that.noMasksCache; 19674 el.inputmask.userOptions = $.extend(true, {}, that.userOptions); 19675 el.inputmask.isRTL = scopedOpts.isRTL || scopedOpts.numericInput; 19676 el.inputmask.el = el; 19677 el.inputmask.maskset = maskset; 19678 $.data(el, "_inputmask_opts", scopedOpts); 19679 maskScope.call(el.inputmask, { 19680 action: "mask" 19681 }); 19682 } 19683 } 19684 }); 19685 return elems && elems[0] ? elems[0].inputmask || this : this; 19686 }, 19687 option: function option(options, noremask) { 19688 if (typeof options === "string") { 19689 return this.opts[options]; 19690 } else if (_typeof(options) === "object") { 19691 $.extend(this.userOptions, options); 19692 19693 if (this.el && noremask !== true) { 19694 this.mask(this.el); 19695 } 19696 19697 return this; 19698 } 19699 }, 19700 unmaskedvalue: function unmaskedvalue(value) { 19701 this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache); 19702 return maskScope.call(this, { 19703 action: "unmaskedvalue", 19704 value: value 19705 }); 19706 }, 19707 remove: function remove() { 19708 return maskScope.call(this, { 19709 action: "remove" 19710 }); 19711 }, 19712 getemptymask: function getemptymask() { 19713 this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache); 19714 return maskScope.call(this, { 19715 action: "getemptymask" 19716 }); 19717 }, 19718 hasMaskedValue: function hasMaskedValue() { 19719 return !this.opts.autoUnmask; 19720 }, 19721 isComplete: function isComplete() { 19722 this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache); 19723 return maskScope.call(this, { 19724 action: "isComplete" 19725 }); 19726 }, 19727 getmetadata: function getmetadata() { 19728 this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache); 19729 return maskScope.call(this, { 19730 action: "getmetadata" 19731 }); 19732 }, 19733 isValid: function isValid(value) { 19734 this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache); 19735 return maskScope.call(this, { 19736 action: "isValid", 19737 value: value 19738 }); 19739 }, 19740 format: function format(value, metadata) { 19741 this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache); 19742 return maskScope.call(this, { 19743 action: "format", 19744 value: value, 19745 metadata: metadata 19746 }); 19747 }, 19748 setValue: function setValue(value) { 19749 if (this.el) { 19750 $(this.el).trigger("setvalue", [value]); 19751 } 19752 }, 19753 analyseMask: function analyseMask(mask, regexMask, opts) { 19754 var tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?(?:\|[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, 19755 regexTokenizer = /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, 19756 escaped = false, 19757 currentToken = new MaskToken(), 19758 match, 19759 m, 19760 openenings = [], 19761 maskTokens = [], 19762 openingToken, 19763 currentOpeningToken, 19764 alternator, 19765 lastMatch, 19766 groupToken; 19767 19768 function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) { 19769 this.matches = []; 19770 this.openGroup = isGroup || false; 19771 this.alternatorGroup = false; 19772 this.isGroup = isGroup || false; 19773 this.isOptional = isOptional || false; 19774 this.isQuantifier = isQuantifier || false; 19775 this.isAlternator = isAlternator || false; 19776 this.quantifier = { 19777 min: 1, 19778 max: 1 19779 }; 19780 } 19781 19782 function insertTestDefinition(mtoken, element, position) { 19783 position = position !== undefined ? position : mtoken.matches.length; 19784 var prevMatch = mtoken.matches[position - 1]; 19785 19786 if (regexMask) { 19787 if (element.indexOf("[") === 0 || escaped && /\\d|\\s|\\w]/i.test(element) || element === ".") { 19788 mtoken.matches.splice(position++, 0, { 19789 fn: new RegExp(element, opts.casing ? "i" : ""), 19790 optionality: false, 19791 newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== element, 19792 casing: null, 19793 def: element, 19794 placeholder: undefined, 19795 nativeDef: element 19796 }); 19797 } else { 19798 if (escaped) element = element[element.length - 1]; 19799 $.each(element.split(""), function (ndx, lmnt) { 19800 prevMatch = mtoken.matches[position - 1]; 19801 mtoken.matches.splice(position++, 0, { 19802 fn: null, 19803 optionality: false, 19804 newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== lmnt && prevMatch.fn !== null, 19805 casing: null, 19806 def: opts.staticDefinitionSymbol || lmnt, 19807 placeholder: opts.staticDefinitionSymbol !== undefined ? lmnt : undefined, 19808 nativeDef: (escaped ? "'" : "") + lmnt 19809 }); 19810 }); 19811 } 19812 19813 escaped = false; 19814 } else { 19815 var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element]; 19816 19817 if (maskdef && !escaped) { 19818 mtoken.matches.splice(position++, 0, { 19819 fn: maskdef.validator ? typeof maskdef.validator == "string" ? new RegExp(maskdef.validator, opts.casing ? "i" : "") : new function () { 19820 this.test = maskdef.validator; 19821 }() : new RegExp("."), 19822 optionality: false, 19823 newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== (maskdef.definitionSymbol || element), 19824 casing: maskdef.casing, 19825 def: maskdef.definitionSymbol || element, 19826 placeholder: maskdef.placeholder, 19827 nativeDef: element 19828 }); 19829 } else { 19830 mtoken.matches.splice(position++, 0, { 19831 fn: null, 19832 optionality: false, 19833 newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== element && prevMatch.fn !== null, 19834 casing: null, 19835 def: opts.staticDefinitionSymbol || element, 19836 placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined, 19837 nativeDef: (escaped ? "'" : "") + element 19838 }); 19839 escaped = false; 19840 } 19841 } 19842 } 19843 19844 function verifyGroupMarker(maskToken) { 19845 if (maskToken && maskToken.matches) { 19846 $.each(maskToken.matches, function (ndx, token) { 19847 var nextToken = maskToken.matches[ndx + 1]; 19848 19849 if ((nextToken === undefined || nextToken.matches === undefined || nextToken.isQuantifier === false) && token && token.isGroup) { 19850 token.isGroup = false; 19851 19852 if (!regexMask) { 19853 insertTestDefinition(token, opts.groupmarker[0], 0); 19854 19855 if (token.openGroup !== true) { 19856 insertTestDefinition(token, opts.groupmarker[1]); 19857 } 19858 } 19859 } 19860 19861 verifyGroupMarker(token); 19862 }); 19863 } 19864 } 19865 19866 function defaultCase() { 19867 if (openenings.length > 0) { 19868 currentOpeningToken = openenings[openenings.length - 1]; 19869 insertTestDefinition(currentOpeningToken, m); 19870 19871 if (currentOpeningToken.isAlternator) { 19872 alternator = openenings.pop(); 19873 19874 for (var mndx = 0; mndx < alternator.matches.length; mndx++) { 19875 if (alternator.matches[mndx].isGroup) alternator.matches[mndx].isGroup = false; 19876 } 19877 19878 if (openenings.length > 0) { 19879 currentOpeningToken = openenings[openenings.length - 1]; 19880 currentOpeningToken.matches.push(alternator); 19881 } else { 19882 currentToken.matches.push(alternator); 19883 } 19884 } 19885 } else { 19886 insertTestDefinition(currentToken, m); 19887 } 19888 } 19889 19890 function reverseTokens(maskToken) { 19891 function reverseStatic(st) { 19892 if (st === opts.optionalmarker[0]) st = opts.optionalmarker[1];else if (st === opts.optionalmarker[1]) st = opts.optionalmarker[0];else if (st === opts.groupmarker[0]) st = opts.groupmarker[1];else if (st === opts.groupmarker[1]) st = opts.groupmarker[0]; 19893 return st; 19894 } 19895 19896 maskToken.matches = maskToken.matches.reverse(); 19897 19898 for (var match in maskToken.matches) { 19899 if (maskToken.matches.hasOwnProperty(match)) { 19900 var intMatch = parseInt(match); 19901 19902 if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) { 19903 var qt = maskToken.matches[match]; 19904 maskToken.matches.splice(match, 1); 19905 maskToken.matches.splice(intMatch + 1, 0, qt); 19906 } 19907 19908 if (maskToken.matches[match].matches !== undefined) { 19909 maskToken.matches[match] = reverseTokens(maskToken.matches[match]); 19910 } else { 19911 maskToken.matches[match] = reverseStatic(maskToken.matches[match]); 19912 } 19913 } 19914 } 19915 19916 return maskToken; 19917 } 19918 19919 function groupify(matches) { 19920 var groupToken = new MaskToken(true); 19921 groupToken.openGroup = false; 19922 groupToken.matches = matches; 19923 return groupToken; 19924 } 19925 19926 if (regexMask) { 19927 opts.optionalmarker[0] = undefined; 19928 opts.optionalmarker[1] = undefined; 19929 } 19930 19931 while (match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask)) { 19932 m = match[0]; 19933 19934 if (regexMask) { 19935 switch (m.charAt(0)) { 19936 case "?": 19937 m = "{0,1}"; 19938 break; 19939 19940 case "+": 19941 case "*": 19942 m = "{" + m + "}"; 19943 break; 19944 } 19945 } 19946 19947 if (escaped) { 19948 defaultCase(); 19949 continue; 19950 } 19951 19952 switch (m.charAt(0)) { 19953 case "(?=": 19954 break; 19955 19956 case "(?!": 19957 break; 19958 19959 case "(?<=": 19960 break; 19961 19962 case "(?<!": 19963 break; 19964 19965 case opts.escapeChar: 19966 escaped = true; 19967 19968 if (regexMask) { 19969 defaultCase(); 19970 } 19971 19972 break; 19973 19974 case opts.optionalmarker[1]: 19975 case opts.groupmarker[1]: 19976 openingToken = openenings.pop(); 19977 openingToken.openGroup = false; 19978 19979 if (openingToken !== undefined) { 19980 if (openenings.length > 0) { 19981 currentOpeningToken = openenings[openenings.length - 1]; 19982 currentOpeningToken.matches.push(openingToken); 19983 19984 if (currentOpeningToken.isAlternator) { 19985 alternator = openenings.pop(); 19986 19987 for (var mndx = 0; mndx < alternator.matches.length; mndx++) { 19988 alternator.matches[mndx].isGroup = false; 19989 alternator.matches[mndx].alternatorGroup = false; 19990 } 19991 19992 if (openenings.length > 0) { 19993 currentOpeningToken = openenings[openenings.length - 1]; 19994 currentOpeningToken.matches.push(alternator); 19995 } else { 19996 currentToken.matches.push(alternator); 19997 } 19998 } 19999 } else { 20000 currentToken.matches.push(openingToken); 20001 } 20002 } else defaultCase(); 20003 20004 break; 20005 20006 case opts.optionalmarker[0]: 20007 openenings.push(new MaskToken(false, true)); 20008 break; 20009 20010 case opts.groupmarker[0]: 20011 openenings.push(new MaskToken(true)); 20012 break; 20013 20014 case opts.quantifiermarker[0]: 20015 var quantifier = new MaskToken(false, false, true); 20016 m = m.replace(/[{}]/g, ""); 20017 var mqj = m.split("|"), 20018 mq = mqj[0].split(","), 20019 mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), 20020 mq1 = mq.length === 1 ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); 20021 20022 if (mq0 === "*" || mq0 === "+") { 20023 mq0 = mq1 === "*" ? 0 : 1; 20024 } 20025 20026 quantifier.quantifier = { 20027 min: mq0, 20028 max: mq1, 20029 jit: mqj[1] 20030 }; 20031 var matches = openenings.length > 0 ? openenings[openenings.length - 1].matches : currentToken.matches; 20032 match = matches.pop(); 20033 20034 if (match.isAlternator) { 20035 matches.push(match); 20036 matches = match.matches; 20037 var groupToken = new MaskToken(true); 20038 var tmpMatch = matches.pop(); 20039 matches.push(groupToken); 20040 matches = groupToken.matches; 20041 match = tmpMatch; 20042 } 20043 20044 if (!match.isGroup) { 20045 match = groupify([match]); 20046 } 20047 20048 matches.push(match); 20049 matches.push(quantifier); 20050 break; 20051 20052 case opts.alternatormarker: 20053 var groupQuantifier = function groupQuantifier(matches) { 20054 var lastMatch = matches.pop(); 20055 20056 if (lastMatch.isQuantifier) { 20057 lastMatch = groupify([matches.pop(), lastMatch]); 20058 } 20059 20060 return lastMatch; 20061 }; 20062 20063 if (openenings.length > 0) { 20064 currentOpeningToken = openenings[openenings.length - 1]; 20065 var subToken = currentOpeningToken.matches[currentOpeningToken.matches.length - 1]; 20066 20067 if (currentOpeningToken.openGroup && (subToken.matches === undefined || subToken.isGroup === false && subToken.isAlternator === false)) { 20068 lastMatch = openenings.pop(); 20069 } else { 20070 lastMatch = groupQuantifier(currentOpeningToken.matches); 20071 } 20072 } else { 20073 lastMatch = groupQuantifier(currentToken.matches); 20074 } 20075 20076 if (lastMatch.isAlternator) { 20077 openenings.push(lastMatch); 20078 } else { 20079 if (lastMatch.alternatorGroup) { 20080 alternator = openenings.pop(); 20081 lastMatch.alternatorGroup = false; 20082 } else { 20083 alternator = new MaskToken(false, false, false, true); 20084 } 20085 20086 alternator.matches.push(lastMatch); 20087 openenings.push(alternator); 20088 20089 if (lastMatch.openGroup) { 20090 lastMatch.openGroup = false; 20091 var alternatorGroup = new MaskToken(true); 20092 alternatorGroup.alternatorGroup = true; 20093 openenings.push(alternatorGroup); 20094 } 20095 } 20096 20097 break; 20098 20099 default: 20100 defaultCase(); 20101 } 20102 } 20103 20104 while (openenings.length > 0) { 20105 openingToken = openenings.pop(); 20106 currentToken.matches.push(openingToken); 20107 } 20108 20109 if (currentToken.matches.length > 0) { 20110 verifyGroupMarker(currentToken); 20111 maskTokens.push(currentToken); 20112 } 20113 20114 if (opts.numericInput || opts.isRTL) { 20115 reverseTokens(maskTokens[0]); 20116 } 20117 20118 return maskTokens; 20119 } 20120 }; 20121 20122 Inputmask.extendDefaults = function (options) { 20123 $.extend(true, Inputmask.prototype.defaults, options); 20124 }; 20125 20126 Inputmask.extendDefinitions = function (definition) { 20127 $.extend(true, Inputmask.prototype.definitions, definition); 20128 }; 20129 20130 Inputmask.extendAliases = function (alias) { 20131 $.extend(true, Inputmask.prototype.aliases, alias); 20132 }; 20133 20134 Inputmask.format = function (value, options, metadata) { 20135 return Inputmask(options).format(value, metadata); 20136 }; 20137 20138 Inputmask.unmask = function (value, options) { 20139 return Inputmask(options).unmaskedvalue(value); 20140 }; 20141 20142 Inputmask.isValid = function (value, options) { 20143 return Inputmask(options).isValid(value); 20144 }; 20145 20146 Inputmask.remove = function (elems) { 20147 if (typeof elems === "string") { 20148 elems = document.getElementById(elems) || document.querySelectorAll(elems); 20149 } 20150 20151 elems = elems.nodeName ? [elems] : elems; 20152 $.each(elems, function (ndx, el) { 20153 if (el.inputmask) el.inputmask.remove(); 20154 }); 20155 }; 20156 20157 Inputmask.setValue = function (elems, value) { 20158 if (typeof elems === "string") { 20159 elems = document.getElementById(elems) || document.querySelectorAll(elems); 20160 } 20161 20162 elems = elems.nodeName ? [elems] : elems; 20163 $.each(elems, function (ndx, el) { 20164 if (el.inputmask) el.inputmask.setValue(value);else $(el).trigger("setvalue", [value]); 20165 }); 20166 }; 20167 20168 Inputmask.escapeRegex = function (str) { 20169 var specials = ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^"]; 20170 return str.replace(new RegExp("(\\" + specials.join("|\\") + ")", "gim"), "\\$1"); 20171 }; 20172 20173 Inputmask.keyCode = { 20174 BACKSPACE: 8, 20175 BACKSPACE_SAFARI: 127, 20176 DELETE: 46, 20177 DOWN: 40, 20178 END: 35, 20179 ENTER: 13, 20180 ESCAPE: 27, 20181 HOME: 36, 20182 INSERT: 45, 20183 LEFT: 37, 20184 PAGE_DOWN: 34, 20185 PAGE_UP: 33, 20186 RIGHT: 39, 20187 SPACE: 32, 20188 TAB: 9, 20189 UP: 38, 20190 X: 88, 20191 CONTROL: 17 20192 }; 20193 Inputmask.dependencyLib = $; 20194 20195 function resolveAlias(aliasStr, options, opts) { 20196 var aliasDefinition = Inputmask.prototype.aliases[aliasStr]; 20197 20198 if (aliasDefinition) { 20199 if (aliasDefinition.alias) resolveAlias(aliasDefinition.alias, undefined, opts); 20200 $.extend(true, opts, aliasDefinition); 20201 $.extend(true, opts, options); 20202 return true; 20203 } else if (opts.mask === null) { 20204 opts.mask = aliasStr; 20205 } 20206 20207 return false; 20208 } 20209 20210 function generateMaskSet(opts, nocache) { 20211 function generateMask(mask, metadata, opts) { 20212 var regexMask = false; 20213 20214 if (mask === null || mask === "") { 20215 regexMask = opts.regex !== null; 20216 20217 if (regexMask) { 20218 mask = opts.regex; 20219 mask = mask.replace(/^(\^)(.*)(\$)$/, "$2"); 20220 } else { 20221 regexMask = true; 20222 mask = ".*"; 20223 } 20224 } 20225 20226 if (mask.length === 1 && opts.greedy === false && opts.repeat !== 0) { 20227 opts.placeholder = ""; 20228 } 20229 20230 if (opts.repeat > 0 || opts.repeat === "*" || opts.repeat === "+") { 20231 var repeatStart = opts.repeat === "*" ? 0 : opts.repeat === "+" ? 1 : opts.repeat; 20232 mask = opts.groupmarker[0] + mask + opts.groupmarker[1] + opts.quantifiermarker[0] + repeatStart + "," + opts.repeat + opts.quantifiermarker[1]; 20233 } 20234 20235 var masksetDefinition, 20236 maskdefKey = regexMask ? "regex_" + opts.regex : opts.numericInput ? mask.split("").reverse().join("") : mask; 20237 20238 if (Inputmask.prototype.masksCache[maskdefKey] === undefined || nocache === true) { 20239 masksetDefinition = { 20240 mask: mask, 20241 maskToken: Inputmask.prototype.analyseMask(mask, regexMask, opts), 20242 validPositions: {}, 20243 _buffer: undefined, 20244 buffer: undefined, 20245 tests: {}, 20246 excludes: {}, 20247 metadata: metadata, 20248 maskLength: undefined, 20249 jitOffset: {} 20250 }; 20251 20252 if (nocache !== true) { 20253 Inputmask.prototype.masksCache[maskdefKey] = masksetDefinition; 20254 masksetDefinition = $.extend(true, {}, Inputmask.prototype.masksCache[maskdefKey]); 20255 } 20256 } else masksetDefinition = $.extend(true, {}, Inputmask.prototype.masksCache[maskdefKey]); 20257 20258 return masksetDefinition; 20259 } 20260 20261 var ms; 20262 20263 if ($.isFunction(opts.mask)) { 20264 opts.mask = opts.mask(opts); 20265 } 20266 20267 if ($.isArray(opts.mask)) { 20268 if (opts.mask.length > 1) { 20269 if (opts.keepStatic === null) { 20270 opts.keepStatic = "auto"; 20271 20272 for (var i = 0; i < opts.mask.length; i++) { 20273 if (opts.mask[i].charAt(0) !== opts.mask[0].charAt(0)) { 20274 opts.keepStatic = true; 20275 break; 20276 } 20277 } 20278 } 20279 20280 var altMask = opts.groupmarker[0]; 20281 $.each(opts.isRTL ? opts.mask.reverse() : opts.mask, function (ndx, msk) { 20282 if (altMask.length > 1) { 20283 altMask += opts.groupmarker[1] + opts.alternatormarker + opts.groupmarker[0]; 20284 } 20285 20286 if (msk.mask !== undefined && !$.isFunction(msk.mask)) { 20287 altMask += msk.mask; 20288 } else { 20289 altMask += msk; 20290 } 20291 }); 20292 altMask += opts.groupmarker[1]; 20293 return generateMask(altMask, opts.mask, opts); 20294 } else opts.mask = opts.mask.pop(); 20295 } 20296 20297 if (opts.mask && opts.mask.mask !== undefined && !$.isFunction(opts.mask.mask)) { 20298 ms = generateMask(opts.mask.mask, opts.mask, opts); 20299 } else { 20300 ms = generateMask(opts.mask, opts.mask, opts); 20301 } 20302 20303 return ms; 20304 } 20305 20306 function isInputEventSupported(eventName) { 20307 var el = document.createElement("input"), 20308 evName = "on" + eventName, 20309 isSupported = evName in el; 20310 20311 if (!isSupported) { 20312 el.setAttribute(evName, "return;"); 20313 isSupported = typeof el[evName] === "function"; 20314 } 20315 20316 el = null; 20317 return isSupported; 20318 } 20319 20320 function maskScope(actionObj, maskset, opts) { 20321 maskset = maskset || this.maskset; 20322 opts = opts || this.opts; 20323 var inputmask = this, 20324 el = this.el, 20325 isRTL = this.isRTL, 20326 undoValue, 20327 $el, 20328 skipKeyPressEvent = false, 20329 skipInputEvent = false, 20330 ignorable = false, 20331 maxLength, 20332 mouseEnter = false, 20333 colorMask, 20334 originalPlaceholder; 20335 20336 function getMaskTemplate(baseOnInput, minimalPos, includeMode, noJit, clearOptionalTail) { 20337 var greedy = opts.greedy; 20338 if (clearOptionalTail) opts.greedy = false; 20339 minimalPos = minimalPos || 0; 20340 var maskTemplate = [], 20341 ndxIntlzr, 20342 pos = 0, 20343 test, 20344 testPos, 20345 lvp = getLastValidPosition(); 20346 20347 do { 20348 if (baseOnInput === true && getMaskSet().validPositions[pos]) { 20349 testPos = clearOptionalTail && getMaskSet().validPositions[pos].match.optionality === true && getMaskSet().validPositions[pos + 1] === undefined && (getMaskSet().validPositions[pos].generatedInput === true || getMaskSet().validPositions[pos].input == opts.skipOptionalPartCharacter && pos > 0) ? determineTestTemplate(pos, getTests(pos, ndxIntlzr, pos - 1)) : getMaskSet().validPositions[pos]; 20350 test = testPos.match; 20351 ndxIntlzr = testPos.locator.slice(); 20352 maskTemplate.push(includeMode === true ? testPos.input : includeMode === false ? test.nativeDef : getPlaceholder(pos, test)); 20353 } else { 20354 testPos = getTestTemplate(pos, ndxIntlzr, pos - 1); 20355 test = testPos.match; 20356 ndxIntlzr = testPos.locator.slice(); 20357 var jitMasking = noJit === true ? false : opts.jitMasking !== false ? opts.jitMasking : test.jit; 20358 20359 if (jitMasking === false || jitMasking === undefined || typeof jitMasking === "number" && isFinite(jitMasking) && jitMasking > pos) { 20360 maskTemplate.push(includeMode === false ? test.nativeDef : getPlaceholder(pos, test)); 20361 } 20362 } 20363 20364 if (opts.keepStatic === "auto") { 20365 if (test.newBlockMarker && test.fn !== null) { 20366 opts.keepStatic = pos - 1; 20367 } 20368 } 20369 20370 pos++; 20371 } while ((maxLength === undefined || pos < maxLength) && (test.fn !== null || test.def !== "") || minimalPos > pos); 20372 20373 if (maskTemplate[maskTemplate.length - 1] === "") { 20374 maskTemplate.pop(); 20375 } 20376 20377 if (includeMode !== false || getMaskSet().maskLength === undefined) getMaskSet().maskLength = pos - 1; 20378 opts.greedy = greedy; 20379 return maskTemplate; 20380 } 20381 20382 function getMaskSet() { 20383 return maskset; 20384 } 20385 20386 function resetMaskSet(soft) { 20387 var maskset = getMaskSet(); 20388 maskset.buffer = undefined; 20389 20390 if (soft !== true) { 20391 maskset.validPositions = {}; 20392 maskset.p = 0; 20393 } 20394 } 20395 20396 function getLastValidPosition(closestTo, strict, validPositions) { 20397 var before = -1, 20398 after = -1, 20399 valids = validPositions || getMaskSet().validPositions; 20400 if (closestTo === undefined) closestTo = -1; 20401 20402 for (var posNdx in valids) { 20403 var psNdx = parseInt(posNdx); 20404 20405 if (valids[psNdx] && (strict || valids[psNdx].generatedInput !== true)) { 20406 if (psNdx <= closestTo) before = psNdx; 20407 if (psNdx >= closestTo) after = psNdx; 20408 } 20409 } 20410 20411 return before === -1 || before == closestTo ? after : after == -1 ? before : closestTo - before < after - closestTo ? before : after; 20412 } 20413 20414 function getDecisionTaker(tst) { 20415 var decisionTaker = tst.locator[tst.alternation]; 20416 20417 if (typeof decisionTaker == "string" && decisionTaker.length > 0) { 20418 decisionTaker = decisionTaker.split(",")[0]; 20419 } 20420 20421 return decisionTaker !== undefined ? decisionTaker.toString() : ""; 20422 } 20423 20424 function getLocator(tst, align) { 20425 var locator = (tst.alternation != undefined ? tst.mloc[getDecisionTaker(tst)] : tst.locator).join(""); 20426 if (locator !== "") while (locator.length < align) { 20427 locator += "0"; 20428 } 20429 return locator; 20430 } 20431 20432 function determineTestTemplate(pos, tests) { 20433 pos = pos > 0 ? pos - 1 : 0; 20434 var altTest = getTest(pos), 20435 targetLocator = getLocator(altTest), 20436 tstLocator, 20437 closest, 20438 bestMatch; 20439 20440 for (var ndx = 0; ndx < tests.length; ndx++) { 20441 var tst = tests[ndx]; 20442 tstLocator = getLocator(tst, targetLocator.length); 20443 var distance = Math.abs(tstLocator - targetLocator); 20444 20445 if (closest === undefined || tstLocator !== "" && distance < closest || bestMatch && !opts.greedy && bestMatch.match.optionality && bestMatch.match.newBlockMarker === "master" && (!tst.match.optionality || !tst.match.newBlockMarker) || bestMatch && bestMatch.match.optionalQuantifier && !tst.match.optionalQuantifier) { 20446 closest = distance; 20447 bestMatch = tst; 20448 } 20449 } 20450 20451 return bestMatch; 20452 } 20453 20454 function getTestTemplate(pos, ndxIntlzr, tstPs) { 20455 return getMaskSet().validPositions[pos] || determineTestTemplate(pos, getTests(pos, ndxIntlzr ? ndxIntlzr.slice() : ndxIntlzr, tstPs)); 20456 } 20457 20458 function getTest(pos, tests) { 20459 if (getMaskSet().validPositions[pos]) { 20460 return getMaskSet().validPositions[pos]; 20461 } 20462 20463 return (tests || getTests(pos))[0]; 20464 } 20465 20466 function positionCanMatchDefinition(pos, def) { 20467 var valid = false, 20468 tests = getTests(pos); 20469 20470 for (var tndx = 0; tndx < tests.length; tndx++) { 20471 if (tests[tndx].match && tests[tndx].match.def === def) { 20472 valid = true; 20473 break; 20474 } 20475 } 20476 20477 return valid; 20478 } 20479 20480 function getTests(pos, ndxIntlzr, tstPs) { 20481 var maskTokens = getMaskSet().maskToken, 20482 testPos = ndxIntlzr ? tstPs : 0, 20483 ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [0], 20484 matches = [], 20485 insertStop = false, 20486 latestMatch, 20487 cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : ""; 20488 20489 function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) { 20490 function handleMatch(match, loopNdx, quantifierRecurse) { 20491 function isFirstMatch(latestMatch, tokenGroup) { 20492 var firstMatch = $.inArray(latestMatch, tokenGroup.matches) === 0; 20493 20494 if (!firstMatch) { 20495 $.each(tokenGroup.matches, function (ndx, match) { 20496 if (match.isQuantifier === true) firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1]);else if (match.hasOwnProperty("matches")) firstMatch = isFirstMatch(latestMatch, match); 20497 if (firstMatch) return false; 20498 }); 20499 } 20500 20501 return firstMatch; 20502 } 20503 20504 function resolveNdxInitializer(pos, alternateNdx, targetAlternation) { 20505 var bestMatch, indexPos; 20506 20507 if (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) { 20508 $.each(getMaskSet().tests[pos] || [getMaskSet().validPositions[pos]], function (ndx, lmnt) { 20509 if (lmnt.mloc[alternateNdx]) { 20510 bestMatch = lmnt; 20511 return false; 20512 } 20513 20514 var alternation = targetAlternation !== undefined ? targetAlternation : lmnt.alternation, 20515 ndxPos = lmnt.locator[alternation] !== undefined ? lmnt.locator[alternation].toString().indexOf(alternateNdx) : -1; 20516 20517 if ((indexPos === undefined || ndxPos < indexPos) && ndxPos !== -1) { 20518 bestMatch = lmnt; 20519 indexPos = ndxPos; 20520 } 20521 }); 20522 } 20523 20524 if (bestMatch) { 20525 var bestMatchAltIndex = bestMatch.locator[bestMatch.alternation]; 20526 var locator = bestMatch.mloc[alternateNdx] || bestMatch.mloc[bestMatchAltIndex] || bestMatch.locator; 20527 return locator.slice((targetAlternation !== undefined ? targetAlternation : bestMatch.alternation) + 1); 20528 } else { 20529 return targetAlternation !== undefined ? resolveNdxInitializer(pos, alternateNdx) : undefined; 20530 } 20531 } 20532 20533 function isSubsetOf(source, target) { 20534 function expand(pattern) { 20535 var expanded = [], 20536 start, 20537 end; 20538 20539 for (var i = 0, l = pattern.length; i < l; i++) { 20540 if (pattern.charAt(i) === "-") { 20541 end = pattern.charCodeAt(i + 1); 20542 20543 while (++start < end) { 20544 expanded.push(String.fromCharCode(start)); 20545 } 20546 } else { 20547 start = pattern.charCodeAt(i); 20548 expanded.push(pattern.charAt(i)); 20549 } 20550 } 20551 20552 return expanded.join(""); 20553 } 20554 20555 if (opts.regex && source.match.fn !== null && target.match.fn !== null) { 20556 return expand(target.match.def.replace(/[\[\]]/g, "")).indexOf(expand(source.match.def.replace(/[\[\]]/g, ""))) !== -1; 20557 } 20558 20559 return source.match.def === target.match.nativeDef; 20560 } 20561 20562 function staticCanMatchDefinition(source, target) { 20563 var sloc = source.locator.slice(source.alternation).join(""), 20564 tloc = target.locator.slice(target.alternation).join(""), 20565 canMatch = sloc == tloc; 20566 canMatch = canMatch && source.match.fn === null && target.match.fn !== null ? target.match.fn.test(source.match.def, getMaskSet(), pos, false, opts, false) : false; 20567 return canMatch; 20568 } 20569 20570 function setMergeLocators(targetMatch, altMatch) { 20571 if (altMatch === undefined || targetMatch.alternation === altMatch.alternation && targetMatch.locator[targetMatch.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1) { 20572 targetMatch.mloc = targetMatch.mloc || {}; 20573 var locNdx = targetMatch.locator[targetMatch.alternation]; 20574 if (locNdx === undefined) targetMatch.alternation = undefined;else { 20575 if (typeof locNdx === "string") locNdx = locNdx.split(",")[0]; 20576 if (targetMatch.mloc[locNdx] === undefined) targetMatch.mloc[locNdx] = targetMatch.locator.slice(); 20577 20578 if (altMatch !== undefined) { 20579 for (var ndx in altMatch.mloc) { 20580 if (typeof ndx === "string") ndx = ndx.split(",")[0]; 20581 if (targetMatch.mloc[ndx] === undefined) targetMatch.mloc[ndx] = altMatch.mloc[ndx]; 20582 } 20583 20584 targetMatch.locator[targetMatch.alternation] = Object.keys(targetMatch.mloc).join(","); 20585 } 20586 20587 return true; 20588 } 20589 } 20590 20591 return false; 20592 } 20593 20594 if (testPos > 500 && quantifierRecurse !== undefined) { 20595 throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask; 20596 } 20597 20598 if (testPos === pos && match.matches === undefined) { 20599 matches.push({ 20600 match: match, 20601 locator: loopNdx.reverse(), 20602 cd: cacheDependency, 20603 mloc: {} 20604 }); 20605 return true; 20606 } else if (match.matches !== undefined) { 20607 if (match.isGroup && quantifierRecurse !== match) { 20608 match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx, quantifierRecurse); 20609 if (match) return true; 20610 } else if (match.isOptional) { 20611 var optionalToken = match; 20612 match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse); 20613 20614 if (match) { 20615 $.each(matches, function (ndx, mtch) { 20616 mtch.match.optionality = true; 20617 }); 20618 latestMatch = matches[matches.length - 1].match; 20619 20620 if (quantifierRecurse === undefined && isFirstMatch(latestMatch, optionalToken)) { 20621 insertStop = true; 20622 testPos = pos; 20623 } else return true; 20624 } 20625 } else if (match.isAlternator) { 20626 var alternateToken = match, 20627 malternateMatches = [], 20628 maltMatches, 20629 currentMatches = matches.slice(), 20630 loopNdxCnt = loopNdx.length; 20631 var altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1; 20632 20633 if (altIndex === -1 || typeof altIndex === "string") { 20634 var currentPos = testPos, 20635 ndxInitializerClone = ndxInitializer.slice(), 20636 altIndexArr = [], 20637 amndx; 20638 20639 if (typeof altIndex == "string") { 20640 altIndexArr = altIndex.split(","); 20641 } else { 20642 for (amndx = 0; amndx < alternateToken.matches.length; amndx++) { 20643 altIndexArr.push(amndx.toString()); 20644 } 20645 } 20646 20647 if (getMaskSet().excludes[pos]) { 20648 var altIndexArrClone = altIndexArr.slice(); 20649 20650 for (var i = 0, el = getMaskSet().excludes[pos].length; i < el; i++) { 20651 altIndexArr.splice(altIndexArr.indexOf(getMaskSet().excludes[pos][i].toString()), 1); 20652 } 20653 20654 if (altIndexArr.length === 0) { 20655 getMaskSet().excludes[pos] = undefined; 20656 altIndexArr = altIndexArrClone; 20657 } 20658 } 20659 20660 if (opts.keepStatic === true || isFinite(parseInt(opts.keepStatic)) && currentPos >= opts.keepStatic) altIndexArr = altIndexArr.slice(0, 1); 20661 var unMatchedAlternation = false; 20662 20663 for (var ndx = 0; ndx < altIndexArr.length; ndx++) { 20664 amndx = parseInt(altIndexArr[ndx]); 20665 matches = []; 20666 ndxInitializer = typeof altIndex === "string" ? resolveNdxInitializer(testPos, amndx, loopNdxCnt) || ndxInitializerClone.slice() : ndxInitializerClone.slice(); 20667 if (alternateToken.matches[amndx] && handleMatch(alternateToken.matches[amndx], [amndx].concat(loopNdx), quantifierRecurse)) match = true;else if (ndx === 0) { 20668 unMatchedAlternation = true; 20669 } 20670 maltMatches = matches.slice(); 20671 testPos = currentPos; 20672 matches = []; 20673 20674 for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) { 20675 var altMatch = maltMatches[ndx1], 20676 dropMatch = false; 20677 altMatch.match.jit = altMatch.match.jit || unMatchedAlternation; 20678 altMatch.alternation = altMatch.alternation || loopNdxCnt; 20679 setMergeLocators(altMatch); 20680 20681 for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) { 20682 var altMatch2 = malternateMatches[ndx2]; 20683 20684 if (typeof altIndex !== "string" || altMatch.alternation !== undefined && $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) { 20685 if (altMatch.match.nativeDef === altMatch2.match.nativeDef) { 20686 dropMatch = true; 20687 setMergeLocators(altMatch2, altMatch); 20688 break; 20689 } else if (isSubsetOf(altMatch, altMatch2)) { 20690 if (setMergeLocators(altMatch, altMatch2)) { 20691 dropMatch = true; 20692 malternateMatches.splice(malternateMatches.indexOf(altMatch2), 0, altMatch); 20693 } 20694 20695 break; 20696 } else if (isSubsetOf(altMatch2, altMatch)) { 20697 setMergeLocators(altMatch2, altMatch); 20698 break; 20699 } else if (staticCanMatchDefinition(altMatch, altMatch2)) { 20700 if (setMergeLocators(altMatch, altMatch2)) { 20701 dropMatch = true; 20702 malternateMatches.splice(malternateMatches.indexOf(altMatch2), 0, altMatch); 20703 } 20704 20705 break; 20706 } 20707 } 20708 } 20709 20710 if (!dropMatch) { 20711 malternateMatches.push(altMatch); 20712 } 20713 } 20714 } 20715 20716 matches = currentMatches.concat(malternateMatches); 20717 testPos = pos; 20718 insertStop = matches.length > 0; 20719 match = malternateMatches.length > 0; 20720 ndxInitializer = ndxInitializerClone.slice(); 20721 } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [altIndex].concat(loopNdx), quantifierRecurse); 20722 20723 if (match) return true; 20724 } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) { 20725 var qt = match; 20726 20727 for (var qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && testPos <= pos; qndx++) { 20728 var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1]; 20729 match = handleMatch(tokenGroup, [qndx].concat(loopNdx), tokenGroup); 20730 20731 if (match) { 20732 latestMatch = matches[matches.length - 1].match; 20733 latestMatch.optionalQuantifier = qndx >= qt.quantifier.min; 20734 latestMatch.jit = (qndx || 1) * tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit; 20735 20736 if (latestMatch.optionalQuantifier && isFirstMatch(latestMatch, tokenGroup)) { 20737 insertStop = true; 20738 testPos = pos; 20739 break; 20740 } 20741 20742 if (latestMatch.jit) { 20743 getMaskSet().jitOffset[pos] = tokenGroup.matches.indexOf(latestMatch); 20744 } 20745 20746 return true; 20747 } 20748 } 20749 } else { 20750 match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse); 20751 if (match) return true; 20752 } 20753 } else { 20754 testPos++; 20755 } 20756 } 20757 20758 for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) { 20759 if (maskToken.matches[tndx].isQuantifier !== true) { 20760 var match = handleMatch(maskToken.matches[tndx], [tndx].concat(loopNdx), quantifierRecurse); 20761 20762 if (match && testPos === pos) { 20763 return match; 20764 } else if (testPos > pos) { 20765 break; 20766 } 20767 } 20768 } 20769 } 20770 20771 function mergeLocators(pos, tests) { 20772 var locator = []; 20773 if (!$.isArray(tests)) tests = [tests]; 20774 20775 if (tests.length > 0) { 20776 if (tests[0].alternation === undefined) { 20777 locator = determineTestTemplate(pos, tests.slice()).locator.slice(); 20778 if (locator.length === 0) locator = tests[0].locator.slice(); 20779 } else { 20780 $.each(tests, function (ndx, tst) { 20781 if (tst.def !== "") { 20782 if (locator.length === 0) locator = tst.locator.slice();else { 20783 for (var i = 0; i < locator.length; i++) { 20784 if (tst.locator[i] && locator[i].toString().indexOf(tst.locator[i]) === -1) { 20785 locator[i] += "," + tst.locator[i]; 20786 } 20787 } 20788 } 20789 } 20790 }); 20791 } 20792 } 20793 20794 return locator; 20795 } 20796 20797 if (pos > -1) { 20798 if (ndxIntlzr === undefined) { 20799 var previousPos = pos - 1, 20800 test; 20801 20802 while ((test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) === undefined && previousPos > -1) { 20803 previousPos--; 20804 } 20805 20806 if (test !== undefined && previousPos > -1) { 20807 ndxInitializer = mergeLocators(previousPos, test); 20808 cacheDependency = ndxInitializer.join(""); 20809 testPos = previousPos; 20810 } 20811 } 20812 20813 if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) { 20814 return getMaskSet().tests[pos]; 20815 } 20816 20817 for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length; mtndx++) { 20818 var match = resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [mtndx]); 20819 20820 if (match && testPos === pos || testPos > pos) { 20821 break; 20822 } 20823 } 20824 } 20825 20826 if (matches.length === 0 || insertStop) { 20827 matches.push({ 20828 match: { 20829 fn: null, 20830 optionality: false, 20831 casing: null, 20832 def: "", 20833 placeholder: "" 20834 }, 20835 locator: [], 20836 mloc: {}, 20837 cd: cacheDependency 20838 }); 20839 } 20840 20841 if (ndxIntlzr !== undefined && getMaskSet().tests[pos]) { 20842 return $.extend(true, [], matches); 20843 } 20844 20845 getMaskSet().tests[pos] = $.extend(true, [], matches); 20846 return getMaskSet().tests[pos]; 20847 } 20848 20849 function getBufferTemplate() { 20850 if (getMaskSet()._buffer === undefined) { 20851 getMaskSet()._buffer = getMaskTemplate(false, 1); 20852 if (getMaskSet().buffer === undefined) getMaskSet().buffer = getMaskSet()._buffer.slice(); 20853 } 20854 20855 return getMaskSet()._buffer; 20856 } 20857 20858 function getBuffer(noCache) { 20859 if (getMaskSet().buffer === undefined || noCache === true) { 20860 getMaskSet().buffer = getMaskTemplate(true, getLastValidPosition(), true); 20861 if (getMaskSet()._buffer === undefined) getMaskSet()._buffer = getMaskSet().buffer.slice(); 20862 } 20863 20864 return getMaskSet().buffer; 20865 } 20866 20867 function refreshFromBuffer(start, end, buffer) { 20868 var i, p; 20869 20870 if (start === true) { 20871 resetMaskSet(); 20872 start = 0; 20873 end = buffer.length; 20874 } else { 20875 for (i = start; i < end; i++) { 20876 delete getMaskSet().validPositions[i]; 20877 } 20878 } 20879 20880 p = start; 20881 20882 for (i = start; i < end; i++) { 20883 resetMaskSet(true); 20884 20885 if (buffer[i] !== opts.skipOptionalPartCharacter) { 20886 var valResult = isValid(p, buffer[i], true, true); 20887 20888 if (valResult !== false) { 20889 resetMaskSet(true); 20890 p = valResult.caret !== undefined ? valResult.caret : valResult.pos + 1; 20891 } 20892 } 20893 } 20894 } 20895 20896 function casing(elem, test, pos) { 20897 switch (opts.casing || test.casing) { 20898 case "upper": 20899 elem = elem.toUpperCase(); 20900 break; 20901 20902 case "lower": 20903 elem = elem.toLowerCase(); 20904 break; 20905 20906 case "title": 20907 var posBefore = getMaskSet().validPositions[pos - 1]; 20908 20909 if (pos === 0 || posBefore && posBefore.input === String.fromCharCode(Inputmask.keyCode.SPACE)) { 20910 elem = elem.toUpperCase(); 20911 } else { 20912 elem = elem.toLowerCase(); 20913 } 20914 20915 break; 20916 20917 default: 20918 if ($.isFunction(opts.casing)) { 20919 var args = Array.prototype.slice.call(arguments); 20920 args.push(getMaskSet().validPositions); 20921 elem = opts.casing.apply(this, args); 20922 } 20923 20924 } 20925 20926 return elem; 20927 } 20928 20929 function checkAlternationMatch(altArr1, altArr2, na) { 20930 var altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), 20931 isMatch = false, 20932 naArr = na !== undefined ? na.split(",") : [], 20933 naNdx; 20934 20935 for (var i = 0; i < naArr.length; i++) { 20936 if ((naNdx = altArr1.indexOf(naArr[i])) !== -1) { 20937 altArr1.splice(naNdx, 1); 20938 } 20939 } 20940 20941 for (var alndx = 0; alndx < altArr1.length; alndx++) { 20942 if ($.inArray(altArr1[alndx], altArrC) !== -1) { 20943 isMatch = true; 20944 break; 20945 } 20946 } 20947 20948 return isMatch; 20949 } 20950 20951 function alternate(pos, c, strict, fromSetValid, rAltPos) { 20952 var validPsClone = $.extend(true, {}, getMaskSet().validPositions), 20953 lastAlt, 20954 alternation, 20955 isValidRslt = false, 20956 altPos, 20957 prevAltPos, 20958 i, 20959 validPos, 20960 decisionPos, 20961 lAltPos = rAltPos !== undefined ? rAltPos : getLastValidPosition(); 20962 20963 if (lAltPos === -1 && rAltPos === undefined) { 20964 lastAlt = 0; 20965 prevAltPos = getTest(lastAlt); 20966 alternation = prevAltPos.alternation; 20967 } else { 20968 for (; lAltPos >= 0; lAltPos--) { 20969 altPos = getMaskSet().validPositions[lAltPos]; 20970 20971 if (altPos && altPos.alternation !== undefined) { 20972 if (prevAltPos && prevAltPos.locator[altPos.alternation] !== altPos.locator[altPos.alternation]) { 20973 break; 20974 } 20975 20976 lastAlt = lAltPos; 20977 alternation = getMaskSet().validPositions[lastAlt].alternation; 20978 prevAltPos = altPos; 20979 } 20980 } 20981 } 20982 20983 if (alternation !== undefined) { 20984 decisionPos = parseInt(lastAlt); 20985 getMaskSet().excludes[decisionPos] = getMaskSet().excludes[decisionPos] || []; 20986 20987 if (pos !== true) { 20988 getMaskSet().excludes[decisionPos].push(getDecisionTaker(prevAltPos)); 20989 } 20990 20991 var validInputsClone = [], 20992 staticInputsBeforePos = 0; 20993 20994 for (i = decisionPos; i < getLastValidPosition(undefined, true) + 1; i++) { 20995 validPos = getMaskSet().validPositions[i]; 20996 20997 if (validPos && validPos.generatedInput !== true) { 20998 validInputsClone.push(validPos.input); 20999 } else if (i < pos) staticInputsBeforePos++; 21000 21001 delete getMaskSet().validPositions[i]; 21002 } 21003 21004 while (getMaskSet().excludes[decisionPos] && getMaskSet().excludes[decisionPos].length < 10) { 21005 var posOffset = staticInputsBeforePos * -1, 21006 validInputs = validInputsClone.slice(); 21007 getMaskSet().tests[decisionPos] = undefined; 21008 resetMaskSet(true); 21009 isValidRslt = true; 21010 21011 while (validInputs.length > 0) { 21012 var input = validInputs.shift(); 21013 21014 if (!(isValidRslt = isValid(getLastValidPosition(undefined, true) + 1, input, false, fromSetValid, true))) { 21015 break; 21016 } 21017 } 21018 21019 if (isValidRslt && c !== undefined) { 21020 var targetLvp = getLastValidPosition(pos) + 1; 21021 21022 for (i = decisionPos; i < getLastValidPosition() + 1; i++) { 21023 validPos = getMaskSet().validPositions[i]; 21024 21025 if ((validPos === undefined || validPos.match.fn == null) && i < pos + posOffset) { 21026 posOffset++; 21027 } 21028 } 21029 21030 pos = pos + posOffset; 21031 isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid, true); 21032 } 21033 21034 if (!isValidRslt) { 21035 resetMaskSet(); 21036 prevAltPos = getTest(decisionPos); 21037 getMaskSet().validPositions = $.extend(true, {}, validPsClone); 21038 21039 if (getMaskSet().excludes[decisionPos]) { 21040 var decisionTaker = getDecisionTaker(prevAltPos); 21041 21042 if (getMaskSet().excludes[decisionPos].indexOf(decisionTaker) !== -1) { 21043 isValidRslt = alternate(pos, c, strict, fromSetValid, decisionPos - 1); 21044 break; 21045 } 21046 21047 getMaskSet().excludes[decisionPos].push(decisionTaker); 21048 21049 for (i = decisionPos; i < getLastValidPosition(undefined, true) + 1; i++) { 21050 delete getMaskSet().validPositions[i]; 21051 } 21052 } else { 21053 isValidRslt = alternate(pos, c, strict, fromSetValid, decisionPos - 1); 21054 break; 21055 } 21056 } else break; 21057 } 21058 } 21059 21060 getMaskSet().excludes[decisionPos] = undefined; 21061 return isValidRslt; 21062 } 21063 21064 function isValid(pos, c, strict, fromSetValid, fromAlternate, validateOnly) { 21065 function isSelection(posObj) { 21066 return isRTL ? posObj.begin - posObj.end > 1 || posObj.begin - posObj.end === 1 : posObj.end - posObj.begin > 1 || posObj.end - posObj.begin === 1; 21067 } 21068 21069 strict = strict === true; 21070 var maskPos = pos; 21071 21072 if (pos.begin !== undefined) { 21073 maskPos = isRTL ? pos.end : pos.begin; 21074 } 21075 21076 function _isValid(position, c, strict) { 21077 var rslt = false; 21078 $.each(getTests(position), function (ndx, tst) { 21079 var test = tst.match; 21080 getBuffer(true); 21081 rslt = test.fn != null ? test.fn.test(c, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && test.def !== "" ? { 21082 c: getPlaceholder(position, test, true) || test.def, 21083 pos: position 21084 } : false; 21085 21086 if (rslt !== false) { 21087 var elem = rslt.c !== undefined ? rslt.c : c, 21088 validatedPos = position; 21089 elem = elem === opts.skipOptionalPartCharacter && test.fn === null ? getPlaceholder(position, test, true) || test.def : elem; 21090 21091 if (rslt.remove !== undefined) { 21092 if (!$.isArray(rslt.remove)) rslt.remove = [rslt.remove]; 21093 $.each(rslt.remove.sort(function (a, b) { 21094 return b - a; 21095 }), function (ndx, lmnt) { 21096 revalidateMask({ 21097 begin: lmnt, 21098 end: lmnt + 1 21099 }); 21100 }); 21101 } 21102 21103 if (rslt.insert !== undefined) { 21104 if (!$.isArray(rslt.insert)) rslt.insert = [rslt.insert]; 21105 $.each(rslt.insert.sort(function (a, b) { 21106 return a - b; 21107 }), function (ndx, lmnt) { 21108 isValid(lmnt.pos, lmnt.c, true, fromSetValid); 21109 }); 21110 } 21111 21112 if (rslt !== true && rslt.pos !== undefined && rslt.pos !== position) { 21113 validatedPos = rslt.pos; 21114 } 21115 21116 if (rslt !== true && rslt.pos === undefined && rslt.c === undefined) { 21117 return false; 21118 } 21119 21120 if (!revalidateMask(pos, $.extend({}, tst, { 21121 input: casing(elem, test, validatedPos) 21122 }), fromSetValid, validatedPos)) { 21123 rslt = false; 21124 } 21125 21126 return false; 21127 } 21128 }); 21129 return rslt; 21130 } 21131 21132 var result = true, 21133 positionsClone = $.extend(true, {}, getMaskSet().validPositions); 21134 21135 if ($.isFunction(opts.preValidation) && !strict && fromSetValid !== true && validateOnly !== true) { 21136 result = opts.preValidation(getBuffer(), maskPos, c, isSelection(pos), opts, getMaskSet()); 21137 } 21138 21139 if (result === true) { 21140 trackbackPositions(undefined, maskPos, true); 21141 21142 if (maxLength === undefined || maskPos < maxLength) { 21143 result = _isValid(maskPos, c, strict); 21144 21145 if ((!strict || fromSetValid === true) && result === false && validateOnly !== true) { 21146 var currentPosValid = getMaskSet().validPositions[maskPos]; 21147 21148 if (currentPosValid && currentPosValid.match.fn === null && (currentPosValid.match.def === c || c === opts.skipOptionalPartCharacter)) { 21149 result = { 21150 caret: seekNext(maskPos) 21151 }; 21152 } else { 21153 if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && (!isMask(maskPos, true) || getMaskSet().jitOffset[maskPos])) { 21154 if (getMaskSet().jitOffset[maskPos] && getMaskSet().validPositions[seekNext(maskPos)] === undefined) { 21155 result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, strict); 21156 if (result !== false) result.caret = maskPos; 21157 } else for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) { 21158 result = _isValid(nPos, c, strict); 21159 21160 if (result !== false) { 21161 result = trackbackPositions(maskPos, result.pos !== undefined ? result.pos : nPos) || result; 21162 maskPos = nPos; 21163 break; 21164 } 21165 } 21166 } 21167 } 21168 } 21169 } 21170 21171 if (result === false && opts.keepStatic !== false && (opts.regex == null || isComplete(getBuffer())) && !strict && fromAlternate !== true) { 21172 result = alternate(maskPos, c, strict, fromSetValid); 21173 } 21174 21175 if (result === true) { 21176 result = { 21177 pos: maskPos 21178 }; 21179 } 21180 } 21181 21182 if ($.isFunction(opts.postValidation) && result !== false && !strict && fromSetValid !== true && validateOnly !== true) { 21183 var postResult = opts.postValidation(getBuffer(true), pos.begin !== undefined ? isRTL ? pos.end : pos.begin : pos, result, opts); 21184 21185 if (postResult !== undefined) { 21186 if (postResult.refreshFromBuffer && postResult.buffer) { 21187 var refresh = postResult.refreshFromBuffer; 21188 refreshFromBuffer(refresh === true ? refresh : refresh.start, refresh.end, postResult.buffer); 21189 } 21190 21191 result = postResult === true ? result : postResult; 21192 } 21193 } 21194 21195 if (result && result.pos === undefined) { 21196 result.pos = maskPos; 21197 } 21198 21199 if (result === false || validateOnly === true) { 21200 resetMaskSet(true); 21201 getMaskSet().validPositions = $.extend(true, {}, positionsClone); 21202 } 21203 21204 return result; 21205 } 21206 21207 function trackbackPositions(originalPos, newPos, fillOnly) { 21208 var result; 21209 21210 if (originalPos === undefined) { 21211 for (originalPos = newPos - 1; originalPos > 0; originalPos--) { 21212 if (getMaskSet().validPositions[originalPos]) break; 21213 } 21214 } 21215 21216 for (var ps = originalPos; ps < newPos; ps++) { 21217 if (getMaskSet().validPositions[ps] === undefined && !isMask(ps, true)) { 21218 var vp = ps == 0 ? getTest(ps) : getMaskSet().validPositions[ps - 1]; 21219 21220 if (vp) { 21221 var tests = getTests(ps).slice(); 21222 if (tests[tests.length - 1].match.def === "") tests.pop(); 21223 var bestMatch = determineTestTemplate(ps, tests); 21224 bestMatch = $.extend({}, bestMatch, { 21225 input: getPlaceholder(ps, bestMatch.match, true) || bestMatch.match.def 21226 }); 21227 bestMatch.generatedInput = true; 21228 revalidateMask(ps, bestMatch, true); 21229 21230 if (fillOnly !== true) { 21231 var cvpInput = getMaskSet().validPositions[newPos].input; 21232 getMaskSet().validPositions[newPos] = undefined; 21233 result = isValid(newPos, cvpInput, true, true); 21234 } 21235 } 21236 } 21237 } 21238 21239 return result; 21240 } 21241 21242 function revalidateMask(pos, validTest, fromSetValid, validatedPos) { 21243 function IsEnclosedStatic(pos, valids, selection) { 21244 var posMatch = valids[pos]; 21245 21246 if (posMatch !== undefined && (posMatch.match.fn === null && posMatch.match.optionality !== true || posMatch.input === opts.radixPoint)) { 21247 var prevMatch = selection.begin <= pos - 1 ? valids[pos - 1] && valids[pos - 1].match.fn === null && valids[pos - 1] : valids[pos - 1], 21248 nextMatch = selection.end > pos + 1 ? valids[pos + 1] && valids[pos + 1].match.fn === null && valids[pos + 1] : valids[pos + 1]; 21249 return prevMatch && nextMatch; 21250 } 21251 21252 return false; 21253 } 21254 21255 var begin = pos.begin !== undefined ? pos.begin : pos, 21256 end = pos.end !== undefined ? pos.end : pos; 21257 21258 if (pos.begin > pos.end) { 21259 begin = pos.end; 21260 end = pos.begin; 21261 } 21262 21263 validatedPos = validatedPos !== undefined ? validatedPos : begin; 21264 21265 if (begin !== end || opts.insertMode && getMaskSet().validPositions[validatedPos] !== undefined && fromSetValid === undefined) { 21266 var positionsClone = $.extend(true, {}, getMaskSet().validPositions), 21267 lvp = getLastValidPosition(undefined, true), 21268 i; 21269 getMaskSet().p = begin; 21270 21271 for (i = lvp; i >= begin; i--) { 21272 if (getMaskSet().validPositions[i] && getMaskSet().validPositions[i].match.nativeDef === "+") { 21273 opts.isNegative = false; 21274 } 21275 21276 delete getMaskSet().validPositions[i]; 21277 } 21278 21279 var valid = true, 21280 j = validatedPos, 21281 vps = getMaskSet().validPositions, 21282 needsValidation = false, 21283 posMatch = j, 21284 i = j; 21285 21286 if (validTest) { 21287 getMaskSet().validPositions[validatedPos] = $.extend(true, {}, validTest); 21288 posMatch++; 21289 j++; 21290 if (begin < end) i++; 21291 } 21292 21293 for (; i <= lvp; i++) { 21294 var t = positionsClone[i]; 21295 21296 if (t !== undefined && (i >= end || i >= begin && t.generatedInput !== true && IsEnclosedStatic(i, positionsClone, { 21297 begin: begin, 21298 end: end 21299 }))) { 21300 while (getTest(posMatch).match.def !== "") { 21301 if (needsValidation === false && positionsClone[posMatch] && positionsClone[posMatch].match.nativeDef === t.match.nativeDef) { 21302 getMaskSet().validPositions[posMatch] = $.extend(true, {}, positionsClone[posMatch]); 21303 getMaskSet().validPositions[posMatch].input = t.input; 21304 trackbackPositions(undefined, posMatch, true); 21305 j = posMatch + 1; 21306 valid = true; 21307 } else if (opts.shiftPositions && positionCanMatchDefinition(posMatch, t.match.def)) { 21308 var result = isValid(posMatch, t.input, true, true); 21309 valid = result !== false; 21310 j = result.caret || result.insert ? getLastValidPosition() : posMatch + 1; 21311 needsValidation = true; 21312 } else { 21313 valid = t.generatedInput === true || t.input === opts.radixPoint && opts.numericInput === true; 21314 } 21315 21316 if (valid) break; 21317 21318 if (!valid && posMatch > end && isMask(posMatch, true) && (t.match.fn !== null || posMatch > getMaskSet().maskLength)) { 21319 break; 21320 } 21321 21322 posMatch++; 21323 } 21324 21325 if (getTest(posMatch).match.def == "") valid = false; 21326 posMatch = j; 21327 } 21328 21329 if (!valid) break; 21330 } 21331 21332 if (!valid) { 21333 getMaskSet().validPositions = $.extend(true, {}, positionsClone); 21334 resetMaskSet(true); 21335 return false; 21336 } 21337 } else if (validTest) { 21338 getMaskSet().validPositions[validatedPos] = $.extend(true, {}, validTest); 21339 } 21340 21341 resetMaskSet(true); 21342 return true; 21343 } 21344 21345 function isMask(pos, strict) { 21346 var test = getTestTemplate(pos).match; 21347 if (test.def === "") test = getTest(pos).match; 21348 21349 if (test.fn != null) { 21350 return test.fn; 21351 } 21352 21353 if (strict !== true && pos > -1) { 21354 var tests = getTests(pos); 21355 return tests.length > 1 + (tests[tests.length - 1].match.def === "" ? 1 : 0); 21356 } 21357 21358 return false; 21359 } 21360 21361 function seekNext(pos, newBlock) { 21362 var position = pos + 1; 21363 21364 while (getTest(position).match.def !== "" && (newBlock === true && (getTest(position).match.newBlockMarker !== true || !isMask(position)) || newBlock !== true && !isMask(position))) { 21365 position++; 21366 } 21367 21368 return position; 21369 } 21370 21371 function seekPrevious(pos, newBlock) { 21372 var position = pos, 21373 tests; 21374 if (position <= 0) return 0; 21375 21376 while (--position > 0 && (newBlock === true && getTest(position).match.newBlockMarker !== true || newBlock !== true && !isMask(position) && (tests = getTests(position), tests.length < 2 || tests.length === 2 && tests[1].match.def === ""))) {} 21377 21378 return position; 21379 } 21380 21381 function writeBuffer(input, buffer, caretPos, event, triggerEvents) { 21382 if (event && $.isFunction(opts.onBeforeWrite)) { 21383 var result = opts.onBeforeWrite.call(inputmask, event, buffer, caretPos, opts); 21384 21385 if (result) { 21386 if (result.refreshFromBuffer) { 21387 var refresh = result.refreshFromBuffer; 21388 refreshFromBuffer(refresh === true ? refresh : refresh.start, refresh.end, result.buffer || buffer); 21389 buffer = getBuffer(true); 21390 } 21391 21392 if (caretPos !== undefined) caretPos = result.caret !== undefined ? result.caret : caretPos; 21393 } 21394 } 21395 21396 if (input !== undefined) { 21397 input.inputmask._valueSet(buffer.join("")); 21398 21399 if (caretPos !== undefined && (event === undefined || event.type !== "blur")) { 21400 caret(input, caretPos); 21401 } else renderColorMask(input, caretPos, buffer.length === 0); 21402 21403 if (triggerEvents === true) { 21404 var $input = $(input), 21405 nptVal = input.inputmask._valueGet(); 21406 21407 skipInputEvent = true; 21408 $input.trigger("input"); 21409 setTimeout(function () { 21410 if (nptVal === getBufferTemplate().join("")) { 21411 $input.trigger("cleared"); 21412 } else if (isComplete(buffer) === true) { 21413 $input.trigger("complete"); 21414 } 21415 }, 0); 21416 } 21417 } 21418 } 21419 21420 function getPlaceholder(pos, test, returnPL) { 21421 test = test || getTest(pos).match; 21422 21423 if (test.placeholder !== undefined || returnPL === true) { 21424 return $.isFunction(test.placeholder) ? test.placeholder(opts) : test.placeholder; 21425 } else if (test.fn === null) { 21426 if (pos > -1 && getMaskSet().validPositions[pos] === undefined) { 21427 var tests = getTests(pos), 21428 staticAlternations = [], 21429 prevTest; 21430 21431 if (tests.length > 1 + (tests[tests.length - 1].match.def === "" ? 1 : 0)) { 21432 for (var i = 0; i < tests.length; i++) { 21433 if (tests[i].match.optionality !== true && tests[i].match.optionalQuantifier !== true && (tests[i].match.fn === null || prevTest === undefined || tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, true, opts) !== false)) { 21434 staticAlternations.push(tests[i]); 21435 if (tests[i].match.fn === null) prevTest = tests[i]; 21436 21437 if (staticAlternations.length > 1) { 21438 if (/[0-9a-bA-Z]/.test(staticAlternations[0].match.def)) { 21439 return opts.placeholder.charAt(pos % opts.placeholder.length); 21440 } 21441 } 21442 } 21443 } 21444 } 21445 } 21446 21447 return test.def; 21448 } 21449 21450 return opts.placeholder.charAt(pos % opts.placeholder.length); 21451 } 21452 21453 function HandleNativePlaceholder(npt, value) { 21454 if (ie) { 21455 if (npt.inputmask._valueGet() !== value && (npt.placeholder !== value || npt.placeholder === "")) { 21456 var buffer = getBuffer().slice(), 21457 nptValue = npt.inputmask._valueGet(); 21458 21459 if (nptValue !== value) { 21460 var lvp = getLastValidPosition(); 21461 21462 if (lvp === -1 && nptValue === getBufferTemplate().join("")) { 21463 buffer = []; 21464 } else if (lvp !== -1) { 21465 clearOptionalTail(buffer); 21466 } 21467 21468 writeBuffer(npt, buffer); 21469 } 21470 } 21471 } else if (npt.placeholder !== value) { 21472 npt.placeholder = value; 21473 if (npt.placeholder === "") npt.removeAttribute("placeholder"); 21474 } 21475 } 21476 21477 var EventRuler = { 21478 on: function on(input, eventName, eventHandler) { 21479 var ev = function ev(e) { 21480 var that = this; 21481 21482 if (that.inputmask === undefined && this.nodeName !== "FORM") { 21483 var imOpts = $.data(that, "_inputmask_opts"); 21484 if (imOpts) new Inputmask(imOpts).mask(that);else EventRuler.off(that); 21485 } else if (e.type !== "setvalue" && this.nodeName !== "FORM" && (that.disabled || that.readOnly && !(e.type === "keydown" && e.ctrlKey && e.keyCode === 67 || opts.tabThrough === false && e.keyCode === Inputmask.keyCode.TAB))) { 21486 e.preventDefault(); 21487 } else { 21488 switch (e.type) { 21489 case "input": 21490 if (skipInputEvent === true) { 21491 skipInputEvent = false; 21492 return e.preventDefault(); 21493 } 21494 21495 if (mobile) { 21496 var args = arguments; 21497 setTimeout(function () { 21498 eventHandler.apply(that, args); 21499 caret(that, that.inputmask.caretPos, undefined, true); 21500 }, 0); 21501 return false; 21502 } 21503 21504 break; 21505 21506 case "keydown": 21507 skipKeyPressEvent = false; 21508 skipInputEvent = false; 21509 break; 21510 21511 case "keypress": 21512 if (skipKeyPressEvent === true) { 21513 return e.preventDefault(); 21514 } 21515 21516 skipKeyPressEvent = true; 21517 break; 21518 21519 case "click": 21520 if (iemobile || iphone) { 21521 var args = arguments; 21522 setTimeout(function () { 21523 eventHandler.apply(that, args); 21524 }, 0); 21525 return false; 21526 } 21527 21528 break; 21529 } 21530 21531 var returnVal = eventHandler.apply(that, arguments); 21532 21533 if (returnVal === false) { 21534 e.preventDefault(); 21535 e.stopPropagation(); 21536 } 21537 21538 return returnVal; 21539 } 21540 }; 21541 21542 input.inputmask.events[eventName] = input.inputmask.events[eventName] || []; 21543 input.inputmask.events[eventName].push(ev); 21544 21545 if ($.inArray(eventName, ["submit", "reset"]) !== -1) { 21546 if (input.form !== null) $(input.form).on(eventName, ev); 21547 } else { 21548 $(input).on(eventName, ev); 21549 } 21550 }, 21551 off: function off(input, event) { 21552 if (input.inputmask && input.inputmask.events) { 21553 var events; 21554 21555 if (event) { 21556 events = []; 21557 events[event] = input.inputmask.events[event]; 21558 } else { 21559 events = input.inputmask.events; 21560 } 21561 21562 $.each(events, function (eventName, evArr) { 21563 while (evArr.length > 0) { 21564 var ev = evArr.pop(); 21565 21566 if ($.inArray(eventName, ["submit", "reset"]) !== -1) { 21567 if (input.form !== null) $(input.form).off(eventName, ev); 21568 } else { 21569 $(input).off(eventName, ev); 21570 } 21571 } 21572 21573 delete input.inputmask.events[eventName]; 21574 }); 21575 } 21576 } 21577 }; 21578 var EventHandlers = { 21579 keydownEvent: function keydownEvent(e) { 21580 var input = this, 21581 $input = $(input), 21582 k = e.keyCode, 21583 pos = caret(input); 21584 21585 if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === Inputmask.keyCode.BACKSPACE_SAFARI || e.ctrlKey && k === Inputmask.keyCode.X && !isInputEventSupported("cut")) { 21586 e.preventDefault(); 21587 handleRemove(input, k, pos); 21588 writeBuffer(input, getBuffer(true), getMaskSet().p, e, input.inputmask._valueGet() !== getBuffer().join("")); 21589 } else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) { 21590 e.preventDefault(); 21591 var caretPos = seekNext(getLastValidPosition()); 21592 caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, true); 21593 } else if (k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP) { 21594 e.preventDefault(); 21595 caret(input, 0, e.shiftKey ? pos.begin : 0, true); 21596 } else if ((opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || k === 90 && e.ctrlKey) && e.altKey !== true) { 21597 checkVal(input, true, false, undoValue.split("")); 21598 $input.trigger("click"); 21599 } else if (k === Inputmask.keyCode.INSERT && !(e.shiftKey || e.ctrlKey)) { 21600 opts.insertMode = !opts.insertMode; 21601 input.setAttribute("im-insert", opts.insertMode); 21602 } else if (opts.tabThrough === true && k === Inputmask.keyCode.TAB) { 21603 if (e.shiftKey === true) { 21604 if (getTest(pos.begin).match.fn === null) { 21605 pos.begin = seekNext(pos.begin); 21606 } 21607 21608 pos.end = seekPrevious(pos.begin, true); 21609 pos.begin = seekPrevious(pos.end, true); 21610 } else { 21611 pos.begin = seekNext(pos.begin, true); 21612 pos.end = seekNext(pos.begin, true); 21613 if (pos.end < getMaskSet().maskLength) pos.end--; 21614 } 21615 21616 if (pos.begin < getMaskSet().maskLength) { 21617 e.preventDefault(); 21618 caret(input, pos.begin, pos.end); 21619 } 21620 } 21621 21622 opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts); 21623 ignorable = $.inArray(k, opts.ignorables) !== -1; 21624 }, 21625 keypressEvent: function keypressEvent(e, checkval, writeOut, strict, ndx) { 21626 var input = this, 21627 $input = $(input), 21628 k = e.which || e.charCode || e.keyCode; 21629 21630 if (checkval !== true && !(e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) { 21631 if (k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("")) { 21632 undoValue = getBuffer().join(""); 21633 setTimeout(function () { 21634 $input.trigger("change"); 21635 }, 0); 21636 } 21637 21638 return true; 21639 } else { 21640 if (k) { 21641 if (k === 46 && e.shiftKey === false && opts.radixPoint !== "") k = opts.radixPoint.charCodeAt(0); 21642 var pos = checkval ? { 21643 begin: ndx, 21644 end: ndx 21645 } : caret(input), 21646 forwardPosition, 21647 c = String.fromCharCode(k), 21648 offset = 0; 21649 21650 if (opts._radixDance && opts.numericInput) { 21651 var caretPos = getBuffer().indexOf(opts.radixPoint.charAt(0)) + 1; 21652 21653 if (pos.begin <= caretPos) { 21654 if (k === opts.radixPoint.charCodeAt(0)) offset = 1; 21655 pos.begin -= 1; 21656 pos.end -= 1; 21657 } 21658 } 21659 21660 getMaskSet().writeOutBuffer = true; 21661 var valResult = isValid(pos, c, strict); 21662 21663 if (valResult !== false) { 21664 resetMaskSet(true); 21665 forwardPosition = valResult.caret !== undefined ? valResult.caret : seekNext(valResult.pos.begin ? valResult.pos.begin : valResult.pos); 21666 getMaskSet().p = forwardPosition; 21667 } 21668 21669 forwardPosition = (opts.numericInput && valResult.caret === undefined ? seekPrevious(forwardPosition) : forwardPosition) + offset; 21670 21671 if (writeOut !== false) { 21672 setTimeout(function () { 21673 opts.onKeyValidation.call(input, k, valResult, opts); 21674 }, 0); 21675 21676 if (getMaskSet().writeOutBuffer && valResult !== false) { 21677 var buffer = getBuffer(); 21678 writeBuffer(input, buffer, forwardPosition, e, checkval !== true); 21679 } 21680 } 21681 21682 e.preventDefault(); 21683 21684 if (checkval) { 21685 if (valResult !== false) valResult.forwardPosition = forwardPosition; 21686 return valResult; 21687 } 21688 } 21689 } 21690 }, 21691 pasteEvent: function pasteEvent(e) { 21692 var input = this, 21693 ev = e.originalEvent || e, 21694 $input = $(input), 21695 inputValue = input.inputmask._valueGet(true), 21696 caretPos = caret(input), 21697 tempValue; 21698 21699 if (isRTL) { 21700 tempValue = caretPos.end; 21701 caretPos.end = caretPos.begin; 21702 caretPos.begin = tempValue; 21703 } 21704 21705 var valueBeforeCaret = inputValue.substr(0, caretPos.begin), 21706 valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length); 21707 if (valueBeforeCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(0, caretPos.begin).join("")) valueBeforeCaret = ""; 21708 if (valueAfterCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(caretPos.end).join("")) valueAfterCaret = ""; 21709 21710 if (window.clipboardData && window.clipboardData.getData) { 21711 inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret; 21712 } else if (ev.clipboardData && ev.clipboardData.getData) { 21713 inputValue = valueBeforeCaret + ev.clipboardData.getData("text/plain") + valueAfterCaret; 21714 } else return true; 21715 21716 var pasteValue = inputValue; 21717 21718 if ($.isFunction(opts.onBeforePaste)) { 21719 pasteValue = opts.onBeforePaste.call(inputmask, inputValue, opts); 21720 21721 if (pasteValue === false) { 21722 return e.preventDefault(); 21723 } 21724 21725 if (!pasteValue) { 21726 pasteValue = inputValue; 21727 } 21728 } 21729 21730 checkVal(input, false, false, pasteValue.toString().split("")); 21731 writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()), e, undoValue !== getBuffer().join("")); 21732 return e.preventDefault(); 21733 }, 21734 inputFallBackEvent: function inputFallBackEvent(e) { 21735 function radixPointHandler(input, inputValue, caretPos) { 21736 if (inputValue.charAt(caretPos.begin - 1) === "." && opts.radixPoint !== "") { 21737 inputValue = inputValue.split(""); 21738 inputValue[caretPos.begin - 1] = opts.radixPoint.charAt(0); 21739 inputValue = inputValue.join(""); 21740 } 21741 21742 return inputValue; 21743 } 21744 21745 function ieMobileHandler(input, inputValue, caretPos) { 21746 if (iemobile) { 21747 var inputChar = inputValue.replace(getBuffer().join(""), ""); 21748 21749 if (inputChar.length === 1) { 21750 var iv = inputValue.split(""); 21751 iv.splice(caretPos.begin, 0, inputChar); 21752 inputValue = iv.join(""); 21753 } 21754 } 21755 21756 return inputValue; 21757 } 21758 21759 var input = this, 21760 inputValue = input.inputmask._valueGet(); 21761 21762 if (getBuffer().join("") !== inputValue) { 21763 var caretPos = caret(input); 21764 inputValue = radixPointHandler(input, inputValue, caretPos); 21765 inputValue = ieMobileHandler(input, inputValue, caretPos); 21766 21767 if (getBuffer().join("") !== inputValue) { 21768 var buffer = getBuffer().join(""), 21769 offset = !opts.numericInput && inputValue.length > buffer.length ? -1 : 0, 21770 frontPart = inputValue.substr(0, caretPos.begin), 21771 backPart = inputValue.substr(caretPos.begin), 21772 frontBufferPart = buffer.substr(0, caretPos.begin + offset), 21773 backBufferPart = buffer.substr(caretPos.begin + offset); 21774 var selection = caretPos, 21775 entries = "", 21776 isEntry = false; 21777 21778 if (frontPart !== frontBufferPart) { 21779 var fpl = (isEntry = frontPart.length >= frontBufferPart.length) ? frontPart.length : frontBufferPart.length, 21780 i; 21781 21782 for (i = 0; frontPart.charAt(i) === frontBufferPart.charAt(i) && i < fpl; i++) { 21783 ; 21784 } 21785 21786 if (isEntry) { 21787 selection.begin = i - offset; 21788 entries += frontPart.slice(i, selection.end); 21789 } 21790 } 21791 21792 if (backPart !== backBufferPart) { 21793 if (backPart.length > backBufferPart.length) { 21794 entries += backPart.slice(0, 1); 21795 } else { 21796 if (backPart.length < backBufferPart.length) { 21797 selection.end += backBufferPart.length - backPart.length; 21798 21799 if (!isEntry && opts.radixPoint !== "" && backPart === "" && frontPart.charAt(selection.begin + offset - 1) === opts.radixPoint) { 21800 selection.begin--; 21801 entries = opts.radixPoint; 21802 } 21803 } 21804 } 21805 } 21806 21807 writeBuffer(input, getBuffer(), { 21808 begin: selection.begin + offset, 21809 end: selection.end + offset 21810 }); 21811 21812 if (entries.length > 0) { 21813 $.each(entries.split(""), function (ndx, entry) { 21814 var keypress = new $.Event("keypress"); 21815 keypress.which = entry.charCodeAt(0); 21816 ignorable = false; 21817 EventHandlers.keypressEvent.call(input, keypress); 21818 }); 21819 } else { 21820 if (selection.begin === selection.end - 1) { 21821 selection.begin = seekPrevious(selection.begin + 1); 21822 21823 if (selection.begin === selection.end - 1) { 21824 caret(input, selection.begin); 21825 } else { 21826 caret(input, selection.begin, selection.end); 21827 } 21828 } 21829 21830 var keydown = new $.Event("keydown"); 21831 keydown.keyCode = opts.numericInput ? Inputmask.keyCode.BACKSPACE : Inputmask.keyCode.DELETE; 21832 EventHandlers.keydownEvent.call(input, keydown); 21833 } 21834 21835 e.preventDefault(); 21836 } 21837 } 21838 }, 21839 beforeInputEvent: function beforeInputEvent(e) { 21840 if (e.cancelable) { 21841 var input = this; 21842 21843 switch (e.inputType) { 21844 case "insertText": 21845 $.each(e.data.split(""), function (ndx, entry) { 21846 var keypress = new $.Event("keypress"); 21847 keypress.which = entry.charCodeAt(0); 21848 ignorable = false; 21849 EventHandlers.keypressEvent.call(input, keypress); 21850 }); 21851 return e.preventDefault(); 21852 21853 case "deleteContentBackward": 21854 var keydown = new $.Event("keydown"); 21855 keydown.keyCode = Inputmask.keyCode.BACKSPACE; 21856 EventHandlers.keydownEvent.call(input, keydown); 21857 return e.preventDefault(); 21858 21859 case "deleteContentForward": 21860 var keydown = new $.Event("keydown"); 21861 keydown.keyCode = Inputmask.keyCode.DELETE; 21862 EventHandlers.keydownEvent.call(input, keydown); 21863 return e.preventDefault(); 21864 } 21865 } 21866 }, 21867 setValueEvent: function setValueEvent(e) { 21868 this.inputmask.refreshValue = false; 21869 21870 var input = this, 21871 value = e && e.detail ? e.detail[0] : arguments[1], 21872 value = value || input.inputmask._valueGet(true); 21873 21874 if ($.isFunction(opts.onBeforeMask)) value = opts.onBeforeMask.call(inputmask, value, opts) || value; 21875 value = value.split(""); 21876 checkVal(input, true, false, value); 21877 undoValue = getBuffer().join(""); 21878 21879 if ((opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("")) { 21880 input.inputmask._valueSet(""); 21881 } 21882 }, 21883 focusEvent: function focusEvent(e) { 21884 var input = this, 21885 nptValue = input.inputmask._valueGet(); 21886 21887 if (opts.showMaskOnFocus) { 21888 if (nptValue !== getBuffer().join("")) { 21889 writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())); 21890 } else if (mouseEnter === false) { 21891 caret(input, seekNext(getLastValidPosition())); 21892 } 21893 } 21894 21895 if (opts.positionCaretOnTab === true && mouseEnter === false) { 21896 EventHandlers.clickEvent.apply(input, [e, true]); 21897 } 21898 21899 undoValue = getBuffer().join(""); 21900 }, 21901 mouseleaveEvent: function mouseleaveEvent(e) { 21902 var input = this; 21903 mouseEnter = false; 21904 21905 if (opts.clearMaskOnLostFocus && document.activeElement !== input) { 21906 HandleNativePlaceholder(input, originalPlaceholder); 21907 } 21908 }, 21909 clickEvent: function clickEvent(e, tabbed) { 21910 function doRadixFocus(clickPos) { 21911 if (opts.radixPoint !== "") { 21912 var vps = getMaskSet().validPositions; 21913 21914 if (vps[clickPos] === undefined || vps[clickPos].input === getPlaceholder(clickPos)) { 21915 if (clickPos < seekNext(-1)) return true; 21916 var radixPos = $.inArray(opts.radixPoint, getBuffer()); 21917 21918 if (radixPos !== -1) { 21919 for (var vp in vps) { 21920 if (radixPos < vp && vps[vp].input !== getPlaceholder(vp)) { 21921 return false; 21922 } 21923 } 21924 21925 return true; 21926 } 21927 } 21928 } 21929 21930 return false; 21931 } 21932 21933 var input = this; 21934 setTimeout(function () { 21935 if (document.activeElement === input) { 21936 var selectedCaret = caret(input); 21937 21938 if (tabbed) { 21939 if (isRTL) { 21940 selectedCaret.end = selectedCaret.begin; 21941 } else { 21942 selectedCaret.begin = selectedCaret.end; 21943 } 21944 } 21945 21946 if (selectedCaret.begin === selectedCaret.end) { 21947 switch (opts.positionCaretOnClick) { 21948 case "none": 21949 break; 21950 21951 case "select": 21952 caret(input, 0, getBuffer().length); 21953 break; 21954 21955 case "ignore": 21956 caret(input, seekNext(getLastValidPosition())); 21957 break; 21958 21959 case "radixFocus": 21960 if (doRadixFocus(selectedCaret.begin)) { 21961 var radixPos = getBuffer().join("").indexOf(opts.radixPoint); 21962 caret(input, opts.numericInput ? seekNext(radixPos) : radixPos); 21963 break; 21964 } 21965 21966 default: 21967 var clickPosition = selectedCaret.begin, 21968 lvclickPosition = getLastValidPosition(clickPosition, true), 21969 lastPosition = seekNext(lvclickPosition); 21970 21971 if (clickPosition < lastPosition) { 21972 caret(input, !isMask(clickPosition, true) && !isMask(clickPosition - 1, true) ? seekNext(clickPosition) : clickPosition); 21973 } else { 21974 var lvp = getMaskSet().validPositions[lvclickPosition], 21975 tt = getTestTemplate(lastPosition, lvp ? lvp.match.locator : undefined, lvp), 21976 placeholder = getPlaceholder(lastPosition, tt.match); 21977 21978 if (placeholder !== "" && getBuffer()[lastPosition] !== placeholder && tt.match.optionalQuantifier !== true && tt.match.newBlockMarker !== true || !isMask(lastPosition, opts.keepStatic) && tt.match.def === placeholder) { 21979 var newPos = seekNext(lastPosition); 21980 21981 if (clickPosition >= newPos || clickPosition === lastPosition) { 21982 lastPosition = newPos; 21983 } 21984 } 21985 21986 caret(input, lastPosition); 21987 } 21988 21989 break; 21990 } 21991 } 21992 } 21993 }, 0); 21994 }, 21995 cutEvent: function cutEvent(e) { 21996 var input = this, 21997 $input = $(input), 21998 pos = caret(input), 21999 ev = e.originalEvent || e; 22000 var clipboardData = window.clipboardData || ev.clipboardData, 22001 clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end); 22002 clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clipData.join("")); 22003 if (document.execCommand) document.execCommand("copy"); 22004 handleRemove(input, Inputmask.keyCode.DELETE, pos); 22005 writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")); 22006 }, 22007 blurEvent: function blurEvent(e) { 22008 var $input = $(this), 22009 input = this; 22010 22011 if (input.inputmask) { 22012 HandleNativePlaceholder(input, originalPlaceholder); 22013 22014 var nptValue = input.inputmask._valueGet(), 22015 buffer = getBuffer().slice(); 22016 22017 if (nptValue !== "" || colorMask !== undefined) { 22018 if (opts.clearMaskOnLostFocus) { 22019 if (getLastValidPosition() === -1 && nptValue === getBufferTemplate().join("")) { 22020 buffer = []; 22021 } else { 22022 clearOptionalTail(buffer); 22023 } 22024 } 22025 22026 if (isComplete(buffer) === false) { 22027 setTimeout(function () { 22028 $input.trigger("incomplete"); 22029 }, 0); 22030 22031 if (opts.clearIncomplete) { 22032 resetMaskSet(); 22033 22034 if (opts.clearMaskOnLostFocus) { 22035 buffer = []; 22036 } else { 22037 buffer = getBufferTemplate().slice(); 22038 } 22039 } 22040 } 22041 22042 writeBuffer(input, buffer, undefined, e); 22043 } 22044 22045 if (undoValue !== getBuffer().join("")) { 22046 undoValue = buffer.join(""); 22047 $input.trigger("change"); 22048 } 22049 } 22050 }, 22051 mouseenterEvent: function mouseenterEvent(e) { 22052 var input = this; 22053 mouseEnter = true; 22054 22055 if (document.activeElement !== input && opts.showMaskOnHover) { 22056 HandleNativePlaceholder(input, (isRTL ? getBuffer().slice().reverse() : getBuffer()).join("")); 22057 } 22058 }, 22059 submitEvent: function submitEvent(e) { 22060 if (undoValue !== getBuffer().join("")) { 22061 $el.trigger("change"); 22062 } 22063 22064 if (opts.clearMaskOnLostFocus && getLastValidPosition() === -1 && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("")) { 22065 el.inputmask._valueSet(""); 22066 } 22067 22068 if (opts.clearIncomplete && isComplete(getBuffer()) === false) { 22069 el.inputmask._valueSet(""); 22070 } 22071 22072 if (opts.removeMaskOnSubmit) { 22073 el.inputmask._valueSet(el.inputmask.unmaskedvalue(), true); 22074 22075 setTimeout(function () { 22076 writeBuffer(el, getBuffer()); 22077 }, 0); 22078 } 22079 }, 22080 resetEvent: function resetEvent(e) { 22081 el.inputmask.refreshValue = true; 22082 setTimeout(function () { 22083 $el.trigger("setvalue"); 22084 }, 0); 22085 } 22086 }; 22087 22088 function checkVal(input, writeOut, strict, nptvl, initiatingEvent) { 22089 var inputmask = this || input.inputmask, 22090 inputValue = nptvl.slice(), 22091 charCodes = "", 22092 initialNdx = -1, 22093 result = undefined; 22094 22095 function isTemplateMatch(ndx, charCodes) { 22096 var charCodeNdx = getMaskTemplate(true, 0, false).slice(ndx, seekNext(ndx)).join("").replace(/'/g, "").indexOf(charCodes); 22097 return charCodeNdx !== -1 && !isMask(ndx) && (getTest(ndx).match.nativeDef === charCodes.charAt(0) || getTest(ndx).match.fn === null && getTest(ndx).match.nativeDef === "'" + charCodes.charAt(0) || getTest(ndx).match.nativeDef === " " && (getTest(ndx + 1).match.nativeDef === charCodes.charAt(0) || getTest(ndx + 1).match.fn === null && getTest(ndx + 1).match.nativeDef === "'" + charCodes.charAt(0))); 22098 } 22099 22100 resetMaskSet(); 22101 22102 if (!strict && opts.autoUnmask !== true) { 22103 var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""), 22104 matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g")); 22105 22106 if (matches && matches.length > 0) { 22107 inputValue.splice(0, matches.length * staticInput.length); 22108 initialNdx = seekNext(initialNdx); 22109 } 22110 } else { 22111 initialNdx = seekNext(initialNdx); 22112 } 22113 22114 if (initialNdx === -1) { 22115 getMaskSet().p = seekNext(initialNdx); 22116 initialNdx = 0; 22117 } else getMaskSet().p = initialNdx; 22118 22119 inputmask.caretPos = { 22120 begin: initialNdx 22121 }; 22122 $.each(inputValue, function (ndx, charCode) { 22123 if (charCode !== undefined) { 22124 if (getMaskSet().validPositions[ndx] === undefined && inputValue[ndx] === getPlaceholder(ndx) && isMask(ndx, true) && isValid(ndx, inputValue[ndx], true, undefined, undefined, true) === false) { 22125 getMaskSet().p++; 22126 } else { 22127 var keypress = new $.Event("_checkval"); 22128 keypress.which = charCode.charCodeAt(0); 22129 charCodes += charCode; 22130 var lvp = getLastValidPosition(undefined, true); 22131 22132 if (!isTemplateMatch(initialNdx, charCodes)) { 22133 result = EventHandlers.keypressEvent.call(input, keypress, true, false, strict, inputmask.caretPos.begin); 22134 22135 if (result) { 22136 initialNdx = inputmask.caretPos.begin + 1; 22137 charCodes = ""; 22138 } 22139 } else { 22140 result = EventHandlers.keypressEvent.call(input, keypress, true, false, strict, lvp + 1); 22141 } 22142 22143 if (result) { 22144 writeBuffer(undefined, getBuffer(), result.forwardPosition, keypress, false); 22145 inputmask.caretPos = { 22146 begin: result.forwardPosition, 22147 end: result.forwardPosition 22148 }; 22149 } 22150 } 22151 } 22152 }); 22153 if (writeOut) writeBuffer(input, getBuffer(), result ? result.forwardPosition : undefined, initiatingEvent || new $.Event("checkval"), initiatingEvent && initiatingEvent.type === "input"); 22154 } 22155 22156 function unmaskedvalue(input) { 22157 if (input) { 22158 if (input.inputmask === undefined) { 22159 return input.value; 22160 } 22161 22162 if (input.inputmask && input.inputmask.refreshValue) { 22163 EventHandlers.setValueEvent.call(input); 22164 } 22165 } 22166 22167 var umValue = [], 22168 vps = getMaskSet().validPositions; 22169 22170 for (var pndx in vps) { 22171 if (vps[pndx].match && vps[pndx].match.fn != null) { 22172 umValue.push(vps[pndx].input); 22173 } 22174 } 22175 22176 var unmaskedValue = umValue.length === 0 ? "" : (isRTL ? umValue.reverse() : umValue).join(""); 22177 22178 if ($.isFunction(opts.onUnMask)) { 22179 var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join(""); 22180 unmaskedValue = opts.onUnMask.call(inputmask, bufferValue, unmaskedValue, opts); 22181 } 22182 22183 return unmaskedValue; 22184 } 22185 22186 function caret(input, begin, end, notranslate) { 22187 function translatePosition(pos) { 22188 if (isRTL && typeof pos === "number" && (!opts.greedy || opts.placeholder !== "") && el) { 22189 pos = el.inputmask._valueGet().length - pos; 22190 } 22191 22192 return pos; 22193 } 22194 22195 var range; 22196 22197 if (begin !== undefined) { 22198 if ($.isArray(begin)) { 22199 end = isRTL ? begin[0] : begin[1]; 22200 begin = isRTL ? begin[1] : begin[0]; 22201 } 22202 22203 if (begin.begin !== undefined) { 22204 end = isRTL ? begin.begin : begin.end; 22205 begin = isRTL ? begin.end : begin.begin; 22206 } 22207 22208 if (typeof begin === "number") { 22209 begin = notranslate ? begin : translatePosition(begin); 22210 end = notranslate ? end : translatePosition(end); 22211 end = typeof end == "number" ? end : begin; 22212 var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end; 22213 input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0; 22214 input.inputmask.caretPos = { 22215 begin: begin, 22216 end: end 22217 }; 22218 22219 if (input === document.activeElement) { 22220 if ("selectionStart" in input) { 22221 input.selectionStart = begin; 22222 input.selectionEnd = end; 22223 } else if (window.getSelection) { 22224 range = document.createRange(); 22225 22226 if (input.firstChild === undefined || input.firstChild === null) { 22227 var textNode = document.createTextNode(""); 22228 input.appendChild(textNode); 22229 } 22230 22231 range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length); 22232 range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length); 22233 range.collapse(true); 22234 var sel = window.getSelection(); 22235 sel.removeAllRanges(); 22236 sel.addRange(range); 22237 } else if (input.createTextRange) { 22238 range = input.createTextRange(); 22239 range.collapse(true); 22240 range.moveEnd("character", end); 22241 range.moveStart("character", begin); 22242 range.select(); 22243 } 22244 22245 renderColorMask(input, { 22246 begin: begin, 22247 end: end 22248 }); 22249 } 22250 } 22251 } else { 22252 if ("selectionStart" in input) { 22253 begin = input.selectionStart; 22254 end = input.selectionEnd; 22255 } else if (window.getSelection) { 22256 range = window.getSelection().getRangeAt(0); 22257 22258 if (range.commonAncestorContainer.parentNode === input || range.commonAncestorContainer === input) { 22259 begin = range.startOffset; 22260 end = range.endOffset; 22261 } 22262 } else if (document.selection && document.selection.createRange) { 22263 range = document.selection.createRange(); 22264 begin = 0 - range.duplicate().moveStart("character", -input.inputmask._valueGet().length); 22265 end = begin + range.text.length; 22266 } 22267 22268 return { 22269 begin: notranslate ? begin : translatePosition(begin), 22270 end: notranslate ? end : translatePosition(end) 22271 }; 22272 } 22273 } 22274 22275 function determineLastRequiredPosition(returnDefinition) { 22276 var buffer = getMaskTemplate(true, getLastValidPosition(), true, true), 22277 bl = buffer.length, 22278 pos, 22279 lvp = getLastValidPosition(), 22280 positions = {}, 22281 lvTest = getMaskSet().validPositions[lvp], 22282 ndxIntlzr = lvTest !== undefined ? lvTest.locator.slice() : undefined, 22283 testPos; 22284 22285 for (pos = lvp + 1; pos < buffer.length; pos++) { 22286 testPos = getTestTemplate(pos, ndxIntlzr, pos - 1); 22287 ndxIntlzr = testPos.locator.slice(); 22288 positions[pos] = $.extend(true, {}, testPos); 22289 } 22290 22291 var lvTestAlt = lvTest && lvTest.alternation !== undefined ? lvTest.locator[lvTest.alternation] : undefined; 22292 22293 for (pos = bl - 1; pos > lvp; pos--) { 22294 testPos = positions[pos]; 22295 22296 if ((testPos.match.optionality || testPos.match.optionalQuantifier && testPos.match.newBlockMarker || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && testPos.match.fn != null || testPos.match.fn === null && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && getTests(pos)[0].def !== "")) && buffer[pos] === getPlaceholder(pos, testPos.match)) { 22297 bl--; 22298 } else break; 22299 } 22300 22301 return returnDefinition ? { 22302 l: bl, 22303 def: positions[bl] ? positions[bl].match : undefined 22304 } : bl; 22305 } 22306 22307 function clearOptionalTail(buffer) { 22308 buffer.length = 0; 22309 var template = getMaskTemplate(true, 0, true, undefined, true), 22310 lmnt, 22311 validPos; 22312 22313 while (lmnt = template.shift(), lmnt !== undefined) { 22314 buffer.push(lmnt); 22315 } 22316 22317 return buffer; 22318 } 22319 22320 function isComplete(buffer) { 22321 if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts); 22322 if (opts.repeat === "*") return undefined; 22323 var complete = false, 22324 lrp = determineLastRequiredPosition(true), 22325 aml = seekPrevious(lrp.l); 22326 22327 if (lrp.def === undefined || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) { 22328 complete = true; 22329 22330 for (var i = 0; i <= aml; i++) { 22331 var test = getTestTemplate(i).match; 22332 22333 if (test.fn !== null && getMaskSet().validPositions[i] === undefined && test.optionality !== true && test.optionalQuantifier !== true || test.fn === null && buffer[i] !== getPlaceholder(i, test)) { 22334 complete = false; 22335 break; 22336 } 22337 } 22338 } 22339 22340 return complete; 22341 } 22342 22343 function handleRemove(input, k, pos, strict, fromIsValid) { 22344 if (opts.numericInput || isRTL) { 22345 if (k === Inputmask.keyCode.BACKSPACE) { 22346 k = Inputmask.keyCode.DELETE; 22347 } else if (k === Inputmask.keyCode.DELETE) { 22348 k = Inputmask.keyCode.BACKSPACE; 22349 } 22350 22351 if (isRTL) { 22352 var pend = pos.end; 22353 pos.end = pos.begin; 22354 pos.begin = pend; 22355 } 22356 } 22357 22358 if (k === Inputmask.keyCode.BACKSPACE && pos.end - pos.begin < 1) { 22359 pos.begin = seekPrevious(pos.begin); 22360 22361 if (getMaskSet().validPositions[pos.begin] !== undefined && getMaskSet().validPositions[pos.begin].input === opts.groupSeparator) { 22362 pos.begin--; 22363 } 22364 } else if (k === Inputmask.keyCode.DELETE && pos.begin === pos.end) { 22365 pos.end = isMask(pos.end, true) && getMaskSet().validPositions[pos.end] && getMaskSet().validPositions[pos.end].input !== opts.radixPoint ? pos.end + 1 : seekNext(pos.end) + 1; 22366 22367 if (getMaskSet().validPositions[pos.begin] !== undefined && getMaskSet().validPositions[pos.begin].input === opts.groupSeparator) { 22368 pos.end++; 22369 } 22370 } 22371 22372 revalidateMask(pos); 22373 22374 if (strict !== true && opts.keepStatic !== false || opts.regex !== null) { 22375 var result = alternate(true); 22376 22377 if (result) { 22378 var newPos = result.caret !== undefined ? result.caret : result.pos ? seekNext(result.pos.begin ? result.pos.begin : result.pos) : getLastValidPosition(-1, true); 22379 22380 if (k !== Inputmask.keyCode.DELETE || pos.begin > newPos) { 22381 pos.begin == newPos; 22382 } 22383 } 22384 } 22385 22386 var lvp = getLastValidPosition(pos.begin, true); 22387 22388 if (lvp < pos.begin || pos.begin === -1) { 22389 getMaskSet().p = seekNext(lvp); 22390 } else if (strict !== true) { 22391 getMaskSet().p = pos.begin; 22392 22393 if (fromIsValid !== true) { 22394 while (getMaskSet().p < lvp && getMaskSet().validPositions[getMaskSet().p] === undefined) { 22395 getMaskSet().p++; 22396 } 22397 } 22398 } 22399 } 22400 22401 function initializeColorMask(input) { 22402 var computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null); 22403 22404 function findCaretPos(clientx) { 22405 var e = document.createElement("span"), 22406 caretPos; 22407 22408 for (var style in computedStyle) { 22409 if (isNaN(style) && style.indexOf("font") !== -1) { 22410 e.style[style] = computedStyle[style]; 22411 } 22412 } 22413 22414 e.style.textTransform = computedStyle.textTransform; 22415 e.style.letterSpacing = computedStyle.letterSpacing; 22416 e.style.position = "absolute"; 22417 e.style.height = "auto"; 22418 e.style.width = "auto"; 22419 e.style.visibility = "hidden"; 22420 e.style.whiteSpace = "nowrap"; 22421 document.body.appendChild(e); 22422 22423 var inputText = input.inputmask._valueGet(), 22424 previousWidth = 0, 22425 itl; 22426 22427 for (caretPos = 0, itl = inputText.length; caretPos <= itl; caretPos++) { 22428 e.innerHTML += inputText.charAt(caretPos) || "_"; 22429 22430 if (e.offsetWidth >= clientx) { 22431 var offset1 = clientx - previousWidth; 22432 var offset2 = e.offsetWidth - clientx; 22433 e.innerHTML = inputText.charAt(caretPos); 22434 offset1 -= e.offsetWidth / 3; 22435 caretPos = offset1 < offset2 ? caretPos - 1 : caretPos; 22436 break; 22437 } 22438 22439 previousWidth = e.offsetWidth; 22440 } 22441 22442 document.body.removeChild(e); 22443 return caretPos; 22444 } 22445 22446 var template = document.createElement("div"); 22447 template.style.width = computedStyle.width; 22448 template.style.textAlign = computedStyle.textAlign; 22449 colorMask = document.createElement("div"); 22450 input.inputmask.colorMask = colorMask; 22451 colorMask.className = "im-colormask"; 22452 input.parentNode.insertBefore(colorMask, input); 22453 input.parentNode.removeChild(input); 22454 colorMask.appendChild(input); 22455 colorMask.appendChild(template); 22456 input.style.left = template.offsetLeft + "px"; 22457 $(colorMask).on("mouseleave", function (e) { 22458 return EventHandlers.mouseleaveEvent.call(input, [e]); 22459 }); 22460 $(colorMask).on("mouseenter", function (e) { 22461 return EventHandlers.mouseenterEvent.call(input, [e]); 22462 }); 22463 $(colorMask).on("click", function (e) { 22464 caret(input, findCaretPos(e.clientX)); 22465 return EventHandlers.clickEvent.call(input, [e]); 22466 }); 22467 } 22468 22469 Inputmask.prototype.positionColorMask = function (input, template) { 22470 input.style.left = template.offsetLeft + "px"; 22471 }; 22472 22473 function renderColorMask(input, caretPos, clear) { 22474 var maskTemplate = [], 22475 isStatic = false, 22476 test, 22477 testPos, 22478 ndxIntlzr, 22479 pos = 0; 22480 22481 function setEntry(entry) { 22482 if (entry === undefined) entry = ""; 22483 22484 if (!isStatic && (test.fn === null || testPos.input === undefined)) { 22485 isStatic = true; 22486 maskTemplate.push("<span class='im-static'>" + entry); 22487 } else if (isStatic && (test.fn !== null && testPos.input !== undefined || test.def === "")) { 22488 isStatic = false; 22489 var mtl = maskTemplate.length; 22490 maskTemplate[mtl - 1] = maskTemplate[mtl - 1] + "</span>"; 22491 maskTemplate.push(entry); 22492 } else maskTemplate.push(entry); 22493 } 22494 22495 function setCaret() { 22496 if (document.activeElement === input) { 22497 maskTemplate.splice(caretPos.begin, 0, caretPos.begin === caretPos.end || caretPos.end > getMaskSet().maskLength ? '<mark class="im-caret" style="border-right-width: 1px;border-right-style: solid;">' : '<mark class="im-caret-select">'); 22498 maskTemplate.splice(caretPos.end + 1, 0, "</mark>"); 22499 } 22500 } 22501 22502 if (colorMask !== undefined) { 22503 var buffer = getBuffer(); 22504 22505 if (caretPos === undefined) { 22506 caretPos = caret(input); 22507 } else if (caretPos.begin === undefined) { 22508 caretPos = { 22509 begin: caretPos, 22510 end: caretPos 22511 }; 22512 } 22513 22514 if (clear !== true) { 22515 var lvp = getLastValidPosition(); 22516 22517 do { 22518 if (getMaskSet().validPositions[pos]) { 22519 testPos = getMaskSet().validPositions[pos]; 22520 test = testPos.match; 22521 ndxIntlzr = testPos.locator.slice(); 22522 setEntry(buffer[pos]); 22523 } else { 22524 testPos = getTestTemplate(pos, ndxIntlzr, pos - 1); 22525 test = testPos.match; 22526 ndxIntlzr = testPos.locator.slice(); 22527 22528 if (opts.jitMasking === false || pos < lvp || typeof opts.jitMasking === "number" && isFinite(opts.jitMasking) && opts.jitMasking > pos) { 22529 setEntry(getPlaceholder(pos, test)); 22530 } else isStatic = false; 22531 } 22532 22533 pos++; 22534 } while ((maxLength === undefined || pos < maxLength) && (test.fn !== null || test.def !== "") || lvp > pos || isStatic); 22535 22536 if (isStatic) setEntry(); 22537 setCaret(); 22538 } 22539 22540 var template = colorMask.getElementsByTagName("div")[0]; 22541 template.innerHTML = maskTemplate.join(""); 22542 input.inputmask.positionColorMask(input, template); 22543 } 22544 } 22545 22546 function mask(elem) { 22547 function isElementTypeSupported(input, opts) { 22548 function patchValueProperty(npt) { 22549 var valueGet; 22550 var valueSet; 22551 22552 function patchValhook(type) { 22553 if ($.valHooks && ($.valHooks[type] === undefined || $.valHooks[type].inputmaskpatch !== true)) { 22554 var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function (elem) { 22555 return elem.value; 22556 }; 22557 var valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function (elem, value) { 22558 elem.value = value; 22559 return elem; 22560 }; 22561 $.valHooks[type] = { 22562 get: function get(elem) { 22563 if (elem.inputmask) { 22564 if (elem.inputmask.opts.autoUnmask) { 22565 return elem.inputmask.unmaskedvalue(); 22566 } else { 22567 var result = valhookGet(elem); 22568 return getLastValidPosition(undefined, undefined, elem.inputmask.maskset.validPositions) !== -1 || opts.nullable !== true ? result : ""; 22569 } 22570 } else return valhookGet(elem); 22571 }, 22572 set: function set(elem, value) { 22573 var $elem = $(elem), 22574 result; 22575 result = valhookSet(elem, value); 22576 22577 if (elem.inputmask) { 22578 $elem.trigger("setvalue", [value]); 22579 } 22580 22581 return result; 22582 }, 22583 inputmaskpatch: true 22584 }; 22585 } 22586 } 22587 22588 function getter() { 22589 if (this.inputmask) { 22590 return this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : getLastValidPosition() !== -1 || opts.nullable !== true ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join("") : valueGet.call(this) : ""; 22591 } else return valueGet.call(this); 22592 } 22593 22594 function setter(value) { 22595 valueSet.call(this, value); 22596 22597 if (this.inputmask) { 22598 $(this).trigger("setvalue", [value]); 22599 } 22600 } 22601 22602 function installNativeValueSetFallback(npt) { 22603 EventRuler.on(npt, "mouseenter", function (event) { 22604 var $input = $(this), 22605 input = this, 22606 value = input.inputmask._valueGet(); 22607 22608 if (value !== getBuffer().join("")) { 22609 $input.trigger("setvalue"); 22610 } 22611 }); 22612 } 22613 22614 if (!npt.inputmask.__valueGet) { 22615 if (opts.noValuePatching !== true) { 22616 if (Object.getOwnPropertyDescriptor) { 22617 if (typeof Object.getPrototypeOf !== "function") { 22618 Object.getPrototypeOf = _typeof("test".__proto__) === "object" ? function (object) { 22619 return object.__proto__; 22620 } : function (object) { 22621 return object.constructor.prototype; 22622 }; 22623 } 22624 22625 var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), "value") : undefined; 22626 22627 if (valueProperty && valueProperty.get && valueProperty.set) { 22628 valueGet = valueProperty.get; 22629 valueSet = valueProperty.set; 22630 Object.defineProperty(npt, "value", { 22631 get: getter, 22632 set: setter, 22633 configurable: true 22634 }); 22635 } else if (npt.tagName !== "INPUT") { 22636 valueGet = function valueGet() { 22637 return this.textContent; 22638 }; 22639 22640 valueSet = function valueSet(value) { 22641 this.textContent = value; 22642 }; 22643 22644 Object.defineProperty(npt, "value", { 22645 get: getter, 22646 set: setter, 22647 configurable: true 22648 }); 22649 } 22650 } else if (document.__lookupGetter__ && npt.__lookupGetter__("value")) { 22651 valueGet = npt.__lookupGetter__("value"); 22652 valueSet = npt.__lookupSetter__("value"); 22653 22654 npt.__defineGetter__("value", getter); 22655 22656 npt.__defineSetter__("value", setter); 22657 } 22658 22659 npt.inputmask.__valueGet = valueGet; 22660 npt.inputmask.__valueSet = valueSet; 22661 } 22662 22663 npt.inputmask._valueGet = function (overruleRTL) { 22664 return isRTL && overruleRTL !== true ? valueGet.call(this.el).split("").reverse().join("") : valueGet.call(this.el); 22665 }; 22666 22667 npt.inputmask._valueSet = function (value, overruleRTL) { 22668 valueSet.call(this.el, value === null || value === undefined ? "" : overruleRTL !== true && isRTL ? value.split("").reverse().join("") : value); 22669 }; 22670 22671 if (valueGet === undefined) { 22672 valueGet = function valueGet() { 22673 return this.value; 22674 }; 22675 22676 valueSet = function valueSet(value) { 22677 this.value = value; 22678 }; 22679 22680 patchValhook(npt.type); 22681 installNativeValueSetFallback(npt); 22682 } 22683 } 22684 } 22685 22686 var elementType = input.getAttribute("type"); 22687 var isSupported = input.tagName === "INPUT" && $.inArray(elementType, opts.supportsInputType) !== -1 || input.isContentEditable || input.tagName === "TEXTAREA"; 22688 22689 if (!isSupported) { 22690 if (input.tagName === "INPUT") { 22691 var el = document.createElement("input"); 22692 el.setAttribute("type", elementType); 22693 isSupported = el.type === "text"; 22694 el = null; 22695 } else isSupported = "partial"; 22696 } 22697 22698 if (isSupported !== false) { 22699 patchValueProperty(input); 22700 } else input.inputmask = undefined; 22701 22702 return isSupported; 22703 } 22704 22705 EventRuler.off(elem); 22706 var isSupported = isElementTypeSupported(elem, opts); 22707 22708 if (isSupported !== false) { 22709 el = elem; 22710 $el = $(el); 22711 originalPlaceholder = el.placeholder; 22712 maxLength = el !== undefined ? el.maxLength : undefined; 22713 if (maxLength === -1) maxLength = undefined; 22714 22715 if (opts.colorMask === true) { 22716 initializeColorMask(el); 22717 } 22718 22719 if (mobile) { 22720 if ("inputmode" in el) { 22721 el.inputmode = opts.inputmode; 22722 el.setAttribute("inputmode", opts.inputmode); 22723 } 22724 22725 if (opts.disablePredictiveText === true) { 22726 if ("autocorrect" in el) { 22727 el.autocorrect = false; 22728 } else { 22729 if (opts.colorMask !== true) { 22730 initializeColorMask(el); 22731 } 22732 22733 el.type = "password"; 22734 } 22735 } 22736 } 22737 22738 if (isSupported === true) { 22739 el.setAttribute("im-insert", opts.insertMode); 22740 EventRuler.on(el, "submit", EventHandlers.submitEvent); 22741 EventRuler.on(el, "reset", EventHandlers.resetEvent); 22742 EventRuler.on(el, "blur", EventHandlers.blurEvent); 22743 EventRuler.on(el, "focus", EventHandlers.focusEvent); 22744 22745 if (opts.colorMask !== true) { 22746 EventRuler.on(el, "click", EventHandlers.clickEvent); 22747 EventRuler.on(el, "mouseleave", EventHandlers.mouseleaveEvent); 22748 EventRuler.on(el, "mouseenter", EventHandlers.mouseenterEvent); 22749 } 22750 22751 EventRuler.on(el, "paste", EventHandlers.pasteEvent); 22752 EventRuler.on(el, "cut", EventHandlers.cutEvent); 22753 EventRuler.on(el, "complete", opts.oncomplete); 22754 EventRuler.on(el, "incomplete", opts.onincomplete); 22755 EventRuler.on(el, "cleared", opts.oncleared); 22756 22757 if (!mobile && opts.inputEventOnly !== true) { 22758 EventRuler.on(el, "keydown", EventHandlers.keydownEvent); 22759 EventRuler.on(el, "keypress", EventHandlers.keypressEvent); 22760 } else { 22761 el.removeAttribute("maxLength"); 22762 } 22763 22764 EventRuler.on(el, "input", EventHandlers.inputFallBackEvent); 22765 EventRuler.on(el, "beforeinput", EventHandlers.beforeInputEvent); 22766 } 22767 22768 EventRuler.on(el, "setvalue", EventHandlers.setValueEvent); 22769 undoValue = getBufferTemplate().join(""); 22770 22771 if (el.inputmask._valueGet(true) !== "" || opts.clearMaskOnLostFocus === false || document.activeElement === el) { 22772 var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, el.inputmask._valueGet(true), opts) || el.inputmask._valueGet(true) : el.inputmask._valueGet(true); 22773 if (initialValue !== "") checkVal(el, true, false, initialValue.split("")); 22774 var buffer = getBuffer().slice(); 22775 undoValue = buffer.join(""); 22776 22777 if (isComplete(buffer) === false) { 22778 if (opts.clearIncomplete) { 22779 resetMaskSet(); 22780 } 22781 } 22782 22783 if (opts.clearMaskOnLostFocus && document.activeElement !== el) { 22784 if (getLastValidPosition() === -1) { 22785 buffer = []; 22786 } else { 22787 clearOptionalTail(buffer); 22788 } 22789 } 22790 22791 if (opts.clearMaskOnLostFocus === false || opts.showMaskOnFocus && document.activeElement === el || el.inputmask._valueGet(true) !== "") writeBuffer(el, buffer); 22792 22793 if (document.activeElement === el) { 22794 caret(el, seekNext(getLastValidPosition())); 22795 } 22796 } 22797 } 22798 } 22799 22800 var valueBuffer; 22801 22802 if (actionObj !== undefined) { 22803 switch (actionObj.action) { 22804 case "isComplete": 22805 el = actionObj.el; 22806 return isComplete(getBuffer()); 22807 22808 case "unmaskedvalue": 22809 if (el === undefined || actionObj.value !== undefined) { 22810 valueBuffer = actionObj.value; 22811 valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, valueBuffer, opts) || valueBuffer : valueBuffer).split(""); 22812 checkVal.call(this, undefined, false, false, valueBuffer); 22813 if ($.isFunction(opts.onBeforeWrite)) opts.onBeforeWrite.call(inputmask, undefined, getBuffer(), 0, opts); 22814 } 22815 22816 return unmaskedvalue(el); 22817 22818 case "mask": 22819 mask(el); 22820 break; 22821 22822 case "format": 22823 valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, actionObj.value, opts) || actionObj.value : actionObj.value).split(""); 22824 checkVal.call(this, undefined, true, false, valueBuffer); 22825 22826 if (actionObj.metadata) { 22827 return { 22828 value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""), 22829 metadata: maskScope.call(this, { 22830 action: "getmetadata" 22831 }, maskset, opts) 22832 }; 22833 } 22834 22835 return isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""); 22836 22837 case "isValid": 22838 if (actionObj.value) { 22839 valueBuffer = actionObj.value.split(""); 22840 checkVal.call(this, undefined, true, true, valueBuffer); 22841 } else { 22842 actionObj.value = getBuffer().join(""); 22843 } 22844 22845 var buffer = getBuffer(); 22846 var rl = determineLastRequiredPosition(), 22847 lmib = buffer.length - 1; 22848 22849 for (; lmib > rl; lmib--) { 22850 if (isMask(lmib)) break; 22851 } 22852 22853 buffer.splice(rl, lmib + 1 - rl); 22854 return isComplete(buffer) && actionObj.value === getBuffer().join(""); 22855 22856 case "getemptymask": 22857 return getBufferTemplate().join(""); 22858 22859 case "remove": 22860 if (el && el.inputmask) { 22861 $.data(el, "_inputmask_opts", null); 22862 $el = $(el); 22863 22864 el.inputmask._valueSet(opts.autoUnmask ? unmaskedvalue(el) : el.inputmask._valueGet(true)); 22865 22866 EventRuler.off(el); 22867 22868 if (el.inputmask.colorMask) { 22869 colorMask = el.inputmask.colorMask; 22870 colorMask.removeChild(el); 22871 colorMask.parentNode.insertBefore(el, colorMask); 22872 colorMask.parentNode.removeChild(colorMask); 22873 } 22874 22875 var valueProperty; 22876 22877 if (Object.getOwnPropertyDescriptor && Object.getPrototypeOf) { 22878 valueProperty = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), "value"); 22879 22880 if (valueProperty) { 22881 if (el.inputmask.__valueGet) { 22882 Object.defineProperty(el, "value", { 22883 get: el.inputmask.__valueGet, 22884 set: el.inputmask.__valueSet, 22885 configurable: true 22886 }); 22887 } 22888 } 22889 } else if (document.__lookupGetter__ && el.__lookupGetter__("value")) { 22890 if (el.inputmask.__valueGet) { 22891 el.__defineGetter__("value", el.inputmask.__valueGet); 22892 22893 el.__defineSetter__("value", el.inputmask.__valueSet); 22894 } 22895 } 22896 22897 el.inputmask = undefined; 22898 } 22899 22900 return el; 22901 break; 22902 22903 case "getmetadata": 22904 if ($.isArray(maskset.metadata)) { 22905 var maskTarget = getMaskTemplate(true, 0, false).join(""); 22906 $.each(maskset.metadata, function (ndx, mtdt) { 22907 if (mtdt.mask === maskTarget) { 22908 maskTarget = mtdt; 22909 return false; 22910 } 22911 }); 22912 return maskTarget; 22913 } 22914 22915 return maskset.metadata; 22916 } 22917 } 22918 } 22919 22920 return Inputmask; 22921}); 22922 22923/***/ }), 22924
vendor: 26,127 bytes, lines 22925-23582
22925/***/ "../node_modules/inputmask/dist/inputmask/inputmask.numeric.extensions.js": 22926/*!********************************************************************************!*\ 22927 !*** ../node_modules/inputmask/dist/inputmask/inputmask.numeric.extensions.js ***! 22928 \********************************************************************************/ 22929/*! no static exports found */ 22930/***/ (function(module, exports, __webpack_require__) { 22931 22932var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 22933 22934/*! 22935* inputmask.numeric.extensions.js 22936* https://github.com/RobinHerbots/Inputmask 22937* Copyright (c) 2010 - 2019 Robin Herbots 22938* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 22939* Version: 4.0.6 22940*/ 22941(function (factory) { 22942 if (true) { 22943 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./inputmask */ "../node_modules/inputmask/dist/inputmask/inputmask.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 22944 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 22945 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 22946 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 22947 } else {} 22948})(function (Inputmask) { 22949 var $ = Inputmask.dependencyLib; 22950 22951 function autoEscape(txt, opts) { 22952 var escapedTxt = ""; 22953 22954 for (var i = 0; i < txt.length; i++) { 22955 if (Inputmask.prototype.definitions[txt.charAt(i)] || opts.definitions[txt.charAt(i)] || opts.optionalmarker.start === txt.charAt(i) || opts.optionalmarker.end === txt.charAt(i) || opts.quantifiermarker.start === txt.charAt(i) || opts.quantifiermarker.end === txt.charAt(i) || opts.groupmarker.start === txt.charAt(i) || opts.groupmarker.end === txt.charAt(i) || opts.alternatormarker === txt.charAt(i)) { 22956 escapedTxt += "\\" + txt.charAt(i); 22957 } else escapedTxt += txt.charAt(i); 22958 } 22959 22960 return escapedTxt; 22961 } 22962 22963 function alignDigits(buffer, digits, opts) { 22964 if (digits > 0) { 22965 var radixPosition = $.inArray(opts.radixPoint, buffer); 22966 22967 if (radixPosition === -1) { 22968 buffer.push(opts.radixPoint); 22969 radixPosition = buffer.length - 1; 22970 } 22971 22972 for (var i = 1; i <= digits; i++) { 22973 buffer[radixPosition + i] = buffer[radixPosition + i] || "0"; 22974 } 22975 } 22976 22977 return buffer; 22978 } 22979 22980 Inputmask.extendAliases({ 22981 numeric: { 22982 mask: function mask(opts) { 22983 if (opts.repeat !== 0 && isNaN(opts.integerDigits)) { 22984 opts.integerDigits = opts.repeat; 22985 } 22986 22987 opts.repeat = 0; 22988 22989 if (opts.groupSeparator === opts.radixPoint && opts.digits && opts.digits !== "0") { 22990 if (opts.radixPoint === ".") { 22991 opts.groupSeparator = ","; 22992 } else if (opts.radixPoint === ",") { 22993 opts.groupSeparator = "."; 22994 } else opts.groupSeparator = ""; 22995 } 22996 22997 if (opts.groupSeparator === " ") { 22998 opts.skipOptionalPartCharacter = undefined; 22999 } 23000 23001 opts.autoGroup = opts.autoGroup && opts.groupSeparator !== ""; 23002 23003 if (opts.autoGroup) { 23004 if (typeof opts.groupSize == "string" && isFinite(opts.groupSize)) opts.groupSize = parseInt(opts.groupSize); 23005 23006 if (isFinite(opts.integerDigits)) { 23007 var seps = Math.floor(opts.integerDigits / opts.groupSize); 23008 var mod = opts.integerDigits % opts.groupSize; 23009 opts.integerDigits = parseInt(opts.integerDigits) + (mod === 0 ? seps - 1 : seps); 23010 23011 if (opts.integerDigits < 1) { 23012 opts.integerDigits = "*"; 23013 } 23014 } 23015 } 23016 23017 if (opts.placeholder.length > 1) { 23018 opts.placeholder = opts.placeholder.charAt(0); 23019 } 23020 23021 if (opts.positionCaretOnClick === "radixFocus" && opts.placeholder === "" && opts.integerOptional === false) { 23022 opts.positionCaretOnClick = "lvp"; 23023 } 23024 23025 opts.definitions[";"] = opts.definitions["~"]; 23026 opts.definitions[";"].definitionSymbol = "~"; 23027 23028 if (opts.numericInput === true) { 23029 opts.positionCaretOnClick = opts.positionCaretOnClick === "radixFocus" ? "lvp" : opts.positionCaretOnClick; 23030 opts.digitsOptional = false; 23031 if (isNaN(opts.digits)) opts.digits = 2; 23032 opts.decimalProtect = false; 23033 } 23034 23035 var mask = "[+]"; 23036 mask += autoEscape(opts.prefix, opts); 23037 23038 if (opts.integerOptional === true) { 23039 mask += "~{1," + opts.integerDigits + "}"; 23040 } else mask += "~{" + opts.integerDigits + "}"; 23041 23042 if (opts.digits !== undefined) { 23043 var radixDef = opts.decimalProtect ? ":" : opts.radixPoint; 23044 var dq = opts.digits.toString().split(","); 23045 23046 if (isFinite(dq[0]) && dq[1] && isFinite(dq[1])) { 23047 mask += radixDef + ";{" + opts.digits + "}"; 23048 } else if (isNaN(opts.digits) || parseInt(opts.digits) > 0) { 23049 if (opts.digitsOptional) { 23050 mask += "[" + radixDef + ";{1," + opts.digits + "}]"; 23051 } else mask += radixDef + ";{" + opts.digits + "}"; 23052 } 23053 } 23054 23055 mask += autoEscape(opts.suffix, opts); 23056 mask += "[-]"; 23057 opts.greedy = false; 23058 return mask; 23059 }, 23060 placeholder: "", 23061 greedy: false, 23062 digits: "*", 23063 digitsOptional: true, 23064 enforceDigitsOnBlur: false, 23065 radixPoint: ".", 23066 positionCaretOnClick: "radixFocus", 23067 groupSize: 3, 23068 groupSeparator: "", 23069 autoGroup: false, 23070 allowMinus: true, 23071 negationSymbol: { 23072 front: "-", 23073 back: "" 23074 }, 23075 integerDigits: "+", 23076 integerOptional: true, 23077 prefix: "", 23078 suffix: "", 23079 rightAlign: true, 23080 decimalProtect: true, 23081 min: null, 23082 max: null, 23083 step: 1, 23084 insertMode: true, 23085 autoUnmask: false, 23086 unmaskAsNumber: false, 23087 inputType: "text", 23088 inputmode: "numeric", 23089 preValidation: function preValidation(buffer, pos, c, isSelection, opts, maskset) { 23090 if (c === "-" || c === opts.negationSymbol.front) { 23091 if (opts.allowMinus !== true) return false; 23092 opts.isNegative = opts.isNegative === undefined ? true : !opts.isNegative; 23093 if (buffer.join("") === "") return true; 23094 return { 23095 caret: maskset.validPositions[pos] ? pos : undefined, 23096 dopost: true 23097 }; 23098 } 23099 23100 if (isSelection === false && c === opts.radixPoint && opts.digits !== undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) { 23101 var radixPos = $.inArray(opts.radixPoint, buffer); 23102 23103 if (radixPos !== -1 && maskset.validPositions[radixPos] !== undefined) { 23104 if (opts.numericInput === true) { 23105 return pos === radixPos; 23106 } 23107 23108 return { 23109 caret: radixPos + 1 23110 }; 23111 } 23112 } 23113 23114 return true; 23115 }, 23116 postValidation: function postValidation(buffer, pos, currentResult, opts) { 23117 function buildPostMask(buffer, opts) { 23118 var postMask = ""; 23119 postMask += "(" + opts.groupSeparator + "*{" + opts.groupSize + "}){*}"; 23120 23121 if (opts.radixPoint !== "") { 23122 var radixSplit = buffer.join("").split(opts.radixPoint); 23123 23124 if (radixSplit[1]) { 23125 postMask += opts.radixPoint + "*{" + radixSplit[1].match(/^\d*\??\d*/)[0].length + "}"; 23126 } 23127 } 23128 23129 return postMask; 23130 } 23131 23132 var suffix = opts.suffix.split(""), 23133 prefix = opts.prefix.split(""); 23134 if (currentResult.pos === undefined && currentResult.caret !== undefined && currentResult.dopost !== true) return currentResult; 23135 var caretPos = currentResult.caret !== undefined ? currentResult.caret : currentResult.pos; 23136 var maskedValue = buffer.slice(); 23137 23138 if (opts.numericInput) { 23139 caretPos = maskedValue.length - caretPos - 1; 23140 maskedValue = maskedValue.reverse(); 23141 } 23142 23143 var charAtPos = maskedValue[caretPos]; 23144 23145 if (charAtPos === opts.groupSeparator) { 23146 caretPos += 1; 23147 charAtPos = maskedValue[caretPos]; 23148 } 23149 23150 if (caretPos === maskedValue.length - opts.suffix.length - 1 && charAtPos === opts.radixPoint) return currentResult; 23151 23152 if (charAtPos !== undefined) { 23153 if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) { 23154 maskedValue[caretPos] = "?"; 23155 23156 if (opts.prefix.length > 0 && caretPos >= (opts.isNegative === false ? 1 : 0) && caretPos < opts.prefix.length - 1 + (opts.isNegative === false ? 1 : 0)) { 23157 prefix[caretPos - (opts.isNegative === false ? 1 : 0)] = "?"; 23158 } else if (opts.suffix.length > 0 && caretPos >= maskedValue.length - opts.suffix.length - (opts.isNegative === false ? 1 : 0)) { 23159 suffix[caretPos - (maskedValue.length - opts.suffix.length - (opts.isNegative === false ? 1 : 0))] = "?"; 23160 } 23161 } 23162 } 23163 23164 prefix = prefix.join(""); 23165 suffix = suffix.join(""); 23166 var processValue = maskedValue.join("").replace(prefix, ""); 23167 processValue = processValue.replace(suffix, ""); 23168 processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""); 23169 processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), ""); 23170 processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""); 23171 23172 if (isNaN(opts.placeholder)) { 23173 processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.placeholder), "g"), ""); 23174 } 23175 23176 if (processValue.length > 1 && processValue.indexOf(opts.radixPoint) !== 1) { 23177 if (charAtPos === "0") { 23178 processValue = processValue.replace(/^\?/g, ""); 23179 } 23180 23181 processValue = processValue.replace(/^0/g, ""); 23182 } 23183 23184 if (processValue.charAt(0) === opts.radixPoint && opts.radixPoint !== "" && opts.numericInput !== true) { 23185 processValue = "0" + processValue; 23186 } 23187 23188 if (processValue !== "") { 23189 processValue = processValue.split(""); 23190 23191 if ((!opts.digitsOptional || opts.enforceDigitsOnBlur && currentResult.event === "blur") && isFinite(opts.digits)) { 23192 var radixPosition = $.inArray(opts.radixPoint, processValue); 23193 var rpb = $.inArray(opts.radixPoint, maskedValue); 23194 23195 if (radixPosition === -1) { 23196 processValue.push(opts.radixPoint); 23197 radixPosition = processValue.length - 1; 23198 } 23199 23200 for (var i = 1; i <= opts.digits; i++) { 23201 if ((!opts.digitsOptional || opts.enforceDigitsOnBlur && currentResult.event === "blur") && (processValue[radixPosition + i] === undefined || processValue[radixPosition + i] === opts.placeholder.charAt(0))) { 23202 processValue[radixPosition + i] = currentResult.placeholder || opts.placeholder.charAt(0); 23203 } else if (rpb !== -1 && maskedValue[rpb + i] !== undefined) { 23204 processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i]; 23205 } 23206 } 23207 } 23208 23209 if (opts.autoGroup === true && opts.groupSeparator !== "" && (charAtPos !== opts.radixPoint || currentResult.pos !== undefined || currentResult.dopost)) { 23210 var addRadix = processValue[processValue.length - 1] === opts.radixPoint && currentResult.c === opts.radixPoint; 23211 processValue = Inputmask(buildPostMask(processValue, opts), { 23212 numericInput: true, 23213 jitMasking: true, 23214 definitions: { 23215 "*": { 23216 validator: "[0-9?]", 23217 cardinality: 1 23218 } 23219 } 23220 }).format(processValue.join("")); 23221 if (addRadix) processValue += opts.radixPoint; 23222 23223 if (processValue.charAt(0) === opts.groupSeparator) { 23224 processValue.substr(1); 23225 } 23226 } else processValue = processValue.join(""); 23227 } 23228 23229 if (opts.isNegative && currentResult.event === "blur") { 23230 opts.isNegative = processValue !== "0"; 23231 } 23232 23233 processValue = prefix + processValue; 23234 processValue += suffix; 23235 23236 if (opts.isNegative) { 23237 processValue = opts.negationSymbol.front + processValue; 23238 processValue += opts.negationSymbol.back; 23239 } 23240 23241 processValue = processValue.split(""); 23242 23243 if (charAtPos !== undefined) { 23244 if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) { 23245 caretPos = $.inArray("?", processValue); 23246 23247 if (caretPos > -1) { 23248 processValue[caretPos] = charAtPos; 23249 } else caretPos = currentResult.caret || 0; 23250 } else if (charAtPos === opts.radixPoint || charAtPos === opts.negationSymbol.front || charAtPos === opts.negationSymbol.back) { 23251 var newCaretPos = $.inArray(charAtPos, processValue); 23252 if (newCaretPos !== -1) caretPos = newCaretPos; 23253 } 23254 } 23255 23256 if (opts.numericInput) { 23257 caretPos = processValue.length - caretPos - 1; 23258 processValue = processValue.reverse(); 23259 } 23260 23261 var rslt = { 23262 caret: (charAtPos === undefined || currentResult.pos !== undefined) && caretPos !== undefined ? caretPos + (opts.numericInput ? -1 : 1) : caretPos, 23263 buffer: processValue, 23264 refreshFromBuffer: currentResult.dopost || buffer.join("") !== processValue.join("") 23265 }; 23266 return rslt.refreshFromBuffer ? rslt : currentResult; 23267 }, 23268 onBeforeWrite: function onBeforeWrite(e, buffer, caretPos, opts) { 23269 function parseMinMaxOptions(opts) { 23270 if (opts.parseMinMaxOptions === undefined) { 23271 if (opts.min !== null) { 23272 opts.min = opts.min.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""); 23273 if (opts.radixPoint === ",") opts.min = opts.min.replace(opts.radixPoint, "."); 23274 opts.min = isFinite(opts.min) ? parseFloat(opts.min) : NaN; 23275 if (isNaN(opts.min)) opts.min = Number.MIN_VALUE; 23276 } 23277 23278 if (opts.max !== null) { 23279 opts.max = opts.max.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""); 23280 if (opts.radixPoint === ",") opts.max = opts.max.replace(opts.radixPoint, "."); 23281 opts.max = isFinite(opts.max) ? parseFloat(opts.max) : NaN; 23282 if (isNaN(opts.max)) opts.max = Number.MAX_VALUE; 23283 } 23284 23285 opts.parseMinMaxOptions = "done"; 23286 } 23287 } 23288 23289 if (e) { 23290 switch (e.type) { 23291 case "keydown": 23292 return opts.postValidation(buffer, caretPos, { 23293 caret: caretPos, 23294 dopost: true 23295 }, opts); 23296 23297 case "blur": 23298 case "checkval": 23299 var unmasked; 23300 parseMinMaxOptions(opts); 23301 23302 if (opts.min !== null || opts.max !== null) { 23303 unmasked = opts.onUnMask(buffer.join(""), undefined, $.extend({}, opts, { 23304 unmaskAsNumber: true 23305 })); 23306 23307 if (opts.min !== null && unmasked < opts.min) { 23308 opts.isNegative = opts.min < 0; 23309 return opts.postValidation(opts.min.toString().replace(".", opts.radixPoint).split(""), caretPos, { 23310 caret: caretPos, 23311 dopost: true, 23312 placeholder: "0" 23313 }, opts); 23314 } else if (opts.max !== null && unmasked > opts.max) { 23315 opts.isNegative = opts.max < 0; 23316 return opts.postValidation(opts.max.toString().replace(".", opts.radixPoint).split(""), caretPos, { 23317 caret: caretPos, 23318 dopost: true, 23319 placeholder: "0" 23320 }, opts); 23321 } 23322 } 23323 23324 return opts.postValidation(buffer, caretPos, { 23325 caret: caretPos, 23326 placeholder: "0", 23327 event: "blur" 23328 }, opts); 23329 23330 case "_checkval": 23331 return { 23332 caret: caretPos 23333 }; 23334 23335 default: 23336 break; 23337 } 23338 } 23339 }, 23340 regex: { 23341 integerPart: function integerPart(opts, emptyCheck) { 23342 return emptyCheck ? new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?") : new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+"); 23343 }, 23344 integerNPart: function integerNPart(opts) { 23345 return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + Inputmask.escapeRegex(opts.placeholder.charAt(0)) + "]+"); 23346 } 23347 }, 23348 definitions: { 23349 "~": { 23350 validator: function validator(chrs, maskset, pos, strict, opts, isSelection) { 23351 var isValid, l; 23352 23353 if (chrs === "k" || chrs === "m") { 23354 isValid = { 23355 insert: [], 23356 c: 0 23357 }; 23358 23359 for (var i = 0, l = chrs === "k" ? 2 : 5; i < l; i++) { 23360 isValid.insert.push({ 23361 pos: pos + i, 23362 c: 0 23363 }); 23364 } 23365 23366 isValid.pos = pos + l; 23367 return isValid; 23368 } 23369 23370 isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs); 23371 23372 if (isValid === true) { 23373 if (opts.numericInput !== true && maskset.validPositions[pos] !== undefined && maskset.validPositions[pos].match.def === "~" && !isSelection) { 23374 var processValue = maskset.buffer.join(""); 23375 processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), ""); 23376 processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""); 23377 var pvRadixSplit = processValue.split(opts.radixPoint); 23378 23379 if (pvRadixSplit.length > 1) { 23380 pvRadixSplit[1] = pvRadixSplit[1].replace(/0/g, opts.placeholder.charAt(0)); 23381 } 23382 23383 if (pvRadixSplit[0] === "0") { 23384 pvRadixSplit[0] = pvRadixSplit[0].replace(/0/g, opts.placeholder.charAt(0)); 23385 } 23386 23387 processValue = pvRadixSplit[0] + opts.radixPoint + pvRadixSplit[1] || ""; 23388 23389 var bufferTemplate = maskset._buffer.join(""); 23390 23391 if (processValue === opts.radixPoint) { 23392 processValue = bufferTemplate; 23393 } 23394 23395 while (processValue.match(Inputmask.escapeRegex(bufferTemplate) + "$") === null) { 23396 bufferTemplate = bufferTemplate.slice(1); 23397 } 23398 23399 processValue = processValue.replace(bufferTemplate, ""); 23400 processValue = processValue.split(""); 23401 23402 if (processValue[pos] === undefined) { 23403 isValid = { 23404 pos: pos, 23405 remove: pos 23406 }; 23407 } else { 23408 isValid = { 23409 pos: pos 23410 }; 23411 } 23412 } 23413 } else if (!strict && chrs === opts.radixPoint && maskset.validPositions[pos - 1] === undefined) { 23414 isValid = { 23415 insert: { 23416 pos: pos, 23417 c: 0 23418 }, 23419 pos: pos + 1 23420 }; 23421 } 23422 23423 return isValid; 23424 }, 23425 cardinality: 1 23426 }, 23427 "+": { 23428 validator: function validator(chrs, maskset, pos, strict, opts) { 23429 return opts.allowMinus && (chrs === "-" || chrs === opts.negationSymbol.front); 23430 }, 23431 cardinality: 1, 23432 placeholder: "" 23433 }, 23434 "-": { 23435 validator: function validator(chrs, maskset, pos, strict, opts) { 23436 return opts.allowMinus && chrs === opts.negationSymbol.back; 23437 }, 23438 cardinality: 1, 23439 placeholder: "" 23440 }, 23441 ":": { 23442 validator: function validator(chrs, maskset, pos, strict, opts) { 23443 var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + "]"; 23444 var isValid = new RegExp(radix).test(chrs); 23445 23446 if (isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint) { 23447 isValid = { 23448 caret: pos + 1 23449 }; 23450 } 23451 23452 return isValid; 23453 }, 23454 cardinality: 1, 23455 placeholder: function placeholder(opts) { 23456 return opts.radixPoint; 23457 } 23458 } 23459 }, 23460 onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) { 23461 if (unmaskedValue === "" && opts.nullable === true) { 23462 return unmaskedValue; 23463 } 23464 23465 var processValue = maskedValue.replace(opts.prefix, ""); 23466 processValue = processValue.replace(opts.suffix, ""); 23467 processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""); 23468 23469 if (opts.placeholder.charAt(0) !== "") { 23470 processValue = processValue.replace(new RegExp(opts.placeholder.charAt(0), "g"), "0"); 23471 } 23472 23473 if (opts.unmaskAsNumber) { 23474 if (opts.radixPoint !== "" && processValue.indexOf(opts.radixPoint) !== -1) processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), "."); 23475 processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-"); 23476 processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""); 23477 return Number(processValue); 23478 } 23479 23480 return processValue; 23481 }, 23482 isComplete: function isComplete(buffer, opts) { 23483 var maskedValue = (opts.numericInput ? buffer.slice().reverse() : buffer).join(""); 23484 maskedValue = maskedValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-"); 23485 maskedValue = maskedValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""); 23486 maskedValue = maskedValue.replace(opts.prefix, ""); 23487 maskedValue = maskedValue.replace(opts.suffix, ""); 23488 maskedValue = maskedValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator) + "([0-9]{3})", "g"), "$1"); 23489 if (opts.radixPoint === ",") maskedValue = maskedValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."); 23490 return isFinite(maskedValue); 23491 }, 23492 onBeforeMask: function onBeforeMask(initialValue, opts) { 23493 opts.isNegative = undefined; 23494 var radixPoint = opts.radixPoint || ","; 23495 23496 if ((typeof initialValue == "number" || opts.inputType === "number") && radixPoint !== "") { 23497 initialValue = initialValue.toString().replace(".", radixPoint); 23498 } 23499 23500 var valueParts = initialValue.split(radixPoint), 23501 integerPart = valueParts[0].replace(/[^\-0-9]/g, ""), 23502 decimalPart = valueParts.length > 1 ? valueParts[1].replace(/[^0-9]/g, "") : ""; 23503 initialValue = integerPart + (decimalPart !== "" ? radixPoint + decimalPart : decimalPart); 23504 var digits = 0; 23505 23506 if (radixPoint !== "") { 23507 digits = decimalPart.length; 23508 23509 if (decimalPart !== "") { 23510 var digitsFactor = Math.pow(10, digits || 1); 23511 23512 if (isFinite(opts.digits)) { 23513 digits = parseInt(opts.digits); 23514 digitsFactor = Math.pow(10, digits); 23515 } 23516 23517 initialValue = initialValue.replace(Inputmask.escapeRegex(radixPoint), "."); 23518 if (isFinite(initialValue)) initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor; 23519 initialValue = initialValue.toString().replace(".", radixPoint); 23520 } 23521 } 23522 23523 if (opts.digits === 0 && initialValue.indexOf(Inputmask.escapeRegex(radixPoint)) !== -1) { 23524 initialValue = initialValue.substring(0, initialValue.indexOf(Inputmask.escapeRegex(radixPoint))); 23525 } 23526 23527 return alignDigits(initialValue.toString().split(""), digits, opts).join(""); 23528 }, 23529 onKeyDown: function onKeyDown(e, buffer, caretPos, opts) { 23530 var $input = $(this); 23531 23532 if (e.ctrlKey) { 23533 switch (e.keyCode) { 23534 case Inputmask.keyCode.UP: 23535 $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)); 23536 $input.trigger("setvalue"); 23537 break; 23538 23539 case Inputmask.keyCode.DOWN: 23540 $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)); 23541 $input.trigger("setvalue"); 23542 break; 23543 } 23544 } 23545 } 23546 }, 23547 currency: { 23548 prefix: "$ ", 23549 groupSeparator: ",", 23550 alias: "numeric", 23551 placeholder: "0", 23552 autoGroup: true, 23553 digits: 2, 23554 digitsOptional: false, 23555 clearMaskOnLostFocus: false 23556 }, 23557 decimal: { 23558 alias: "numeric" 23559 }, 23560 integer: { 23561 alias: "numeric", 23562 digits: 0, 23563 radixPoint: "" 23564 }, 23565 percentage: { 23566 alias: "numeric", 23567 digits: 2, 23568 digitsOptional: true, 23569 radixPoint: ".", 23570 placeholder: "0", 23571 autoGroup: false, 23572 min: 0, 23573 max: 100, 23574 suffix: " %", 23575 allowMinus: false 23576 } 23577 }); 23578 return Inputmask; 23579}); 23580 23581/***/ }), 23582
vendor: 850 bytes, lines 23583-23599
23583/***/ "../node_modules/inputmask/index.js": 23584/*!******************************************!*\ 23585 !*** ../node_modules/inputmask/index.js ***! 23586 \******************************************/ 23587/*! no static exports found */ 23588/***/ (function(module, exports, __webpack_require__) { 23589 23590__webpack_require__(/*! ./dist/inputmask/inputmask.extensions */ "../node_modules/inputmask/dist/inputmask/inputmask.extensions.js"); 23591 23592__webpack_require__(/*! ./dist/inputmask/inputmask.date.extensions */ "../node_modules/inputmask/dist/inputmask/inputmask.date.extensions.js"); 23593 23594__webpack_require__(/*! ./dist/inputmask/inputmask.numeric.extensions */ "../node_modules/inputmask/dist/inputmask/inputmask.numeric.extensions.js"); 23595 23596module.exports = __webpack_require__(/*! ./dist/inputmask/inputmask.js */ "../node_modules/inputmask/dist/inputmask/inputmask.js"); 23597 23598/***/ }), 23599
vendor: 300,076 bytes, lines 23600-32732
23600/***/ "../node_modules/jquery/dist/jquery.js": 23601/*!*********************************************!*\ 23602 !*** ../node_modules/jquery/dist/jquery.js ***! 23603 \*********************************************/ 23604/*! no static exports found */ 23605/***/ (function(module, exports, __webpack_require__) { 23606 23607/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 23608 23609/*! 23610 * jQuery JavaScript Library v3.3.1 23611 * https://jquery.com/ 23612 * 23613 * Includes Sizzle.js 23614 * https://sizzlejs.com/ 23615 * 23616 * Copyright JS Foundation and other contributors 23617 * Released under the MIT license 23618 * https://jquery.org/license 23619 * 23620 * Date: 2018-01-20T17:24Z 23621 */ 23622(function (global, factory) { 23623 "use strict"; 23624 23625 if (( false ? undefined : _typeof(module)) === "object" && _typeof(module.exports) === "object") { 23626 // For CommonJS and CommonJS-like environments where a proper `window` 23627 // is present, execute the factory and get jQuery. 23628 // For environments that do not have a `window` with a `document` 23629 // (such as Node.js), expose a factory as module.exports. 23630 // This accentuates the need for the creation of a real `window`. 23631 // e.g. var jQuery = require("jquery")(window); 23632 // See ticket #14549 for more info. 23633 module.exports = global.document ? factory(global, true) : function (w) { 23634 if (!w.document) { 23635 throw new Error("jQuery requires a window with a document"); 23636 } 23637 23638 return factory(w); 23639 }; 23640 } else { 23641 factory(global); 23642 } // Pass this if window is not defined yet 23643 23644})(typeof window !== "undefined" ? window : this, function (window, noGlobal) { 23645 // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 23646 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 23647 // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 23648 // enough that all such attempts are guarded in a try block. 23649 "use strict"; 23650 23651 var arr = []; 23652 var document = window.document; 23653 var getProto = Object.getPrototypeOf; 23654 var _slice = arr.slice; 23655 var concat = arr.concat; 23656 var push = arr.push; 23657 var indexOf = arr.indexOf; 23658 var class2type = {}; 23659 var toString = class2type.toString; 23660 var hasOwn = class2type.hasOwnProperty; 23661 var fnToString = hasOwn.toString; 23662 var ObjectFunctionString = fnToString.call(Object); 23663 var support = {}; 23664 23665 var isFunction = function isFunction(obj) { 23666 // Support: Chrome <=57, Firefox <=52 23667 // In some browsers, typeof returns "function" for HTML <object> elements 23668 // (i.e., `typeof document.createElement( "object" ) === "function"`). 23669 // We don't want to classify *any* DOM node as a function. 23670 return typeof obj === "function" && typeof obj.nodeType !== "number"; 23671 }; 23672 23673 var isWindow = function isWindow(obj) { 23674 return obj != null && obj === obj.window; 23675 }; 23676 23677 var preservedScriptAttributes = { 23678 type: true, 23679 src: true, 23680 noModule: true 23681 }; 23682 23683 function DOMEval(code, doc, node) { 23684 doc = doc || document; 23685 var i, 23686 script = doc.createElement("script"); 23687 script.text = code; 23688 23689 if (node) { 23690 for (i in preservedScriptAttributes) { 23691 if (node[i]) { 23692 script[i] = node[i]; 23693 } 23694 } 23695 } 23696 23697 doc.head.appendChild(script).parentNode.removeChild(script); 23698 } 23699 23700 function toType(obj) { 23701 if (obj == null) { 23702 return obj + ""; 23703 } // Support: Android <=2.3 only (functionish RegExp) 23704 23705 23706 return _typeof(obj) === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : _typeof(obj); 23707 } 23708 /* global Symbol */ 23709 // Defining this global in .eslintrc.json would create a danger of using the global 23710 // unguarded in another place, it seems safer to define global only for this module 23711 23712 23713 var version = "3.3.1", 23714 // Define a local copy of jQuery 23715 jQuery = function jQuery(selector, context) { 23716 // The jQuery object is actually just the init constructor 'enhanced' 23717 // Need init if jQuery is called (just allow error to be thrown if not included) 23718 return new jQuery.fn.init(selector, context); 23719 }, 23720 // Support: Android <=4.0 only 23721 // Make sure we trim BOM and NBSP 23722 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 23723 23724 jQuery.fn = jQuery.prototype = { 23725 // The current version of jQuery being used 23726 jquery: version, 23727 constructor: jQuery, 23728 // The default length of a jQuery object is 0 23729 length: 0, 23730 toArray: function toArray() { 23731 return _slice.call(this); 23732 }, 23733 // Get the Nth element in the matched element set OR 23734 // Get the whole matched element set as a clean array 23735 get: function get(num) { 23736 // Return all the elements in a clean array 23737 if (num == null) { 23738 return _slice.call(this); 23739 } // Return just the one element from the set 23740 23741 23742 return num < 0 ? this[num + this.length] : this[num]; 23743 }, 23744 // Take an array of elements and push it onto the stack 23745 // (returning the new matched element set) 23746 pushStack: function pushStack(elems) { 23747 // Build a new jQuery matched element set 23748 var ret = jQuery.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference) 23749 23750 ret.prevObject = this; // Return the newly-formed element set 23751 23752 return ret; 23753 }, 23754 // Execute a callback for every element in the matched set. 23755 each: function each(callback) { 23756 return jQuery.each(this, callback); 23757 }, 23758 map: function map(callback) { 23759 return this.pushStack(jQuery.map(this, function (elem, i) { 23760 return callback.call(elem, i, elem); 23761 })); 23762 }, 23763 slice: function slice() { 23764 return this.pushStack(_slice.apply(this, arguments)); 23765 }, 23766 first: function first() { 23767 return this.eq(0); 23768 }, 23769 last: function last() { 23770 return this.eq(-1); 23771 }, 23772 eq: function eq(i) { 23773 var len = this.length, 23774 j = +i + (i < 0 ? len : 0); 23775 return this.pushStack(j >= 0 && j < len ? [this[j]] : []); 23776 }, 23777 end: function end() { 23778 return this.prevObject || this.constructor(); 23779 }, 23780 // For internal use only. 23781 // Behaves like an Array's method, not like a jQuery method. 23782 push: push, 23783 sort: arr.sort, 23784 splice: arr.splice 23785 }; 23786 23787 jQuery.extend = jQuery.fn.extend = function () { 23788 var options, 23789 name, 23790 src, 23791 copy, 23792 copyIsArray, 23793 clone, 23794 target = arguments[0] || {}, 23795 i = 1, 23796 length = arguments.length, 23797 deep = false; // Handle a deep copy situation 23798 23799 if (typeof target === "boolean") { 23800 deep = target; // Skip the boolean and the target 23801 23802 target = arguments[i] || {}; 23803 i++; 23804 } // Handle case when target is a string or something (possible in deep copy) 23805 23806 23807 if (_typeof(target) !== "object" && !isFunction(target)) { 23808 target = {}; 23809 } // Extend jQuery itself if only one argument is passed 23810 23811 23812 if (i === length) { 23813 target = this; 23814 i--; 23815 } 23816 23817 for (; i < length; i++) { 23818 // Only deal with non-null/undefined values 23819 if ((options = arguments[i]) != null) { 23820 // Extend the base object 23821 for (name in options) { 23822 src = target[name]; 23823 copy = options[name]; // Prevent never-ending loop 23824 23825 if (target === copy) { 23826 continue; 23827 } // Recurse if we're merging plain objects or arrays 23828 23829 23830 if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { 23831 if (copyIsArray) { 23832 copyIsArray = false; 23833 clone = src && Array.isArray(src) ? src : []; 23834 } else { 23835 clone = src && jQuery.isPlainObject(src) ? src : {}; 23836 } // Never move original objects, clone them 23837 23838 23839 target[name] = jQuery.extend(deep, clone, copy); // Don't bring in undefined values 23840 } else if (copy !== undefined) { 23841 target[name] = copy; 23842 } 23843 } 23844 } 23845 } // Return the modified object 23846 23847 23848 return target; 23849 }; 23850 23851 jQuery.extend({ 23852 // Unique for each copy of jQuery on the page 23853 expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), 23854 // Assume jQuery is ready without the ready module 23855 isReady: true, 23856 error: function error(msg) { 23857 throw new Error(msg); 23858 }, 23859 noop: function noop() {}, 23860 isPlainObject: function isPlainObject(obj) { 23861 var proto, Ctor; // Detect obvious negatives 23862 // Use toString instead of jQuery.type to catch host objects 23863 23864 if (!obj || toString.call(obj) !== "[object Object]") { 23865 return false; 23866 } 23867 23868 proto = getProto(obj); // Objects with no prototype (e.g., `Object.create( null )`) are plain 23869 23870 if (!proto) { 23871 return true; 23872 } // Objects with prototype are plain iff they were constructed by a global Object function 23873 23874 23875 Ctor = hasOwn.call(proto, "constructor") && proto.constructor; 23876 return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; 23877 }, 23878 isEmptyObject: function isEmptyObject(obj) { 23879 /* eslint-disable no-unused-vars */ 23880 // See https://github.com/eslint/eslint/issues/6125 23881 var name; 23882 23883 for (name in obj) { 23884 return false; 23885 } 23886 23887 return true; 23888 }, 23889 // Evaluates a script in a global context 23890 globalEval: function globalEval(code) { 23891 DOMEval(code); 23892 }, 23893 each: function each(obj, callback) { 23894 var length, 23895 i = 0; 23896 23897 if (isArrayLike(obj)) { 23898 length = obj.length; 23899 23900 for (; i < length; i++) { 23901 if (callback.call(obj[i], i, obj[i]) === false) { 23902 break; 23903 } 23904 } 23905 } else { 23906 for (i in obj) { 23907 if (callback.call(obj[i], i, obj[i]) === false) { 23908 break; 23909 } 23910 } 23911 } 23912 23913 return obj; 23914 }, 23915 // Support: Android <=4.0 only 23916 trim: function trim(text) { 23917 return text == null ? "" : (text + "").replace(rtrim, ""); 23918 }, 23919 // results is for internal usage only 23920 makeArray: function makeArray(arr, results) { 23921 var ret = results || []; 23922 23923 if (arr != null) { 23924 if (isArrayLike(Object(arr))) { 23925 jQuery.merge(ret, typeof arr === "string" ? [arr] : arr); 23926 } else { 23927 push.call(ret, arr); 23928 } 23929 } 23930 23931 return ret; 23932 }, 23933 inArray: function inArray(elem, arr, i) { 23934 return arr == null ? -1 : indexOf.call(arr, elem, i); 23935 }, 23936 // Support: Android <=4.0 only, PhantomJS 1 only 23937 // push.apply(_, arraylike) throws on ancient WebKit 23938 merge: function merge(first, second) { 23939 var len = +second.length, 23940 j = 0, 23941 i = first.length; 23942 23943 for (; j < len; j++) { 23944 first[i++] = second[j]; 23945 } 23946 23947 first.length = i; 23948 return first; 23949 }, 23950 grep: function grep(elems, callback, invert) { 23951 var callbackInverse, 23952 matches = [], 23953 i = 0, 23954 length = elems.length, 23955 callbackExpect = !invert; // Go through the array, only saving the items 23956 // that pass the validator function 23957 23958 for (; i < length; i++) { 23959 callbackInverse = !callback(elems[i], i); 23960 23961 if (callbackInverse !== callbackExpect) { 23962 matches.push(elems[i]); 23963 } 23964 } 23965 23966 return matches; 23967 }, 23968 // arg is for internal usage only 23969 map: function map(elems, callback, arg) { 23970 var length, 23971 value, 23972 i = 0, 23973 ret = []; // Go through the array, translating each of the items to their new values 23974 23975 if (isArrayLike(elems)) { 23976 length = elems.length; 23977 23978 for (; i < length; i++) { 23979 value = callback(elems[i], i, arg); 23980 23981 if (value != null) { 23982 ret.push(value); 23983 } 23984 } // Go through every key on the object, 23985 23986 } else { 23987 for (i in elems) { 23988 value = callback(elems[i], i, arg); 23989 23990 if (value != null) { 23991 ret.push(value); 23992 } 23993 } 23994 } // Flatten any nested arrays 23995 23996 23997 return concat.apply([], ret); 23998 }, 23999 // A global GUID counter for objects 24000 guid: 1, 24001 // jQuery.support is not used in Core but other projects attach their 24002 // properties to it so it needs to exist. 24003 support: support 24004 }); 24005 24006 if (typeof Symbol === "function") { 24007 jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; 24008 } // Populate the class2type map 24009 24010 24011 jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) { 24012 class2type["[object " + name + "]"] = name.toLowerCase(); 24013 }); 24014 24015 function isArrayLike(obj) { 24016 // Support: real iOS 8.2 only (not reproducible in simulator) 24017 // `in` check used to prevent JIT error (gh-2145) 24018 // hasOwn isn't used here due to false negatives 24019 // regarding Nodelist length in IE 24020 var length = !!obj && "length" in obj && obj.length, 24021 type = toType(obj); 24022 24023 if (isFunction(obj) || isWindow(obj)) { 24024 return false; 24025 } 24026 24027 return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; 24028 } 24029 24030 var Sizzle = 24031 /*! 24032 * Sizzle CSS Selector Engine v2.3.3 24033 * https://sizzlejs.com/ 24034 * 24035 * Copyright jQuery Foundation and other contributors 24036 * Released under the MIT license 24037 * http://jquery.org/license 24038 * 24039 * Date: 2016-08-08 24040 */ 24041 function (window) { 24042 var i, 24043 support, 24044 Expr, 24045 getText, 24046 isXML, 24047 tokenize, 24048 compile, 24049 select, 24050 outermostContext, 24051 sortInput, 24052 hasDuplicate, 24053 // Local document vars 24054 setDocument, 24055 document, 24056 docElem, 24057 documentIsHTML, 24058 rbuggyQSA, 24059 rbuggyMatches, 24060 matches, 24061 contains, 24062 // Instance-specific data 24063 expando = "sizzle" + 1 * new Date(), 24064 preferredDoc = window.document, 24065 dirruns = 0, 24066 done = 0, 24067 classCache = createCache(), 24068 tokenCache = createCache(), 24069 compilerCache = createCache(), 24070 sortOrder = function sortOrder(a, b) { 24071 if (a === b) { 24072 hasDuplicate = true; 24073 } 24074 24075 return 0; 24076 }, 24077 // Instance methods 24078 hasOwn = {}.hasOwnProperty, 24079 arr = [], 24080 pop = arr.pop, 24081 push_native = arr.push, 24082 push = arr.push, 24083 slice = arr.slice, 24084 // Use a stripped-down indexOf as it's faster than native 24085 // https://jsperf.com/thor-indexof-vs-for/5 24086 indexOf = function indexOf(list, elem) { 24087 var i = 0, 24088 len = list.length; 24089 24090 for (; i < len; i++) { 24091 if (list[i] === elem) { 24092 return i; 24093 } 24094 } 24095 24096 return -1; 24097 }, 24098 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", 24099 // Regular expressions 24100 // http://www.w3.org/TR/css3-selectors/#whitespace 24101 whitespace = "[\\x20\\t\\r\\n\\f]", 24102 // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier 24103 identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", 24104 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 24105 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) 24106 "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 24107 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", 24108 pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 24109 // 1. quoted (capture 3; capture 4 or capture 5) 24110 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) 24111 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) 24112 ".*" + ")\\)|)", 24113 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 24114 rwhitespace = new RegExp(whitespace + "+", "g"), 24115 rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), 24116 rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), 24117 rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), 24118 rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"), 24119 rpseudo = new RegExp(pseudos), 24120 ridentifier = new RegExp("^" + identifier + "$"), 24121 matchExpr = { 24122 "ID": new RegExp("^#(" + identifier + ")"), 24123 "CLASS": new RegExp("^\\.(" + identifier + ")"), 24124 "TAG": new RegExp("^(" + identifier + "|[*])"), 24125 "ATTR": new RegExp("^" + attributes), 24126 "PSEUDO": new RegExp("^" + pseudos), 24127 "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), 24128 "bool": new RegExp("^(?:" + booleans + ")$", "i"), 24129 // For use in libraries implementing .is() 24130 // We use this for POS matching in `select` 24131 "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") 24132 }, 24133 rinputs = /^(?:input|select|textarea|button)$/i, 24134 rheader = /^h\d$/i, 24135 rnative = /^[^{]+\{\s*\[native \w/, 24136 // Easily-parseable/retrievable ID or TAG or CLASS selectors 24137 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 24138 rsibling = /[+~]/, 24139 // CSS escapes 24140 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 24141 runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), 24142 funescape = function funescape(_, escaped, escapedWhitespace) { 24143 var high = "0x" + escaped - 0x10000; // NaN means non-codepoint 24144 // Support: Firefox<24 24145 // Workaround erroneous numeric interpretation of +"0x" 24146 24147 return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint 24148 String.fromCharCode(high + 0x10000) : // Supplemental Plane codepoint (surrogate pair) 24149 String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); 24150 }, 24151 // CSS string/identifier serialization 24152 // https://drafts.csswg.org/cssom/#common-serializing-idioms 24153 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 24154 fcssescape = function fcssescape(ch, asCodePoint) { 24155 if (asCodePoint) { 24156 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 24157 if (ch === "\0") { 24158 return "\uFFFD"; 24159 } // Control characters and (dependent upon position) numbers get escaped as code points 24160 24161 24162 return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; 24163 } // Other potentially-special ASCII characters get backslash-escaped 24164 24165 24166 return "\\" + ch; 24167 }, 24168 // Used for iframes 24169 // See setDocument() 24170 // Removing the function wrapper causes a "Permission Denied" 24171 // error in IE 24172 unloadHandler = function unloadHandler() { 24173 setDocument(); 24174 }, 24175 disabledAncestor = addCombinator(function (elem) { 24176 return elem.disabled === true && ("form" in elem || "label" in elem); 24177 }, { 24178 dir: "parentNode", 24179 next: "legend" 24180 }); // Optimize for push.apply( _, NodeList ) 24181 24182 24183 try { 24184 push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes); // Support: Android<4.0 24185 // Detect silently failing push.apply 24186 24187 arr[preferredDoc.childNodes.length].nodeType; 24188 } catch (e) { 24189 push = { 24190 apply: arr.length ? // Leverage slice if possible 24191 function (target, els) { 24192 push_native.apply(target, slice.call(els)); 24193 } : // Support: IE<9 24194 // Otherwise append directly 24195 function (target, els) { 24196 var j = target.length, 24197 i = 0; // Can't trust NodeList.length 24198 24199 while (target[j++] = els[i++]) {} 24200 24201 target.length = j - 1; 24202 } 24203 }; 24204 } 24205 24206 function Sizzle(selector, context, results, seed) { 24207 var m, 24208 i, 24209 elem, 24210 nid, 24211 match, 24212 groups, 24213 newSelector, 24214 newContext = context && context.ownerDocument, 24215 // nodeType defaults to 9, since context defaults to document 24216 nodeType = context ? context.nodeType : 9; 24217 results = results || []; // Return early from calls with invalid selector or context 24218 24219 if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { 24220 return results; 24221 } // Try to shortcut find operations (as opposed to filters) in HTML documents 24222 24223 24224 if (!seed) { 24225 if ((context ? context.ownerDocument || context : preferredDoc) !== document) { 24226 setDocument(context); 24227 } 24228 24229 context = context || document; 24230 24231 if (documentIsHTML) { 24232 // If the selector is sufficiently simple, try using a "get*By*" DOM method 24233 // (excepting DocumentFragment context, where the methods don't exist) 24234 if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { 24235 // ID selector 24236 if (m = match[1]) { 24237 // Document context 24238 if (nodeType === 9) { 24239 if (elem = context.getElementById(m)) { 24240 // Support: IE, Opera, Webkit 24241 // TODO: identify versions 24242 // getElementById can match elements by name instead of ID 24243 if (elem.id === m) { 24244 results.push(elem); 24245 return results; 24246 } 24247 } else { 24248 return results; 24249 } // Element context 24250 24251 } else { 24252 // Support: IE, Opera, Webkit 24253 // TODO: identify versions 24254 // getElementById can match elements by name instead of ID 24255 if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) { 24256 results.push(elem); 24257 return results; 24258 } 24259 } // Type selector 24260 24261 } else if (match[2]) { 24262 push.apply(results, context.getElementsByTagName(selector)); 24263 return results; // Class selector 24264 } else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) { 24265 push.apply(results, context.getElementsByClassName(m)); 24266 return results; 24267 } 24268 } // Take advantage of querySelectorAll 24269 24270 24271 if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) { 24272 if (nodeType !== 1) { 24273 newContext = context; 24274 newSelector = selector; // qSA looks outside Element context, which is not what we want 24275 // Thanks to Andrew Dupont for this workaround technique 24276 // Support: IE <=8 24277 // Exclude object elements 24278 } else if (context.nodeName.toLowerCase() !== "object") { 24279 // Capture the context ID, setting it first if necessary 24280 if (nid = context.getAttribute("id")) { 24281 nid = nid.replace(rcssescape, fcssescape); 24282 } else { 24283 context.setAttribute("id", nid = expando); 24284 } // Prefix every selector in the list 24285 24286 24287 groups = tokenize(selector); 24288 i = groups.length; 24289 24290 while (i--) { 24291 groups[i] = "#" + nid + " " + toSelector(groups[i]); 24292 } 24293 24294 newSelector = groups.join(","); // Expand context for sibling selectors 24295 24296 newContext = rsibling.test(selector) && testContext(context.parentNode) || context; 24297 } 24298 24299 if (newSelector) { 24300 try { 24301 push.apply(results, newContext.querySelectorAll(newSelector)); 24302 return results; 24303 } catch (qsaError) {} finally { 24304 if (nid === expando) { 24305 context.removeAttribute("id"); 24306 } 24307 } 24308 } 24309 } 24310 } 24311 } // All others 24312 24313 24314 return select(selector.replace(rtrim, "$1"), context, results, seed); 24315 } 24316 /** 24317 * Create key-value caches of limited size 24318 * @returns {function(string, object)} Returns the Object data after storing it on itself with 24319 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 24320 * deleting the oldest entry 24321 */ 24322 24323 24324 function createCache() { 24325 var keys = []; 24326 24327 function cache(key, value) { 24328 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 24329 if (keys.push(key + " ") > Expr.cacheLength) { 24330 // Only keep the most recent entries 24331 delete cache[keys.shift()]; 24332 } 24333 24334 return cache[key + " "] = value; 24335 } 24336 24337 return cache; 24338 } 24339 /** 24340 * Mark a function for special use by Sizzle 24341 * @param {Function} fn The function to mark 24342 */ 24343 24344 24345 function markFunction(fn) { 24346 fn[expando] = true; 24347 return fn; 24348 } 24349 /** 24350 * Support testing using an element 24351 * @param {Function} fn Passed the created element and returns a boolean result 24352 */ 24353 24354 24355 function assert(fn) { 24356 var el = document.createElement("fieldset"); 24357 24358 try { 24359 return !!fn(el); 24360 } catch (e) { 24361 return false; 24362 } finally { 24363 // Remove from its parent by default 24364 if (el.parentNode) { 24365 el.parentNode.removeChild(el); 24366 } // release memory in IE 24367 24368 24369 el = null; 24370 } 24371 } 24372 /** 24373 * Adds the same handler for all of the specified attrs 24374 * @param {String} attrs Pipe-separated list of attributes 24375 * @param {Function} handler The method that will be applied 24376 */ 24377 24378 24379 function addHandle(attrs, handler) { 24380 var arr = attrs.split("|"), 24381 i = arr.length; 24382 24383 while (i--) { 24384 Expr.attrHandle[arr[i]] = handler; 24385 } 24386 } 24387 /** 24388 * Checks document order of two siblings 24389 * @param {Element} a 24390 * @param {Element} b 24391 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 24392 */ 24393 24394 24395 function siblingCheck(a, b) { 24396 var cur = b && a, 24397 diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes 24398 24399 if (diff) { 24400 return diff; 24401 } // Check if b follows a 24402 24403 24404 if (cur) { 24405 while (cur = cur.nextSibling) { 24406 if (cur === b) { 24407 return -1; 24408 } 24409 } 24410 } 24411 24412 return a ? 1 : -1; 24413 } 24414 /** 24415 * Returns a function to use in pseudos for input types 24416 * @param {String} type 24417 */ 24418 24419 24420 function createInputPseudo(type) { 24421 return function (elem) { 24422 var name = elem.nodeName.toLowerCase(); 24423 return name === "input" && elem.type === type; 24424 }; 24425 } 24426 /** 24427 * Returns a function to use in pseudos for buttons 24428 * @param {String} type 24429 */ 24430 24431 24432 function createButtonPseudo(type) { 24433 return function (elem) { 24434 var name = elem.nodeName.toLowerCase(); 24435 return (name === "input" || name === "button") && elem.type === type; 24436 }; 24437 } 24438 /** 24439 * Returns a function to use in pseudos for :enabled/:disabled 24440 * @param {Boolean} disabled true for :disabled; false for :enabled 24441 */ 24442 24443 24444 function createDisabledPseudo(disabled) { 24445 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 24446 return function (elem) { 24447 // Only certain elements can match :enabled or :disabled 24448 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 24449 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 24450 if ("form" in elem) { 24451 // Check for inherited disabledness on relevant non-disabled elements: 24452 // * listed form-associated elements in a disabled fieldset 24453 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 24454 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 24455 // * option elements in a disabled optgroup 24456 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 24457 // All such elements have a "form" property. 24458 if (elem.parentNode && elem.disabled === false) { 24459 // Option elements defer to a parent optgroup if present 24460 if ("label" in elem) { 24461 if ("label" in elem.parentNode) { 24462 return elem.parentNode.disabled === disabled; 24463 } else { 24464 return elem.disabled === disabled; 24465 } 24466 } // Support: IE 6 - 11 24467 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 24468 24469 24470 return elem.isDisabled === disabled || // Where there is no isDisabled, check manually 24471 24472 /* jshint -W018 */ 24473 elem.isDisabled !== !disabled && disabledAncestor(elem) === disabled; 24474 } 24475 24476 return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. 24477 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 24478 // even exist on them, let alone have a boolean value. 24479 } else if ("label" in elem) { 24480 return elem.disabled === disabled; 24481 } // Remaining elements are neither :enabled nor :disabled 24482 24483 24484 return false; 24485 }; 24486 } 24487 /** 24488 * Returns a function to use in pseudos for positionals 24489 * @param {Function} fn 24490 */ 24491 24492 24493 function createPositionalPseudo(fn) { 24494 return markFunction(function (argument) { 24495 argument = +argument; 24496 return markFunction(function (seed, matches) { 24497 var j, 24498 matchIndexes = fn([], seed.length, argument), 24499 i = matchIndexes.length; // Match elements found at the specified indexes 24500 24501 while (i--) { 24502 if (seed[j = matchIndexes[i]]) { 24503 seed[j] = !(matches[j] = seed[j]); 24504 } 24505 } 24506 }); 24507 }); 24508 } 24509 /** 24510 * Checks a node for validity as a Sizzle context 24511 * @param {Element|Object=} context 24512 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 24513 */ 24514 24515 24516 function testContext(context) { 24517 return context && typeof context.getElementsByTagName !== "undefined" && context; 24518 } // Expose support vars for convenience 24519 24520 24521 support = Sizzle.support = {}; 24522 /** 24523 * Detects XML nodes 24524 * @param {Element|Object} elem An element or a document 24525 * @returns {Boolean} True iff elem is a non-HTML XML node 24526 */ 24527 24528 isXML = Sizzle.isXML = function (elem) { 24529 // documentElement is verified for cases where it doesn't yet exist 24530 // (such as loading iframes in IE - #4833) 24531 var documentElement = elem && (elem.ownerDocument || elem).documentElement; 24532 return documentElement ? documentElement.nodeName !== "HTML" : false; 24533 }; 24534 /** 24535 * Sets document-related variables once based on the current document 24536 * @param {Element|Object} [doc] An element or document object to use to set the document 24537 * @returns {Object} Returns the current document 24538 */ 24539 24540 24541 setDocument = Sizzle.setDocument = function (node) { 24542 var hasCompare, 24543 subWindow, 24544 doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected 24545 24546 if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { 24547 return document; 24548 } // Update global variables 24549 24550 24551 document = doc; 24552 docElem = document.documentElement; 24553 documentIsHTML = !isXML(document); // Support: IE 9-11, Edge 24554 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 24555 24556 if (preferredDoc !== document && (subWindow = document.defaultView) && subWindow.top !== subWindow) { 24557 // Support: IE 11, Edge 24558 if (subWindow.addEventListener) { 24559 subWindow.addEventListener("unload", unloadHandler, false); // Support: IE 9 - 10 only 24560 } else if (subWindow.attachEvent) { 24561 subWindow.attachEvent("onunload", unloadHandler); 24562 } 24563 } 24564 /* Attributes 24565 ---------------------------------------------------------------------- */ 24566 // Support: IE<8 24567 // Verify that getAttribute really returns attributes and not properties 24568 // (excepting IE8 booleans) 24569 24570 24571 support.attributes = assert(function (el) { 24572 el.className = "i"; 24573 return !el.getAttribute("className"); 24574 }); 24575 /* getElement(s)By* 24576 ---------------------------------------------------------------------- */ 24577 // Check if getElementsByTagName("*") returns only elements 24578 24579 support.getElementsByTagName = assert(function (el) { 24580 el.appendChild(document.createComment("")); 24581 return !el.getElementsByTagName("*").length; 24582 }); // Support: IE<9 24583 24584 support.getElementsByClassName = rnative.test(document.getElementsByClassName); // Support: IE<10 24585 // Check if getElementById returns elements by name 24586 // The broken getElementById methods don't pick up programmatically-set names, 24587 // so use a roundabout getElementsByName test 24588 24589 support.getById = assert(function (el) { 24590 docElem.appendChild(el).id = expando; 24591 return !document.getElementsByName || !document.getElementsByName(expando).length; 24592 }); // ID filter and find 24593 24594 if (support.getById) { 24595 Expr.filter["ID"] = function (id) { 24596 var attrId = id.replace(runescape, funescape); 24597 return function (elem) { 24598 return elem.getAttribute("id") === attrId; 24599 }; 24600 }; 24601 24602 Expr.find["ID"] = function (id, context) { 24603 if (typeof context.getElementById !== "undefined" && documentIsHTML) { 24604 var elem = context.getElementById(id); 24605 return elem ? [elem] : []; 24606 } 24607 }; 24608 } else { 24609 Expr.filter["ID"] = function (id) { 24610 var attrId = id.replace(runescape, funescape); 24611 return function (elem) { 24612 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 24613 return node && node.value === attrId; 24614 }; 24615 }; // Support: IE 6 - 7 only 24616 // getElementById is not reliable as a find shortcut 24617 24618 24619 Expr.find["ID"] = function (id, context) { 24620 if (typeof context.getElementById !== "undefined" && documentIsHTML) { 24621 var node, 24622 i, 24623 elems, 24624 elem = context.getElementById(id); 24625 24626 if (elem) { 24627 // Verify the id attribute 24628 node = elem.getAttributeNode("id"); 24629 24630 if (node && node.value === id) { 24631 return [elem]; 24632 } // Fall back on getElementsByName 24633 24634 24635 elems = context.getElementsByName(id); 24636 i = 0; 24637 24638 while (elem = elems[i++]) { 24639 node = elem.getAttributeNode("id"); 24640 24641 if (node && node.value === id) { 24642 return [elem]; 24643 } 24644 } 24645 } 24646 24647 return []; 24648 } 24649 }; 24650 } // Tag 24651 24652 24653 Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) { 24654 if (typeof context.getElementsByTagName !== "undefined") { 24655 return context.getElementsByTagName(tag); // DocumentFragment nodes don't have gEBTN 24656 } else if (support.qsa) { 24657 return context.querySelectorAll(tag); 24658 } 24659 } : function (tag, context) { 24660 var elem, 24661 tmp = [], 24662 i = 0, 24663 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 24664 results = context.getElementsByTagName(tag); // Filter out possible comments 24665 24666 if (tag === "*") { 24667 while (elem = results[i++]) { 24668 if (elem.nodeType === 1) { 24669 tmp.push(elem); 24670 } 24671 } 24672 24673 return tmp; 24674 } 24675 24676 return results; 24677 }; // Class 24678 24679 Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { 24680 if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { 24681 return context.getElementsByClassName(className); 24682 } 24683 }; 24684 /* QSA/matchesSelector 24685 ---------------------------------------------------------------------- */ 24686 // QSA and matchesSelector support 24687 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 24688 24689 24690 rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) 24691 // We allow this because of a bug in IE8/9 that throws an error 24692 // whenever `document.activeElement` is accessed on an iframe 24693 // So, we allow :focus to pass through QSA all the time to avoid the IE error 24694 // See https://bugs.jquery.com/ticket/13378 24695 24696 rbuggyQSA = []; 24697 24698 if (support.qsa = rnative.test(document.querySelectorAll)) { 24699 // Build QSA regex 24700 // Regex strategy adopted from Diego Perini 24701 assert(function (el) { 24702 // Select is set to empty string on purpose 24703 // This is to test IE's treatment of not explicitly 24704 // setting a boolean content attribute, 24705 // since its presence should be enough 24706 // https://bugs.jquery.com/ticket/12359 24707 docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>"; // Support: IE8, Opera 11-12.16 24708 // Nothing should be selected when empty strings follow ^= or $= or *= 24709 // The test attribute must be unknown in Opera but "safe" for WinRT 24710 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 24711 24712 if (el.querySelectorAll("[msallowcapture^='']").length) { 24713 rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); 24714 } // Support: IE8 24715 // Boolean attributes and "value" are not treated correctly 24716 24717 24718 if (!el.querySelectorAll("[selected]").length) { 24719 rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); 24720 } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 24721 24722 24723 if (!el.querySelectorAll("[id~=" + expando + "-]").length) { 24724 rbuggyQSA.push("~="); 24725 } // Webkit/Opera - :checked should return selected option elements 24726 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 24727 // IE8 throws error here and will not see later tests 24728 24729 24730 if (!el.querySelectorAll(":checked").length) { 24731 rbuggyQSA.push(":checked"); 24732 } // Support: Safari 8+, iOS 8+ 24733 // https://bugs.webkit.org/show_bug.cgi?id=136851 24734 // In-page `selector#id sibling-combinator selector` fails 24735 24736 24737 if (!el.querySelectorAll("a#" + expando + "+*").length) { 24738 rbuggyQSA.push(".#.+[+~]"); 24739 } 24740 }); 24741 assert(function (el) { 24742 el.innerHTML = "<a href='' disabled='disabled'></a>" + "<select disabled='disabled'><option/></select>"; // Support: Windows 8 Native Apps 24743 // The type and name attributes are restricted during .innerHTML assignment 24744 24745 var input = document.createElement("input"); 24746 input.setAttribute("type", "hidden"); 24747 el.appendChild(input).setAttribute("name", "D"); // Support: IE8 24748 // Enforce case-sensitivity of name attribute 24749 24750 if (el.querySelectorAll("[name=d]").length) { 24751 rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); 24752 } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 24753 // IE8 throws error here and will not see later tests 24754 24755 24756 if (el.querySelectorAll(":enabled").length !== 2) { 24757 rbuggyQSA.push(":enabled", ":disabled"); 24758 } // Support: IE9-11+ 24759 // IE's :disabled selector does not pick up the children of disabled fieldsets 24760 24761 24762 docElem.appendChild(el).disabled = true; 24763 24764 if (el.querySelectorAll(":disabled").length !== 2) { 24765 rbuggyQSA.push(":enabled", ":disabled"); 24766 } // Opera 10-11 does not throw on post-comma invalid pseudos 24767 24768 24769 el.querySelectorAll("*,:x"); 24770 rbuggyQSA.push(",.*:"); 24771 }); 24772 } 24773 24774 if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) { 24775 assert(function (el) { 24776 // Check to see if it's possible to do matchesSelector 24777 // on a disconnected node (IE 9) 24778 support.disconnectedMatch = matches.call(el, "*"); // This should fail with an exception 24779 // Gecko does not error, returns false instead 24780 24781 matches.call(el, "[s!='']:x"); 24782 rbuggyMatches.push("!=", pseudos); 24783 }); 24784 } 24785 24786 rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); 24787 rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); 24788 /* Contains 24789 ---------------------------------------------------------------------- */ 24790 24791 hasCompare = rnative.test(docElem.compareDocumentPosition); // Element contains another 24792 // Purposefully self-exclusive 24793 // As in, an element does not contain itself 24794 24795 contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) { 24796 var adown = a.nodeType === 9 ? a.documentElement : a, 24797 bup = b && b.parentNode; 24798 return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16)); 24799 } : function (a, b) { 24800 if (b) { 24801 while (b = b.parentNode) { 24802 if (b === a) { 24803 return true; 24804 } 24805 } 24806 } 24807 24808 return false; 24809 }; 24810 /* Sorting 24811 ---------------------------------------------------------------------- */ 24812 // Document order sorting 24813 24814 sortOrder = hasCompare ? function (a, b) { 24815 // Flag for duplicate removal 24816 if (a === b) { 24817 hasDuplicate = true; 24818 return 0; 24819 } // Sort on method existence if only one input has compareDocumentPosition 24820 24821 24822 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 24823 24824 if (compare) { 24825 return compare; 24826 } // Calculate position if both inputs belong to the same document 24827 24828 24829 compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : // Otherwise we know they are disconnected 24830 1; // Disconnected nodes 24831 24832 if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) { 24833 // Choose the first element that is related to our preferred document 24834 if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) { 24835 return -1; 24836 } 24837 24838 if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) { 24839 return 1; 24840 } // Maintain original order 24841 24842 24843 return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0; 24844 } 24845 24846 return compare & 4 ? -1 : 1; 24847 } : function (a, b) { 24848 // Exit early if the nodes are identical 24849 if (a === b) { 24850 hasDuplicate = true; 24851 return 0; 24852 } 24853 24854 var cur, 24855 i = 0, 24856 aup = a.parentNode, 24857 bup = b.parentNode, 24858 ap = [a], 24859 bp = [b]; // Parentless nodes are either documents or disconnected 24860 24861 if (!aup || !bup) { 24862 return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0; // If the nodes are siblings, we can do a quick check 24863 } else if (aup === bup) { 24864 return siblingCheck(a, b); 24865 } // Otherwise we need full lists of their ancestors for comparison 24866 24867 24868 cur = a; 24869 24870 while (cur = cur.parentNode) { 24871 ap.unshift(cur); 24872 } 24873 24874 cur = b; 24875 24876 while (cur = cur.parentNode) { 24877 bp.unshift(cur); 24878 } // Walk down the tree looking for a discrepancy 24879 24880 24881 while (ap[i] === bp[i]) { 24882 i++; 24883 } 24884 24885 return i ? // Do a sibling check if the nodes have a common ancestor 24886 siblingCheck(ap[i], bp[i]) : // Otherwise nodes in our document sort first 24887 ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; 24888 }; 24889 return document; 24890 }; 24891 24892 Sizzle.matches = function (expr, elements) { 24893 return Sizzle(expr, null, null, elements); 24894 }; 24895 24896 Sizzle.matchesSelector = function (elem, expr) { 24897 // Set document vars if needed 24898 if ((elem.ownerDocument || elem) !== document) { 24899 setDocument(elem); 24900 } // Make sure that attribute selectors are quoted 24901 24902 24903 expr = expr.replace(rattributeQuotes, "='$1']"); 24904 24905 if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) { 24906 try { 24907 var ret = matches.call(elem, expr); // IE 9's matchesSelector returns false on disconnected nodes 24908 24909 if (ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document 24910 // fragment in IE 9 24911 elem.document && elem.document.nodeType !== 11) { 24912 return ret; 24913 } 24914 } catch (e) {} 24915 } 24916 24917 return Sizzle(expr, document, null, [elem]).length > 0; 24918 }; 24919 24920 Sizzle.contains = function (context, elem) { 24921 // Set document vars if needed 24922 if ((context.ownerDocument || context) !== document) { 24923 setDocument(context); 24924 } 24925 24926 return contains(context, elem); 24927 }; 24928 24929 Sizzle.attr = function (elem, name) { 24930 // Set document vars if needed 24931 if ((elem.ownerDocument || elem) !== document) { 24932 setDocument(elem); 24933 } 24934 24935 var fn = Expr.attrHandle[name.toLowerCase()], 24936 // Don't get fooled by Object.prototype properties (jQuery #13807) 24937 val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined; 24938 return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; 24939 }; 24940 24941 Sizzle.escape = function (sel) { 24942 return (sel + "").replace(rcssescape, fcssescape); 24943 }; 24944 24945 Sizzle.error = function (msg) { 24946 throw new Error("Syntax error, unrecognized expression: " + msg); 24947 }; 24948 /** 24949 * Document sorting and removing duplicates 24950 * @param {ArrayLike} results 24951 */ 24952 24953 24954 Sizzle.uniqueSort = function (results) { 24955 var elem, 24956 duplicates = [], 24957 j = 0, 24958 i = 0; // Unless we *know* we can detect duplicates, assume their presence 24959 24960 hasDuplicate = !support.detectDuplicates; 24961 sortInput = !support.sortStable && results.slice(0); 24962 results.sort(sortOrder); 24963 24964 if (hasDuplicate) { 24965 while (elem = results[i++]) { 24966 if (elem === results[i]) { 24967 j = duplicates.push(i); 24968 } 24969 } 24970 24971 while (j--) { 24972 results.splice(duplicates[j], 1); 24973 } 24974 } // Clear input after sorting to release objects 24975 // See https://github.com/jquery/sizzle/pull/225 24976 24977 24978 sortInput = null; 24979 return results; 24980 }; 24981 /** 24982 * Utility function for retrieving the text value of an array of DOM nodes 24983 * @param {Array|Element} elem 24984 */ 24985 24986 24987 getText = Sizzle.getText = function (elem) { 24988 var node, 24989 ret = "", 24990 i = 0, 24991 nodeType = elem.nodeType; 24992 24993 if (!nodeType) { 24994 // If no nodeType, this is expected to be an array 24995 while (node = elem[i++]) { 24996 // Do not traverse comment nodes 24997 ret += getText(node); 24998 } 24999 } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { 25000 // Use textContent for elements 25001 // innerText usage removed for consistency of new lines (jQuery #11153) 25002 if (typeof elem.textContent === "string") { 25003 return elem.textContent; 25004 } else { 25005 // Traverse its children 25006 for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 25007 ret += getText(elem); 25008 } 25009 } 25010 } else if (nodeType === 3 || nodeType === 4) { 25011 return elem.nodeValue; 25012 } // Do not include comment or processing instruction nodes 25013 25014 25015 return ret; 25016 }; 25017 25018 Expr = Sizzle.selectors = { 25019 // Can be adjusted by the user 25020 cacheLength: 50, 25021 createPseudo: markFunction, 25022 match: matchExpr, 25023 attrHandle: {}, 25024 find: {}, 25025 relative: { 25026 ">": { 25027 dir: "parentNode", 25028 first: true 25029 }, 25030 " ": { 25031 dir: "parentNode" 25032 }, 25033 "+": { 25034 dir: "previousSibling", 25035 first: true 25036 }, 25037 "~": { 25038 dir: "previousSibling" 25039 } 25040 }, 25041 preFilter: { 25042 "ATTR": function ATTR(match) { 25043 match[1] = match[1].replace(runescape, funescape); // Move the given value to match[3] whether quoted or unquoted 25044 25045 match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape); 25046 25047 if (match[2] === "~=") { 25048 match[3] = " " + match[3] + " "; 25049 } 25050 25051 return match.slice(0, 4); 25052 }, 25053 "CHILD": function CHILD(match) { 25054 /* matches from matchExpr["CHILD"] 25055 1 type (only|nth|...) 25056 2 what (child|of-type) 25057 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 25058 4 xn-component of xn+y argument ([+-]?\d*n|) 25059 5 sign of xn-component 25060 6 x of xn-component 25061 7 sign of y-component 25062 8 y of y-component 25063 */ 25064 match[1] = match[1].toLowerCase(); 25065 25066 if (match[1].slice(0, 3) === "nth") { 25067 // nth-* requires argument 25068 if (!match[3]) { 25069 Sizzle.error(match[0]); 25070 } // numeric x and y parameters for Expr.filter.CHILD 25071 // remember that false/true cast respectively to 0/1 25072 25073 25074 match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); 25075 match[5] = +(match[7] + match[8] || match[3] === "odd"); // other types prohibit arguments 25076 } else if (match[3]) { 25077 Sizzle.error(match[0]); 25078 } 25079 25080 return match; 25081 }, 25082 "PSEUDO": function PSEUDO(match) { 25083 var excess, 25084 unquoted = !match[6] && match[2]; 25085 25086 if (matchExpr["CHILD"].test(match[0])) { 25087 return null; 25088 } // Accept quoted arguments as-is 25089 25090 25091 if (match[3]) { 25092 match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments 25093 } else if (unquoted && rpseudo.test(unquoted) && ( // Get excess from tokenize (recursively) 25094 excess = tokenize(unquoted, true)) && ( // advance to the next closing parenthesis 25095 excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { 25096 // excess is a negative index 25097 match[0] = match[0].slice(0, excess); 25098 match[2] = unquoted.slice(0, excess); 25099 } // Return only captures needed by the pseudo filter method (type and argument) 25100 25101 25102 return match.slice(0, 3); 25103 } 25104 }, 25105 filter: { 25106 "TAG": function TAG(nodeNameSelector) { 25107 var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); 25108 return nodeNameSelector === "*" ? function () { 25109 return true; 25110 } : function (elem) { 25111 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 25112 }; 25113 }, 25114 "CLASS": function CLASS(className) { 25115 var pattern = classCache[className + " "]; 25116 return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) { 25117 return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""); 25118 }); 25119 }, 25120 "ATTR": function ATTR(name, operator, check) { 25121 return function (elem) { 25122 var result = Sizzle.attr(elem, name); 25123 25124 if (result == null) { 25125 return operator === "!="; 25126 } 25127 25128 if (!operator) { 25129 return true; 25130 } 25131 25132 result += ""; 25133 return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false; 25134 }; 25135 }, 25136 "CHILD": function CHILD(type, what, argument, first, last) { 25137 var simple = type.slice(0, 3) !== "nth", 25138 forward = type.slice(-4) !== "last", 25139 ofType = what === "of-type"; 25140 return first === 1 && last === 0 ? // Shortcut for :nth-*(n) 25141 function (elem) { 25142 return !!elem.parentNode; 25143 } : function (elem, context, xml) { 25144 var cache, 25145 uniqueCache, 25146 outerCache, 25147 node, 25148 nodeIndex, 25149 start, 25150 dir = simple !== forward ? "nextSibling" : "previousSibling", 25151 parent = elem.parentNode, 25152 name = ofType && elem.nodeName.toLowerCase(), 25153 useCache = !xml && !ofType, 25154 diff = false; 25155 25156 if (parent) { 25157 // :(first|last|only)-(child|of-type) 25158 if (simple) { 25159 while (dir) { 25160 node = elem; 25161 25162 while (node = node[dir]) { 25163 if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) { 25164 return false; 25165 } 25166 } // Reverse direction for :only-* (if we haven't yet done so) 25167 25168 25169 start = dir = type === "only" && !start && "nextSibling"; 25170 } 25171 25172 return true; 25173 } 25174 25175 start = [forward ? parent.firstChild : parent.lastChild]; // non-xml :nth-child(...) stores cache data on `parent` 25176 25177 if (forward && useCache) { 25178 // Seek `elem` from a previously-cached index 25179 // ...in a gzip-friendly way 25180 node = parent; 25181 outerCache = node[expando] || (node[expando] = {}); // Support: IE <9 only 25182 // Defend against cloned attroperties (jQuery gh-1709) 25183 25184 uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {}); 25185 cache = uniqueCache[type] || []; 25186 nodeIndex = cache[0] === dirruns && cache[1]; 25187 diff = nodeIndex && cache[2]; 25188 node = nodeIndex && parent.childNodes[nodeIndex]; 25189 25190 while (node = ++nodeIndex && node && node[dir] || ( // Fallback to seeking `elem` from the start 25191 diff = nodeIndex = 0) || start.pop()) { 25192 // When found, cache indexes on `parent` and break 25193 if (node.nodeType === 1 && ++diff && node === elem) { 25194 uniqueCache[type] = [dirruns, nodeIndex, diff]; 25195 break; 25196 } 25197 } 25198 } else { 25199 // Use previously-cached element index if available 25200 if (useCache) { 25201 // ...in a gzip-friendly way 25202 node = elem; 25203 outerCache = node[expando] || (node[expando] = {}); // Support: IE <9 only 25204 // Defend against cloned attroperties (jQuery gh-1709) 25205 25206 uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {}); 25207 cache = uniqueCache[type] || []; 25208 nodeIndex = cache[0] === dirruns && cache[1]; 25209 diff = nodeIndex; 25210 } // xml :nth-child(...) 25211 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 25212 25213 25214 if (diff === false) { 25215 // Use the same loop as above to seek `elem` from the start 25216 while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) { 25217 if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) { 25218 // Cache the index of each encountered element 25219 if (useCache) { 25220 outerCache = node[expando] || (node[expando] = {}); // Support: IE <9 only 25221 // Defend against cloned attroperties (jQuery gh-1709) 25222 25223 uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {}); 25224 uniqueCache[type] = [dirruns, diff]; 25225 } 25226 25227 if (node === elem) { 25228 break; 25229 } 25230 } 25231 } 25232 } 25233 } // Incorporate the offset, then check against cycle size 25234 25235 25236 diff -= last; 25237 return diff === first || diff % first === 0 && diff / first >= 0; 25238 } 25239 }; 25240 }, 25241 "PSEUDO": function PSEUDO(pseudo, argument) { 25242 // pseudo-class names are case-insensitive 25243 // http://www.w3.org/TR/selectors/#pseudo-classes 25244 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 25245 // Remember that setFilters inherits from pseudos 25246 var args, 25247 fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo); // The user may use createPseudo to indicate that 25248 // arguments are needed to create the filter function 25249 // just as Sizzle does 25250 25251 if (fn[expando]) { 25252 return fn(argument); 25253 } // But maintain support for old signatures 25254 25255 25256 if (fn.length > 1) { 25257 args = [pseudo, pseudo, "", argument]; 25258 return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) { 25259 var idx, 25260 matched = fn(seed, argument), 25261 i = matched.length; 25262 25263 while (i--) { 25264 idx = indexOf(seed, matched[i]); 25265 seed[idx] = !(matches[idx] = matched[i]); 25266 } 25267 }) : function (elem) { 25268 return fn(elem, 0, args); 25269 }; 25270 } 25271 25272 return fn; 25273 } 25274 }, 25275 pseudos: { 25276 // Potentially complex pseudos 25277 "not": markFunction(function (selector) { 25278 // Trim the selector passed to compile 25279 // to avoid treating leading and trailing 25280 // spaces as combinators 25281 var input = [], 25282 results = [], 25283 matcher = compile(selector.replace(rtrim, "$1")); 25284 return matcher[expando] ? markFunction(function (seed, matches, context, xml) { 25285 var elem, 25286 unmatched = matcher(seed, null, xml, []), 25287 i = seed.length; // Match elements unmatched by `matcher` 25288 25289 while (i--) { 25290 if (elem = unmatched[i]) { 25291 seed[i] = !(matches[i] = elem); 25292 } 25293 } 25294 }) : function (elem, context, xml) { 25295 input[0] = elem; 25296 matcher(input, null, xml, results); // Don't keep the element (issue #299) 25297 25298 input[0] = null; 25299 return !results.pop(); 25300 }; 25301 }), 25302 "has": markFunction(function (selector) { 25303 return function (elem) { 25304 return Sizzle(selector, elem).length > 0; 25305 }; 25306 }), 25307 "contains": markFunction(function (text) { 25308 text = text.replace(runescape, funescape); 25309 return function (elem) { 25310 return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; 25311 }; 25312 }), 25313 // "Whether an element is represented by a :lang() selector 25314 // is based solely on the element's language value 25315 // being equal to the identifier C, 25316 // or beginning with the identifier C immediately followed by "-". 25317 // The matching of C against the element's language value is performed case-insensitively. 25318 // The identifier C does not have to be a valid language name." 25319 // http://www.w3.org/TR/selectors/#lang-pseudo 25320 "lang": markFunction(function (lang) { 25321 // lang value must be a valid identifier 25322 if (!ridentifier.test(lang || "")) { 25323 Sizzle.error("unsupported lang: " + lang); 25324 } 25325 25326 lang = lang.replace(runescape, funescape).toLowerCase(); 25327 return function (elem) { 25328 var elemLang; 25329 25330 do { 25331 if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) { 25332 elemLang = elemLang.toLowerCase(); 25333 return elemLang === lang || elemLang.indexOf(lang + "-") === 0; 25334 } 25335 } while ((elem = elem.parentNode) && elem.nodeType === 1); 25336 25337 return false; 25338 }; 25339 }), 25340 // Miscellaneous 25341 "target": function target(elem) { 25342 var hash = window.location && window.location.hash; 25343 return hash && hash.slice(1) === elem.id; 25344 }, 25345 "root": function root(elem) { 25346 return elem === docElem; 25347 }, 25348 "focus": function focus(elem) { 25349 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); 25350 }, 25351 // Boolean properties 25352 "enabled": createDisabledPseudo(false), 25353 "disabled": createDisabledPseudo(true), 25354 "checked": function checked(elem) { 25355 // In CSS3, :checked should return both checked and selected elements 25356 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 25357 var nodeName = elem.nodeName.toLowerCase(); 25358 return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected; 25359 }, 25360 "selected": function selected(elem) { 25361 // Accessing this property makes selected-by-default 25362 // options in Safari work properly 25363 if (elem.parentNode) { 25364 elem.parentNode.selectedIndex; 25365 } 25366 25367 return elem.selected === true; 25368 }, 25369 // Contents 25370 "empty": function empty(elem) { 25371 // http://www.w3.org/TR/selectors/#empty-pseudo 25372 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 25373 // but not by others (comment: 8; processing instruction: 7; etc.) 25374 // nodeType < 6 works because attributes (2) do not appear as children 25375 for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 25376 if (elem.nodeType < 6) { 25377 return false; 25378 } 25379 } 25380 25381 return true; 25382 }, 25383 "parent": function parent(elem) { 25384 return !Expr.pseudos["empty"](elem); 25385 }, 25386 // Element/input types 25387 "header": function header(elem) { 25388 return rheader.test(elem.nodeName); 25389 }, 25390 "input": function input(elem) { 25391 return rinputs.test(elem.nodeName); 25392 }, 25393 "button": function button(elem) { 25394 var name = elem.nodeName.toLowerCase(); 25395 return name === "input" && elem.type === "button" || name === "button"; 25396 }, 25397 "text": function text(elem) { 25398 var attr; 25399 return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && ( // Support: IE<8 25400 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 25401 (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); 25402 }, 25403 // Position-in-collection 25404 "first": createPositionalPseudo(function () { 25405 return [0]; 25406 }), 25407 "last": createPositionalPseudo(function (matchIndexes, length) { 25408 return [length - 1]; 25409 }), 25410 "eq": createPositionalPseudo(function (matchIndexes, length, argument) { 25411 return [argument < 0 ? argument + length : argument]; 25412 }), 25413 "even": createPositionalPseudo(function (matchIndexes, length) { 25414 var i = 0; 25415 25416 for (; i < length; i += 2) { 25417 matchIndexes.push(i); 25418 } 25419 25420 return matchIndexes; 25421 }), 25422 "odd": createPositionalPseudo(function (matchIndexes, length) { 25423 var i = 1; 25424 25425 for (; i < length; i += 2) { 25426 matchIndexes.push(i); 25427 } 25428 25429 return matchIndexes; 25430 }), 25431 "lt": createPositionalPseudo(function (matchIndexes, length, argument) { 25432 var i = argument < 0 ? argument + length : argument; 25433 25434 for (; --i >= 0;) { 25435 matchIndexes.push(i); 25436 } 25437 25438 return matchIndexes; 25439 }), 25440 "gt": createPositionalPseudo(function (matchIndexes, length, argument) { 25441 var i = argument < 0 ? argument + length : argument; 25442 25443 for (; ++i < length;) { 25444 matchIndexes.push(i); 25445 } 25446 25447 return matchIndexes; 25448 }) 25449 } 25450 }; 25451 Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos 25452 25453 for (i in { 25454 radio: true, 25455 checkbox: true, 25456 file: true, 25457 password: true, 25458 image: true 25459 }) { 25460 Expr.pseudos[i] = createInputPseudo(i); 25461 } 25462 25463 for (i in { 25464 submit: true, 25465 reset: true 25466 }) { 25467 Expr.pseudos[i] = createButtonPseudo(i); 25468 } // Easy API for creating new setFilters 25469 25470 25471 function setFilters() {} 25472 25473 setFilters.prototype = Expr.filters = Expr.pseudos; 25474 Expr.setFilters = new setFilters(); 25475 25476 tokenize = Sizzle.tokenize = function (selector, parseOnly) { 25477 var matched, 25478 match, 25479 tokens, 25480 type, 25481 soFar, 25482 groups, 25483 preFilters, 25484 cached = tokenCache[selector + " "]; 25485 25486 if (cached) { 25487 return parseOnly ? 0 : cached.slice(0); 25488 } 25489 25490 soFar = selector; 25491 groups = []; 25492 preFilters = Expr.preFilter; 25493 25494 while (soFar) { 25495 // Comma and first run 25496 if (!matched || (match = rcomma.exec(soFar))) { 25497 if (match) { 25498 // Don't consume trailing commas as valid 25499 soFar = soFar.slice(match[0].length) || soFar; 25500 } 25501 25502 groups.push(tokens = []); 25503 } 25504 25505 matched = false; // Combinators 25506 25507 if (match = rcombinators.exec(soFar)) { 25508 matched = match.shift(); 25509 tokens.push({ 25510 value: matched, 25511 // Cast descendant combinators to space 25512 type: match[0].replace(rtrim, " ") 25513 }); 25514 soFar = soFar.slice(matched.length); 25515 } // Filters 25516 25517 25518 for (type in Expr.filter) { 25519 if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) { 25520 matched = match.shift(); 25521 tokens.push({ 25522 value: matched, 25523 type: type, 25524 matches: match 25525 }); 25526 soFar = soFar.slice(matched.length); 25527 } 25528 } 25529 25530 if (!matched) { 25531 break; 25532 } 25533 } // Return the length of the invalid excess 25534 // if we're just parsing 25535 // Otherwise, throw an error or return tokens 25536 25537 25538 return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : // Cache the tokens 25539 tokenCache(selector, groups).slice(0); 25540 }; 25541 25542 function toSelector(tokens) { 25543 var i = 0, 25544 len = tokens.length, 25545 selector = ""; 25546 25547 for (; i < len; i++) { 25548 selector += tokens[i].value; 25549 } 25550 25551 return selector; 25552 } 25553 25554 function addCombinator(matcher, combinator, base) { 25555 var dir = combinator.dir, 25556 skip = combinator.next, 25557 key = skip || dir, 25558 checkNonElements = base && key === "parentNode", 25559 doneName = done++; 25560 return combinator.first ? // Check against closest ancestor/preceding element 25561 function (elem, context, xml) { 25562 while (elem = elem[dir]) { 25563 if (elem.nodeType === 1 || checkNonElements) { 25564 return matcher(elem, context, xml); 25565 } 25566 } 25567 25568 return false; 25569 } : // Check against all ancestor/preceding elements 25570 function (elem, context, xml) { 25571 var oldCache, 25572 uniqueCache, 25573 outerCache, 25574 newCache = [dirruns, doneName]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 25575 25576 if (xml) { 25577 while (elem = elem[dir]) { 25578 if (elem.nodeType === 1 || checkNonElements) { 25579 if (matcher(elem, context, xml)) { 25580 return true; 25581 } 25582 } 25583 } 25584 } else { 25585 while (elem = elem[dir]) { 25586 if (elem.nodeType === 1 || checkNonElements) { 25587 outerCache = elem[expando] || (elem[expando] = {}); // Support: IE <9 only 25588 // Defend against cloned attroperties (jQuery gh-1709) 25589 25590 uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {}); 25591 25592 if (skip && skip === elem.nodeName.toLowerCase()) { 25593 elem = elem[dir] || elem; 25594 } else if ((oldCache = uniqueCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) { 25595 // Assign to newCache so results back-propagate to previous elements 25596 return newCache[2] = oldCache[2]; 25597 } else { 25598 // Reuse newcache so results back-propagate to previous elements 25599 uniqueCache[key] = newCache; // A match means we're done; a fail means we have to keep checking 25600 25601 if (newCache[2] = matcher(elem, context, xml)) { 25602 return true; 25603 } 25604 } 25605 } 25606 } 25607 } 25608 25609 return false; 25610 }; 25611 } 25612 25613 function elementMatcher(matchers) { 25614 return matchers.length > 1 ? function (elem, context, xml) { 25615 var i = matchers.length; 25616 25617 while (i--) { 25618 if (!matchers[i](elem, context, xml)) { 25619 return false; 25620 } 25621 } 25622 25623 return true; 25624 } : matchers[0]; 25625 } 25626 25627 function multipleContexts(selector, contexts, results) { 25628 var i = 0, 25629 len = contexts.length; 25630 25631 for (; i < len; i++) { 25632 Sizzle(selector, contexts[i], results); 25633 } 25634 25635 return results; 25636 } 25637 25638 function condense(unmatched, map, filter, context, xml) { 25639 var elem, 25640 newUnmatched = [], 25641 i = 0, 25642 len = unmatched.length, 25643 mapped = map != null; 25644 25645 for (; i < len; i++) { 25646 if (elem = unmatched[i]) { 25647 if (!filter || filter(elem, context, xml)) { 25648 newUnmatched.push(elem); 25649 25650 if (mapped) { 25651 map.push(i); 25652 } 25653 } 25654 } 25655 } 25656 25657 return newUnmatched; 25658 } 25659 25660 function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { 25661 if (postFilter && !postFilter[expando]) { 25662 postFilter = setMatcher(postFilter); 25663 } 25664 25665 if (postFinder && !postFinder[expando]) { 25666 postFinder = setMatcher(postFinder, postSelector); 25667 } 25668 25669 return markFunction(function (seed, results, context, xml) { 25670 var temp, 25671 i, 25672 elem, 25673 preMap = [], 25674 postMap = [], 25675 preexisting = results.length, 25676 // Get initial elements from seed or context 25677 elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), 25678 // Prefilter to get matcher input, preserving a map for seed-results synchronization 25679 matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems, 25680 matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 25681 postFinder || (seed ? preFilter : preexisting || postFilter) ? // ...intermediate processing is necessary 25682 [] : // ...otherwise use results directly 25683 results : matcherIn; // Find primary matches 25684 25685 if (matcher) { 25686 matcher(matcherIn, matcherOut, context, xml); 25687 } // Apply postFilter 25688 25689 25690 if (postFilter) { 25691 temp = condense(matcherOut, postMap); 25692 postFilter(temp, [], context, xml); // Un-match failing elements by moving them back to matcherIn 25693 25694 i = temp.length; 25695 25696 while (i--) { 25697 if (elem = temp[i]) { 25698 matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); 25699 } 25700 } 25701 } 25702 25703 if (seed) { 25704 if (postFinder || preFilter) { 25705 if (postFinder) { 25706 // Get the final matcherOut by condensing this intermediate into postFinder contexts 25707 temp = []; 25708 i = matcherOut.length; 25709 25710 while (i--) { 25711 if (elem = matcherOut[i]) { 25712 // Restore matcherIn since elem is not yet a final match 25713 temp.push(matcherIn[i] = elem); 25714 } 25715 } 25716 25717 postFinder(null, matcherOut = [], temp, xml); 25718 } // Move matched elements from seed to results to keep them synchronized 25719 25720 25721 i = matcherOut.length; 25722 25723 while (i--) { 25724 if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) { 25725 seed[temp] = !(results[temp] = elem); 25726 } 25727 } 25728 } // Add elements to results, through postFinder if defined 25729 25730 } else { 25731 matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut); 25732 25733 if (postFinder) { 25734 postFinder(null, results, matcherOut, xml); 25735 } else { 25736 push.apply(results, matcherOut); 25737 } 25738 } 25739 }); 25740 } 25741 25742 function matcherFromTokens(tokens) { 25743 var checkContext, 25744 matcher, 25745 j, 25746 len = tokens.length, 25747 leadingRelative = Expr.relative[tokens[0].type], 25748 implicitRelative = leadingRelative || Expr.relative[" "], 25749 i = leadingRelative ? 1 : 0, 25750 // The foundational matcher ensures that elements are reachable from top-level context(s) 25751 matchContext = addCombinator(function (elem) { 25752 return elem === checkContext; 25753 }, implicitRelative, true), 25754 matchAnyContext = addCombinator(function (elem) { 25755 return indexOf(checkContext, elem) > -1; 25756 }, implicitRelative, true), 25757 matchers = [function (elem, context, xml) { 25758 var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml)); // Avoid hanging onto element (issue #299) 25759 25760 checkContext = null; 25761 return ret; 25762 }]; 25763 25764 for (; i < len; i++) { 25765 if (matcher = Expr.relative[tokens[i].type]) { 25766 matchers = [addCombinator(elementMatcher(matchers), matcher)]; 25767 } else { 25768 matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); // Return special upon seeing a positional matcher 25769 25770 if (matcher[expando]) { 25771 // Find the next relative operator (if any) for proper handling 25772 j = ++i; 25773 25774 for (; j < len; j++) { 25775 if (Expr.relative[tokens[j].type]) { 25776 break; 25777 } 25778 } 25779 25780 return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` 25781 tokens.slice(0, i - 1).concat({ 25782 value: tokens[i - 2].type === " " ? "*" : "" 25783 })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens)); 25784 } 25785 25786 matchers.push(matcher); 25787 } 25788 } 25789 25790 return elementMatcher(matchers); 25791 } 25792 25793 function matcherFromGroupMatchers(elementMatchers, setMatchers) { 25794 var bySet = setMatchers.length > 0, 25795 byElement = elementMatchers.length > 0, 25796 superMatcher = function superMatcher(seed, context, xml, results, outermost) { 25797 var elem, 25798 j, 25799 matcher, 25800 matchedCount = 0, 25801 i = "0", 25802 unmatched = seed && [], 25803 setMatched = [], 25804 contextBackup = outermostContext, 25805 // We must always have either seed elements or outermost context 25806 elems = seed || byElement && Expr.find["TAG"]("*", outermost), 25807 // Use integer dirruns iff this is the outermost matcher 25808 dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, 25809 len = elems.length; 25810 25811 if (outermost) { 25812 outermostContext = context === document || context || outermost; 25813 } // Add elements passing elementMatchers directly to results 25814 // Support: IE<9, Safari 25815 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 25816 25817 25818 for (; i !== len && (elem = elems[i]) != null; i++) { 25819 if (byElement && elem) { 25820 j = 0; 25821 25822 if (!context && elem.ownerDocument !== document) { 25823 setDocument(elem); 25824 xml = !documentIsHTML; 25825 } 25826 25827 while (matcher = elementMatchers[j++]) { 25828 if (matcher(elem, context || document, xml)) { 25829 results.push(elem); 25830 break; 25831 } 25832 } 25833 25834 if (outermost) { 25835 dirruns = dirrunsUnique; 25836 } 25837 } // Track unmatched elements for set filters 25838 25839 25840 if (bySet) { 25841 // They will have gone through all possible matchers 25842 if (elem = !matcher && elem) { 25843 matchedCount--; 25844 } // Lengthen the array for every element, matched or not 25845 25846 25847 if (seed) { 25848 unmatched.push(elem); 25849 } 25850 } 25851 } // `i` is now the count of elements visited above, and adding it to `matchedCount` 25852 // makes the latter nonnegative. 25853 25854 25855 matchedCount += i; // Apply set filters to unmatched elements 25856 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 25857 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 25858 // no element matchers and no seed. 25859 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 25860 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 25861 // numerically zero. 25862 25863 if (bySet && i !== matchedCount) { 25864 j = 0; 25865 25866 while (matcher = setMatchers[j++]) { 25867 matcher(unmatched, setMatched, context, xml); 25868 } 25869 25870 if (seed) { 25871 // Reintegrate element matches to eliminate the need for sorting 25872 if (matchedCount > 0) { 25873 while (i--) { 25874 if (!(unmatched[i] || setMatched[i])) { 25875 setMatched[i] = pop.call(results); 25876 } 25877 } 25878 } // Discard index placeholder values to get only actual matches 25879 25880 25881 setMatched = condense(setMatched); 25882 } // Add matches to results 25883 25884 25885 push.apply(results, setMatched); // Seedless set matches succeeding multiple successful matchers stipulate sorting 25886 25887 if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) { 25888 Sizzle.uniqueSort(results); 25889 } 25890 } // Override manipulation of globals by nested matchers 25891 25892 25893 if (outermost) { 25894 dirruns = dirrunsUnique; 25895 outermostContext = contextBackup; 25896 } 25897 25898 return unmatched; 25899 }; 25900 25901 return bySet ? markFunction(superMatcher) : superMatcher; 25902 } 25903 25904 compile = Sizzle.compile = function (selector, match 25905 /* Internal Use Only */ 25906 ) { 25907 var i, 25908 setMatchers = [], 25909 elementMatchers = [], 25910 cached = compilerCache[selector + " "]; 25911 25912 if (!cached) { 25913 // Generate a function of recursive functions that can be used to check each element 25914 if (!match) { 25915 match = tokenize(selector); 25916 } 25917 25918 i = match.length; 25919 25920 while (i--) { 25921 cached = matcherFromTokens(match[i]); 25922 25923 if (cached[expando]) { 25924 setMatchers.push(cached); 25925 } else { 25926 elementMatchers.push(cached); 25927 } 25928 } // Cache the compiled function 25929 25930 25931 cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); // Save selector and tokenization 25932 25933 cached.selector = selector; 25934 } 25935 25936 return cached; 25937 }; 25938 /** 25939 * A low-level selection function that works with Sizzle's compiled 25940 * selector functions 25941 * @param {String|Function} selector A selector or a pre-compiled 25942 * selector function built with Sizzle.compile 25943 * @param {Element} context 25944 * @param {Array} [results] 25945 * @param {Array} [seed] A set of elements to match against 25946 */ 25947 25948 25949 select = Sizzle.select = function (selector, context, results, seed) { 25950 var i, 25951 tokens, 25952 token, 25953 type, 25954 find, 25955 compiled = typeof selector === "function" && selector, 25956 match = !seed && tokenize(selector = compiled.selector || selector); 25957 results = results || []; // Try to minimize operations if there is only one selector in the list and no seed 25958 // (the latter of which guarantees us context) 25959 25960 if (match.length === 1) { 25961 // Reduce context if the leading compound selector is an ID 25962 tokens = match[0] = match[0].slice(0); 25963 25964 if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) { 25965 context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0]; 25966 25967 if (!context) { 25968 return results; // Precompiled matchers will still verify ancestry, so step up a level 25969 } else if (compiled) { 25970 context = context.parentNode; 25971 } 25972 25973 selector = selector.slice(tokens.shift().value.length); 25974 } // Fetch a seed set for right-to-left matching 25975 25976 25977 i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; 25978 25979 while (i--) { 25980 token = tokens[i]; // Abort if we hit a combinator 25981 25982 if (Expr.relative[type = token.type]) { 25983 break; 25984 } 25985 25986 if (find = Expr.find[type]) { 25987 // Search, expanding context for leading sibling combinators 25988 if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) { 25989 // If seed is empty or no tokens remain, we can return early 25990 tokens.splice(i, 1); 25991 selector = seed.length && toSelector(tokens); 25992 25993 if (!selector) { 25994 push.apply(results, seed); 25995 return results; 25996 } 25997 25998 break; 25999 } 26000 } 26001 } 26002 } // Compile and execute a filtering function if one is not provided 26003 // Provide `match` to avoid retokenization if we modified the selector above 26004 26005 26006 (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context); 26007 return results; 26008 }; // One-time assignments 26009 // Sort stability 26010 26011 26012 support.sortStable = expando.split("").sort(sortOrder).join("") === expando; // Support: Chrome 14-35+ 26013 // Always assume duplicates if they aren't passed to the comparison function 26014 26015 support.detectDuplicates = !!hasDuplicate; // Initialize against the default document 26016 26017 setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 26018 // Detached nodes confoundingly follow *each other* 26019 26020 support.sortDetached = assert(function (el) { 26021 // Should return 1, but returns 4 (following) 26022 return el.compareDocumentPosition(document.createElement("fieldset")) & 1; 26023 }); // Support: IE<8 26024 // Prevent attribute/property "interpolation" 26025 // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 26026 26027 if (!assert(function (el) { 26028 el.innerHTML = "<a href='#'></a>"; 26029 return el.firstChild.getAttribute("href") === "#"; 26030 })) { 26031 addHandle("type|href|height|width", function (elem, name, isXML) { 26032 if (!isXML) { 26033 return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); 26034 } 26035 }); 26036 } // Support: IE<9 26037 // Use defaultValue in place of getAttribute("value") 26038 26039 26040 if (!support.attributes || !assert(function (el) { 26041 el.innerHTML = "<input/>"; 26042 el.firstChild.setAttribute("value", ""); 26043 return el.firstChild.getAttribute("value") === ""; 26044 })) { 26045 addHandle("value", function (elem, name, isXML) { 26046 if (!isXML && elem.nodeName.toLowerCase() === "input") { 26047 return elem.defaultValue; 26048 } 26049 }); 26050 } // Support: IE<9 26051 // Use getAttributeNode to fetch booleans when getAttribute lies 26052 26053 26054 if (!assert(function (el) { 26055 return el.getAttribute("disabled") == null; 26056 })) { 26057 addHandle(booleans, function (elem, name, isXML) { 26058 var val; 26059 26060 if (!isXML) { 26061 return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; 26062 } 26063 }); 26064 } 26065 26066 return Sizzle; 26067 }(window); 26068 26069 jQuery.find = Sizzle; 26070 jQuery.expr = Sizzle.selectors; // Deprecated 26071 26072 jQuery.expr[":"] = jQuery.expr.pseudos; 26073 jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 26074 jQuery.text = Sizzle.getText; 26075 jQuery.isXMLDoc = Sizzle.isXML; 26076 jQuery.contains = Sizzle.contains; 26077 jQuery.escapeSelector = Sizzle.escape; 26078 26079 var dir = function dir(elem, _dir, until) { 26080 var matched = [], 26081 truncate = until !== undefined; 26082 26083 while ((elem = elem[_dir]) && elem.nodeType !== 9) { 26084 if (elem.nodeType === 1) { 26085 if (truncate && jQuery(elem).is(until)) { 26086 break; 26087 } 26088 26089 matched.push(elem); 26090 } 26091 } 26092 26093 return matched; 26094 }; 26095 26096 var _siblings = function siblings(n, elem) { 26097 var matched = []; 26098 26099 for (; n; n = n.nextSibling) { 26100 if (n.nodeType === 1 && n !== elem) { 26101 matched.push(n); 26102 } 26103 } 26104 26105 return matched; 26106 }; 26107 26108 var rneedsContext = jQuery.expr.match.needsContext; 26109 26110 function nodeName(elem, name) { 26111 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 26112 } 26113 26114 ; 26115 var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; // Implement the identical functionality for filter and not 26116 26117 function winnow(elements, qualifier, not) { 26118 if (isFunction(qualifier)) { 26119 return jQuery.grep(elements, function (elem, i) { 26120 return !!qualifier.call(elem, i, elem) !== not; 26121 }); 26122 } // Single element 26123 26124 26125 if (qualifier.nodeType) { 26126 return jQuery.grep(elements, function (elem) { 26127 return elem === qualifier !== not; 26128 }); 26129 } // Arraylike of elements (jQuery, arguments, Array) 26130 26131 26132 if (typeof qualifier !== "string") { 26133 return jQuery.grep(elements, function (elem) { 26134 return indexOf.call(qualifier, elem) > -1 !== not; 26135 }); 26136 } // Filtered directly for both simple and complex selectors 26137 26138 26139 return jQuery.filter(qualifier, elements, not); 26140 } 26141 26142 jQuery.filter = function (expr, elems, not) { 26143 var elem = elems[0]; 26144 26145 if (not) { 26146 expr = ":not(" + expr + ")"; 26147 } 26148 26149 if (elems.length === 1 && elem.nodeType === 1) { 26150 return jQuery.find.matchesSelector(elem, expr) ? [elem] : []; 26151 } 26152 26153 return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { 26154 return elem.nodeType === 1; 26155 })); 26156 }; 26157 26158 jQuery.fn.extend({ 26159 find: function find(selector) { 26160 var i, 26161 ret, 26162 len = this.length, 26163 self = this; 26164 26165 if (typeof selector !== "string") { 26166 return this.pushStack(jQuery(selector).filter(function () { 26167 for (i = 0; i < len; i++) { 26168 if (jQuery.contains(self[i], this)) { 26169 return true; 26170 } 26171 } 26172 })); 26173 } 26174 26175 ret = this.pushStack([]); 26176 26177 for (i = 0; i < len; i++) { 26178 jQuery.find(selector, self[i], ret); 26179 } 26180 26181 return len > 1 ? jQuery.uniqueSort(ret) : ret; 26182 }, 26183 filter: function filter(selector) { 26184 return this.pushStack(winnow(this, selector || [], false)); 26185 }, 26186 not: function not(selector) { 26187 return this.pushStack(winnow(this, selector || [], true)); 26188 }, 26189 is: function is(selector) { 26190 return !!winnow(this, // If this is a positional/relative selector, check membership in the returned set 26191 // so $("p:first").is("p:last") won't return true for a doc with two "p". 26192 typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length; 26193 } 26194 }); // Initialize a jQuery object 26195 // A central reference to the root jQuery(document) 26196 26197 var rootjQuery, 26198 // A simple way to check for HTML strings 26199 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 26200 // Strict HTML recognition (#11290: must start with <) 26201 // Shortcut simple #id case for speed 26202 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 26203 init = jQuery.fn.init = function (selector, context, root) { 26204 var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) 26205 26206 if (!selector) { 26207 return this; 26208 } // Method init() accepts an alternate rootjQuery 26209 // so migrate can support jQuery.sub (gh-2101) 26210 26211 26212 root = root || rootjQuery; // Handle HTML strings 26213 26214 if (typeof selector === "string") { 26215 if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) { 26216 // Assume that strings that start and end with <> are HTML and skip the regex check 26217 match = [null, selector, null]; 26218 } else { 26219 match = rquickExpr.exec(selector); 26220 } // Match html or make sure no context is specified for #id 26221 26222 26223 if (match && (match[1] || !context)) { 26224 // HANDLE: $(html) -> $(array) 26225 if (match[1]) { 26226 context = context instanceof jQuery ? context[0] : context; // Option to run scripts is true for back-compat 26227 // Intentionally let the error be thrown if parseHTML is not present 26228 26229 jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true)); // HANDLE: $(html, props) 26230 26231 if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { 26232 for (match in context) { 26233 // Properties of context are called as methods if possible 26234 if (isFunction(this[match])) { 26235 this[match](context[match]); // ...and otherwise set as attributes 26236 } else { 26237 this.attr(match, context[match]); 26238 } 26239 } 26240 } 26241 26242 return this; // HANDLE: $(#id) 26243 } else { 26244 elem = document.getElementById(match[2]); 26245 26246 if (elem) { 26247 // Inject the element directly into the jQuery object 26248 this[0] = elem; 26249 this.length = 1; 26250 } 26251 26252 return this; 26253 } // HANDLE: $(expr, $(...)) 26254 26255 } else if (!context || context.jquery) { 26256 return (context || root).find(selector); // HANDLE: $(expr, context) 26257 // (which is just equivalent to: $(context).find(expr) 26258 } else { 26259 return this.constructor(context).find(selector); 26260 } // HANDLE: $(DOMElement) 26261 26262 } else if (selector.nodeType) { 26263 this[0] = selector; 26264 this.length = 1; 26265 return this; // HANDLE: $(function) 26266 // Shortcut for document ready 26267 } else if (isFunction(selector)) { 26268 return root.ready !== undefined ? root.ready(selector) : // Execute immediately if ready is not present 26269 selector(jQuery); 26270 } 26271 26272 return jQuery.makeArray(selector, this); 26273 }; // Give the init function the jQuery prototype for later instantiation 26274 26275 26276 init.prototype = jQuery.fn; // Initialize central reference 26277 26278 rootjQuery = jQuery(document); 26279 var rparentsprev = /^(?:parents|prev(?:Until|All))/, 26280 // Methods guaranteed to produce a unique set when starting from a unique set 26281 guaranteedUnique = { 26282 children: true, 26283 contents: true, 26284 next: true, 26285 prev: true 26286 }; 26287 jQuery.fn.extend({ 26288 has: function has(target) { 26289 var targets = jQuery(target, this), 26290 l = targets.length; 26291 return this.filter(function () { 26292 var i = 0; 26293 26294 for (; i < l; i++) { 26295 if (jQuery.contains(this, targets[i])) { 26296 return true; 26297 } 26298 } 26299 }); 26300 }, 26301 closest: function closest(selectors, context) { 26302 var cur, 26303 i = 0, 26304 l = this.length, 26305 matched = [], 26306 targets = typeof selectors !== "string" && jQuery(selectors); // Positional selectors never match, since there's no _selection_ context 26307 26308 if (!rneedsContext.test(selectors)) { 26309 for (; i < l; i++) { 26310 for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { 26311 // Always skip document fragments 26312 if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : // Don't pass non-elements to Sizzle 26313 cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) { 26314 matched.push(cur); 26315 break; 26316 } 26317 } 26318 } 26319 } 26320 26321 return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched); 26322 }, 26323 // Determine the position of an element within the set 26324 index: function index(elem) { 26325 // No argument, return index in parent 26326 if (!elem) { 26327 return this[0] && this[0].parentNode ? this.first().prevAll().length : -1; 26328 } // Index in selector 26329 26330 26331 if (typeof elem === "string") { 26332 return indexOf.call(jQuery(elem), this[0]); 26333 } // Locate the position of the desired element 26334 26335 26336 return indexOf.call(this, // If it receives a jQuery object, the first element is used 26337 elem.jquery ? elem[0] : elem); 26338 }, 26339 add: function add(selector, context) { 26340 return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context)))); 26341 }, 26342 addBack: function addBack(selector) { 26343 return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector)); 26344 } 26345 }); 26346 26347 function sibling(cur, dir) { 26348 while ((cur = cur[dir]) && cur.nodeType !== 1) {} 26349 26350 return cur; 26351 } 26352 26353 jQuery.each({ 26354 parent: function parent(elem) { 26355 var parent = elem.parentNode; 26356 return parent && parent.nodeType !== 11 ? parent : null; 26357 }, 26358 parents: function parents(elem) { 26359 return dir(elem, "parentNode"); 26360 }, 26361 parentsUntil: function parentsUntil(elem, i, until) { 26362 return dir(elem, "parentNode", until); 26363 }, 26364 next: function next(elem) { 26365 return sibling(elem, "nextSibling"); 26366 }, 26367 prev: function prev(elem) { 26368 return sibling(elem, "previousSibling"); 26369 }, 26370 nextAll: function nextAll(elem) { 26371 return dir(elem, "nextSibling"); 26372 }, 26373 prevAll: function prevAll(elem) { 26374 return dir(elem, "previousSibling"); 26375 }, 26376 nextUntil: function nextUntil(elem, i, until) { 26377 return dir(elem, "nextSibling", until); 26378 }, 26379 prevUntil: function prevUntil(elem, i, until) { 26380 return dir(elem, "previousSibling", until); 26381 }, 26382 siblings: function siblings(elem) { 26383 return _siblings((elem.parentNode || {}).firstChild, elem); 26384 }, 26385 children: function children(elem) { 26386 return _siblings(elem.firstChild); 26387 }, 26388 contents: function contents(elem) { 26389 if (nodeName(elem, "iframe")) { 26390 return elem.contentDocument; 26391 } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 26392 // Treat the template element as a regular one in browsers that 26393 // don't support it. 26394 26395 26396 if (nodeName(elem, "template")) { 26397 elem = elem.content || elem; 26398 } 26399 26400 return jQuery.merge([], elem.childNodes); 26401 } 26402 }, function (name, fn) { 26403 jQuery.fn[name] = function (until, selector) { 26404 var matched = jQuery.map(this, fn, until); 26405 26406 if (name.slice(-5) !== "Until") { 26407 selector = until; 26408 } 26409 26410 if (selector && typeof selector === "string") { 26411 matched = jQuery.filter(selector, matched); 26412 } 26413 26414 if (this.length > 1) { 26415 // Remove duplicates 26416 if (!guaranteedUnique[name]) { 26417 jQuery.uniqueSort(matched); 26418 } // Reverse order for parents* and prev-derivatives 26419 26420 26421 if (rparentsprev.test(name)) { 26422 matched.reverse(); 26423 } 26424 } 26425 26426 return this.pushStack(matched); 26427 }; 26428 }); 26429 var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; // Convert String-formatted options into Object-formatted ones 26430 26431 function createOptions(options) { 26432 var object = {}; 26433 jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) { 26434 object[flag] = true; 26435 }); 26436 return object; 26437 } 26438 /* 26439 * Create a callback list using the following parameters: 26440 * 26441 * options: an optional list of space-separated options that will change how 26442 * the callback list behaves or a more traditional option object 26443 * 26444 * By default a callback list will act like an event callback list and can be 26445 * "fired" multiple times. 26446 * 26447 * Possible options: 26448 * 26449 * once: will ensure the callback list can only be fired once (like a Deferred) 26450 * 26451 * memory: will keep track of previous values and will call any callback added 26452 * after the list has been fired right away with the latest "memorized" 26453 * values (like a Deferred) 26454 * 26455 * unique: will ensure a callback can only be added once (no duplicate in the list) 26456 * 26457 * stopOnFalse: interrupt callings when a callback returns false 26458 * 26459 */ 26460 26461 26462 jQuery.Callbacks = function (options) { 26463 // Convert options from String-formatted to Object-formatted if needed 26464 // (we check in cache first) 26465 options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options); 26466 26467 var // Flag to know if list is currently firing 26468 firing, 26469 // Last fire value for non-forgettable lists 26470 memory, 26471 // Flag to know if list was already fired 26472 _fired, 26473 // Flag to prevent firing 26474 _locked, 26475 // Actual callback list 26476 list = [], 26477 // Queue of execution data for repeatable lists 26478 queue = [], 26479 // Index of currently firing callback (modified by add/remove as needed) 26480 firingIndex = -1, 26481 // Fire callbacks 26482 fire = function fire() { 26483 // Enforce single-firing 26484 _locked = _locked || options.once; // Execute callbacks for all pending executions, 26485 // respecting firingIndex overrides and runtime changes 26486 26487 _fired = firing = true; 26488 26489 for (; queue.length; firingIndex = -1) { 26490 memory = queue.shift(); 26491 26492 while (++firingIndex < list.length) { 26493 // Run callback and check for early termination 26494 if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) { 26495 // Jump to end and forget the data so .add doesn't re-fire 26496 firingIndex = list.length; 26497 memory = false; 26498 } 26499 } 26500 } // Forget the data if we're done with it 26501 26502 26503 if (!options.memory) { 26504 memory = false; 26505 } 26506 26507 firing = false; // Clean up if we're done firing for good 26508 26509 if (_locked) { 26510 // Keep an empty list if we have data for future add calls 26511 if (memory) { 26512 list = []; // Otherwise, this object is spent 26513 } else { 26514 list = ""; 26515 } 26516 } 26517 }, 26518 // Actual Callbacks object 26519 self = { 26520 // Add a callback or a collection of callbacks to the list 26521 add: function add() { 26522 if (list) { 26523 // If we have memory from a past run, we should fire after adding 26524 if (memory && !firing) { 26525 firingIndex = list.length - 1; 26526 queue.push(memory); 26527 } 26528 26529 (function add(args) { 26530 jQuery.each(args, function (_, arg) { 26531 if (isFunction(arg)) { 26532 if (!options.unique || !self.has(arg)) { 26533 list.push(arg); 26534 } 26535 } else if (arg && arg.length && toType(arg) !== "string") { 26536 // Inspect recursively 26537 add(arg); 26538 } 26539 }); 26540 })(arguments); 26541 26542 if (memory && !firing) { 26543 fire(); 26544 } 26545 } 26546 26547 return this; 26548 }, 26549 // Remove a callback from the list 26550 remove: function remove() { 26551 jQuery.each(arguments, function (_, arg) { 26552 var index; 26553 26554 while ((index = jQuery.inArray(arg, list, index)) > -1) { 26555 list.splice(index, 1); // Handle firing indexes 26556 26557 if (index <= firingIndex) { 26558 firingIndex--; 26559 } 26560 } 26561 }); 26562 return this; 26563 }, 26564 // Check if a given callback is in the list. 26565 // If no argument is given, return whether or not list has callbacks attached. 26566 has: function has(fn) { 26567 return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0; 26568 }, 26569 // Remove all callbacks from the list 26570 empty: function empty() { 26571 if (list) { 26572 list = []; 26573 } 26574 26575 return this; 26576 }, 26577 // Disable .fire and .add 26578 // Abort any current/pending executions 26579 // Clear all callbacks and values 26580 disable: function disable() { 26581 _locked = queue = []; 26582 list = memory = ""; 26583 return this; 26584 }, 26585 disabled: function disabled() { 26586 return !list; 26587 }, 26588 // Disable .fire 26589 // Also disable .add unless we have memory (since it would have no effect) 26590 // Abort any pending executions 26591 lock: function lock() { 26592 _locked = queue = []; 26593 26594 if (!memory && !firing) { 26595 list = memory = ""; 26596 } 26597 26598 return this; 26599 }, 26600 locked: function locked() { 26601 return !!_locked; 26602 }, 26603 // Call all callbacks with the given context and arguments 26604 fireWith: function fireWith(context, args) { 26605 if (!_locked) { 26606 args = args || []; 26607 args = [context, args.slice ? args.slice() : args]; 26608 queue.push(args); 26609 26610 if (!firing) { 26611 fire(); 26612 } 26613 } 26614 26615 return this; 26616 }, 26617 // Call all the callbacks with the given arguments 26618 fire: function fire() { 26619 self.fireWith(this, arguments); 26620 return this; 26621 }, 26622 // To know if the callbacks have already been called at least once 26623 fired: function fired() { 26624 return !!_fired; 26625 } 26626 }; 26627 26628 return self; 26629 }; 26630 26631 function Identity(v) { 26632 return v; 26633 } 26634 26635 function Thrower(ex) { 26636 throw ex; 26637 } 26638 26639 function adoptValue(value, resolve, reject, noValue) { 26640 var method; 26641 26642 try { 26643 // Check for promise aspect first to privilege synchronous behavior 26644 if (value && isFunction(method = value.promise)) { 26645 method.call(value).done(resolve).fail(reject); // Other thenables 26646 } else if (value && isFunction(method = value.then)) { 26647 method.call(value, resolve, reject); // Other non-thenables 26648 } else { 26649 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 26650 // * false: [ value ].slice( 0 ) => resolve( value ) 26651 // * true: [ value ].slice( 1 ) => resolve() 26652 resolve.apply(undefined, [value].slice(noValue)); 26653 } // For Promises/A+, convert exceptions into rejections 26654 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 26655 // Deferred#then to conditionally suppress rejection. 26656 26657 } catch (value) { 26658 // Support: Android 4.0 only 26659 // Strict mode functions invoked without .call/.apply get global-object context 26660 reject.apply(undefined, [value]); 26661 } 26662 } 26663 26664 jQuery.extend({ 26665 Deferred: function Deferred(func) { 26666 var tuples = [// action, add listener, callbacks, 26667 // ... .then handlers, argument index, [final state] 26668 ["notify", "progress", jQuery.Callbacks("memory"), jQuery.Callbacks("memory"), 2], ["resolve", "done", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 1, "rejected"]], 26669 _state = "pending", 26670 _promise = { 26671 state: function state() { 26672 return _state; 26673 }, 26674 always: function always() { 26675 deferred.done(arguments).fail(arguments); 26676 return this; 26677 }, 26678 "catch": function _catch(fn) { 26679 return _promise.then(null, fn); 26680 }, 26681 // Keep pipe for back-compat 26682 pipe: function pipe() 26683 /* fnDone, fnFail, fnProgress */ 26684 { 26685 var fns = arguments; 26686 return jQuery.Deferred(function (newDefer) { 26687 jQuery.each(tuples, function (i, tuple) { 26688 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 26689 var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) 26690 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 26691 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 26692 26693 deferred[tuple[1]](function () { 26694 var returned = fn && fn.apply(this, arguments); 26695 26696 if (returned && isFunction(returned.promise)) { 26697 returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject); 26698 } else { 26699 newDefer[tuple[0] + "With"](this, fn ? [returned] : arguments); 26700 } 26701 }); 26702 }); 26703 fns = null; 26704 }).promise(); 26705 }, 26706 then: function then(onFulfilled, onRejected, onProgress) { 26707 var maxDepth = 0; 26708 26709 function resolve(depth, deferred, handler, special) { 26710 return function () { 26711 var that = this, 26712 args = arguments, 26713 mightThrow = function mightThrow() { 26714 var returned, then; // Support: Promises/A+ section 2.3.3.3.3 26715 // https://promisesaplus.com/#point-59 26716 // Ignore double-resolution attempts 26717 26718 if (depth < maxDepth) { 26719 return; 26720 } 26721 26722 returned = handler.apply(that, args); // Support: Promises/A+ section 2.3.1 26723 // https://promisesaplus.com/#point-48 26724 26725 if (returned === deferred.promise()) { 26726 throw new TypeError("Thenable self-resolution"); 26727 } // Support: Promises/A+ sections 2.3.3.1, 3.5 26728 // https://promisesaplus.com/#point-54 26729 // https://promisesaplus.com/#point-75 26730 // Retrieve `then` only once 26731 26732 26733 then = returned && ( // Support: Promises/A+ section 2.3.4 26734 // https://promisesaplus.com/#point-64 26735 // Only check objects and functions for thenability 26736 _typeof(returned) === "object" || typeof returned === "function") && returned.then; // Handle a returned thenable 26737 26738 if (isFunction(then)) { 26739 // Special processors (notify) just wait for resolution 26740 if (special) { 26741 then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special)); // Normal processors (resolve) also hook into progress 26742 } else { 26743 // ...and disregard older resolution values 26744 maxDepth++; 26745 then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith)); 26746 } // Handle all other returned values 26747 26748 } else { 26749 // Only substitute handlers pass on context 26750 // and multiple values (non-spec behavior) 26751 if (handler !== Identity) { 26752 that = undefined; 26753 args = [returned]; 26754 } // Process the value(s) 26755 // Default process is resolve 26756 26757 26758 (special || deferred.resolveWith)(that, args); 26759 } 26760 }, 26761 // Only normal processors (resolve) catch and reject exceptions 26762 process = special ? mightThrow : function () { 26763 try { 26764 mightThrow(); 26765 } catch (e) { 26766 if (jQuery.Deferred.exceptionHook) { 26767 jQuery.Deferred.exceptionHook(e, process.stackTrace); 26768 } // Support: Promises/A+ section 2.3.3.3.4.1 26769 // https://promisesaplus.com/#point-61 26770 // Ignore post-resolution exceptions 26771 26772 26773 if (depth + 1 >= maxDepth) { 26774 // Only substitute handlers pass on context 26775 // and multiple values (non-spec behavior) 26776 if (handler !== Thrower) { 26777 that = undefined; 26778 args = [e]; 26779 } 26780 26781 deferred.rejectWith(that, args); 26782 } 26783 } 26784 }; // Support: Promises/A+ section 2.3.3.3.1 26785 // https://promisesaplus.com/#point-57 26786 // Re-resolve promises immediately to dodge false rejection from 26787 // subsequent errors 26788 26789 26790 if (depth) { 26791 process(); 26792 } else { 26793 // Call an optional hook to record the stack, in case of exception 26794 // since it's otherwise lost when execution goes async 26795 if (jQuery.Deferred.getStackHook) { 26796 process.stackTrace = jQuery.Deferred.getStackHook(); 26797 } 26798 26799 window.setTimeout(process); 26800 } 26801 }; 26802 } 26803 26804 return jQuery.Deferred(function (newDefer) { 26805 // progress_handlers.add( ... ) 26806 tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith)); // fulfilled_handlers.add( ... ) 26807 26808 tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity)); // rejected_handlers.add( ... ) 26809 26810 tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower)); 26811 }).promise(); 26812 }, 26813 // Get a promise for this deferred 26814 // If obj is provided, the promise aspect is added to the object 26815 promise: function promise(obj) { 26816 return obj != null ? jQuery.extend(obj, _promise) : _promise; 26817 } 26818 }, 26819 deferred = {}; // Add list-specific methods 26820 26821 jQuery.each(tuples, function (i, tuple) { 26822 var list = tuple[2], 26823 stateString = tuple[5]; // promise.progress = list.add 26824 // promise.done = list.add 26825 // promise.fail = list.add 26826 26827 _promise[tuple[1]] = list.add; // Handle state 26828 26829 if (stateString) { 26830 list.add(function () { 26831 // state = "resolved" (i.e., fulfilled) 26832 // state = "rejected" 26833 _state = stateString; 26834 }, // rejected_callbacks.disable 26835 // fulfilled_callbacks.disable 26836 tuples[3 - i][2].disable, // rejected_handlers.disable 26837 // fulfilled_handlers.disable 26838 tuples[3 - i][3].disable, // progress_callbacks.lock 26839 tuples[0][2].lock, // progress_handlers.lock 26840 tuples[0][3].lock); 26841 } // progress_handlers.fire 26842 // fulfilled_handlers.fire 26843 // rejected_handlers.fire 26844 26845 26846 list.add(tuple[3].fire); // deferred.notify = function() { deferred.notifyWith(...) } 26847 // deferred.resolve = function() { deferred.resolveWith(...) } 26848 // deferred.reject = function() { deferred.rejectWith(...) } 26849 26850 deferred[tuple[0]] = function () { 26851 deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments); 26852 return this; 26853 }; // deferred.notifyWith = list.fireWith 26854 // deferred.resolveWith = list.fireWith 26855 // deferred.rejectWith = list.fireWith 26856 26857 26858 deferred[tuple[0] + "With"] = list.fireWith; 26859 }); // Make the deferred a promise 26860 26861 _promise.promise(deferred); // Call given func if any 26862 26863 26864 if (func) { 26865 func.call(deferred, deferred); 26866 } // All done! 26867 26868 26869 return deferred; 26870 }, 26871 // Deferred helper 26872 when: function when(singleValue) { 26873 var // count of uncompleted subordinates 26874 remaining = arguments.length, 26875 // count of unprocessed arguments 26876 i = remaining, 26877 // subordinate fulfillment data 26878 resolveContexts = Array(i), 26879 resolveValues = _slice.call(arguments), 26880 // the master Deferred 26881 master = jQuery.Deferred(), 26882 // subordinate callback factory 26883 updateFunc = function updateFunc(i) { 26884 return function (value) { 26885 resolveContexts[i] = this; 26886 resolveValues[i] = arguments.length > 1 ? _slice.call(arguments) : value; 26887 26888 if (! --remaining) { 26889 master.resolveWith(resolveContexts, resolveValues); 26890 } 26891 }; 26892 }; // Single- and empty arguments are adopted like Promise.resolve 26893 26894 26895 if (remaining <= 1) { 26896 adoptValue(singleValue, master.done(updateFunc(i)).resolve, master.reject, !remaining); // Use .then() to unwrap secondary thenables (cf. gh-3000) 26897 26898 if (master.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) { 26899 return master.then(); 26900 } 26901 } // Multiple arguments are aggregated like Promise.all array elements 26902 26903 26904 while (i--) { 26905 adoptValue(resolveValues[i], updateFunc(i), master.reject); 26906 } 26907 26908 return master.promise(); 26909 } 26910 }); // These usually indicate a programmer mistake during development, 26911 // warn about them ASAP rather than swallowing them by default. 26912 26913 var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 26914 26915 jQuery.Deferred.exceptionHook = function (error, stack) { 26916 // Support: IE 8 - 9 only 26917 // Console exists when dev tools are open, which can happen at any time 26918 if (window.console && window.console.warn && error && rerrorNames.test(error.name)) { 26919 window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack); 26920 } 26921 }; 26922 26923 jQuery.readyException = function (error) { 26924 window.setTimeout(function () { 26925 throw error; 26926 }); 26927 }; // The deferred used on DOM ready 26928 26929 26930 var readyList = jQuery.Deferred(); 26931 26932 jQuery.fn.ready = function (fn) { 26933 readyList.then(fn) // Wrap jQuery.readyException in a function so that the lookup 26934 // happens at the time of error handling instead of callback 26935 // registration. 26936 .catch(function (error) { 26937 jQuery.readyException(error); 26938 }); 26939 return this; 26940 }; 26941 26942 jQuery.extend({ 26943 // Is the DOM ready to be used? Set to true once it occurs. 26944 isReady: false, 26945 // A counter to track how many items to wait for before 26946 // the ready event fires. See #6781 26947 readyWait: 1, 26948 // Handle when the DOM is ready 26949 ready: function ready(wait) { 26950 // Abort if there are pending holds or we're already ready 26951 if (wait === true ? --jQuery.readyWait : jQuery.isReady) { 26952 return; 26953 } // Remember that the DOM is ready 26954 26955 26956 jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be 26957 26958 if (wait !== true && --jQuery.readyWait > 0) { 26959 return; 26960 } // If there are functions bound, to execute 26961 26962 26963 readyList.resolveWith(document, [jQuery]); 26964 } 26965 }); 26966 jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method 26967 26968 function completed() { 26969 document.removeEventListener("DOMContentLoaded", completed); 26970 window.removeEventListener("load", completed); 26971 jQuery.ready(); 26972 } // Catch cases where $(document).ready() is called 26973 // after the browser event has already occurred. 26974 // Support: IE <=9 - 10 only 26975 // Older IE sometimes signals "interactive" too soon 26976 26977 26978 if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) { 26979 // Handle it asynchronously to allow scripts the opportunity to delay ready 26980 window.setTimeout(jQuery.ready); 26981 } else { 26982 // Use the handy event callback 26983 document.addEventListener("DOMContentLoaded", completed); // A fallback to window.onload, that will always work 26984 26985 window.addEventListener("load", completed); 26986 } // Multifunctional method to get and set values of a collection 26987 // The value/s can optionally be executed if it's a function 26988 26989 26990 var access = function access(elems, fn, key, value, chainable, emptyGet, raw) { 26991 var i = 0, 26992 len = elems.length, 26993 bulk = key == null; // Sets many values 26994 26995 if (toType(key) === "object") { 26996 chainable = true; 26997 26998 for (i in key) { 26999 access(elems, fn, i, key[i], true, emptyGet, raw); 27000 } // Sets one value 27001 27002 } else if (value !== undefined) { 27003 chainable = true; 27004 27005 if (!isFunction(value)) { 27006 raw = true; 27007 } 27008 27009 if (bulk) { 27010 // Bulk operations run against the entire set 27011 if (raw) { 27012 fn.call(elems, value); 27013 fn = null; // ...except when executing function values 27014 } else { 27015 bulk = fn; 27016 27017 fn = function fn(elem, key, value) { 27018 return bulk.call(jQuery(elem), value); 27019 }; 27020 } 27021 } 27022 27023 if (fn) { 27024 for (; i < len; i++) { 27025 fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key))); 27026 } 27027 } 27028 } 27029 27030 if (chainable) { 27031 return elems; 27032 } // Gets 27033 27034 27035 if (bulk) { 27036 return fn.call(elems); 27037 } 27038 27039 return len ? fn(elems[0], key) : emptyGet; 27040 }; // Matches dashed string for camelizing 27041 27042 27043 var rmsPrefix = /^-ms-/, 27044 rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() 27045 27046 function fcamelCase(all, letter) { 27047 return letter.toUpperCase(); 27048 } // Convert dashed to camelCase; used by the css and data modules 27049 // Support: IE <=9 - 11, Edge 12 - 15 27050 // Microsoft forgot to hump their vendor prefix (#9572) 27051 27052 27053 function camelCase(string) { 27054 return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); 27055 } 27056 27057 var acceptData = function acceptData(owner) { 27058 // Accepts only: 27059 // - Node 27060 // - Node.ELEMENT_NODE 27061 // - Node.DOCUMENT_NODE 27062 // - Object 27063 // - Any 27064 return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; 27065 }; 27066 27067 function Data() { 27068 this.expando = jQuery.expando + Data.uid++; 27069 } 27070 27071 Data.uid = 1; 27072 Data.prototype = { 27073 cache: function cache(owner) { 27074 // Check if the owner object already has a cache 27075 var value = owner[this.expando]; // If not, create one 27076 27077 if (!value) { 27078 value = {}; // We can accept data for non-element nodes in modern browsers, 27079 // but we should not, see #8335. 27080 // Always return an empty object. 27081 27082 if (acceptData(owner)) { 27083 // If it is a node unlikely to be stringify-ed or looped over 27084 // use plain assignment 27085 if (owner.nodeType) { 27086 owner[this.expando] = value; // Otherwise secure it in a non-enumerable property 27087 // configurable must be true to allow the property to be 27088 // deleted when data is removed 27089 } else { 27090 Object.defineProperty(owner, this.expando, { 27091 value: value, 27092 configurable: true 27093 }); 27094 } 27095 } 27096 } 27097 27098 return value; 27099 }, 27100 set: function set(owner, data, value) { 27101 var prop, 27102 cache = this.cache(owner); // Handle: [ owner, key, value ] args 27103 // Always use camelCase key (gh-2257) 27104 27105 if (typeof data === "string") { 27106 cache[camelCase(data)] = value; // Handle: [ owner, { properties } ] args 27107 } else { 27108 // Copy the properties one-by-one to the cache object 27109 for (prop in data) { 27110 cache[camelCase(prop)] = data[prop]; 27111 } 27112 } 27113 27114 return cache; 27115 }, 27116 get: function get(owner, key) { 27117 return key === undefined ? this.cache(owner) : // Always use camelCase key (gh-2257) 27118 owner[this.expando] && owner[this.expando][camelCase(key)]; 27119 }, 27120 access: function access(owner, key, value) { 27121 // In cases where either: 27122 // 27123 // 1. No key was specified 27124 // 2. A string key was specified, but no value provided 27125 // 27126 // Take the "read" path and allow the get method to determine 27127 // which value to return, respectively either: 27128 // 27129 // 1. The entire cache object 27130 // 2. The data stored at the key 27131 // 27132 if (key === undefined || key && typeof key === "string" && value === undefined) { 27133 return this.get(owner, key); 27134 } // When the key is not a string, or both a key and value 27135 // are specified, set or extend (existing objects) with either: 27136 // 27137 // 1. An object of properties 27138 // 2. A key and value 27139 // 27140 27141 27142 this.set(owner, key, value); // Since the "set" path can have two possible entry points 27143 // return the expected data based on which path was taken[*] 27144 27145 return value !== undefined ? value : key; 27146 }, 27147 remove: function remove(owner, key) { 27148 var i, 27149 cache = owner[this.expando]; 27150 27151 if (cache === undefined) { 27152 return; 27153 } 27154 27155 if (key !== undefined) { 27156 // Support array or space separated string of keys 27157 if (Array.isArray(key)) { 27158 // If key is an array of keys... 27159 // We always set camelCase keys, so remove that. 27160 key = key.map(camelCase); 27161 } else { 27162 key = camelCase(key); // If a key with the spaces exists, use it. 27163 // Otherwise, create an array by matching non-whitespace 27164 27165 key = key in cache ? [key] : key.match(rnothtmlwhite) || []; 27166 } 27167 27168 i = key.length; 27169 27170 while (i--) { 27171 delete cache[key[i]]; 27172 } 27173 } // Remove the expando if there's no more data 27174 27175 27176 if (key === undefined || jQuery.isEmptyObject(cache)) { 27177 // Support: Chrome <=35 - 45 27178 // Webkit & Blink performance suffers when deleting properties 27179 // from DOM nodes, so set to undefined instead 27180 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 27181 if (owner.nodeType) { 27182 owner[this.expando] = undefined; 27183 } else { 27184 delete owner[this.expando]; 27185 } 27186 } 27187 }, 27188 hasData: function hasData(owner) { 27189 var cache = owner[this.expando]; 27190 return cache !== undefined && !jQuery.isEmptyObject(cache); 27191 } 27192 }; 27193 var dataPriv = new Data(); 27194 var dataUser = new Data(); // Implementation Summary 27195 // 27196 // 1. Enforce API surface and semantic compatibility with 1.9.x branch 27197 // 2. Improve the module's maintainability by reducing the storage 27198 // paths to a single mechanism. 27199 // 3. Use the same single mechanism to support "private" and "user" data. 27200 // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 27201 // 5. Avoid exposing implementation details on user objects (eg. expando properties) 27202 // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 27203 27204 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 27205 rmultiDash = /[A-Z]/g; 27206 27207 function getData(data) { 27208 if (data === "true") { 27209 return true; 27210 } 27211 27212 if (data === "false") { 27213 return false; 27214 } 27215 27216 if (data === "null") { 27217 return null; 27218 } // Only convert to a number if it doesn't change the string 27219 27220 27221 if (data === +data + "") { 27222 return +data; 27223 } 27224 27225 if (rbrace.test(data)) { 27226 return JSON.parse(data); 27227 } 27228 27229 return data; 27230 } 27231 27232 function dataAttr(elem, key, data) { 27233 var name; // If nothing was found internally, try to fetch any 27234 // data from the HTML5 data-* attribute 27235 27236 if (data === undefined && elem.nodeType === 1) { 27237 name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase(); 27238 data = elem.getAttribute(name); 27239 27240 if (typeof data === "string") { 27241 try { 27242 data = getData(data); 27243 } catch (e) {} // Make sure we set the data so it isn't changed later 27244 27245 27246 dataUser.set(elem, key, data); 27247 } else { 27248 data = undefined; 27249 } 27250 } 27251 27252 return data; 27253 } 27254 27255 jQuery.extend({ 27256 hasData: function hasData(elem) { 27257 return dataUser.hasData(elem) || dataPriv.hasData(elem); 27258 }, 27259 data: function data(elem, name, _data) { 27260 return dataUser.access(elem, name, _data); 27261 }, 27262 removeData: function removeData(elem, name) { 27263 dataUser.remove(elem, name); 27264 }, 27265 // TODO: Now that all calls to _data and _removeData have been replaced 27266 // with direct calls to dataPriv methods, these can be deprecated. 27267 _data: function _data(elem, name, data) { 27268 return dataPriv.access(elem, name, data); 27269 }, 27270 _removeData: function _removeData(elem, name) { 27271 dataPriv.remove(elem, name); 27272 } 27273 }); 27274 jQuery.fn.extend({ 27275 data: function data(key, value) { 27276 var i, 27277 name, 27278 data, 27279 elem = this[0], 27280 attrs = elem && elem.attributes; // Gets all values 27281 27282 if (key === undefined) { 27283 if (this.length) { 27284 data = dataUser.get(elem); 27285 27286 if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) { 27287 i = attrs.length; 27288 27289 while (i--) { 27290 // Support: IE 11 only 27291 // The attrs elements can be null (#14894) 27292 if (attrs[i]) { 27293 name = attrs[i].name; 27294 27295 if (name.indexOf("data-") === 0) { 27296 name = camelCase(name.slice(5)); 27297 dataAttr(elem, name, data[name]); 27298 } 27299 } 27300 } 27301 27302 dataPriv.set(elem, "hasDataAttrs", true); 27303 } 27304 } 27305 27306 return data; 27307 } // Sets multiple values 27308 27309 27310 if (_typeof(key) === "object") { 27311 return this.each(function () { 27312 dataUser.set(this, key); 27313 }); 27314 } 27315 27316 return access(this, function (value) { 27317 var data; // The calling jQuery object (element matches) is not empty 27318 // (and therefore has an element appears at this[ 0 ]) and the 27319 // `value` parameter was not undefined. An empty jQuery object 27320 // will result in `undefined` for elem = this[ 0 ] which will 27321 // throw an exception if an attempt to read a data cache is made. 27322 27323 if (elem && value === undefined) { 27324 // Attempt to get data from the cache 27325 // The key will always be camelCased in Data 27326 data = dataUser.get(elem, key); 27327 27328 if (data !== undefined) { 27329 return data; 27330 } // Attempt to "discover" the data in 27331 // HTML5 custom data-* attrs 27332 27333 27334 data = dataAttr(elem, key); 27335 27336 if (data !== undefined) { 27337 return data; 27338 } // We tried really hard, but the data doesn't exist. 27339 27340 27341 return; 27342 } // Set the data... 27343 27344 27345 this.each(function () { 27346 // We always store the camelCased key 27347 dataUser.set(this, key, value); 27348 }); 27349 }, null, value, arguments.length > 1, null, true); 27350 }, 27351 removeData: function removeData(key) { 27352 return this.each(function () { 27353 dataUser.remove(this, key); 27354 }); 27355 } 27356 }); 27357 jQuery.extend({ 27358 queue: function queue(elem, type, data) { 27359 var queue; 27360 27361 if (elem) { 27362 type = (type || "fx") + "queue"; 27363 queue = dataPriv.get(elem, type); // Speed up dequeue by getting out quickly if this is just a lookup 27364 27365 if (data) { 27366 if (!queue || Array.isArray(data)) { 27367 queue = dataPriv.access(elem, type, jQuery.makeArray(data)); 27368 } else { 27369 queue.push(data); 27370 } 27371 } 27372 27373 return queue || []; 27374 } 27375 }, 27376 dequeue: function dequeue(elem, type) { 27377 type = type || "fx"; 27378 27379 var queue = jQuery.queue(elem, type), 27380 startLength = queue.length, 27381 fn = queue.shift(), 27382 hooks = jQuery._queueHooks(elem, type), 27383 next = function next() { 27384 jQuery.dequeue(elem, type); 27385 }; // If the fx queue is dequeued, always remove the progress sentinel 27386 27387 27388 if (fn === "inprogress") { 27389 fn = queue.shift(); 27390 startLength--; 27391 } 27392 27393 if (fn) { 27394 // Add a progress sentinel to prevent the fx queue from being 27395 // automatically dequeued 27396 if (type === "fx") { 27397 queue.unshift("inprogress"); 27398 } // Clear up the last queue stop function 27399 27400 27401 delete hooks.stop; 27402 fn.call(elem, next, hooks); 27403 } 27404 27405 if (!startLength && hooks) { 27406 hooks.empty.fire(); 27407 } 27408 }, 27409 // Not public - generate a queueHooks object, or return the current one 27410 _queueHooks: function _queueHooks(elem, type) { 27411 var key = type + "queueHooks"; 27412 return dataPriv.get(elem, key) || dataPriv.access(elem, key, { 27413 empty: jQuery.Callbacks("once memory").add(function () { 27414 dataPriv.remove(elem, [type + "queue", key]); 27415 }) 27416 }); 27417 } 27418 }); 27419 jQuery.fn.extend({ 27420 queue: function queue(type, data) { 27421 var setter = 2; 27422 27423 if (typeof type !== "string") { 27424 data = type; 27425 type = "fx"; 27426 setter--; 27427 } 27428 27429 if (arguments.length < setter) { 27430 return jQuery.queue(this[0], type); 27431 } 27432 27433 return data === undefined ? this : this.each(function () { 27434 var queue = jQuery.queue(this, type, data); // Ensure a hooks for this queue 27435 27436 jQuery._queueHooks(this, type); 27437 27438 if (type === "fx" && queue[0] !== "inprogress") { 27439 jQuery.dequeue(this, type); 27440 } 27441 }); 27442 }, 27443 dequeue: function dequeue(type) { 27444 return this.each(function () { 27445 jQuery.dequeue(this, type); 27446 }); 27447 }, 27448 clearQueue: function clearQueue(type) { 27449 return this.queue(type || "fx", []); 27450 }, 27451 // Get a promise resolved when queues of a certain type 27452 // are emptied (fx is the type by default) 27453 promise: function promise(type, obj) { 27454 var tmp, 27455 count = 1, 27456 defer = jQuery.Deferred(), 27457 elements = this, 27458 i = this.length, 27459 resolve = function resolve() { 27460 if (! --count) { 27461 defer.resolveWith(elements, [elements]); 27462 } 27463 }; 27464 27465 if (typeof type !== "string") { 27466 obj = type; 27467 type = undefined; 27468 } 27469 27470 type = type || "fx"; 27471 27472 while (i--) { 27473 tmp = dataPriv.get(elements[i], type + "queueHooks"); 27474 27475 if (tmp && tmp.empty) { 27476 count++; 27477 tmp.empty.add(resolve); 27478 } 27479 } 27480 27481 resolve(); 27482 return defer.promise(obj); 27483 } 27484 }); 27485 var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; 27486 var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); 27487 var cssExpand = ["Top", "Right", "Bottom", "Left"]; 27488 27489 var isHiddenWithinTree = function isHiddenWithinTree(elem, el) { 27490 // isHiddenWithinTree might be called from jQuery#filter function; 27491 // in that case, element will be second argument 27492 elem = el || elem; // Inline style trumps all 27493 27494 return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style 27495 // Support: Firefox <=43 - 45 27496 // Disconnected elements can have computed display: none, so first confirm that elem is 27497 // in the document. 27498 jQuery.contains(elem.ownerDocument, elem) && jQuery.css(elem, "display") === "none"; 27499 }; 27500 27501 var swap = function swap(elem, options, callback, args) { 27502 var ret, 27503 name, 27504 old = {}; // Remember the old values, and insert the new ones 27505 27506 for (name in options) { 27507 old[name] = elem.style[name]; 27508 elem.style[name] = options[name]; 27509 } 27510 27511 ret = callback.apply(elem, args || []); // Revert the old values 27512 27513 for (name in options) { 27514 elem.style[name] = old[name]; 27515 } 27516 27517 return ret; 27518 }; 27519 27520 function adjustCSS(elem, prop, valueParts, tween) { 27521 var adjusted, 27522 scale, 27523 maxIterations = 20, 27524 currentValue = tween ? function () { 27525 return tween.cur(); 27526 } : function () { 27527 return jQuery.css(elem, prop, ""); 27528 }, 27529 initial = currentValue(), 27530 unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), 27531 // Starting value computation is required for potential unit mismatches 27532 initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop)); 27533 27534 if (initialInUnit && initialInUnit[3] !== unit) { 27535 // Support: Firefox <=54 27536 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 27537 initial = initial / 2; // Trust units reported by jQuery.css 27538 27539 unit = unit || initialInUnit[3]; // Iteratively approximate from a nonzero starting point 27540 27541 initialInUnit = +initial || 1; 27542 27543 while (maxIterations--) { 27544 // Evaluate and update our best guess (doubling guesses that zero out). 27545 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 27546 jQuery.style(elem, prop, initialInUnit + unit); 27547 27548 if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) { 27549 maxIterations = 0; 27550 } 27551 27552 initialInUnit = initialInUnit / scale; 27553 } 27554 27555 initialInUnit = initialInUnit * 2; 27556 jQuery.style(elem, prop, initialInUnit + unit); // Make sure we update the tween properties later on 27557 27558 valueParts = valueParts || []; 27559 } 27560 27561 if (valueParts) { 27562 initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified 27563 27564 adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2]; 27565 27566 if (tween) { 27567 tween.unit = unit; 27568 tween.start = initialInUnit; 27569 tween.end = adjusted; 27570 } 27571 } 27572 27573 return adjusted; 27574 } 27575 27576 var defaultDisplayMap = {}; 27577 27578 function getDefaultDisplay(elem) { 27579 var temp, 27580 doc = elem.ownerDocument, 27581 nodeName = elem.nodeName, 27582 display = defaultDisplayMap[nodeName]; 27583 27584 if (display) { 27585 return display; 27586 } 27587 27588 temp = doc.body.appendChild(doc.createElement(nodeName)); 27589 display = jQuery.css(temp, "display"); 27590 temp.parentNode.removeChild(temp); 27591 27592 if (display === "none") { 27593 display = "block"; 27594 } 27595 27596 defaultDisplayMap[nodeName] = display; 27597 return display; 27598 } 27599 27600 function showHide(elements, show) { 27601 var display, 27602 elem, 27603 values = [], 27604 index = 0, 27605 length = elements.length; // Determine new display value for elements that need to change 27606 27607 for (; index < length; index++) { 27608 elem = elements[index]; 27609 27610 if (!elem.style) { 27611 continue; 27612 } 27613 27614 display = elem.style.display; 27615 27616 if (show) { 27617 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 27618 // check is required in this first loop unless we have a nonempty display value (either 27619 // inline or about-to-be-restored) 27620 if (display === "none") { 27621 values[index] = dataPriv.get(elem, "display") || null; 27622 27623 if (!values[index]) { 27624 elem.style.display = ""; 27625 } 27626 } 27627 27628 if (elem.style.display === "" && isHiddenWithinTree(elem)) { 27629 values[index] = getDefaultDisplay(elem); 27630 } 27631 } else { 27632 if (display !== "none") { 27633 values[index] = "none"; // Remember what we're overwriting 27634 27635 dataPriv.set(elem, "display", display); 27636 } 27637 } 27638 } // Set the display of the elements in a second loop to avoid constant reflow 27639 27640 27641 for (index = 0; index < length; index++) { 27642 if (values[index] != null) { 27643 elements[index].style.display = values[index]; 27644 } 27645 } 27646 27647 return elements; 27648 } 27649 27650 jQuery.fn.extend({ 27651 show: function show() { 27652 return showHide(this, true); 27653 }, 27654 hide: function hide() { 27655 return showHide(this); 27656 }, 27657 toggle: function toggle(state) { 27658 if (typeof state === "boolean") { 27659 return state ? this.show() : this.hide(); 27660 } 27661 27662 return this.each(function () { 27663 if (isHiddenWithinTree(this)) { 27664 jQuery(this).show(); 27665 } else { 27666 jQuery(this).hide(); 27667 } 27668 }); 27669 } 27670 }); 27671 var rcheckableType = /^(?:checkbox|radio)$/i; 27672 var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i; 27673 var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; // We have to close these tags to support XHTML (#13200) 27674 27675 var wrapMap = { 27676 // Support: IE <=9 only 27677 option: [1, "<select multiple='multiple'>", "</select>"], 27678 // XHTML parsers do not magically insert elements in the 27679 // same way that tag soup parsers do. So we cannot shorten 27680 // this by omitting <tbody> or other required elements. 27681 thead: [1, "<table>", "</table>"], 27682 col: [2, "<table><colgroup>", "</colgroup></table>"], 27683 tr: [2, "<table><tbody>", "</tbody></table>"], 27684 td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], 27685 _default: [0, "", ""] 27686 }; // Support: IE <=9 only 27687 27688 wrapMap.optgroup = wrapMap.option; 27689 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 27690 wrapMap.th = wrapMap.td; 27691 27692 function getAll(context, tag) { 27693 // Support: IE <=9 - 11 only 27694 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 27695 var ret; 27696 27697 if (typeof context.getElementsByTagName !== "undefined") { 27698 ret = context.getElementsByTagName(tag || "*"); 27699 } else if (typeof context.querySelectorAll !== "undefined") { 27700 ret = context.querySelectorAll(tag || "*"); 27701 } else { 27702 ret = []; 27703 } 27704 27705 if (tag === undefined || tag && nodeName(context, tag)) { 27706 return jQuery.merge([context], ret); 27707 } 27708 27709 return ret; 27710 } // Mark scripts as having already been evaluated 27711 27712 27713 function setGlobalEval(elems, refElements) { 27714 var i = 0, 27715 l = elems.length; 27716 27717 for (; i < l; i++) { 27718 dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval")); 27719 } 27720 } 27721 27722 var rhtml = /<|&#?\w+;/; 27723 27724 function buildFragment(elems, context, scripts, selection, ignored) { 27725 var elem, 27726 tmp, 27727 tag, 27728 wrap, 27729 contains, 27730 j, 27731 fragment = context.createDocumentFragment(), 27732 nodes = [], 27733 i = 0, 27734 l = elems.length; 27735 27736 for (; i < l; i++) { 27737 elem = elems[i]; 27738 27739 if (elem || elem === 0) { 27740 // Add nodes directly 27741 if (toType(elem) === "object") { 27742 // Support: Android <=4.0 only, PhantomJS 1 only 27743 // push.apply(_, arraylike) throws on ancient WebKit 27744 jQuery.merge(nodes, elem.nodeType ? [elem] : elem); // Convert non-html into a text node 27745 } else if (!rhtml.test(elem)) { 27746 nodes.push(context.createTextNode(elem)); // Convert html into DOM nodes 27747 } else { 27748 tmp = tmp || fragment.appendChild(context.createElement("div")); // Deserialize a standard representation 27749 27750 tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); 27751 wrap = wrapMap[tag] || wrapMap._default; 27752 tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; // Descend through wrappers to the right content 27753 27754 j = wrap[0]; 27755 27756 while (j--) { 27757 tmp = tmp.lastChild; 27758 } // Support: Android <=4.0 only, PhantomJS 1 only 27759 // push.apply(_, arraylike) throws on ancient WebKit 27760 27761 27762 jQuery.merge(nodes, tmp.childNodes); // Remember the top-level container 27763 27764 tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) 27765 27766 tmp.textContent = ""; 27767 } 27768 } 27769 } // Remove wrapper from fragment 27770 27771 27772 fragment.textContent = ""; 27773 i = 0; 27774 27775 while (elem = nodes[i++]) { 27776 // Skip elements already in the context collection (trac-4087) 27777 if (selection && jQuery.inArray(elem, selection) > -1) { 27778 if (ignored) { 27779 ignored.push(elem); 27780 } 27781 27782 continue; 27783 } 27784 27785 contains = jQuery.contains(elem.ownerDocument, elem); // Append to fragment 27786 27787 tmp = getAll(fragment.appendChild(elem), "script"); // Preserve script evaluation history 27788 27789 if (contains) { 27790 setGlobalEval(tmp); 27791 } // Capture executables 27792 27793 27794 if (scripts) { 27795 j = 0; 27796 27797 while (elem = tmp[j++]) { 27798 if (rscriptType.test(elem.type || "")) { 27799 scripts.push(elem); 27800 } 27801 } 27802 } 27803 } 27804 27805 return fragment; 27806 } 27807 27808 (function () { 27809 var fragment = document.createDocumentFragment(), 27810 div = fragment.appendChild(document.createElement("div")), 27811 input = document.createElement("input"); // Support: Android 4.0 - 4.3 only 27812 // Check state lost if the name is set (#11217) 27813 // Support: Windows Web Apps (WWA) 27814 // `name` and `type` must use .setAttribute for WWA (#14901) 27815 27816 input.setAttribute("type", "radio"); 27817 input.setAttribute("checked", "checked"); 27818 input.setAttribute("name", "t"); 27819 div.appendChild(input); // Support: Android <=4.1 only 27820 // Older WebKit doesn't clone checked state correctly in fragments 27821 27822 support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; // Support: IE <=11 only 27823 // Make sure textarea (and checkbox) defaultValue is properly cloned 27824 27825 div.innerHTML = "<textarea>x</textarea>"; 27826 support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; 27827 })(); 27828 27829 var documentElement = document.documentElement; 27830 var rkeyEvent = /^key/, 27831 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 27832 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 27833 27834 function returnTrue() { 27835 return true; 27836 } 27837 27838 function returnFalse() { 27839 return false; 27840 } // Support: IE <=9 only 27841 // See #13393 for more info 27842 27843 27844 function safeActiveElement() { 27845 try { 27846 return document.activeElement; 27847 } catch (err) {} 27848 } 27849 27850 function _on(elem, types, selector, data, fn, one) { 27851 var origFn, type; // Types can be a map of types/handlers 27852 27853 if (_typeof(types) === "object") { 27854 // ( types-Object, selector, data ) 27855 if (typeof selector !== "string") { 27856 // ( types-Object, data ) 27857 data = data || selector; 27858 selector = undefined; 27859 } 27860 27861 for (type in types) { 27862 _on(elem, type, selector, data, types[type], one); 27863 } 27864 27865 return elem; 27866 } 27867 27868 if (data == null && fn == null) { 27869 // ( types, fn ) 27870 fn = selector; 27871 data = selector = undefined; 27872 } else if (fn == null) { 27873 if (typeof selector === "string") { 27874 // ( types, selector, fn ) 27875 fn = data; 27876 data = undefined; 27877 } else { 27878 // ( types, data, fn ) 27879 fn = data; 27880 data = selector; 27881 selector = undefined; 27882 } 27883 } 27884 27885 if (fn === false) { 27886 fn = returnFalse; 27887 } else if (!fn) { 27888 return elem; 27889 } 27890 27891 if (one === 1) { 27892 origFn = fn; 27893 27894 fn = function fn(event) { 27895 // Can use an empty set, since event contains the info 27896 jQuery().off(event); 27897 return origFn.apply(this, arguments); 27898 }; // Use same guid so caller can remove using origFn 27899 27900 27901 fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); 27902 } 27903 27904 return elem.each(function () { 27905 jQuery.event.add(this, types, fn, data, selector); 27906 }); 27907 } 27908 /* 27909 * Helper functions for managing events -- not part of the public interface. 27910 * Props to Dean Edwards' addEvent library for many of the ideas. 27911 */ 27912 27913 27914 jQuery.event = { 27915 global: {}, 27916 add: function add(elem, types, handler, data, selector) { 27917 var handleObjIn, 27918 eventHandle, 27919 tmp, 27920 events, 27921 t, 27922 handleObj, 27923 special, 27924 handlers, 27925 type, 27926 namespaces, 27927 origType, 27928 elemData = dataPriv.get(elem); // Don't attach events to noData or text/comment nodes (but allow plain objects) 27929 27930 if (!elemData) { 27931 return; 27932 } // Caller can pass in an object of custom data in lieu of the handler 27933 27934 27935 if (handler.handler) { 27936 handleObjIn = handler; 27937 handler = handleObjIn.handler; 27938 selector = handleObjIn.selector; 27939 } // Ensure that invalid selectors throw exceptions at attach time 27940 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 27941 27942 27943 if (selector) { 27944 jQuery.find.matchesSelector(documentElement, selector); 27945 } // Make sure that the handler has a unique ID, used to find/remove it later 27946 27947 27948 if (!handler.guid) { 27949 handler.guid = jQuery.guid++; 27950 } // Init the element's event structure and main handler, if this is the first 27951 27952 27953 if (!(events = elemData.events)) { 27954 events = elemData.events = {}; 27955 } 27956 27957 if (!(eventHandle = elemData.handle)) { 27958 eventHandle = elemData.handle = function (e) { 27959 // Discard the second event of a jQuery.event.trigger() and 27960 // when an event is called after a page has unloaded 27961 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined; 27962 }; 27963 } // Handle multiple events separated by a space 27964 27965 27966 types = (types || "").match(rnothtmlwhite) || [""]; 27967 t = types.length; 27968 27969 while (t--) { 27970 tmp = rtypenamespace.exec(types[t]) || []; 27971 type = origType = tmp[1]; 27972 namespaces = (tmp[2] || "").split(".").sort(); // There *must* be a type, no attaching namespace-only handlers 27973 27974 if (!type) { 27975 continue; 27976 } // If event changes its type, use the special event handlers for the changed type 27977 27978 27979 special = jQuery.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type 27980 27981 type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type 27982 27983 special = jQuery.event.special[type] || {}; // handleObj is passed to all event handlers 27984 27985 handleObj = jQuery.extend({ 27986 type: type, 27987 origType: origType, 27988 data: data, 27989 handler: handler, 27990 guid: handler.guid, 27991 selector: selector, 27992 needsContext: selector && jQuery.expr.match.needsContext.test(selector), 27993 namespace: namespaces.join(".") 27994 }, handleObjIn); // Init the event handler queue if we're the first 27995 27996 if (!(handlers = events[type])) { 27997 handlers = events[type] = []; 27998 handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false 27999 28000 if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { 28001 if (elem.addEventListener) { 28002 elem.addEventListener(type, eventHandle); 28003 } 28004 } 28005 } 28006 28007 if (special.add) { 28008 special.add.call(elem, handleObj); 28009 28010 if (!handleObj.handler.guid) { 28011 handleObj.handler.guid = handler.guid; 28012 } 28013 } // Add to the element's handler list, delegates in front 28014 28015 28016 if (selector) { 28017 handlers.splice(handlers.delegateCount++, 0, handleObj); 28018 } else { 28019 handlers.push(handleObj); 28020 } // Keep track of which events have ever been used, for event optimization 28021 28022 28023 jQuery.event.global[type] = true; 28024 } 28025 }, 28026 // Detach an event or set of events from an element 28027 remove: function remove(elem, types, handler, selector, mappedTypes) { 28028 var j, 28029 origCount, 28030 tmp, 28031 events, 28032 t, 28033 handleObj, 28034 special, 28035 handlers, 28036 type, 28037 namespaces, 28038 origType, 28039 elemData = dataPriv.hasData(elem) && dataPriv.get(elem); 28040 28041 if (!elemData || !(events = elemData.events)) { 28042 return; 28043 } // Once for each type.namespace in types; type may be omitted 28044 28045 28046 types = (types || "").match(rnothtmlwhite) || [""]; 28047 t = types.length; 28048 28049 while (t--) { 28050 tmp = rtypenamespace.exec(types[t]) || []; 28051 type = origType = tmp[1]; 28052 namespaces = (tmp[2] || "").split(".").sort(); // Unbind all events (on this namespace, if provided) for the element 28053 28054 if (!type) { 28055 for (type in events) { 28056 jQuery.event.remove(elem, type + types[t], handler, selector, true); 28057 } 28058 28059 continue; 28060 } 28061 28062 special = jQuery.event.special[type] || {}; 28063 type = (selector ? special.delegateType : special.bindType) || type; 28064 handlers = events[type] || []; 28065 tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); // Remove matching events 28066 28067 origCount = j = handlers.length; 28068 28069 while (j--) { 28070 handleObj = handlers[j]; 28071 28072 if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { 28073 handlers.splice(j, 1); 28074 28075 if (handleObj.selector) { 28076 handlers.delegateCount--; 28077 } 28078 28079 if (special.remove) { 28080 special.remove.call(elem, handleObj); 28081 } 28082 } 28083 } // Remove generic event handler if we removed something and no more handlers exist 28084 // (avoids potential for endless recursion during removal of special event handlers) 28085 28086 28087 if (origCount && !handlers.length) { 28088 if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { 28089 jQuery.removeEvent(elem, type, elemData.handle); 28090 } 28091 28092 delete events[type]; 28093 } 28094 } // Remove data and the expando if it's no longer used 28095 28096 28097 if (jQuery.isEmptyObject(events)) { 28098 dataPriv.remove(elem, "handle events"); 28099 } 28100 }, 28101 dispatch: function dispatch(nativeEvent) { 28102 // Make a writable jQuery.Event from the native event object 28103 var event = jQuery.event.fix(nativeEvent); 28104 var i, 28105 j, 28106 ret, 28107 matched, 28108 handleObj, 28109 handlerQueue, 28110 args = new Array(arguments.length), 28111 handlers = (dataPriv.get(this, "events") || {})[event.type] || [], 28112 special = jQuery.event.special[event.type] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event 28113 28114 args[0] = event; 28115 28116 for (i = 1; i < arguments.length; i++) { 28117 args[i] = arguments[i]; 28118 } 28119 28120 event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired 28121 28122 if (special.preDispatch && special.preDispatch.call(this, event) === false) { 28123 return; 28124 } // Determine handlers 28125 28126 28127 handlerQueue = jQuery.event.handlers.call(this, event, handlers); // Run delegates first; they may want to stop propagation beneath us 28128 28129 i = 0; 28130 28131 while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { 28132 event.currentTarget = matched.elem; 28133 j = 0; 28134 28135 while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { 28136 // Triggered event must either 1) have no namespace, or 2) have namespace(s) 28137 // a subset or equal to those in the bound event (both can have no namespace). 28138 if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) { 28139 event.handleObj = handleObj; 28140 event.data = handleObj.data; 28141 ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args); 28142 28143 if (ret !== undefined) { 28144 if ((event.result = ret) === false) { 28145 event.preventDefault(); 28146 event.stopPropagation(); 28147 } 28148 } 28149 } 28150 } 28151 } // Call the postDispatch hook for the mapped type 28152 28153 28154 if (special.postDispatch) { 28155 special.postDispatch.call(this, event); 28156 } 28157 28158 return event.result; 28159 }, 28160 handlers: function handlers(event, _handlers) { 28161 var i, 28162 handleObj, 28163 sel, 28164 matchedHandlers, 28165 matchedSelectors, 28166 handlerQueue = [], 28167 delegateCount = _handlers.delegateCount, 28168 cur = event.target; // Find delegate handlers 28169 28170 if (delegateCount && // Support: IE <=9 28171 // Black-hole SVG <use> instance trees (trac-13180) 28172 cur.nodeType && // Support: Firefox <=42 28173 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 28174 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 28175 // Support: IE 11 only 28176 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 28177 !(event.type === "click" && event.button >= 1)) { 28178 for (; cur !== this; cur = cur.parentNode || this) { 28179 // Don't check non-elements (#13208) 28180 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 28181 if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) { 28182 matchedHandlers = []; 28183 matchedSelectors = {}; 28184 28185 for (i = 0; i < delegateCount; i++) { 28186 handleObj = _handlers[i]; // Don't conflict with Object.prototype properties (#13203) 28187 28188 sel = handleObj.selector + " "; 28189 28190 if (matchedSelectors[sel] === undefined) { 28191 matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length; 28192 } 28193 28194 if (matchedSelectors[sel]) { 28195 matchedHandlers.push(handleObj); 28196 } 28197 } 28198 28199 if (matchedHandlers.length) { 28200 handlerQueue.push({ 28201 elem: cur, 28202 handlers: matchedHandlers 28203 }); 28204 } 28205 } 28206 } 28207 } // Add the remaining (directly-bound) handlers 28208 28209 28210 cur = this; 28211 28212 if (delegateCount < _handlers.length) { 28213 handlerQueue.push({ 28214 elem: cur, 28215 handlers: _handlers.slice(delegateCount) 28216 }); 28217 } 28218 28219 return handlerQueue; 28220 }, 28221 addProp: function addProp(name, hook) { 28222 Object.defineProperty(jQuery.Event.prototype, name, { 28223 enumerable: true, 28224 configurable: true, 28225 get: isFunction(hook) ? function () { 28226 if (this.originalEvent) { 28227 return hook(this.originalEvent); 28228 } 28229 } : function () { 28230 if (this.originalEvent) { 28231 return this.originalEvent[name]; 28232 } 28233 }, 28234 set: function set(value) { 28235 Object.defineProperty(this, name, { 28236 enumerable: true, 28237 configurable: true, 28238 writable: true, 28239 value: value 28240 }); 28241 } 28242 }); 28243 }, 28244 fix: function fix(originalEvent) { 28245 return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent); 28246 }, 28247 special: { 28248 load: { 28249 // Prevent triggered image.load events from bubbling to window.load 28250 noBubble: true 28251 }, 28252 focus: { 28253 // Fire native event if possible so blur/focus sequence is correct 28254 trigger: function trigger() { 28255 if (this !== safeActiveElement() && this.focus) { 28256 this.focus(); 28257 return false; 28258 } 28259 }, 28260 delegateType: "focusin" 28261 }, 28262 blur: { 28263 trigger: function trigger() { 28264 if (this === safeActiveElement() && this.blur) { 28265 this.blur(); 28266 return false; 28267 } 28268 }, 28269 delegateType: "focusout" 28270 }, 28271 click: { 28272 // For checkbox, fire native event so checked state will be right 28273 trigger: function trigger() { 28274 if (this.type === "checkbox" && this.click && nodeName(this, "input")) { 28275 this.click(); 28276 return false; 28277 } 28278 }, 28279 // For cross-browser consistency, don't fire native .click() on links 28280 _default: function _default(event) { 28281 return nodeName(event.target, "a"); 28282 } 28283 }, 28284 beforeunload: { 28285 postDispatch: function postDispatch(event) { 28286 // Support: Firefox 20+ 28287 // Firefox doesn't alert if the returnValue field is not set. 28288 if (event.result !== undefined && event.originalEvent) { 28289 event.originalEvent.returnValue = event.result; 28290 } 28291 } 28292 } 28293 } 28294 }; 28295 28296 jQuery.removeEvent = function (elem, type, handle) { 28297 // This "if" is needed for plain objects 28298 if (elem.removeEventListener) { 28299 elem.removeEventListener(type, handle); 28300 } 28301 }; 28302 28303 jQuery.Event = function (src, props) { 28304 // Allow instantiation without the 'new' keyword 28305 if (!(this instanceof jQuery.Event)) { 28306 return new jQuery.Event(src, props); 28307 } // Event object 28308 28309 28310 if (src && src.type) { 28311 this.originalEvent = src; 28312 this.type = src.type; // Events bubbling up the document may have been marked as prevented 28313 // by a handler lower down the tree; reflect the correct value. 28314 28315 this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only 28316 src.returnValue === false ? returnTrue : returnFalse; // Create target properties 28317 // Support: Safari <=6 - 7 only 28318 // Target should not be a text node (#504, #13143) 28319 28320 this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target; 28321 this.currentTarget = src.currentTarget; 28322 this.relatedTarget = src.relatedTarget; // Event type 28323 } else { 28324 this.type = src; 28325 } // Put explicitly provided properties onto the event object 28326 28327 28328 if (props) { 28329 jQuery.extend(this, props); 28330 } // Create a timestamp if incoming event doesn't have one 28331 28332 28333 this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed 28334 28335 this[jQuery.expando] = true; 28336 }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 28337 // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 28338 28339 28340 jQuery.Event.prototype = { 28341 constructor: jQuery.Event, 28342 isDefaultPrevented: returnFalse, 28343 isPropagationStopped: returnFalse, 28344 isImmediatePropagationStopped: returnFalse, 28345 isSimulated: false, 28346 preventDefault: function preventDefault() { 28347 var e = this.originalEvent; 28348 this.isDefaultPrevented = returnTrue; 28349 28350 if (e && !this.isSimulated) { 28351 e.preventDefault(); 28352 } 28353 }, 28354 stopPropagation: function stopPropagation() { 28355 var e = this.originalEvent; 28356 this.isPropagationStopped = returnTrue; 28357 28358 if (e && !this.isSimulated) { 28359 e.stopPropagation(); 28360 } 28361 }, 28362 stopImmediatePropagation: function stopImmediatePropagation() { 28363 var e = this.originalEvent; 28364 this.isImmediatePropagationStopped = returnTrue; 28365 28366 if (e && !this.isSimulated) { 28367 e.stopImmediatePropagation(); 28368 } 28369 28370 this.stopPropagation(); 28371 } 28372 }; // Includes all common event props including KeyEvent and MouseEvent specific props 28373 28374 jQuery.each({ 28375 altKey: true, 28376 bubbles: true, 28377 cancelable: true, 28378 changedTouches: true, 28379 ctrlKey: true, 28380 detail: true, 28381 eventPhase: true, 28382 metaKey: true, 28383 pageX: true, 28384 pageY: true, 28385 shiftKey: true, 28386 view: true, 28387 "char": true, 28388 charCode: true, 28389 key: true, 28390 keyCode: true, 28391 button: true, 28392 buttons: true, 28393 clientX: true, 28394 clientY: true, 28395 offsetX: true, 28396 offsetY: true, 28397 pointerId: true, 28398 pointerType: true, 28399 screenX: true, 28400 screenY: true, 28401 targetTouches: true, 28402 toElement: true, 28403 touches: true, 28404 which: function which(event) { 28405 var button = event.button; // Add which for key events 28406 28407 if (event.which == null && rkeyEvent.test(event.type)) { 28408 return event.charCode != null ? event.charCode : event.keyCode; 28409 } // Add which for click: 1 === left; 2 === middle; 3 === right 28410 28411 28412 if (!event.which && button !== undefined && rmouseEvent.test(event.type)) { 28413 if (button & 1) { 28414 return 1; 28415 } 28416 28417 if (button & 2) { 28418 return 3; 28419 } 28420 28421 if (button & 4) { 28422 return 2; 28423 } 28424 28425 return 0; 28426 } 28427 28428 return event.which; 28429 } 28430 }, jQuery.event.addProp); // Create mouseenter/leave events using mouseover/out and event-time checks 28431 // so that event delegation works in jQuery. 28432 // Do the same for pointerenter/pointerleave and pointerover/pointerout 28433 // 28434 // Support: Safari 7 only 28435 // Safari sends mouseenter too often; see: 28436 // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 28437 // for the description of the bug (it existed in older Chrome versions as well). 28438 28439 jQuery.each({ 28440 mouseenter: "mouseover", 28441 mouseleave: "mouseout", 28442 pointerenter: "pointerover", 28443 pointerleave: "pointerout" 28444 }, function (orig, fix) { 28445 jQuery.event.special[orig] = { 28446 delegateType: fix, 28447 bindType: fix, 28448 handle: function handle(event) { 28449 var ret, 28450 target = this, 28451 related = event.relatedTarget, 28452 handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. 28453 // NB: No relatedTarget if the mouse left/entered the browser window 28454 28455 if (!related || related !== target && !jQuery.contains(target, related)) { 28456 event.type = handleObj.origType; 28457 ret = handleObj.handler.apply(this, arguments); 28458 event.type = fix; 28459 } 28460 28461 return ret; 28462 } 28463 }; 28464 }); 28465 jQuery.fn.extend({ 28466 on: function on(types, selector, data, fn) { 28467 return _on(this, types, selector, data, fn); 28468 }, 28469 one: function one(types, selector, data, fn) { 28470 return _on(this, types, selector, data, fn, 1); 28471 }, 28472 off: function off(types, selector, fn) { 28473 var handleObj, type; 28474 28475 if (types && types.preventDefault && types.handleObj) { 28476 // ( event ) dispatched jQuery.Event 28477 handleObj = types.handleObj; 28478 jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler); 28479 return this; 28480 } 28481 28482 if (_typeof(types) === "object") { 28483 // ( types-object [, selector] ) 28484 for (type in types) { 28485 this.off(type, selector, types[type]); 28486 } 28487 28488 return this; 28489 } 28490 28491 if (selector === false || typeof selector === "function") { 28492 // ( types [, fn] ) 28493 fn = selector; 28494 selector = undefined; 28495 } 28496 28497 if (fn === false) { 28498 fn = returnFalse; 28499 } 28500 28501 return this.each(function () { 28502 jQuery.event.remove(this, types, fn, selector); 28503 }); 28504 } 28505 }); 28506 var 28507 /* eslint-disable max-len */ 28508 // See https://github.com/eslint/eslint/issues/3229 28509 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, 28510 28511 /* eslint-enable */ 28512 // Support: IE <=10 - 11, Edge 12 - 13 only 28513 // In IE/Edge using regex groups here causes severe slowdowns. 28514 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 28515 rnoInnerhtml = /<script|<style|<link/i, 28516 // checked="checked" or checked 28517 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 28518 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; // Prefer a tbody over its parent table for containing new rows 28519 28520 function manipulationTarget(elem, content) { 28521 if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) { 28522 return jQuery(elem).children("tbody")[0] || elem; 28523 } 28524 28525 return elem; 28526 } // Replace/restore the type attribute of script elements for safe DOM manipulation 28527 28528 28529 function disableScript(elem) { 28530 elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; 28531 return elem; 28532 } 28533 28534 function restoreScript(elem) { 28535 if ((elem.type || "").slice(0, 5) === "true/") { 28536 elem.type = elem.type.slice(5); 28537 } else { 28538 elem.removeAttribute("type"); 28539 } 28540 28541 return elem; 28542 } 28543 28544 function cloneCopyEvent(src, dest) { 28545 var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; 28546 28547 if (dest.nodeType !== 1) { 28548 return; 28549 } // 1. Copy private data: events, handlers, etc. 28550 28551 28552 if (dataPriv.hasData(src)) { 28553 pdataOld = dataPriv.access(src); 28554 pdataCur = dataPriv.set(dest, pdataOld); 28555 events = pdataOld.events; 28556 28557 if (events) { 28558 delete pdataCur.handle; 28559 pdataCur.events = {}; 28560 28561 for (type in events) { 28562 for (i = 0, l = events[type].length; i < l; i++) { 28563 jQuery.event.add(dest, type, events[type][i]); 28564 } 28565 } 28566 } 28567 } // 2. Copy user data 28568 28569 28570 if (dataUser.hasData(src)) { 28571 udataOld = dataUser.access(src); 28572 udataCur = jQuery.extend({}, udataOld); 28573 dataUser.set(dest, udataCur); 28574 } 28575 } // Fix IE bugs, see support tests 28576 28577 28578 function fixInput(src, dest) { 28579 var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. 28580 28581 if (nodeName === "input" && rcheckableType.test(src.type)) { 28582 dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options 28583 } else if (nodeName === "input" || nodeName === "textarea") { 28584 dest.defaultValue = src.defaultValue; 28585 } 28586 } 28587 28588 function domManip(collection, args, callback, ignored) { 28589 // Flatten any nested arrays 28590 args = concat.apply([], args); 28591 var fragment, 28592 first, 28593 scripts, 28594 hasScripts, 28595 node, 28596 doc, 28597 i = 0, 28598 l = collection.length, 28599 iNoClone = l - 1, 28600 value = args[0], 28601 valueIsFunction = isFunction(value); // We can't cloneNode fragments that contain checked, in WebKit 28602 28603 if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) { 28604 return collection.each(function (index) { 28605 var self = collection.eq(index); 28606 28607 if (valueIsFunction) { 28608 args[0] = value.call(this, index, self.html()); 28609 } 28610 28611 domManip(self, args, callback, ignored); 28612 }); 28613 } 28614 28615 if (l) { 28616 fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored); 28617 first = fragment.firstChild; 28618 28619 if (fragment.childNodes.length === 1) { 28620 fragment = first; 28621 } // Require either new content or an interest in ignored elements to invoke the callback 28622 28623 28624 if (first || ignored) { 28625 scripts = jQuery.map(getAll(fragment, "script"), disableScript); 28626 hasScripts = scripts.length; // Use the original fragment for the last item 28627 // instead of the first because it can end up 28628 // being emptied incorrectly in certain situations (#8070). 28629 28630 for (; i < l; i++) { 28631 node = fragment; 28632 28633 if (i !== iNoClone) { 28634 node = jQuery.clone(node, true, true); // Keep references to cloned scripts for later restoration 28635 28636 if (hasScripts) { 28637 // Support: Android <=4.0 only, PhantomJS 1 only 28638 // push.apply(_, arraylike) throws on ancient WebKit 28639 jQuery.merge(scripts, getAll(node, "script")); 28640 } 28641 } 28642 28643 callback.call(collection[i], node, i); 28644 } 28645 28646 if (hasScripts) { 28647 doc = scripts[scripts.length - 1].ownerDocument; // Reenable scripts 28648 28649 jQuery.map(scripts, restoreScript); // Evaluate executable scripts on first document insertion 28650 28651 for (i = 0; i < hasScripts; i++) { 28652 node = scripts[i]; 28653 28654 if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) { 28655 if (node.src && (node.type || "").toLowerCase() !== "module") { 28656 // Optional AJAX dependency, but won't run scripts if not present 28657 if (jQuery._evalUrl) { 28658 jQuery._evalUrl(node.src); 28659 } 28660 } else { 28661 DOMEval(node.textContent.replace(rcleanScript, ""), doc, node); 28662 } 28663 } 28664 } 28665 } 28666 } 28667 } 28668 28669 return collection; 28670 } 28671 28672 function _remove(elem, selector, keepData) { 28673 var node, 28674 nodes = selector ? jQuery.filter(selector, elem) : elem, 28675 i = 0; 28676 28677 for (; (node = nodes[i]) != null; i++) { 28678 if (!keepData && node.nodeType === 1) { 28679 jQuery.cleanData(getAll(node)); 28680 } 28681 28682 if (node.parentNode) { 28683 if (keepData && jQuery.contains(node.ownerDocument, node)) { 28684 setGlobalEval(getAll(node, "script")); 28685 } 28686 28687 node.parentNode.removeChild(node); 28688 } 28689 } 28690 28691 return elem; 28692 } 28693 28694 jQuery.extend({ 28695 htmlPrefilter: function htmlPrefilter(html) { 28696 return html.replace(rxhtmlTag, "<$1></$2>"); 28697 }, 28698 clone: function clone(elem, dataAndEvents, deepDataAndEvents) { 28699 var i, 28700 l, 28701 srcElements, 28702 destElements, 28703 clone = elem.cloneNode(true), 28704 inPage = jQuery.contains(elem.ownerDocument, elem); // Fix IE cloning issues 28705 28706 if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { 28707 // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 28708 destElements = getAll(clone); 28709 srcElements = getAll(elem); 28710 28711 for (i = 0, l = srcElements.length; i < l; i++) { 28712 fixInput(srcElements[i], destElements[i]); 28713 } 28714 } // Copy the events from the original to the clone 28715 28716 28717 if (dataAndEvents) { 28718 if (deepDataAndEvents) { 28719 srcElements = srcElements || getAll(elem); 28720 destElements = destElements || getAll(clone); 28721 28722 for (i = 0, l = srcElements.length; i < l; i++) { 28723 cloneCopyEvent(srcElements[i], destElements[i]); 28724 } 28725 } else { 28726 cloneCopyEvent(elem, clone); 28727 } 28728 } // Preserve script evaluation history 28729 28730 28731 destElements = getAll(clone, "script"); 28732 28733 if (destElements.length > 0) { 28734 setGlobalEval(destElements, !inPage && getAll(elem, "script")); 28735 } // Return the cloned set 28736 28737 28738 return clone; 28739 }, 28740 cleanData: function cleanData(elems) { 28741 var data, 28742 elem, 28743 type, 28744 special = jQuery.event.special, 28745 i = 0; 28746 28747 for (; (elem = elems[i]) !== undefined; i++) { 28748 if (acceptData(elem)) { 28749 if (data = elem[dataPriv.expando]) { 28750 if (data.events) { 28751 for (type in data.events) { 28752 if (special[type]) { 28753 jQuery.event.remove(elem, type); // This is a shortcut to avoid jQuery.event.remove's overhead 28754 } else { 28755 jQuery.removeEvent(elem, type, data.handle); 28756 } 28757 } 28758 } // Support: Chrome <=35 - 45+ 28759 // Assign undefined instead of using delete, see Data#remove 28760 28761 28762 elem[dataPriv.expando] = undefined; 28763 } 28764 28765 if (elem[dataUser.expando]) { 28766 // Support: Chrome <=35 - 45+ 28767 // Assign undefined instead of using delete, see Data#remove 28768 elem[dataUser.expando] = undefined; 28769 } 28770 } 28771 } 28772 } 28773 }); 28774 jQuery.fn.extend({ 28775 detach: function detach(selector) { 28776 return _remove(this, selector, true); 28777 }, 28778 remove: function remove(selector) { 28779 return _remove(this, selector); 28780 }, 28781 text: function text(value) { 28782 return access(this, function (value) { 28783 return value === undefined ? jQuery.text(this) : this.empty().each(function () { 28784 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 28785 this.textContent = value; 28786 } 28787 }); 28788 }, null, value, arguments.length); 28789 }, 28790 append: function append() { 28791 return domManip(this, arguments, function (elem) { 28792 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 28793 var target = manipulationTarget(this, elem); 28794 target.appendChild(elem); 28795 } 28796 }); 28797 }, 28798 prepend: function prepend() { 28799 return domManip(this, arguments, function (elem) { 28800 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 28801 var target = manipulationTarget(this, elem); 28802 target.insertBefore(elem, target.firstChild); 28803 } 28804 }); 28805 }, 28806 before: function before() { 28807 return domManip(this, arguments, function (elem) { 28808 if (this.parentNode) { 28809 this.parentNode.insertBefore(elem, this); 28810 } 28811 }); 28812 }, 28813 after: function after() { 28814 return domManip(this, arguments, function (elem) { 28815 if (this.parentNode) { 28816 this.parentNode.insertBefore(elem, this.nextSibling); 28817 } 28818 }); 28819 }, 28820 empty: function empty() { 28821 var elem, 28822 i = 0; 28823 28824 for (; (elem = this[i]) != null; i++) { 28825 if (elem.nodeType === 1) { 28826 // Prevent memory leaks 28827 jQuery.cleanData(getAll(elem, false)); // Remove any remaining nodes 28828 28829 elem.textContent = ""; 28830 } 28831 } 28832 28833 return this; 28834 }, 28835 clone: function clone(dataAndEvents, deepDataAndEvents) { 28836 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 28837 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 28838 return this.map(function () { 28839 return jQuery.clone(this, dataAndEvents, deepDataAndEvents); 28840 }); 28841 }, 28842 html: function html(value) { 28843 return access(this, function (value) { 28844 var elem = this[0] || {}, 28845 i = 0, 28846 l = this.length; 28847 28848 if (value === undefined && elem.nodeType === 1) { 28849 return elem.innerHTML; 28850 } // See if we can take a shortcut and just use innerHTML 28851 28852 28853 if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { 28854 value = jQuery.htmlPrefilter(value); 28855 28856 try { 28857 for (; i < l; i++) { 28858 elem = this[i] || {}; // Remove element nodes and prevent memory leaks 28859 28860 if (elem.nodeType === 1) { 28861 jQuery.cleanData(getAll(elem, false)); 28862 elem.innerHTML = value; 28863 } 28864 } 28865 28866 elem = 0; // If using innerHTML throws an exception, use the fallback method 28867 } catch (e) {} 28868 } 28869 28870 if (elem) { 28871 this.empty().append(value); 28872 } 28873 }, null, value, arguments.length); 28874 }, 28875 replaceWith: function replaceWith() { 28876 var ignored = []; // Make the changes, replacing each non-ignored context element with the new content 28877 28878 return domManip(this, arguments, function (elem) { 28879 var parent = this.parentNode; 28880 28881 if (jQuery.inArray(this, ignored) < 0) { 28882 jQuery.cleanData(getAll(this)); 28883 28884 if (parent) { 28885 parent.replaceChild(elem, this); 28886 } 28887 } // Force callback invocation 28888 28889 }, ignored); 28890 } 28891 }); 28892 jQuery.each({ 28893 appendTo: "append", 28894 prependTo: "prepend", 28895 insertBefore: "before", 28896 insertAfter: "after", 28897 replaceAll: "replaceWith" 28898 }, function (name, original) { 28899 jQuery.fn[name] = function (selector) { 28900 var elems, 28901 ret = [], 28902 insert = jQuery(selector), 28903 last = insert.length - 1, 28904 i = 0; 28905 28906 for (; i <= last; i++) { 28907 elems = i === last ? this : this.clone(true); 28908 jQuery(insert[i])[original](elems); // Support: Android <=4.0 only, PhantomJS 1 only 28909 // .get() because push.apply(_, arraylike) throws on ancient WebKit 28910 28911 push.apply(ret, elems.get()); 28912 } 28913 28914 return this.pushStack(ret); 28915 }; 28916 }); 28917 var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i"); 28918 28919 var getStyles = function getStyles(elem) { 28920 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 28921 // IE throws on elements created in popups 28922 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 28923 var view = elem.ownerDocument.defaultView; 28924 28925 if (!view || !view.opener) { 28926 view = window; 28927 } 28928 28929 return view.getComputedStyle(elem); 28930 }; 28931 28932 var rboxStyle = new RegExp(cssExpand.join("|"), "i"); 28933 28934 (function () { 28935 // Executing both pixelPosition & boxSizingReliable tests require only one layout 28936 // so they're executed at the same time to save the second computation. 28937 function computeStyleTests() { 28938 // This is a singleton, we need to execute it only once 28939 if (!div) { 28940 return; 28941 } 28942 28943 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; 28944 div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; 28945 documentElement.appendChild(container).appendChild(div); 28946 var divStyle = window.getComputedStyle(div); 28947 pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 28948 28949 reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 28950 // Some styles come back with percentage values, even though they shouldn't 28951 28952 div.style.right = "60%"; 28953 pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36; // Support: IE 9 - 11 only 28954 // Detect misreporting of content dimensions for box-sizing:border-box elements 28955 28956 boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36; // Support: IE 9 only 28957 // Detect overflow:scroll screwiness (gh-3699) 28958 28959 div.style.position = "absolute"; 28960 scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; 28961 documentElement.removeChild(container); // Nullify the div so it wouldn't be stored in the memory and 28962 // it will also be a sign that checks already performed 28963 28964 div = null; 28965 } 28966 28967 function roundPixelMeasures(measure) { 28968 return Math.round(parseFloat(measure)); 28969 } 28970 28971 var pixelPositionVal, 28972 boxSizingReliableVal, 28973 scrollboxSizeVal, 28974 pixelBoxStylesVal, 28975 reliableMarginLeftVal, 28976 container = document.createElement("div"), 28977 div = document.createElement("div"); // Finish early in limited (non-browser) environments 28978 28979 if (!div.style) { 28980 return; 28981 } // Support: IE <=9 - 11 only 28982 // Style of cloned element affects source element cloned (#8908) 28983 28984 28985 div.style.backgroundClip = "content-box"; 28986 div.cloneNode(true).style.backgroundClip = ""; 28987 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 28988 jQuery.extend(support, { 28989 boxSizingReliable: function boxSizingReliable() { 28990 computeStyleTests(); 28991 return boxSizingReliableVal; 28992 }, 28993 pixelBoxStyles: function pixelBoxStyles() { 28994 computeStyleTests(); 28995 return pixelBoxStylesVal; 28996 }, 28997 pixelPosition: function pixelPosition() { 28998 computeStyleTests(); 28999 return pixelPositionVal; 29000 }, 29001 reliableMarginLeft: function reliableMarginLeft() { 29002 computeStyleTests(); 29003 return reliableMarginLeftVal; 29004 }, 29005 scrollboxSize: function scrollboxSize() { 29006 computeStyleTests(); 29007 return scrollboxSizeVal; 29008 } 29009 }); 29010 })(); 29011 29012 function curCSS(elem, name, computed) { 29013 var width, 29014 minWidth, 29015 maxWidth, 29016 ret, 29017 // Support: Firefox 51+ 29018 // Retrieving style before computed somehow 29019 // fixes an issue with getting wrong values 29020 // on detached elements 29021 style = elem.style; 29022 computed = computed || getStyles(elem); // getPropertyValue is needed for: 29023 // .css('filter') (IE 9 only, #12537) 29024 // .css('--customProperty) (#3144) 29025 29026 if (computed) { 29027 ret = computed.getPropertyValue(name) || computed[name]; 29028 29029 if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) { 29030 ret = jQuery.style(elem, name); 29031 } // A tribute to the "awesome hack by Dean Edwards" 29032 // Android Browser returns percentage for some values, 29033 // but width seems to be reliably pixels. 29034 // This is against the CSSOM draft spec: 29035 // https://drafts.csswg.org/cssom/#resolved-values 29036 29037 29038 if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) { 29039 // Remember the original values 29040 width = style.width; 29041 minWidth = style.minWidth; 29042 maxWidth = style.maxWidth; // Put in the new values to get a computed value out 29043 29044 style.minWidth = style.maxWidth = style.width = ret; 29045 ret = computed.width; // Revert the changed values 29046 29047 style.width = width; 29048 style.minWidth = minWidth; 29049 style.maxWidth = maxWidth; 29050 } 29051 } 29052 29053 return ret !== undefined ? // Support: IE <=9 - 11 only 29054 // IE returns zIndex value as an integer. 29055 ret + "" : ret; 29056 } 29057 29058 function addGetHookIf(conditionFn, hookFn) { 29059 // Define the hook, we'll check on the first run if it's really needed. 29060 return { 29061 get: function get() { 29062 if (conditionFn()) { 29063 // Hook not needed (or it's not possible to use it due 29064 // to missing dependency), remove it. 29065 delete this.get; 29066 return; 29067 } // Hook needed; redefine it so that the support test is not executed again. 29068 29069 29070 return (this.get = hookFn).apply(this, arguments); 29071 } 29072 }; 29073 } 29074 29075 var // Swappable if display is none or starts with table 29076 // except "table", "table-cell", or "table-caption" 29077 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 29078 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 29079 rcustomProp = /^--/, 29080 cssShow = { 29081 position: "absolute", 29082 visibility: "hidden", 29083 display: "block" 29084 }, 29085 cssNormalTransform = { 29086 letterSpacing: "0", 29087 fontWeight: "400" 29088 }, 29089 cssPrefixes = ["Webkit", "Moz", "ms"], 29090 emptyStyle = document.createElement("div").style; // Return a css property mapped to a potentially vendor prefixed property 29091 29092 function vendorPropName(name) { 29093 // Shortcut for names that are not vendor prefixed 29094 if (name in emptyStyle) { 29095 return name; 29096 } // Check for vendor prefixed names 29097 29098 29099 var capName = name[0].toUpperCase() + name.slice(1), 29100 i = cssPrefixes.length; 29101 29102 while (i--) { 29103 name = cssPrefixes[i] + capName; 29104 29105 if (name in emptyStyle) { 29106 return name; 29107 } 29108 } 29109 } // Return a property mapped along what jQuery.cssProps suggests or to 29110 // a vendor prefixed property. 29111 29112 29113 function finalPropName(name) { 29114 var ret = jQuery.cssProps[name]; 29115 29116 if (!ret) { 29117 ret = jQuery.cssProps[name] = vendorPropName(name) || name; 29118 } 29119 29120 return ret; 29121 } 29122 29123 function setPositiveNumber(elem, value, subtract) { 29124 // Any relative (+/-) values have already been 29125 // normalized at this point 29126 var matches = rcssNum.exec(value); 29127 return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks 29128 Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value; 29129 } 29130 29131 function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) { 29132 var i = dimension === "width" ? 1 : 0, 29133 extra = 0, 29134 delta = 0; // Adjustment may not be necessary 29135 29136 if (box === (isBorderBox ? "border" : "content")) { 29137 return 0; 29138 } 29139 29140 for (; i < 4; i += 2) { 29141 // Both box models exclude margin 29142 if (box === "margin") { 29143 delta += jQuery.css(elem, box + cssExpand[i], true, styles); 29144 } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 29145 29146 29147 if (!isBorderBox) { 29148 // Add padding 29149 delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles); // For "border" or "margin", add border 29150 29151 if (box !== "padding") { 29152 delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); // But still keep track of it otherwise 29153 } else { 29154 extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 29155 } // If we get here with a border-box (content + padding + border), we're seeking "content" or 29156 // "padding" or "margin" 29157 29158 } else { 29159 // For "content", subtract padding 29160 if (box === "content") { 29161 delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles); 29162 } // For "content" or "padding", subtract border 29163 29164 29165 if (box !== "margin") { 29166 delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 29167 } 29168 } 29169 } // Account for positive content-box scroll gutter when requested by providing computedVal 29170 29171 29172 if (!isBorderBox && computedVal >= 0) { 29173 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 29174 // Assuming integer scroll gutter, subtract the rest and round down 29175 delta += Math.max(0, Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5)); 29176 } 29177 29178 return delta; 29179 } 29180 29181 function getWidthOrHeight(elem, dimension, extra) { 29182 // Start with computed style 29183 var styles = getStyles(elem), 29184 val = curCSS(elem, dimension, styles), 29185 isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box", 29186 valueIsBorderBox = isBorderBox; // Support: Firefox <=54 29187 // Return a confounding non-pixel value or feign ignorance, as appropriate. 29188 29189 if (rnumnonpx.test(val)) { 29190 if (!extra) { 29191 return val; 29192 } 29193 29194 val = "auto"; 29195 } // Check for style in case a browser which returns unreliable values 29196 // for getComputedStyle silently falls back to the reliable elem.style 29197 29198 29199 valueIsBorderBox = valueIsBorderBox && (support.boxSizingReliable() || val === elem.style[dimension]); // Fall back to offsetWidth/offsetHeight when value is "auto" 29200 // This happens for inline elements with no explicit setting (gh-3571) 29201 // Support: Android <=4.1 - 4.3 only 29202 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 29203 29204 if (val === "auto" || !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") { 29205 val = elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)]; // offsetWidth/offsetHeight provide border-box values 29206 29207 valueIsBorderBox = true; 29208 } // Normalize "" and auto 29209 29210 29211 val = parseFloat(val) || 0; // Adjust for the element's box model 29212 29213 return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) 29214 val) + "px"; 29215 } 29216 29217 jQuery.extend({ 29218 // Add in style property hooks for overriding the default 29219 // behavior of getting and setting a style property 29220 cssHooks: { 29221 opacity: { 29222 get: function get(elem, computed) { 29223 if (computed) { 29224 // We should always get a number back from opacity 29225 var ret = curCSS(elem, "opacity"); 29226 return ret === "" ? "1" : ret; 29227 } 29228 } 29229 } 29230 }, 29231 // Don't automatically add "px" to these possibly-unitless properties 29232 cssNumber: { 29233 "animationIterationCount": true, 29234 "columnCount": true, 29235 "fillOpacity": true, 29236 "flexGrow": true, 29237 "flexShrink": true, 29238 "fontWeight": true, 29239 "lineHeight": true, 29240 "opacity": true, 29241 "order": true, 29242 "orphans": true, 29243 "widows": true, 29244 "zIndex": true, 29245 "zoom": true 29246 }, 29247 // Add in properties whose names you wish to fix before 29248 // setting or getting the value 29249 cssProps: {}, 29250 // Get and set the style property on a DOM Node 29251 style: function style(elem, name, value, extra) { 29252 // Don't set styles on text and comment nodes 29253 if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { 29254 return; 29255 } // Make sure that we're working with the right name 29256 29257 29258 var ret, 29259 type, 29260 hooks, 29261 origName = camelCase(name), 29262 isCustomProp = rcustomProp.test(name), 29263 style = elem.style; // Make sure that we're working with the right name. We don't 29264 // want to query the value if it is a CSS custom property 29265 // since they are user-defined. 29266 29267 if (!isCustomProp) { 29268 name = finalPropName(origName); 29269 } // Gets hook for the prefixed version, then unprefixed version 29270 29271 29272 hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // Check if we're setting a value 29273 29274 if (value !== undefined) { 29275 type = _typeof(value); // Convert "+=" or "-=" to relative numbers (#7345) 29276 29277 if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) { 29278 value = adjustCSS(elem, name, ret); // Fixes bug #9237 29279 29280 type = "number"; 29281 } // Make sure that null and NaN values aren't set (#7116) 29282 29283 29284 if (value == null || value !== value) { 29285 return; 29286 } // If a number was passed in, add the unit (except for certain CSS properties) 29287 29288 29289 if (type === "number") { 29290 value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px"); 29291 } // background-* props affect original clone's values 29292 29293 29294 if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) { 29295 style[name] = "inherit"; 29296 } // If a hook was provided, use that value, otherwise just set the specified value 29297 29298 29299 if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) { 29300 if (isCustomProp) { 29301 style.setProperty(name, value); 29302 } else { 29303 style[name] = value; 29304 } 29305 } 29306 } else { 29307 // If a hook was provided get the non-computed value from there 29308 if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) { 29309 return ret; 29310 } // Otherwise just get the value from the style object 29311 29312 29313 return style[name]; 29314 } 29315 }, 29316 css: function css(elem, name, extra, styles) { 29317 var val, 29318 num, 29319 hooks, 29320 origName = camelCase(name), 29321 isCustomProp = rcustomProp.test(name); // Make sure that we're working with the right name. We don't 29322 // want to modify the value if it is a CSS custom property 29323 // since they are user-defined. 29324 29325 if (!isCustomProp) { 29326 name = finalPropName(origName); 29327 } // Try prefixed name followed by the unprefixed name 29328 29329 29330 hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // If a hook was provided get the computed value from there 29331 29332 if (hooks && "get" in hooks) { 29333 val = hooks.get(elem, true, extra); 29334 } // Otherwise, if a way to get the computed value exists, use that 29335 29336 29337 if (val === undefined) { 29338 val = curCSS(elem, name, styles); 29339 } // Convert "normal" to computed value 29340 29341 29342 if (val === "normal" && name in cssNormalTransform) { 29343 val = cssNormalTransform[name]; 29344 } // Make numeric if forced or a qualifier was provided and val looks numeric 29345 29346 29347 if (extra === "" || extra) { 29348 num = parseFloat(val); 29349 return extra === true || isFinite(num) ? num || 0 : val; 29350 } 29351 29352 return val; 29353 } 29354 }); 29355 jQuery.each(["height", "width"], function (i, dimension) { 29356 jQuery.cssHooks[dimension] = { 29357 get: function get(elem, computed, extra) { 29358 if (computed) { 29359 // Certain elements can have dimension info if we invisibly show them 29360 // but it must have a current display style that would benefit 29361 return rdisplayswap.test(jQuery.css(elem, "display")) && ( // Support: Safari 8+ 29362 // Table columns in Safari have non-zero offsetWidth & zero 29363 // getBoundingClientRect().width unless display is changed. 29364 // Support: IE <=11 only 29365 // Running getBoundingClientRect on a disconnected node 29366 // in IE throws an error. 29367 !elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () { 29368 return getWidthOrHeight(elem, dimension, extra); 29369 }) : getWidthOrHeight(elem, dimension, extra); 29370 } 29371 }, 29372 set: function set(elem, value, extra) { 29373 var matches, 29374 styles = getStyles(elem), 29375 isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box", 29376 subtract = extra && boxModelAdjustment(elem, dimension, extra, isBorderBox, styles); // Account for unreliable border-box dimensions by comparing offset* to computed and 29377 // faking a content-box to get border and padding (gh-3699) 29378 29379 if (isBorderBox && support.scrollboxSize() === styles.position) { 29380 subtract -= Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5); 29381 } // Convert to pixels if value adjustment is needed 29382 29383 29384 if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") { 29385 elem.style[dimension] = value; 29386 value = jQuery.css(elem, dimension); 29387 } 29388 29389 return setPositiveNumber(elem, value, subtract); 29390 } 29391 }; 29392 }); 29393 jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) { 29394 if (computed) { 29395 return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { 29396 marginLeft: 0 29397 }, function () { 29398 return elem.getBoundingClientRect().left; 29399 })) + "px"; 29400 } 29401 }); // These hooks are used by animate to expand properties 29402 29403 jQuery.each({ 29404 margin: "", 29405 padding: "", 29406 border: "Width" 29407 }, function (prefix, suffix) { 29408 jQuery.cssHooks[prefix + suffix] = { 29409 expand: function expand(value) { 29410 var i = 0, 29411 expanded = {}, 29412 // Assumes a single number if not a string 29413 parts = typeof value === "string" ? value.split(" ") : [value]; 29414 29415 for (; i < 4; i++) { 29416 expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0]; 29417 } 29418 29419 return expanded; 29420 } 29421 }; 29422 29423 if (prefix !== "margin") { 29424 jQuery.cssHooks[prefix + suffix].set = setPositiveNumber; 29425 } 29426 }); 29427 jQuery.fn.extend({ 29428 css: function css(name, value) { 29429 return access(this, function (elem, name, value) { 29430 var styles, 29431 len, 29432 map = {}, 29433 i = 0; 29434 29435 if (Array.isArray(name)) { 29436 styles = getStyles(elem); 29437 len = name.length; 29438 29439 for (; i < len; i++) { 29440 map[name[i]] = jQuery.css(elem, name[i], false, styles); 29441 } 29442 29443 return map; 29444 } 29445 29446 return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name); 29447 }, name, value, arguments.length > 1); 29448 } 29449 }); 29450 29451 function Tween(elem, options, prop, end, easing) { 29452 return new Tween.prototype.init(elem, options, prop, end, easing); 29453 } 29454 29455 jQuery.Tween = Tween; 29456 Tween.prototype = { 29457 constructor: Tween, 29458 init: function init(elem, options, prop, end, easing, unit) { 29459 this.elem = elem; 29460 this.prop = prop; 29461 this.easing = easing || jQuery.easing._default; 29462 this.options = options; 29463 this.start = this.now = this.cur(); 29464 this.end = end; 29465 this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px"); 29466 }, 29467 cur: function cur() { 29468 var hooks = Tween.propHooks[this.prop]; 29469 return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this); 29470 }, 29471 run: function run(percent) { 29472 var eased, 29473 hooks = Tween.propHooks[this.prop]; 29474 29475 if (this.options.duration) { 29476 this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration); 29477 } else { 29478 this.pos = eased = percent; 29479 } 29480 29481 this.now = (this.end - this.start) * eased + this.start; 29482 29483 if (this.options.step) { 29484 this.options.step.call(this.elem, this.now, this); 29485 } 29486 29487 if (hooks && hooks.set) { 29488 hooks.set(this); 29489 } else { 29490 Tween.propHooks._default.set(this); 29491 } 29492 29493 return this; 29494 } 29495 }; 29496 Tween.prototype.init.prototype = Tween.prototype; 29497 Tween.propHooks = { 29498 _default: { 29499 get: function get(tween) { 29500 var result; // Use a property on the element directly when it is not a DOM element, 29501 // or when there is no matching style property that exists. 29502 29503 if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) { 29504 return tween.elem[tween.prop]; 29505 } // Passing an empty string as a 3rd parameter to .css will automatically 29506 // attempt a parseFloat and fallback to a string if the parse fails. 29507 // Simple values such as "10px" are parsed to Float; 29508 // complex values such as "rotate(1rad)" are returned as-is. 29509 29510 29511 result = jQuery.css(tween.elem, tween.prop, ""); // Empty strings, null, undefined and "auto" are converted to 0. 29512 29513 return !result || result === "auto" ? 0 : result; 29514 }, 29515 set: function set(tween) { 29516 // Use step hook for back compat. 29517 // Use cssHook if its there. 29518 // Use .style if available and use plain properties where available. 29519 if (jQuery.fx.step[tween.prop]) { 29520 jQuery.fx.step[tween.prop](tween); 29521 } else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) { 29522 jQuery.style(tween.elem, tween.prop, tween.now + tween.unit); 29523 } else { 29524 tween.elem[tween.prop] = tween.now; 29525 } 29526 } 29527 } 29528 }; // Support: IE <=9 only 29529 // Panic based approach to setting things on disconnected nodes 29530 29531 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 29532 set: function set(tween) { 29533 if (tween.elem.nodeType && tween.elem.parentNode) { 29534 tween.elem[tween.prop] = tween.now; 29535 } 29536 } 29537 }; 29538 jQuery.easing = { 29539 linear: function linear(p) { 29540 return p; 29541 }, 29542 swing: function swing(p) { 29543 return 0.5 - Math.cos(p * Math.PI) / 2; 29544 }, 29545 _default: "swing" 29546 }; 29547 jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point 29548 29549 jQuery.fx.step = {}; 29550 var fxNow, 29551 inProgress, 29552 rfxtypes = /^(?:toggle|show|hide)$/, 29553 rrun = /queueHooks$/; 29554 29555 function schedule() { 29556 if (inProgress) { 29557 if (document.hidden === false && window.requestAnimationFrame) { 29558 window.requestAnimationFrame(schedule); 29559 } else { 29560 window.setTimeout(schedule, jQuery.fx.interval); 29561 } 29562 29563 jQuery.fx.tick(); 29564 } 29565 } // Animations created synchronously will run synchronously 29566 29567 29568 function createFxNow() { 29569 window.setTimeout(function () { 29570 fxNow = undefined; 29571 }); 29572 return fxNow = Date.now(); 29573 } // Generate parameters to create a standard animation 29574 29575 29576 function genFx(type, includeWidth) { 29577 var which, 29578 i = 0, 29579 attrs = { 29580 height: type 29581 }; // If we include width, step value is 1 to do all cssExpand values, 29582 // otherwise step value is 2 to skip over Left and Right 29583 29584 includeWidth = includeWidth ? 1 : 0; 29585 29586 for (; i < 4; i += 2 - includeWidth) { 29587 which = cssExpand[i]; 29588 attrs["margin" + which] = attrs["padding" + which] = type; 29589 } 29590 29591 if (includeWidth) { 29592 attrs.opacity = attrs.width = type; 29593 } 29594 29595 return attrs; 29596 } 29597 29598 function createTween(value, prop, animation) { 29599 var tween, 29600 collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), 29601 index = 0, 29602 length = collection.length; 29603 29604 for (; index < length; index++) { 29605 if (tween = collection[index].call(animation, prop, value)) { 29606 // We're done with this property 29607 return tween; 29608 } 29609 } 29610 } 29611 29612 function defaultPrefilter(elem, props, opts) { 29613 var prop, 29614 value, 29615 toggle, 29616 hooks, 29617 oldfire, 29618 propTween, 29619 restoreDisplay, 29620 display, 29621 isBox = "width" in props || "height" in props, 29622 anim = this, 29623 orig = {}, 29624 style = elem.style, 29625 hidden = elem.nodeType && isHiddenWithinTree(elem), 29626 dataShow = dataPriv.get(elem, "fxshow"); // Queue-skipping animations hijack the fx hooks 29627 29628 if (!opts.queue) { 29629 hooks = jQuery._queueHooks(elem, "fx"); 29630 29631 if (hooks.unqueued == null) { 29632 hooks.unqueued = 0; 29633 oldfire = hooks.empty.fire; 29634 29635 hooks.empty.fire = function () { 29636 if (!hooks.unqueued) { 29637 oldfire(); 29638 } 29639 }; 29640 } 29641 29642 hooks.unqueued++; 29643 anim.always(function () { 29644 // Ensure the complete handler is called before this completes 29645 anim.always(function () { 29646 hooks.unqueued--; 29647 29648 if (!jQuery.queue(elem, "fx").length) { 29649 hooks.empty.fire(); 29650 } 29651 }); 29652 }); 29653 } // Detect show/hide animations 29654 29655 29656 for (prop in props) { 29657 value = props[prop]; 29658 29659 if (rfxtypes.test(value)) { 29660 delete props[prop]; 29661 toggle = toggle || value === "toggle"; 29662 29663 if (value === (hidden ? "hide" : "show")) { 29664 // Pretend to be hidden if this is a "show" and 29665 // there is still data from a stopped show/hide 29666 if (value === "show" && dataShow && dataShow[prop] !== undefined) { 29667 hidden = true; // Ignore all other no-op show/hide data 29668 } else { 29669 continue; 29670 } 29671 } 29672 29673 orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop); 29674 } 29675 } // Bail out if this is a no-op like .hide().hide() 29676 29677 29678 propTween = !jQuery.isEmptyObject(props); 29679 29680 if (!propTween && jQuery.isEmptyObject(orig)) { 29681 return; 29682 } // Restrict "overflow" and "display" styles during box animations 29683 29684 29685 if (isBox && elem.nodeType === 1) { 29686 // Support: IE <=9 - 11, Edge 12 - 15 29687 // Record all 3 overflow attributes because IE does not infer the shorthand 29688 // from identically-valued overflowX and overflowY and Edge just mirrors 29689 // the overflowX value there. 29690 opts.overflow = [style.overflow, style.overflowX, style.overflowY]; // Identify a display type, preferring old show/hide data over the CSS cascade 29691 29692 restoreDisplay = dataShow && dataShow.display; 29693 29694 if (restoreDisplay == null) { 29695 restoreDisplay = dataPriv.get(elem, "display"); 29696 } 29697 29698 display = jQuery.css(elem, "display"); 29699 29700 if (display === "none") { 29701 if (restoreDisplay) { 29702 display = restoreDisplay; 29703 } else { 29704 // Get nonempty value(s) by temporarily forcing visibility 29705 showHide([elem], true); 29706 restoreDisplay = elem.style.display || restoreDisplay; 29707 display = jQuery.css(elem, "display"); 29708 showHide([elem]); 29709 } 29710 } // Animate inline elements as inline-block 29711 29712 29713 if (display === "inline" || display === "inline-block" && restoreDisplay != null) { 29714 if (jQuery.css(elem, "float") === "none") { 29715 // Restore the original display value at the end of pure show/hide animations 29716 if (!propTween) { 29717 anim.done(function () { 29718 style.display = restoreDisplay; 29719 }); 29720 29721 if (restoreDisplay == null) { 29722 display = style.display; 29723 restoreDisplay = display === "none" ? "" : display; 29724 } 29725 } 29726 29727 style.display = "inline-block"; 29728 } 29729 } 29730 } 29731 29732 if (opts.overflow) { 29733 style.overflow = "hidden"; 29734 anim.always(function () { 29735 style.overflow = opts.overflow[0]; 29736 style.overflowX = opts.overflow[1]; 29737 style.overflowY = opts.overflow[2]; 29738 }); 29739 } // Implement show/hide animations 29740 29741 29742 propTween = false; 29743 29744 for (prop in orig) { 29745 // General show/hide setup for this element animation 29746 if (!propTween) { 29747 if (dataShow) { 29748 if ("hidden" in dataShow) { 29749 hidden = dataShow.hidden; 29750 } 29751 } else { 29752 dataShow = dataPriv.access(elem, "fxshow", { 29753 display: restoreDisplay 29754 }); 29755 } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 29756 29757 29758 if (toggle) { 29759 dataShow.hidden = !hidden; 29760 } // Show elements before animating them 29761 29762 29763 if (hidden) { 29764 showHide([elem], true); 29765 } 29766 /* eslint-disable no-loop-func */ 29767 29768 29769 anim.done(function () { 29770 /* eslint-enable no-loop-func */ 29771 // The final step of a "hide" animation is actually hiding the element 29772 if (!hidden) { 29773 showHide([elem]); 29774 } 29775 29776 dataPriv.remove(elem, "fxshow"); 29777 29778 for (prop in orig) { 29779 jQuery.style(elem, prop, orig[prop]); 29780 } 29781 }); 29782 } // Per-property setup 29783 29784 29785 propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim); 29786 29787 if (!(prop in dataShow)) { 29788 dataShow[prop] = propTween.start; 29789 29790 if (hidden) { 29791 propTween.end = propTween.start; 29792 propTween.start = 0; 29793 } 29794 } 29795 } 29796 } 29797 29798 function propFilter(props, specialEasing) { 29799 var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass 29800 29801 for (index in props) { 29802 name = camelCase(index); 29803 easing = specialEasing[name]; 29804 value = props[index]; 29805 29806 if (Array.isArray(value)) { 29807 easing = value[1]; 29808 value = props[index] = value[0]; 29809 } 29810 29811 if (index !== name) { 29812 props[name] = value; 29813 delete props[index]; 29814 } 29815 29816 hooks = jQuery.cssHooks[name]; 29817 29818 if (hooks && "expand" in hooks) { 29819 value = hooks.expand(value); 29820 delete props[name]; // Not quite $.extend, this won't overwrite existing keys. 29821 // Reusing 'index' because we have the correct "name" 29822 29823 for (index in value) { 29824 if (!(index in props)) { 29825 props[index] = value[index]; 29826 specialEasing[index] = easing; 29827 } 29828 } 29829 } else { 29830 specialEasing[name] = easing; 29831 } 29832 } 29833 } 29834 29835 function Animation(elem, properties, options) { 29836 var result, 29837 stopped, 29838 index = 0, 29839 length = Animation.prefilters.length, 29840 deferred = jQuery.Deferred().always(function () { 29841 // Don't match elem in the :animated selector 29842 delete tick.elem; 29843 }), 29844 tick = function tick() { 29845 if (stopped) { 29846 return false; 29847 } 29848 29849 var currentTime = fxNow || createFxNow(), 29850 remaining = Math.max(0, animation.startTime + animation.duration - currentTime), 29851 // Support: Android 2.3 only 29852 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 29853 temp = remaining / animation.duration || 0, 29854 percent = 1 - temp, 29855 index = 0, 29856 length = animation.tweens.length; 29857 29858 for (; index < length; index++) { 29859 animation.tweens[index].run(percent); 29860 } 29861 29862 deferred.notifyWith(elem, [animation, percent, remaining]); // If there's more to do, yield 29863 29864 if (percent < 1 && length) { 29865 return remaining; 29866 } // If this was an empty animation, synthesize a final progress notification 29867 29868 29869 if (!length) { 29870 deferred.notifyWith(elem, [animation, 1, 0]); 29871 } // Resolve the animation and report its conclusion 29872 29873 29874 deferred.resolveWith(elem, [animation]); 29875 return false; 29876 }, 29877 animation = deferred.promise({ 29878 elem: elem, 29879 props: jQuery.extend({}, properties), 29880 opts: jQuery.extend(true, { 29881 specialEasing: {}, 29882 easing: jQuery.easing._default 29883 }, options), 29884 originalProperties: properties, 29885 originalOptions: options, 29886 startTime: fxNow || createFxNow(), 29887 duration: options.duration, 29888 tweens: [], 29889 createTween: function createTween(prop, end) { 29890 var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing); 29891 animation.tweens.push(tween); 29892 return tween; 29893 }, 29894 stop: function stop(gotoEnd) { 29895 var index = 0, 29896 // If we are going to the end, we want to run all the tweens 29897 // otherwise we skip this part 29898 length = gotoEnd ? animation.tweens.length : 0; 29899 29900 if (stopped) { 29901 return this; 29902 } 29903 29904 stopped = true; 29905 29906 for (; index < length; index++) { 29907 animation.tweens[index].run(1); 29908 } // Resolve when we played the last frame; otherwise, reject 29909 29910 29911 if (gotoEnd) { 29912 deferred.notifyWith(elem, [animation, 1, 0]); 29913 deferred.resolveWith(elem, [animation, gotoEnd]); 29914 } else { 29915 deferred.rejectWith(elem, [animation, gotoEnd]); 29916 } 29917 29918 return this; 29919 } 29920 }), 29921 props = animation.props; 29922 29923 propFilter(props, animation.opts.specialEasing); 29924 29925 for (; index < length; index++) { 29926 result = Animation.prefilters[index].call(animation, elem, props, animation.opts); 29927 29928 if (result) { 29929 if (isFunction(result.stop)) { 29930 jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result); 29931 } 29932 29933 return result; 29934 } 29935 } 29936 29937 jQuery.map(props, createTween, animation); 29938 29939 if (isFunction(animation.opts.start)) { 29940 animation.opts.start.call(elem, animation); 29941 } // Attach callbacks from options 29942 29943 29944 animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always); 29945 jQuery.fx.timer(jQuery.extend(tick, { 29946 elem: elem, 29947 anim: animation, 29948 queue: animation.opts.queue 29949 })); 29950 return animation; 29951 } 29952 29953 jQuery.Animation = jQuery.extend(Animation, { 29954 tweeners: { 29955 "*": [function (prop, value) { 29956 var tween = this.createTween(prop, value); 29957 adjustCSS(tween.elem, prop, rcssNum.exec(value), tween); 29958 return tween; 29959 }] 29960 }, 29961 tweener: function tweener(props, callback) { 29962 if (isFunction(props)) { 29963 callback = props; 29964 props = ["*"]; 29965 } else { 29966 props = props.match(rnothtmlwhite); 29967 } 29968 29969 var prop, 29970 index = 0, 29971 length = props.length; 29972 29973 for (; index < length; index++) { 29974 prop = props[index]; 29975 Animation.tweeners[prop] = Animation.tweeners[prop] || []; 29976 Animation.tweeners[prop].unshift(callback); 29977 } 29978 }, 29979 prefilters: [defaultPrefilter], 29980 prefilter: function prefilter(callback, prepend) { 29981 if (prepend) { 29982 Animation.prefilters.unshift(callback); 29983 } else { 29984 Animation.prefilters.push(callback); 29985 } 29986 } 29987 }); 29988 29989 jQuery.speed = function (speed, easing, fn) { 29990 var opt = speed && _typeof(speed) === "object" ? jQuery.extend({}, speed) : { 29991 complete: fn || !fn && easing || isFunction(speed) && speed, 29992 duration: speed, 29993 easing: fn && easing || easing && !isFunction(easing) && easing 29994 }; // Go to the end state if fx are off 29995 29996 if (jQuery.fx.off) { 29997 opt.duration = 0; 29998 } else { 29999 if (typeof opt.duration !== "number") { 30000 if (opt.duration in jQuery.fx.speeds) { 30001 opt.duration = jQuery.fx.speeds[opt.duration]; 30002 } else { 30003 opt.duration = jQuery.fx.speeds._default; 30004 } 30005 } 30006 } // Normalize opt.queue - true/undefined/null -> "fx" 30007 30008 30009 if (opt.queue == null || opt.queue === true) { 30010 opt.queue = "fx"; 30011 } // Queueing 30012 30013 30014 opt.old = opt.complete; 30015 30016 opt.complete = function () { 30017 if (isFunction(opt.old)) { 30018 opt.old.call(this); 30019 } 30020 30021 if (opt.queue) { 30022 jQuery.dequeue(this, opt.queue); 30023 } 30024 }; 30025 30026 return opt; 30027 }; 30028 30029 jQuery.fn.extend({ 30030 fadeTo: function fadeTo(speed, to, easing, callback) { 30031 // Show any hidden elements after setting opacity to 0 30032 return this.filter(isHiddenWithinTree).css("opacity", 0).show() // Animate to the value specified 30033 .end().animate({ 30034 opacity: to 30035 }, speed, easing, callback); 30036 }, 30037 animate: function animate(prop, speed, easing, callback) { 30038 var empty = jQuery.isEmptyObject(prop), 30039 optall = jQuery.speed(speed, easing, callback), 30040 doAnimation = function doAnimation() { 30041 // Operate on a copy of prop so per-property easing won't be lost 30042 var anim = Animation(this, jQuery.extend({}, prop), optall); // Empty animations, or finishing resolves immediately 30043 30044 if (empty || dataPriv.get(this, "finish")) { 30045 anim.stop(true); 30046 } 30047 }; 30048 30049 doAnimation.finish = doAnimation; 30050 return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation); 30051 }, 30052 stop: function stop(type, clearQueue, gotoEnd) { 30053 var stopQueue = function stopQueue(hooks) { 30054 var stop = hooks.stop; 30055 delete hooks.stop; 30056 stop(gotoEnd); 30057 }; 30058 30059 if (typeof type !== "string") { 30060 gotoEnd = clearQueue; 30061 clearQueue = type; 30062 type = undefined; 30063 } 30064 30065 if (clearQueue && type !== false) { 30066 this.queue(type || "fx", []); 30067 } 30068 30069 return this.each(function () { 30070 var dequeue = true, 30071 index = type != null && type + "queueHooks", 30072 timers = jQuery.timers, 30073 data = dataPriv.get(this); 30074 30075 if (index) { 30076 if (data[index] && data[index].stop) { 30077 stopQueue(data[index]); 30078 } 30079 } else { 30080 for (index in data) { 30081 if (data[index] && data[index].stop && rrun.test(index)) { 30082 stopQueue(data[index]); 30083 } 30084 } 30085 } 30086 30087 for (index = timers.length; index--;) { 30088 if (timers[index].elem === this && (type == null || timers[index].queue === type)) { 30089 timers[index].anim.stop(gotoEnd); 30090 dequeue = false; 30091 timers.splice(index, 1); 30092 } 30093 } // Start the next in the queue if the last step wasn't forced. 30094 // Timers currently will call their complete callbacks, which 30095 // will dequeue but only if they were gotoEnd. 30096 30097 30098 if (dequeue || !gotoEnd) { 30099 jQuery.dequeue(this, type); 30100 } 30101 }); 30102 }, 30103 finish: function finish(type) { 30104 if (type !== false) { 30105 type = type || "fx"; 30106 } 30107 30108 return this.each(function () { 30109 var index, 30110 data = dataPriv.get(this), 30111 queue = data[type + "queue"], 30112 hooks = data[type + "queueHooks"], 30113 timers = jQuery.timers, 30114 length = queue ? queue.length : 0; // Enable finishing flag on private data 30115 30116 data.finish = true; // Empty the queue first 30117 30118 jQuery.queue(this, type, []); 30119 30120 if (hooks && hooks.stop) { 30121 hooks.stop.call(this, true); 30122 } // Look for any active animations, and finish them 30123 30124 30125 for (index = timers.length; index--;) { 30126 if (timers[index].elem === this && timers[index].queue === type) { 30127 timers[index].anim.stop(true); 30128 timers.splice(index, 1); 30129 } 30130 } // Look for any animations in the old queue and finish them 30131 30132 30133 for (index = 0; index < length; index++) { 30134 if (queue[index] && queue[index].finish) { 30135 queue[index].finish.call(this); 30136 } 30137 } // Turn off finishing flag 30138 30139 30140 delete data.finish; 30141 }); 30142 } 30143 }); 30144 jQuery.each(["toggle", "show", "hide"], function (i, name) { 30145 var cssFn = jQuery.fn[name]; 30146 30147 jQuery.fn[name] = function (speed, easing, callback) { 30148 return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback); 30149 }; 30150 }); // Generate shortcuts for custom animations 30151 30152 jQuery.each({ 30153 slideDown: genFx("show"), 30154 slideUp: genFx("hide"), 30155 slideToggle: genFx("toggle"), 30156 fadeIn: { 30157 opacity: "show" 30158 }, 30159 fadeOut: { 30160 opacity: "hide" 30161 }, 30162 fadeToggle: { 30163 opacity: "toggle" 30164 } 30165 }, function (name, props) { 30166 jQuery.fn[name] = function (speed, easing, callback) { 30167 return this.animate(props, speed, easing, callback); 30168 }; 30169 }); 30170 jQuery.timers = []; 30171 30172 jQuery.fx.tick = function () { 30173 var timer, 30174 i = 0, 30175 timers = jQuery.timers; 30176 fxNow = Date.now(); 30177 30178 for (; i < timers.length; i++) { 30179 timer = timers[i]; // Run the timer and safely remove it when done (allowing for external removal) 30180 30181 if (!timer() && timers[i] === timer) { 30182 timers.splice(i--, 1); 30183 } 30184 } 30185 30186 if (!timers.length) { 30187 jQuery.fx.stop(); 30188 } 30189 30190 fxNow = undefined; 30191 }; 30192 30193 jQuery.fx.timer = function (timer) { 30194 jQuery.timers.push(timer); 30195 jQuery.fx.start(); 30196 }; 30197 30198 jQuery.fx.interval = 13; 30199 30200 jQuery.fx.start = function () { 30201 if (inProgress) { 30202 return; 30203 } 30204 30205 inProgress = true; 30206 schedule(); 30207 }; 30208 30209 jQuery.fx.stop = function () { 30210 inProgress = null; 30211 }; 30212 30213 jQuery.fx.speeds = { 30214 slow: 600, 30215 fast: 200, 30216 // Default speed 30217 _default: 400 30218 }; // Based off of the plugin by Clint Helfers, with permission. 30219 // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 30220 30221 jQuery.fn.delay = function (time, type) { 30222 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; 30223 type = type || "fx"; 30224 return this.queue(type, function (next, hooks) { 30225 var timeout = window.setTimeout(next, time); 30226 30227 hooks.stop = function () { 30228 window.clearTimeout(timeout); 30229 }; 30230 }); 30231 }; 30232 30233 (function () { 30234 var input = document.createElement("input"), 30235 select = document.createElement("select"), 30236 opt = select.appendChild(document.createElement("option")); 30237 input.type = "checkbox"; // Support: Android <=4.3 only 30238 // Default value for a checkbox should be "on" 30239 30240 support.checkOn = input.value !== ""; // Support: IE <=11 only 30241 // Must access selectedIndex to make default options select 30242 30243 support.optSelected = opt.selected; // Support: IE <=11 only 30244 // An input loses its value after becoming a radio 30245 30246 input = document.createElement("input"); 30247 input.value = "t"; 30248 input.type = "radio"; 30249 support.radioValue = input.value === "t"; 30250 })(); 30251 30252 var boolHook, 30253 attrHandle = jQuery.expr.attrHandle; 30254 jQuery.fn.extend({ 30255 attr: function attr(name, value) { 30256 return access(this, jQuery.attr, name, value, arguments.length > 1); 30257 }, 30258 removeAttr: function removeAttr(name) { 30259 return this.each(function () { 30260 jQuery.removeAttr(this, name); 30261 }); 30262 } 30263 }); 30264 jQuery.extend({ 30265 attr: function attr(elem, name, value) { 30266 var ret, 30267 hooks, 30268 nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes 30269 30270 if (nType === 3 || nType === 8 || nType === 2) { 30271 return; 30272 } // Fallback to prop when attributes are not supported 30273 30274 30275 if (typeof elem.getAttribute === "undefined") { 30276 return jQuery.prop(elem, name, value); 30277 } // Attribute hooks are determined by the lowercase version 30278 // Grab necessary hook if one is defined 30279 30280 30281 if (nType !== 1 || !jQuery.isXMLDoc(elem)) { 30282 hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined); 30283 } 30284 30285 if (value !== undefined) { 30286 if (value === null) { 30287 jQuery.removeAttr(elem, name); 30288 return; 30289 } 30290 30291 if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { 30292 return ret; 30293 } 30294 30295 elem.setAttribute(name, value + ""); 30296 return value; 30297 } 30298 30299 if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { 30300 return ret; 30301 } 30302 30303 ret = jQuery.find.attr(elem, name); // Non-existent attributes return null, we normalize to undefined 30304 30305 return ret == null ? undefined : ret; 30306 }, 30307 attrHooks: { 30308 type: { 30309 set: function set(elem, value) { 30310 if (!support.radioValue && value === "radio" && nodeName(elem, "input")) { 30311 var val = elem.value; 30312 elem.setAttribute("type", value); 30313 30314 if (val) { 30315 elem.value = val; 30316 } 30317 30318 return value; 30319 } 30320 } 30321 } 30322 }, 30323 removeAttr: function removeAttr(elem, value) { 30324 var name, 30325 i = 0, 30326 // Attribute names can contain non-HTML whitespace characters 30327 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 30328 attrNames = value && value.match(rnothtmlwhite); 30329 30330 if (attrNames && elem.nodeType === 1) { 30331 while (name = attrNames[i++]) { 30332 elem.removeAttribute(name); 30333 } 30334 } 30335 } 30336 }); // Hooks for boolean attributes 30337 30338 boolHook = { 30339 set: function set(elem, value, name) { 30340 if (value === false) { 30341 // Remove boolean attributes when set to false 30342 jQuery.removeAttr(elem, name); 30343 } else { 30344 elem.setAttribute(name, name); 30345 } 30346 30347 return name; 30348 } 30349 }; 30350 jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) { 30351 var getter = attrHandle[name] || jQuery.find.attr; 30352 30353 attrHandle[name] = function (elem, name, isXML) { 30354 var ret, 30355 handle, 30356 lowercaseName = name.toLowerCase(); 30357 30358 if (!isXML) { 30359 // Avoid an infinite loop by temporarily removing this function from the getter 30360 handle = attrHandle[lowercaseName]; 30361 attrHandle[lowercaseName] = ret; 30362 ret = getter(elem, name, isXML) != null ? lowercaseName : null; 30363 attrHandle[lowercaseName] = handle; 30364 } 30365 30366 return ret; 30367 }; 30368 }); 30369 var rfocusable = /^(?:input|select|textarea|button)$/i, 30370 rclickable = /^(?:a|area)$/i; 30371 jQuery.fn.extend({ 30372 prop: function prop(name, value) { 30373 return access(this, jQuery.prop, name, value, arguments.length > 1); 30374 }, 30375 removeProp: function removeProp(name) { 30376 return this.each(function () { 30377 delete this[jQuery.propFix[name] || name]; 30378 }); 30379 } 30380 }); 30381 jQuery.extend({ 30382 prop: function prop(elem, name, value) { 30383 var ret, 30384 hooks, 30385 nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes 30386 30387 if (nType === 3 || nType === 8 || nType === 2) { 30388 return; 30389 } 30390 30391 if (nType !== 1 || !jQuery.isXMLDoc(elem)) { 30392 // Fix name and attach hooks 30393 name = jQuery.propFix[name] || name; 30394 hooks = jQuery.propHooks[name]; 30395 } 30396 30397 if (value !== undefined) { 30398 if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { 30399 return ret; 30400 } 30401 30402 return elem[name] = value; 30403 } 30404 30405 if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { 30406 return ret; 30407 } 30408 30409 return elem[name]; 30410 }, 30411 propHooks: { 30412 tabIndex: { 30413 get: function get(elem) { 30414 // Support: IE <=9 - 11 only 30415 // elem.tabIndex doesn't always return the 30416 // correct value when it hasn't been explicitly set 30417 // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 30418 // Use proper attribute retrieval(#12072) 30419 var tabindex = jQuery.find.attr(elem, "tabindex"); 30420 30421 if (tabindex) { 30422 return parseInt(tabindex, 10); 30423 } 30424 30425 if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) { 30426 return 0; 30427 } 30428 30429 return -1; 30430 } 30431 } 30432 }, 30433 propFix: { 30434 "for": "htmlFor", 30435 "class": "className" 30436 } 30437 }); // Support: IE <=11 only 30438 // Accessing the selectedIndex property 30439 // forces the browser to respect setting selected 30440 // on the option 30441 // The getter ensures a default option is selected 30442 // when in an optgroup 30443 // eslint rule "no-unused-expressions" is disabled for this code 30444 // since it considers such accessions noop 30445 30446 if (!support.optSelected) { 30447 jQuery.propHooks.selected = { 30448 get: function get(elem) { 30449 /* eslint no-unused-expressions: "off" */ 30450 var parent = elem.parentNode; 30451 30452 if (parent && parent.parentNode) { 30453 parent.parentNode.selectedIndex; 30454 } 30455 30456 return null; 30457 }, 30458 set: function set(elem) { 30459 /* eslint no-unused-expressions: "off" */ 30460 var parent = elem.parentNode; 30461 30462 if (parent) { 30463 parent.selectedIndex; 30464 30465 if (parent.parentNode) { 30466 parent.parentNode.selectedIndex; 30467 } 30468 } 30469 } 30470 }; 30471 } 30472 30473 jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { 30474 jQuery.propFix[this.toLowerCase()] = this; 30475 }); // Strip and collapse whitespace according to HTML spec 30476 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 30477 30478 function stripAndCollapse(value) { 30479 var tokens = value.match(rnothtmlwhite) || []; 30480 return tokens.join(" "); 30481 } 30482 30483 function getClass(elem) { 30484 return elem.getAttribute && elem.getAttribute("class") || ""; 30485 } 30486 30487 function classesToArray(value) { 30488 if (Array.isArray(value)) { 30489 return value; 30490 } 30491 30492 if (typeof value === "string") { 30493 return value.match(rnothtmlwhite) || []; 30494 } 30495 30496 return []; 30497 } 30498 30499 jQuery.fn.extend({ 30500 addClass: function addClass(value) { 30501 var classes, 30502 elem, 30503 cur, 30504 curValue, 30505 clazz, 30506 j, 30507 finalValue, 30508 i = 0; 30509 30510 if (isFunction(value)) { 30511 return this.each(function (j) { 30512 jQuery(this).addClass(value.call(this, j, getClass(this))); 30513 }); 30514 } 30515 30516 classes = classesToArray(value); 30517 30518 if (classes.length) { 30519 while (elem = this[i++]) { 30520 curValue = getClass(elem); 30521 cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; 30522 30523 if (cur) { 30524 j = 0; 30525 30526 while (clazz = classes[j++]) { 30527 if (cur.indexOf(" " + clazz + " ") < 0) { 30528 cur += clazz + " "; 30529 } 30530 } // Only assign if different to avoid unneeded rendering. 30531 30532 30533 finalValue = stripAndCollapse(cur); 30534 30535 if (curValue !== finalValue) { 30536 elem.setAttribute("class", finalValue); 30537 } 30538 } 30539 } 30540 } 30541 30542 return this; 30543 }, 30544 removeClass: function removeClass(value) { 30545 var classes, 30546 elem, 30547 cur, 30548 curValue, 30549 clazz, 30550 j, 30551 finalValue, 30552 i = 0; 30553 30554 if (isFunction(value)) { 30555 return this.each(function (j) { 30556 jQuery(this).removeClass(value.call(this, j, getClass(this))); 30557 }); 30558 } 30559 30560 if (!arguments.length) { 30561 return this.attr("class", ""); 30562 } 30563 30564 classes = classesToArray(value); 30565 30566 if (classes.length) { 30567 while (elem = this[i++]) { 30568 curValue = getClass(elem); // This expression is here for better compressibility (see addClass) 30569 30570 cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; 30571 30572 if (cur) { 30573 j = 0; 30574 30575 while (clazz = classes[j++]) { 30576 // Remove *all* instances 30577 while (cur.indexOf(" " + clazz + " ") > -1) { 30578 cur = cur.replace(" " + clazz + " ", " "); 30579 } 30580 } // Only assign if different to avoid unneeded rendering. 30581 30582 30583 finalValue = stripAndCollapse(cur); 30584 30585 if (curValue !== finalValue) { 30586 elem.setAttribute("class", finalValue); 30587 } 30588 } 30589 } 30590 } 30591 30592 return this; 30593 }, 30594 toggleClass: function toggleClass(value, stateVal) { 30595 var type = _typeof(value), 30596 isValidValue = type === "string" || Array.isArray(value); 30597 30598 if (typeof stateVal === "boolean" && isValidValue) { 30599 return stateVal ? this.addClass(value) : this.removeClass(value); 30600 } 30601 30602 if (isFunction(value)) { 30603 return this.each(function (i) { 30604 jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal); 30605 }); 30606 } 30607 30608 return this.each(function () { 30609 var className, i, self, classNames; 30610 30611 if (isValidValue) { 30612 // Toggle individual class names 30613 i = 0; 30614 self = jQuery(this); 30615 classNames = classesToArray(value); 30616 30617 while (className = classNames[i++]) { 30618 // Check each className given, space separated list 30619 if (self.hasClass(className)) { 30620 self.removeClass(className); 30621 } else { 30622 self.addClass(className); 30623 } 30624 } // Toggle whole class name 30625 30626 } else if (value === undefined || type === "boolean") { 30627 className = getClass(this); 30628 30629 if (className) { 30630 // Store className if set 30631 dataPriv.set(this, "__className__", className); 30632 } // If the element has a class name or if we're passed `false`, 30633 // then remove the whole classname (if there was one, the above saved it). 30634 // Otherwise bring back whatever was previously saved (if anything), 30635 // falling back to the empty string if nothing was stored. 30636 30637 30638 if (this.setAttribute) { 30639 this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || ""); 30640 } 30641 } 30642 }); 30643 }, 30644 hasClass: function hasClass(selector) { 30645 var className, 30646 elem, 30647 i = 0; 30648 className = " " + selector + " "; 30649 30650 while (elem = this[i++]) { 30651 if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) { 30652 return true; 30653 } 30654 } 30655 30656 return false; 30657 } 30658 }); 30659 var rreturn = /\r/g; 30660 jQuery.fn.extend({ 30661 val: function val(value) { 30662 var hooks, 30663 ret, 30664 valueIsFunction, 30665 elem = this[0]; 30666 30667 if (!arguments.length) { 30668 if (elem) { 30669 hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()]; 30670 30671 if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) { 30672 return ret; 30673 } 30674 30675 ret = elem.value; // Handle most common string cases 30676 30677 if (typeof ret === "string") { 30678 return ret.replace(rreturn, ""); 30679 } // Handle cases where value is null/undef or number 30680 30681 30682 return ret == null ? "" : ret; 30683 } 30684 30685 return; 30686 } 30687 30688 valueIsFunction = isFunction(value); 30689 return this.each(function (i) { 30690 var val; 30691 30692 if (this.nodeType !== 1) { 30693 return; 30694 } 30695 30696 if (valueIsFunction) { 30697 val = value.call(this, i, jQuery(this).val()); 30698 } else { 30699 val = value; 30700 } // Treat null/undefined as ""; convert numbers to string 30701 30702 30703 if (val == null) { 30704 val = ""; 30705 } else if (typeof val === "number") { 30706 val += ""; 30707 } else if (Array.isArray(val)) { 30708 val = jQuery.map(val, function (value) { 30709 return value == null ? "" : value + ""; 30710 }); 30711 } 30712 30713 hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; // If set returns undefined, fall back to normal setting 30714 30715 if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { 30716 this.value = val; 30717 } 30718 }); 30719 } 30720 }); 30721 jQuery.extend({ 30722 valHooks: { 30723 option: { 30724 get: function get(elem) { 30725 var val = jQuery.find.attr(elem, "value"); 30726 return val != null ? val : // Support: IE <=10 - 11 only 30727 // option.text throws exceptions (#14686, #14858) 30728 // Strip and collapse whitespace 30729 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 30730 stripAndCollapse(jQuery.text(elem)); 30731 } 30732 }, 30733 select: { 30734 get: function get(elem) { 30735 var value, 30736 option, 30737 i, 30738 options = elem.options, 30739 index = elem.selectedIndex, 30740 one = elem.type === "select-one", 30741 values = one ? null : [], 30742 max = one ? index + 1 : options.length; 30743 30744 if (index < 0) { 30745 i = max; 30746 } else { 30747 i = one ? index : 0; 30748 } // Loop through all the selected options 30749 30750 30751 for (; i < max; i++) { 30752 option = options[i]; // Support: IE <=9 only 30753 // IE8-9 doesn't update selected after form reset (#2551) 30754 30755 if ((option.selected || i === index) && // Don't return options that are disabled or in a disabled optgroup 30756 !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) { 30757 // Get the specific value for the option 30758 value = jQuery(option).val(); // We don't need an array for one selects 30759 30760 if (one) { 30761 return value; 30762 } // Multi-Selects return an array 30763 30764 30765 values.push(value); 30766 } 30767 } 30768 30769 return values; 30770 }, 30771 set: function set(elem, value) { 30772 var optionSet, 30773 option, 30774 options = elem.options, 30775 values = jQuery.makeArray(value), 30776 i = options.length; 30777 30778 while (i--) { 30779 option = options[i]; 30780 /* eslint-disable no-cond-assign */ 30781 30782 if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) { 30783 optionSet = true; 30784 } 30785 /* eslint-enable no-cond-assign */ 30786 30787 } // Force browsers to behave consistently when non-matching value is set 30788 30789 30790 if (!optionSet) { 30791 elem.selectedIndex = -1; 30792 } 30793 30794 return values; 30795 } 30796 } 30797 } 30798 }); // Radios and checkboxes getter/setter 30799 30800 jQuery.each(["radio", "checkbox"], function () { 30801 jQuery.valHooks[this] = { 30802 set: function set(elem, value) { 30803 if (Array.isArray(value)) { 30804 return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1; 30805 } 30806 } 30807 }; 30808 30809 if (!support.checkOn) { 30810 jQuery.valHooks[this].get = function (elem) { 30811 return elem.getAttribute("value") === null ? "on" : elem.value; 30812 }; 30813 } 30814 }); // Return jQuery for attributes-only inclusion 30815 30816 support.focusin = "onfocusin" in window; 30817 30818 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 30819 stopPropagationCallback = function stopPropagationCallback(e) { 30820 e.stopPropagation(); 30821 }; 30822 30823 jQuery.extend(jQuery.event, { 30824 trigger: function trigger(event, data, elem, onlyHandlers) { 30825 var i, 30826 cur, 30827 tmp, 30828 bubbleType, 30829 ontype, 30830 handle, 30831 special, 30832 lastElement, 30833 eventPath = [elem || document], 30834 type = hasOwn.call(event, "type") ? event.type : event, 30835 namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; 30836 cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes 30837 30838 if (elem.nodeType === 3 || elem.nodeType === 8) { 30839 return; 30840 } // focus/blur morphs to focusin/out; ensure we're not firing them right now 30841 30842 30843 if (rfocusMorph.test(type + jQuery.event.triggered)) { 30844 return; 30845 } 30846 30847 if (type.indexOf(".") > -1) { 30848 // Namespaced trigger; create a regexp to match event type in handle() 30849 namespaces = type.split("."); 30850 type = namespaces.shift(); 30851 namespaces.sort(); 30852 } 30853 30854 ontype = type.indexOf(":") < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string 30855 30856 event = event[jQuery.expando] ? event : new jQuery.Event(type, _typeof(event) === "object" && event); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 30857 30858 event.isTrigger = onlyHandlers ? 2 : 3; 30859 event.namespace = namespaces.join("."); 30860 event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; // Clean up the event in case it is being reused 30861 30862 event.result = undefined; 30863 30864 if (!event.target) { 30865 event.target = elem; 30866 } // Clone any incoming data and prepend the event, creating the handler arg list 30867 30868 30869 data = data == null ? [event] : jQuery.makeArray(data, [event]); // Allow special events to draw outside the lines 30870 30871 special = jQuery.event.special[type] || {}; 30872 30873 if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { 30874 return; 30875 } // Determine event propagation path in advance, per W3C events spec (#9951) 30876 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 30877 30878 30879 if (!onlyHandlers && !special.noBubble && !isWindow(elem)) { 30880 bubbleType = special.delegateType || type; 30881 30882 if (!rfocusMorph.test(bubbleType + type)) { 30883 cur = cur.parentNode; 30884 } 30885 30886 for (; cur; cur = cur.parentNode) { 30887 eventPath.push(cur); 30888 tmp = cur; 30889 } // Only add window if we got to document (e.g., not plain obj or detached DOM) 30890 30891 30892 if (tmp === (elem.ownerDocument || document)) { 30893 eventPath.push(tmp.defaultView || tmp.parentWindow || window); 30894 } 30895 } // Fire handlers on the event path 30896 30897 30898 i = 0; 30899 30900 while ((cur = eventPath[i++]) && !event.isPropagationStopped()) { 30901 lastElement = cur; 30902 event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler 30903 30904 handle = (dataPriv.get(cur, "events") || {})[event.type] && dataPriv.get(cur, "handle"); 30905 30906 if (handle) { 30907 handle.apply(cur, data); 30908 } // Native handler 30909 30910 30911 handle = ontype && cur[ontype]; 30912 30913 if (handle && handle.apply && acceptData(cur)) { 30914 event.result = handle.apply(cur, data); 30915 30916 if (event.result === false) { 30917 event.preventDefault(); 30918 } 30919 } 30920 } 30921 30922 event.type = type; // If nobody prevented the default action, do it now 30923 30924 if (!onlyHandlers && !event.isDefaultPrevented()) { 30925 if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) { 30926 // Call a native DOM method on the target with the same name as the event. 30927 // Don't do default actions on window, that's where global variables be (#6170) 30928 if (ontype && isFunction(elem[type]) && !isWindow(elem)) { 30929 // Don't re-trigger an onFOO event when we call its FOO() method 30930 tmp = elem[ontype]; 30931 30932 if (tmp) { 30933 elem[ontype] = null; 30934 } // Prevent re-triggering of the same event, since we already bubbled it above 30935 30936 30937 jQuery.event.triggered = type; 30938 30939 if (event.isPropagationStopped()) { 30940 lastElement.addEventListener(type, stopPropagationCallback); 30941 } 30942 30943 elem[type](); 30944 30945 if (event.isPropagationStopped()) { 30946 lastElement.removeEventListener(type, stopPropagationCallback); 30947 } 30948 30949 jQuery.event.triggered = undefined; 30950 30951 if (tmp) { 30952 elem[ontype] = tmp; 30953 } 30954 } 30955 } 30956 } 30957 30958 return event.result; 30959 }, 30960 // Piggyback on a donor event to simulate a different one 30961 // Used only for `focus(in | out)` events 30962 simulate: function simulate(type, elem, event) { 30963 var e = jQuery.extend(new jQuery.Event(), event, { 30964 type: type, 30965 isSimulated: true 30966 }); 30967 jQuery.event.trigger(e, null, elem); 30968 } 30969 }); 30970 jQuery.fn.extend({ 30971 trigger: function trigger(type, data) { 30972 return this.each(function () { 30973 jQuery.event.trigger(type, data, this); 30974 }); 30975 }, 30976 triggerHandler: function triggerHandler(type, data) { 30977 var elem = this[0]; 30978 30979 if (elem) { 30980 return jQuery.event.trigger(type, data, elem, true); 30981 } 30982 } 30983 }); // Support: Firefox <=44 30984 // Firefox doesn't have focus(in | out) events 30985 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 30986 // 30987 // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 30988 // focus(in | out) events fire after focus & blur events, 30989 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 30990 // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 30991 30992 if (!support.focusin) { 30993 jQuery.each({ 30994 focus: "focusin", 30995 blur: "focusout" 30996 }, function (orig, fix) { 30997 // Attach a single capturing handler on the document while someone wants focusin/focusout 30998 var handler = function handler(event) { 30999 jQuery.event.simulate(fix, event.target, jQuery.event.fix(event)); 31000 }; 31001 31002 jQuery.event.special[fix] = { 31003 setup: function setup() { 31004 var doc = this.ownerDocument || this, 31005 attaches = dataPriv.access(doc, fix); 31006 31007 if (!attaches) { 31008 doc.addEventListener(orig, handler, true); 31009 } 31010 31011 dataPriv.access(doc, fix, (attaches || 0) + 1); 31012 }, 31013 teardown: function teardown() { 31014 var doc = this.ownerDocument || this, 31015 attaches = dataPriv.access(doc, fix) - 1; 31016 31017 if (!attaches) { 31018 doc.removeEventListener(orig, handler, true); 31019 dataPriv.remove(doc, fix); 31020 } else { 31021 dataPriv.access(doc, fix, attaches); 31022 } 31023 } 31024 }; 31025 }); 31026 } 31027 31028 var location = window.location; 31029 var nonce = Date.now(); 31030 var rquery = /\?/; // Cross-browser xml parsing 31031 31032 jQuery.parseXML = function (data) { 31033 var xml; 31034 31035 if (!data || typeof data !== "string") { 31036 return null; 31037 } // Support: IE 9 - 11 only 31038 // IE throws on parseFromString with invalid input. 31039 31040 31041 try { 31042 xml = new window.DOMParser().parseFromString(data, "text/xml"); 31043 } catch (e) { 31044 xml = undefined; 31045 } 31046 31047 if (!xml || xml.getElementsByTagName("parsererror").length) { 31048 jQuery.error("Invalid XML: " + data); 31049 } 31050 31051 return xml; 31052 }; 31053 31054 var rbracket = /\[\]$/, 31055 rCRLF = /\r?\n/g, 31056 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 31057 rsubmittable = /^(?:input|select|textarea|keygen)/i; 31058 31059 function buildParams(prefix, obj, traditional, add) { 31060 var name; 31061 31062 if (Array.isArray(obj)) { 31063 // Serialize array item. 31064 jQuery.each(obj, function (i, v) { 31065 if (traditional || rbracket.test(prefix)) { 31066 // Treat each array item as a scalar. 31067 add(prefix, v); 31068 } else { 31069 // Item is non-scalar (array or object), encode its numeric index. 31070 buildParams(prefix + "[" + (_typeof(v) === "object" && v != null ? i : "") + "]", v, traditional, add); 31071 } 31072 }); 31073 } else if (!traditional && toType(obj) === "object") { 31074 // Serialize object item. 31075 for (name in obj) { 31076 buildParams(prefix + "[" + name + "]", obj[name], traditional, add); 31077 } 31078 } else { 31079 // Serialize scalar item. 31080 add(prefix, obj); 31081 } 31082 } // Serialize an array of form elements or a set of 31083 // key/values into a query string 31084 31085 31086 jQuery.param = function (a, traditional) { 31087 var prefix, 31088 s = [], 31089 add = function add(key, valueOrFunction) { 31090 // If value is a function, invoke it and use its return value 31091 var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction; 31092 s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value); 31093 }; // If an array was passed in, assume that it is an array of form elements. 31094 31095 31096 if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) { 31097 // Serialize the form elements 31098 jQuery.each(a, function () { 31099 add(this.name, this.value); 31100 }); 31101 } else { 31102 // If traditional, encode the "old" way (the way 1.3.2 or older 31103 // did it), otherwise encode params recursively. 31104 for (prefix in a) { 31105 buildParams(prefix, a[prefix], traditional, add); 31106 } 31107 } // Return the resulting serialization 31108 31109 31110 return s.join("&"); 31111 }; 31112 31113 jQuery.fn.extend({ 31114 serialize: function serialize() { 31115 return jQuery.param(this.serializeArray()); 31116 }, 31117 serializeArray: function serializeArray() { 31118 return this.map(function () { 31119 // Can add propHook for "elements" to filter or add form elements 31120 var elements = jQuery.prop(this, "elements"); 31121 return elements ? jQuery.makeArray(elements) : this; 31122 }).filter(function () { 31123 var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works 31124 31125 return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type)); 31126 }).map(function (i, elem) { 31127 var val = jQuery(this).val(); 31128 31129 if (val == null) { 31130 return null; 31131 } 31132 31133 if (Array.isArray(val)) { 31134 return jQuery.map(val, function (val) { 31135 return { 31136 name: elem.name, 31137 value: val.replace(rCRLF, "\r\n") 31138 }; 31139 }); 31140 } 31141 31142 return { 31143 name: elem.name, 31144 value: val.replace(rCRLF, "\r\n") 31145 }; 31146 }).get(); 31147 } 31148 }); 31149 var r20 = /%20/g, 31150 rhash = /#.*$/, 31151 rantiCache = /([?&])_=[^&]*/, 31152 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 31153 // #7653, #8125, #8152: local protocol detection 31154 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 31155 rnoContent = /^(?:GET|HEAD)$/, 31156 rprotocol = /^\/\//, 31157 31158 /* Prefilters 31159 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 31160 * 2) These are called: 31161 * - BEFORE asking for a transport 31162 * - AFTER param serialization (s.data is a string if s.processData is true) 31163 * 3) key is the dataType 31164 * 4) the catchall symbol "*" can be used 31165 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 31166 */ 31167 prefilters = {}, 31168 31169 /* Transports bindings 31170 * 1) key is the dataType 31171 * 2) the catchall symbol "*" can be used 31172 * 3) selection will start with transport dataType and THEN go to "*" if needed 31173 */ 31174 transports = {}, 31175 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 31176 allTypes = "*/".concat("*"), 31177 // Anchor tag for parsing the document origin 31178 originAnchor = document.createElement("a"); 31179 originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 31180 31181 function addToPrefiltersOrTransports(structure) { 31182 // dataTypeExpression is optional and defaults to "*" 31183 return function (dataTypeExpression, func) { 31184 if (typeof dataTypeExpression !== "string") { 31185 func = dataTypeExpression; 31186 dataTypeExpression = "*"; 31187 } 31188 31189 var dataType, 31190 i = 0, 31191 dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || []; 31192 31193 if (isFunction(func)) { 31194 // For each dataType in the dataTypeExpression 31195 while (dataType = dataTypes[i++]) { 31196 // Prepend if requested 31197 if (dataType[0] === "+") { 31198 dataType = dataType.slice(1) || "*"; 31199 (structure[dataType] = structure[dataType] || []).unshift(func); // Otherwise append 31200 } else { 31201 (structure[dataType] = structure[dataType] || []).push(func); 31202 } 31203 } 31204 } 31205 }; 31206 } // Base inspection function for prefilters and transports 31207 31208 31209 function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) { 31210 var inspected = {}, 31211 seekingTransport = structure === transports; 31212 31213 function inspect(dataType) { 31214 var selected; 31215 inspected[dataType] = true; 31216 jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) { 31217 var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR); 31218 31219 if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) { 31220 options.dataTypes.unshift(dataTypeOrTransport); 31221 inspect(dataTypeOrTransport); 31222 return false; 31223 } else if (seekingTransport) { 31224 return !(selected = dataTypeOrTransport); 31225 } 31226 }); 31227 return selected; 31228 } 31229 31230 return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*"); 31231 } // A special extend for ajax options 31232 // that takes "flat" options (not to be deep extended) 31233 // Fixes #9887 31234 31235 31236 function ajaxExtend(target, src) { 31237 var key, 31238 deep, 31239 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 31240 31241 for (key in src) { 31242 if (src[key] !== undefined) { 31243 (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key]; 31244 } 31245 } 31246 31247 if (deep) { 31248 jQuery.extend(true, target, deep); 31249 } 31250 31251 return target; 31252 } 31253 /* Handles responses to an ajax request: 31254 * - finds the right dataType (mediates between content-type and expected dataType) 31255 * - returns the corresponding response 31256 */ 31257 31258 31259 function ajaxHandleResponses(s, jqXHR, responses) { 31260 var ct, 31261 type, 31262 finalDataType, 31263 firstDataType, 31264 contents = s.contents, 31265 dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process 31266 31267 while (dataTypes[0] === "*") { 31268 dataTypes.shift(); 31269 31270 if (ct === undefined) { 31271 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); 31272 } 31273 } // Check if we're dealing with a known content-type 31274 31275 31276 if (ct) { 31277 for (type in contents) { 31278 if (contents[type] && contents[type].test(ct)) { 31279 dataTypes.unshift(type); 31280 break; 31281 } 31282 } 31283 } // Check to see if we have a response for the expected dataType 31284 31285 31286 if (dataTypes[0] in responses) { 31287 finalDataType = dataTypes[0]; 31288 } else { 31289 // Try convertible dataTypes 31290 for (type in responses) { 31291 if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) { 31292 finalDataType = type; 31293 break; 31294 } 31295 31296 if (!firstDataType) { 31297 firstDataType = type; 31298 } 31299 } // Or just use first one 31300 31301 31302 finalDataType = finalDataType || firstDataType; 31303 } // If we found a dataType 31304 // We add the dataType to the list if needed 31305 // and return the corresponding response 31306 31307 31308 if (finalDataType) { 31309 if (finalDataType !== dataTypes[0]) { 31310 dataTypes.unshift(finalDataType); 31311 } 31312 31313 return responses[finalDataType]; 31314 } 31315 } 31316 /* Chain conversions given the request and the original response 31317 * Also sets the responseXXX fields on the jqXHR instance 31318 */ 31319 31320 31321 function ajaxConvert(s, response, jqXHR, isSuccess) { 31322 var conv2, 31323 current, 31324 conv, 31325 tmp, 31326 prev, 31327 converters = {}, 31328 // Work with a copy of dataTypes in case we need to modify it for conversion 31329 dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys 31330 31331 if (dataTypes[1]) { 31332 for (conv in s.converters) { 31333 converters[conv.toLowerCase()] = s.converters[conv]; 31334 } 31335 } 31336 31337 current = dataTypes.shift(); // Convert to each sequential dataType 31338 31339 while (current) { 31340 if (s.responseFields[current]) { 31341 jqXHR[s.responseFields[current]] = response; 31342 } // Apply the dataFilter if provided 31343 31344 31345 if (!prev && isSuccess && s.dataFilter) { 31346 response = s.dataFilter(response, s.dataType); 31347 } 31348 31349 prev = current; 31350 current = dataTypes.shift(); 31351 31352 if (current) { 31353 // There's only work to do if current dataType is non-auto 31354 if (current === "*") { 31355 current = prev; // Convert response if prev dataType is non-auto and differs from current 31356 } else if (prev !== "*" && prev !== current) { 31357 // Seek a direct converter 31358 conv = converters[prev + " " + current] || converters["* " + current]; // If none found, seek a pair 31359 31360 if (!conv) { 31361 for (conv2 in converters) { 31362 // If conv2 outputs current 31363 tmp = conv2.split(" "); 31364 31365 if (tmp[1] === current) { 31366 // If prev can be converted to accepted input 31367 conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]]; 31368 31369 if (conv) { 31370 // Condense equivalence converters 31371 if (conv === true) { 31372 conv = converters[conv2]; // Otherwise, insert the intermediate dataType 31373 } else if (converters[conv2] !== true) { 31374 current = tmp[0]; 31375 dataTypes.unshift(tmp[1]); 31376 } 31377 31378 break; 31379 } 31380 } 31381 } 31382 } // Apply converter (if not an equivalence) 31383 31384 31385 if (conv !== true) { 31386 // Unless errors are allowed to bubble, catch and return them 31387 if (conv && s.throws) { 31388 response = conv(response); 31389 } else { 31390 try { 31391 response = conv(response); 31392 } catch (e) { 31393 return { 31394 state: "parsererror", 31395 error: conv ? e : "No conversion from " + prev + " to " + current 31396 }; 31397 } 31398 } 31399 } 31400 } 31401 } 31402 } 31403 31404 return { 31405 state: "success", 31406 data: response 31407 }; 31408 } 31409 31410 jQuery.extend({ 31411 // Counter for holding the number of active queries 31412 active: 0, 31413 // Last-Modified header cache for next request 31414 lastModified: {}, 31415 etag: {}, 31416 ajaxSettings: { 31417 url: location.href, 31418 type: "GET", 31419 isLocal: rlocalProtocol.test(location.protocol), 31420 global: true, 31421 processData: true, 31422 async: true, 31423 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 31424 31425 /* 31426 timeout: 0, 31427 data: null, 31428 dataType: null, 31429 username: null, 31430 password: null, 31431 cache: null, 31432 throws: false, 31433 traditional: false, 31434 headers: {}, 31435 */ 31436 accepts: { 31437 "*": allTypes, 31438 text: "text/plain", 31439 html: "text/html", 31440 xml: "application/xml, text/xml", 31441 json: "application/json, text/javascript" 31442 }, 31443 contents: { 31444 xml: /\bxml\b/, 31445 html: /\bhtml/, 31446 json: /\bjson\b/ 31447 }, 31448 responseFields: { 31449 xml: "responseXML", 31450 text: "responseText", 31451 json: "responseJSON" 31452 }, 31453 // Data converters 31454 // Keys separate source (or catchall "*") and destination types with a single space 31455 converters: { 31456 // Convert anything to text 31457 "* text": String, 31458 // Text to html (true = no transformation) 31459 "text html": true, 31460 // Evaluate text as a json expression 31461 "text json": JSON.parse, 31462 // Parse text as xml 31463 "text xml": jQuery.parseXML 31464 }, 31465 // For options that shouldn't be deep extended: 31466 // you can add your own custom options here if 31467 // and when you create one that shouldn't be 31468 // deep extended (see ajaxExtend) 31469 flatOptions: { 31470 url: true, 31471 context: true 31472 } 31473 }, 31474 // Creates a full fledged settings object into target 31475 // with both ajaxSettings and settings fields. 31476 // If target is omitted, writes into ajaxSettings. 31477 ajaxSetup: function ajaxSetup(target, settings) { 31478 return settings ? // Building a settings object 31479 ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : // Extending ajaxSettings 31480 ajaxExtend(jQuery.ajaxSettings, target); 31481 }, 31482 ajaxPrefilter: addToPrefiltersOrTransports(prefilters), 31483 ajaxTransport: addToPrefiltersOrTransports(transports), 31484 // Main method 31485 ajax: function ajax(url, options) { 31486 // If url is an object, simulate pre-1.5 signature 31487 if (_typeof(url) === "object") { 31488 options = url; 31489 url = undefined; 31490 } // Force options to be an object 31491 31492 31493 options = options || {}; 31494 31495 var transport, 31496 // URL without anti-cache param 31497 cacheURL, 31498 // Response headers 31499 responseHeadersString, 31500 responseHeaders, 31501 // timeout handle 31502 timeoutTimer, 31503 // Url cleanup var 31504 urlAnchor, 31505 // Request state (becomes false upon send and true upon completion) 31506 completed, 31507 // To know if global events are to be dispatched 31508 fireGlobals, 31509 // Loop variable 31510 i, 31511 // uncached part of the url 31512 uncached, 31513 // Create the final options object 31514 s = jQuery.ajaxSetup({}, options), 31515 // Callbacks context 31516 callbackContext = s.context || s, 31517 // Context for global events is callbackContext if it is a DOM node or jQuery collection 31518 globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event, 31519 // Deferreds 31520 deferred = jQuery.Deferred(), 31521 completeDeferred = jQuery.Callbacks("once memory"), 31522 // Status-dependent callbacks 31523 _statusCode = s.statusCode || {}, 31524 // Headers (they are sent all at once) 31525 requestHeaders = {}, 31526 requestHeadersNames = {}, 31527 // Default abort message 31528 strAbort = "canceled", 31529 // Fake xhr 31530 jqXHR = { 31531 readyState: 0, 31532 // Builds headers hashtable if needed 31533 getResponseHeader: function getResponseHeader(key) { 31534 var match; 31535 31536 if (completed) { 31537 if (!responseHeaders) { 31538 responseHeaders = {}; 31539 31540 while (match = rheaders.exec(responseHeadersString)) { 31541 responseHeaders[match[1].toLowerCase()] = match[2]; 31542 } 31543 } 31544 31545 match = responseHeaders[key.toLowerCase()]; 31546 } 31547 31548 return match == null ? null : match; 31549 }, 31550 // Raw string 31551 getAllResponseHeaders: function getAllResponseHeaders() { 31552 return completed ? responseHeadersString : null; 31553 }, 31554 // Caches the header 31555 setRequestHeader: function setRequestHeader(name, value) { 31556 if (completed == null) { 31557 name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name; 31558 requestHeaders[name] = value; 31559 } 31560 31561 return this; 31562 }, 31563 // Overrides response content-type header 31564 overrideMimeType: function overrideMimeType(type) { 31565 if (completed == null) { 31566 s.mimeType = type; 31567 } 31568 31569 return this; 31570 }, 31571 // Status-dependent callbacks 31572 statusCode: function statusCode(map) { 31573 var code; 31574 31575 if (map) { 31576 if (completed) { 31577 // Execute the appropriate callbacks 31578 jqXHR.always(map[jqXHR.status]); 31579 } else { 31580 // Lazy-add the new callbacks in a way that preserves old ones 31581 for (code in map) { 31582 _statusCode[code] = [_statusCode[code], map[code]]; 31583 } 31584 } 31585 } 31586 31587 return this; 31588 }, 31589 // Cancel the request 31590 abort: function abort(statusText) { 31591 var finalText = statusText || strAbort; 31592 31593 if (transport) { 31594 transport.abort(finalText); 31595 } 31596 31597 done(0, finalText); 31598 return this; 31599 } 31600 }; // Attach deferreds 31601 31602 31603 deferred.promise(jqXHR); // Add protocol if not provided (prefilters might expect it) 31604 // Handle falsy url in the settings object (#10093: consistency with old signature) 31605 // We also use the url parameter if available 31606 31607 s.url = ((url || s.url || location.href) + "").replace(rprotocol, location.protocol + "//"); // Alias method option to type as per ticket #12004 31608 31609 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list 31610 31611 s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""]; // A cross-domain request is in order when the origin doesn't match the current origin. 31612 31613 if (s.crossDomain == null) { 31614 urlAnchor = document.createElement("a"); // Support: IE <=8 - 11, Edge 12 - 15 31615 // IE throws exception on accessing the href property if url is malformed, 31616 // e.g. http://example.com:80x/ 31617 31618 try { 31619 urlAnchor.href = s.url; // Support: IE <=8 - 11 only 31620 // Anchor's host property isn't correctly set when s.url is relative 31621 31622 urlAnchor.href = urlAnchor.href; 31623 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; 31624 } catch (e) { 31625 // If there is an error parsing the URL, assume it is crossDomain, 31626 // it can be rejected by the transport if it is invalid 31627 s.crossDomain = true; 31628 } 31629 } // Convert data if not already a string 31630 31631 31632 if (s.data && s.processData && typeof s.data !== "string") { 31633 s.data = jQuery.param(s.data, s.traditional); 31634 } // Apply prefilters 31635 31636 31637 inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); // If request was aborted inside a prefilter, stop there 31638 31639 if (completed) { 31640 return jqXHR; 31641 } // We can fire global events as of now if asked to 31642 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 31643 31644 31645 fireGlobals = jQuery.event && s.global; // Watch for a new set of requests 31646 31647 if (fireGlobals && jQuery.active++ === 0) { 31648 jQuery.event.trigger("ajaxStart"); 31649 } // Uppercase the type 31650 31651 31652 s.type = s.type.toUpperCase(); // Determine if request has content 31653 31654 s.hasContent = !rnoContent.test(s.type); // Save the URL in case we're toying with the If-Modified-Since 31655 // and/or If-None-Match header later on 31656 // Remove hash to simplify url manipulation 31657 31658 cacheURL = s.url.replace(rhash, ""); // More options handling for requests with no content 31659 31660 if (!s.hasContent) { 31661 // Remember the hash so we can put it back 31662 uncached = s.url.slice(cacheURL.length); // If data is available and should be processed, append data to url 31663 31664 if (s.data && (s.processData || typeof s.data === "string")) { 31665 cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data; // #9682: remove data so that it's not used in an eventual retry 31666 31667 delete s.data; 31668 } // Add or update anti-cache param if needed 31669 31670 31671 if (s.cache === false) { 31672 cacheURL = cacheURL.replace(rantiCache, "$1"); 31673 uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++ + uncached; 31674 } // Put hash and anti-cache on the URL that will be requested (gh-1732) 31675 31676 31677 s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) 31678 } else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) { 31679 s.data = s.data.replace(r20, "+"); 31680 } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 31681 31682 31683 if (s.ifModified) { 31684 if (jQuery.lastModified[cacheURL]) { 31685 jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]); 31686 } 31687 31688 if (jQuery.etag[cacheURL]) { 31689 jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]); 31690 } 31691 } // Set the correct header, if data is being sent 31692 31693 31694 if (s.data && s.hasContent && s.contentType !== false || options.contentType) { 31695 jqXHR.setRequestHeader("Content-Type", s.contentType); 31696 } // Set the Accepts header for the server, depending on the dataType 31697 31698 31699 jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]); // Check for headers option 31700 31701 for (i in s.headers) { 31702 jqXHR.setRequestHeader(i, s.headers[i]); 31703 } // Allow custom headers/mimetypes and early abort 31704 31705 31706 if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) { 31707 // Abort if not done already and return 31708 return jqXHR.abort(); 31709 } // Aborting is no longer a cancellation 31710 31711 31712 strAbort = "abort"; // Install callbacks on deferreds 31713 31714 completeDeferred.add(s.complete); 31715 jqXHR.done(s.success); 31716 jqXHR.fail(s.error); // Get transport 31717 31718 transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); // If no transport, we auto-abort 31719 31720 if (!transport) { 31721 done(-1, "No Transport"); 31722 } else { 31723 jqXHR.readyState = 1; // Send global event 31724 31725 if (fireGlobals) { 31726 globalEventContext.trigger("ajaxSend", [jqXHR, s]); 31727 } // If request was aborted inside ajaxSend, stop there 31728 31729 31730 if (completed) { 31731 return jqXHR; 31732 } // Timeout 31733 31734 31735 if (s.async && s.timeout > 0) { 31736 timeoutTimer = window.setTimeout(function () { 31737 jqXHR.abort("timeout"); 31738 }, s.timeout); 31739 } 31740 31741 try { 31742 completed = false; 31743 transport.send(requestHeaders, done); 31744 } catch (e) { 31745 // Rethrow post-completion exceptions 31746 if (completed) { 31747 throw e; 31748 } // Propagate others as results 31749 31750 31751 done(-1, e); 31752 } 31753 } // Callback for when everything is done 31754 31755 31756 function done(status, nativeStatusText, responses, headers) { 31757 var isSuccess, 31758 success, 31759 error, 31760 response, 31761 modified, 31762 statusText = nativeStatusText; // Ignore repeat invocations 31763 31764 if (completed) { 31765 return; 31766 } 31767 31768 completed = true; // Clear timeout if it exists 31769 31770 if (timeoutTimer) { 31771 window.clearTimeout(timeoutTimer); 31772 } // Dereference transport for early garbage collection 31773 // (no matter how long the jqXHR object will be used) 31774 31775 31776 transport = undefined; // Cache response headers 31777 31778 responseHeadersString = headers || ""; // Set readyState 31779 31780 jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful 31781 31782 isSuccess = status >= 200 && status < 300 || status === 304; // Get response data 31783 31784 if (responses) { 31785 response = ajaxHandleResponses(s, jqXHR, responses); 31786 } // Convert no matter what (that way responseXXX fields are always set) 31787 31788 31789 response = ajaxConvert(s, response, jqXHR, isSuccess); // If successful, handle type chaining 31790 31791 if (isSuccess) { 31792 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 31793 if (s.ifModified) { 31794 modified = jqXHR.getResponseHeader("Last-Modified"); 31795 31796 if (modified) { 31797 jQuery.lastModified[cacheURL] = modified; 31798 } 31799 31800 modified = jqXHR.getResponseHeader("etag"); 31801 31802 if (modified) { 31803 jQuery.etag[cacheURL] = modified; 31804 } 31805 } // if no content 31806 31807 31808 if (status === 204 || s.type === "HEAD") { 31809 statusText = "nocontent"; // if not modified 31810 } else if (status === 304) { 31811 statusText = "notmodified"; // If we have data, let's convert it 31812 } else { 31813 statusText = response.state; 31814 success = response.data; 31815 error = response.error; 31816 isSuccess = !error; 31817 } 31818 } else { 31819 // Extract error from statusText and normalize for non-aborts 31820 error = statusText; 31821 31822 if (status || !statusText) { 31823 statusText = "error"; 31824 31825 if (status < 0) { 31826 status = 0; 31827 } 31828 } 31829 } // Set data for the fake xhr object 31830 31831 31832 jqXHR.status = status; 31833 jqXHR.statusText = (nativeStatusText || statusText) + ""; // Success/Error 31834 31835 if (isSuccess) { 31836 deferred.resolveWith(callbackContext, [success, statusText, jqXHR]); 31837 } else { 31838 deferred.rejectWith(callbackContext, [jqXHR, statusText, error]); 31839 } // Status-dependent callbacks 31840 31841 31842 jqXHR.statusCode(_statusCode); 31843 _statusCode = undefined; 31844 31845 if (fireGlobals) { 31846 globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]); 31847 } // Complete 31848 31849 31850 completeDeferred.fireWith(callbackContext, [jqXHR, statusText]); 31851 31852 if (fireGlobals) { 31853 globalEventContext.trigger("ajaxComplete", [jqXHR, s]); // Handle the global AJAX counter 31854 31855 if (! --jQuery.active) { 31856 jQuery.event.trigger("ajaxStop"); 31857 } 31858 } 31859 } 31860 31861 return jqXHR; 31862 }, 31863 getJSON: function getJSON(url, data, callback) { 31864 return jQuery.get(url, data, callback, "json"); 31865 }, 31866 getScript: function getScript(url, callback) { 31867 return jQuery.get(url, undefined, callback, "script"); 31868 } 31869 }); 31870 jQuery.each(["get", "post"], function (i, method) { 31871 jQuery[method] = function (url, data, callback, type) { 31872 // Shift arguments if data argument was omitted 31873 if (isFunction(data)) { 31874 type = type || callback; 31875 callback = data; 31876 data = undefined; 31877 } // The url can be an options object (which then must have .url) 31878 31879 31880 return jQuery.ajax(jQuery.extend({ 31881 url: url, 31882 type: method, 31883 dataType: type, 31884 data: data, 31885 success: callback 31886 }, jQuery.isPlainObject(url) && url)); 31887 }; 31888 }); 31889 31890 jQuery._evalUrl = function (url) { 31891 return jQuery.ajax({ 31892 url: url, 31893 // Make this explicit, since user can override this through ajaxSetup (#11264) 31894 type: "GET", 31895 dataType: "script", 31896 cache: true, 31897 async: false, 31898 global: false, 31899 "throws": true 31900 }); 31901 }; 31902 31903 jQuery.fn.extend({ 31904 wrapAll: function wrapAll(html) { 31905 var wrap; 31906 31907 if (this[0]) { 31908 if (isFunction(html)) { 31909 html = html.call(this[0]); 31910 } // The elements to wrap the target around 31911 31912 31913 wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true); 31914 31915 if (this[0].parentNode) { 31916 wrap.insertBefore(this[0]); 31917 } 31918 31919 wrap.map(function () { 31920 var elem = this; 31921 31922 while (elem.firstElementChild) { 31923 elem = elem.firstElementChild; 31924 } 31925 31926 return elem; 31927 }).append(this); 31928 } 31929 31930 return this; 31931 }, 31932 wrapInner: function wrapInner(html) { 31933 if (isFunction(html)) { 31934 return this.each(function (i) { 31935 jQuery(this).wrapInner(html.call(this, i)); 31936 }); 31937 } 31938 31939 return this.each(function () { 31940 var self = jQuery(this), 31941 contents = self.contents(); 31942 31943 if (contents.length) { 31944 contents.wrapAll(html); 31945 } else { 31946 self.append(html); 31947 } 31948 }); 31949 }, 31950 wrap: function wrap(html) { 31951 var htmlIsFunction = isFunction(html); 31952 return this.each(function (i) { 31953 jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html); 31954 }); 31955 }, 31956 unwrap: function unwrap(selector) { 31957 this.parent(selector).not("body").each(function () { 31958 jQuery(this).replaceWith(this.childNodes); 31959 }); 31960 return this; 31961 } 31962 }); 31963 31964 jQuery.expr.pseudos.hidden = function (elem) { 31965 return !jQuery.expr.pseudos.visible(elem); 31966 }; 31967 31968 jQuery.expr.pseudos.visible = function (elem) { 31969 return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); 31970 }; 31971 31972 jQuery.ajaxSettings.xhr = function () { 31973 try { 31974 return new window.XMLHttpRequest(); 31975 } catch (e) {} 31976 }; 31977 31978 var xhrSuccessStatus = { 31979 // File protocol always yields status code 0, assume 200 31980 0: 200, 31981 // Support: IE <=9 only 31982 // #1450: sometimes IE returns 1223 when it should be 204 31983 1223: 204 31984 }, 31985 xhrSupported = jQuery.ajaxSettings.xhr(); 31986 support.cors = !!xhrSupported && "withCredentials" in xhrSupported; 31987 support.ajax = xhrSupported = !!xhrSupported; 31988 jQuery.ajaxTransport(function (options) { 31989 var _callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest 31990 31991 31992 if (support.cors || xhrSupported && !options.crossDomain) { 31993 return { 31994 send: function send(headers, complete) { 31995 var i, 31996 xhr = options.xhr(); 31997 xhr.open(options.type, options.url, options.async, options.username, options.password); // Apply custom fields if provided 31998 31999 if (options.xhrFields) { 32000 for (i in options.xhrFields) { 32001 xhr[i] = options.xhrFields[i]; 32002 } 32003 } // Override mime type if needed 32004 32005 32006 if (options.mimeType && xhr.overrideMimeType) { 32007 xhr.overrideMimeType(options.mimeType); 32008 } // X-Requested-With header 32009 // For cross-domain requests, seeing as conditions for a preflight are 32010 // akin to a jigsaw puzzle, we simply never set it to be sure. 32011 // (it can always be set on a per-request basis or even using ajaxSetup) 32012 // For same-domain requests, won't change header if already provided. 32013 32014 32015 if (!options.crossDomain && !headers["X-Requested-With"]) { 32016 headers["X-Requested-With"] = "XMLHttpRequest"; 32017 } // Set headers 32018 32019 32020 for (i in headers) { 32021 xhr.setRequestHeader(i, headers[i]); 32022 } // Callback 32023 32024 32025 _callback = function callback(type) { 32026 return function () { 32027 if (_callback) { 32028 _callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; 32029 32030 if (type === "abort") { 32031 xhr.abort(); 32032 } else if (type === "error") { 32033 // Support: IE <=9 only 32034 // On a manual native abort, IE9 throws 32035 // errors on any property access that is not readyState 32036 if (typeof xhr.status !== "number") { 32037 complete(0, "error"); 32038 } else { 32039 complete( // File: protocol always yields status 0; see #8605, #14207 32040 xhr.status, xhr.statusText); 32041 } 32042 } else { 32043 complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText, // Support: IE <=9 only 32044 // IE9 has no XHR2 but throws on binary (trac-11426) 32045 // For XHR2 non-text, let the caller handle it (gh-2498) 32046 (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { 32047 binary: xhr.response 32048 } : { 32049 text: xhr.responseText 32050 }, xhr.getAllResponseHeaders()); 32051 } 32052 } 32053 }; 32054 }; // Listen to events 32055 32056 32057 xhr.onload = _callback(); 32058 errorCallback = xhr.onerror = xhr.ontimeout = _callback("error"); // Support: IE 9 only 32059 // Use onreadystatechange to replace onabort 32060 // to handle uncaught aborts 32061 32062 if (xhr.onabort !== undefined) { 32063 xhr.onabort = errorCallback; 32064 } else { 32065 xhr.onreadystatechange = function () { 32066 // Check readyState before timeout as it changes 32067 if (xhr.readyState === 4) { 32068 // Allow onerror to be called first, 32069 // but that will not handle a native abort 32070 // Also, save errorCallback to a variable 32071 // as xhr.onerror cannot be accessed 32072 window.setTimeout(function () { 32073 if (_callback) { 32074 errorCallback(); 32075 } 32076 }); 32077 } 32078 }; 32079 } // Create the abort callback 32080 32081 32082 _callback = _callback("abort"); 32083 32084 try { 32085 // Do send the request (this may raise an exception) 32086 xhr.send(options.hasContent && options.data || null); 32087 } catch (e) { 32088 // #14683: Only rethrow if this hasn't been notified as an error yet 32089 if (_callback) { 32090 throw e; 32091 } 32092 } 32093 }, 32094 abort: function abort() { 32095 if (_callback) { 32096 _callback(); 32097 } 32098 } 32099 }; 32100 } 32101 }); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 32102 32103 jQuery.ajaxPrefilter(function (s) { 32104 if (s.crossDomain) { 32105 s.contents.script = false; 32106 } 32107 }); // Install script dataType 32108 32109 jQuery.ajaxSetup({ 32110 accepts: { 32111 script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" 32112 }, 32113 contents: { 32114 script: /\b(?:java|ecma)script\b/ 32115 }, 32116 converters: { 32117 "text script": function textScript(text) { 32118 jQuery.globalEval(text); 32119 return text; 32120 } 32121 } 32122 }); // Handle cache's special case and crossDomain 32123 32124 jQuery.ajaxPrefilter("script", function (s) { 32125 if (s.cache === undefined) { 32126 s.cache = false; 32127 } 32128 32129 if (s.crossDomain) { 32130 s.type = "GET"; 32131 } 32132 }); // Bind script tag hack transport 32133 32134 jQuery.ajaxTransport("script", function (s) { 32135 // This transport only deals with cross domain requests 32136 if (s.crossDomain) { 32137 var script, _callback2; 32138 32139 return { 32140 send: function send(_, complete) { 32141 script = jQuery("<script>").prop({ 32142 charset: s.scriptCharset, 32143 src: s.url 32144 }).on("load error", _callback2 = function callback(evt) { 32145 script.remove(); 32146 _callback2 = null; 32147 32148 if (evt) { 32149 complete(evt.type === "error" ? 404 : 200, evt.type); 32150 } 32151 }); // Use native DOM manipulation to avoid our domManip AJAX trickery 32152 32153 document.head.appendChild(script[0]); 32154 }, 32155 abort: function abort() { 32156 if (_callback2) { 32157 _callback2(); 32158 } 32159 } 32160 }; 32161 } 32162 }); 32163 var oldCallbacks = [], 32164 rjsonp = /(=)\?(?=&|$)|\?\?/; // Default jsonp settings 32165 32166 jQuery.ajaxSetup({ 32167 jsonp: "callback", 32168 jsonpCallback: function jsonpCallback() { 32169 var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++; 32170 this[callback] = true; 32171 return callback; 32172 } 32173 }); // Detect, normalize options and install callbacks for jsonp requests 32174 32175 jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) { 32176 var callbackName, 32177 overwritten, 32178 responseContainer, 32179 jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data"); // Handle iff the expected data type is "jsonp" or we have a parameter to set 32180 32181 if (jsonProp || s.dataTypes[0] === "jsonp") { 32182 // Get callback name, remembering preexisting value associated with it 32183 callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback; // Insert callback into url or form data 32184 32185 if (jsonProp) { 32186 s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName); 32187 } else if (s.jsonp !== false) { 32188 s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName; 32189 } // Use data converter to retrieve json after script execution 32190 32191 32192 s.converters["script json"] = function () { 32193 if (!responseContainer) { 32194 jQuery.error(callbackName + " was not called"); 32195 } 32196 32197 return responseContainer[0]; 32198 }; // Force json dataType 32199 32200 32201 s.dataTypes[0] = "json"; // Install callback 32202 32203 overwritten = window[callbackName]; 32204 32205 window[callbackName] = function () { 32206 responseContainer = arguments; 32207 }; // Clean-up function (fires after converters) 32208 32209 32210 jqXHR.always(function () { 32211 // If previous value didn't exist - remove it 32212 if (overwritten === undefined) { 32213 jQuery(window).removeProp(callbackName); // Otherwise restore preexisting value 32214 } else { 32215 window[callbackName] = overwritten; 32216 } // Save back as free 32217 32218 32219 if (s[callbackName]) { 32220 // Make sure that re-using the options doesn't screw things around 32221 s.jsonpCallback = originalSettings.jsonpCallback; // Save the callback name for future use 32222 32223 oldCallbacks.push(callbackName); 32224 } // Call if it was a function and we have a response 32225 32226 32227 if (responseContainer && isFunction(overwritten)) { 32228 overwritten(responseContainer[0]); 32229 } 32230 32231 responseContainer = overwritten = undefined; 32232 }); // Delegate to script 32233 32234 return "script"; 32235 } 32236 }); // Support: Safari 8 only 32237 // In Safari 8 documents created via document.implementation.createHTMLDocument 32238 // collapse sibling forms: the second one becomes a child of the first one. 32239 // Because of that, this security measure has to be disabled in Safari 8. 32240 // https://bugs.webkit.org/show_bug.cgi?id=137337 32241 32242 support.createHTMLDocument = function () { 32243 var body = document.implementation.createHTMLDocument("").body; 32244 body.innerHTML = "<form></form><form></form>"; 32245 return body.childNodes.length === 2; 32246 }(); // Argument "data" should be string of html 32247 // context (optional): If specified, the fragment will be created in this context, 32248 // defaults to document 32249 // keepScripts (optional): If true, will include scripts passed in the html string 32250 32251 32252 jQuery.parseHTML = function (data, context, keepScripts) { 32253 if (typeof data !== "string") { 32254 return []; 32255 } 32256 32257 if (typeof context === "boolean") { 32258 keepScripts = context; 32259 context = false; 32260 } 32261 32262 var base, parsed, scripts; 32263 32264 if (!context) { 32265 // Stop scripts or inline event handlers from being executed immediately 32266 // by using document.implementation 32267 if (support.createHTMLDocument) { 32268 context = document.implementation.createHTMLDocument(""); // Set the base href for the created document 32269 // so any parsed elements with URLs 32270 // are based on the document's URL (gh-2965) 32271 32272 base = context.createElement("base"); 32273 base.href = document.location.href; 32274 context.head.appendChild(base); 32275 } else { 32276 context = document; 32277 } 32278 } 32279 32280 parsed = rsingleTag.exec(data); 32281 scripts = !keepScripts && []; // Single tag 32282 32283 if (parsed) { 32284 return [context.createElement(parsed[1])]; 32285 } 32286 32287 parsed = buildFragment([data], context, scripts); 32288 32289 if (scripts && scripts.length) { 32290 jQuery(scripts).remove(); 32291 } 32292 32293 return jQuery.merge([], parsed.childNodes); 32294 }; 32295 /** 32296 * Load a url into a page 32297 */ 32298 32299 32300 jQuery.fn.load = function (url, params, callback) { 32301 var selector, 32302 type, 32303 response, 32304 self = this, 32305 off = url.indexOf(" "); 32306 32307 if (off > -1) { 32308 selector = stripAndCollapse(url.slice(off)); 32309 url = url.slice(0, off); 32310 } // If it's a function 32311 32312 32313 if (isFunction(params)) { 32314 // We assume that it's the callback 32315 callback = params; 32316 params = undefined; // Otherwise, build a param string 32317 } else if (params && _typeof(params) === "object") { 32318 type = "POST"; 32319 } // If we have elements to modify, make the request 32320 32321 32322 if (self.length > 0) { 32323 jQuery.ajax({ 32324 url: url, 32325 // If "type" variable is undefined, then "GET" method will be used. 32326 // Make value of this field explicit since 32327 // user can override it through ajaxSetup method 32328 type: type || "GET", 32329 dataType: "html", 32330 data: params 32331 }).done(function (responseText) { 32332 // Save response for use in complete callback 32333 response = arguments; 32334 self.html(selector ? // If a selector was specified, locate the right elements in a dummy div 32335 // Exclude scripts to avoid IE 'Permission Denied' errors 32336 jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : // Otherwise use the full result 32337 responseText); // If the request succeeds, this function gets "data", "status", "jqXHR" 32338 // but they are ignored because response was set above. 32339 // If it fails, this function gets "jqXHR", "status", "error" 32340 }).always(callback && function (jqXHR, status) { 32341 self.each(function () { 32342 callback.apply(this, response || [jqXHR.responseText, status, jqXHR]); 32343 }); 32344 }); 32345 } 32346 32347 return this; 32348 }; // Attach a bunch of functions for handling common AJAX events 32349 32350 32351 jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) { 32352 jQuery.fn[type] = function (fn) { 32353 return this.on(type, fn); 32354 }; 32355 }); 32356 32357 jQuery.expr.pseudos.animated = function (elem) { 32358 return jQuery.grep(jQuery.timers, function (fn) { 32359 return elem === fn.elem; 32360 }).length; 32361 }; 32362 32363 jQuery.offset = { 32364 setOffset: function setOffset(elem, options, i) { 32365 var curPosition, 32366 curLeft, 32367 curCSSTop, 32368 curTop, 32369 curOffset, 32370 curCSSLeft, 32371 calculatePosition, 32372 position = jQuery.css(elem, "position"), 32373 curElem = jQuery(elem), 32374 props = {}; // Set position first, in-case top/left are set even on static elem 32375 32376 if (position === "static") { 32377 elem.style.position = "relative"; 32378 } 32379 32380 curOffset = curElem.offset(); 32381 curCSSTop = jQuery.css(elem, "top"); 32382 curCSSLeft = jQuery.css(elem, "left"); 32383 calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1; // Need to be able to calculate position if either 32384 // top or left is auto and position is either absolute or fixed 32385 32386 if (calculatePosition) { 32387 curPosition = curElem.position(); 32388 curTop = curPosition.top; 32389 curLeft = curPosition.left; 32390 } else { 32391 curTop = parseFloat(curCSSTop) || 0; 32392 curLeft = parseFloat(curCSSLeft) || 0; 32393 } 32394 32395 if (isFunction(options)) { 32396 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 32397 options = options.call(elem, i, jQuery.extend({}, curOffset)); 32398 } 32399 32400 if (options.top != null) { 32401 props.top = options.top - curOffset.top + curTop; 32402 } 32403 32404 if (options.left != null) { 32405 props.left = options.left - curOffset.left + curLeft; 32406 } 32407 32408 if ("using" in options) { 32409 options.using.call(elem, props); 32410 } else { 32411 curElem.css(props); 32412 } 32413 } 32414 }; 32415 jQuery.fn.extend({ 32416 // offset() relates an element's border box to the document origin 32417 offset: function offset(options) { 32418 // Preserve chaining for setter 32419 if (arguments.length) { 32420 return options === undefined ? this : this.each(function (i) { 32421 jQuery.offset.setOffset(this, options, i); 32422 }); 32423 } 32424 32425 var rect, 32426 win, 32427 elem = this[0]; 32428 32429 if (!elem) { 32430 return; 32431 } // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 32432 // Support: IE <=11 only 32433 // Running getBoundingClientRect on a 32434 // disconnected node in IE throws an error 32435 32436 32437 if (!elem.getClientRects().length) { 32438 return { 32439 top: 0, 32440 left: 0 32441 }; 32442 } // Get document-relative position by adding viewport scroll to viewport-relative gBCR 32443 32444 32445 rect = elem.getBoundingClientRect(); 32446 win = elem.ownerDocument.defaultView; 32447 return { 32448 top: rect.top + win.pageYOffset, 32449 left: rect.left + win.pageXOffset 32450 }; 32451 }, 32452 // position() relates an element's margin box to its offset parent's padding box 32453 // This corresponds to the behavior of CSS absolute positioning 32454 position: function position() { 32455 if (!this[0]) { 32456 return; 32457 } 32458 32459 var offsetParent, 32460 offset, 32461 doc, 32462 elem = this[0], 32463 parentOffset = { 32464 top: 0, 32465 left: 0 32466 }; // position:fixed elements are offset from the viewport, which itself always has zero offset 32467 32468 if (jQuery.css(elem, "position") === "fixed") { 32469 // Assume position:fixed implies availability of getBoundingClientRect 32470 offset = elem.getBoundingClientRect(); 32471 } else { 32472 offset = this.offset(); // Account for the *real* offset parent, which can be the document or its root element 32473 // when a statically positioned element is identified 32474 32475 doc = elem.ownerDocument; 32476 offsetParent = elem.offsetParent || doc.documentElement; 32477 32478 while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, "position") === "static") { 32479 offsetParent = offsetParent.parentNode; 32480 } 32481 32482 if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) { 32483 // Incorporate borders into its offset, since they are outside its content origin 32484 parentOffset = jQuery(offsetParent).offset(); 32485 parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true); 32486 parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true); 32487 } 32488 } // Subtract parent offsets and element margins 32489 32490 32491 return { 32492 top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true), 32493 left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true) 32494 }; 32495 }, 32496 // This method will return documentElement in the following cases: 32497 // 1) For the element inside the iframe without offsetParent, this method will return 32498 // documentElement of the parent window 32499 // 2) For the hidden or detached element 32500 // 3) For body or html element, i.e. in case of the html node - it will return itself 32501 // 32502 // but those exceptions were never presented as a real life use-cases 32503 // and might be considered as more preferable results. 32504 // 32505 // This logic, however, is not guaranteed and can change at any point in the future 32506 offsetParent: function offsetParent() { 32507 return this.map(function () { 32508 var offsetParent = this.offsetParent; 32509 32510 while (offsetParent && jQuery.css(offsetParent, "position") === "static") { 32511 offsetParent = offsetParent.offsetParent; 32512 } 32513 32514 return offsetParent || documentElement; 32515 }); 32516 } 32517 }); // Create scrollLeft and scrollTop methods 32518 32519 jQuery.each({ 32520 scrollLeft: "pageXOffset", 32521 scrollTop: "pageYOffset" 32522 }, function (method, prop) { 32523 var top = "pageYOffset" === prop; 32524 32525 jQuery.fn[method] = function (val) { 32526 return access(this, function (elem, method, val) { 32527 // Coalesce documents and windows 32528 var win; 32529 32530 if (isWindow(elem)) { 32531 win = elem; 32532 } else if (elem.nodeType === 9) { 32533 win = elem.defaultView; 32534 } 32535 32536 if (val === undefined) { 32537 return win ? win[prop] : elem[method]; 32538 } 32539 32540 if (win) { 32541 win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset); 32542 } else { 32543 elem[method] = val; 32544 } 32545 }, method, val, arguments.length); 32546 }; 32547 }); // Support: Safari <=7 - 9.1, Chrome <=37 - 49 32548 // Add the top/left cssHooks using jQuery.fn.position 32549 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 32550 // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 32551 // getComputedStyle returns percent when specified for top/left/bottom/right; 32552 // rather than make the css module depend on the offset module, just check for it here 32553 32554 jQuery.each(["top", "left"], function (i, prop) { 32555 jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) { 32556 if (computed) { 32557 computed = curCSS(elem, prop); // If curCSS returns percentage, fallback to offset 32558 32559 return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed; 32560 } 32561 }); 32562 }); // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 32563 32564 jQuery.each({ 32565 Height: "height", 32566 Width: "width" 32567 }, function (name, type) { 32568 jQuery.each({ 32569 padding: "inner" + name, 32570 content: type, 32571 "": "outer" + name 32572 }, function (defaultExtra, funcName) { 32573 // Margin is only for outerHeight, outerWidth 32574 jQuery.fn[funcName] = function (margin, value) { 32575 var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"), 32576 extra = defaultExtra || (margin === true || value === true ? "margin" : "border"); 32577 return access(this, function (elem, type, value) { 32578 var doc; 32579 32580 if (isWindow(elem)) { 32581 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 32582 return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name]; 32583 } // Get document width or height 32584 32585 32586 if (elem.nodeType === 9) { 32587 doc = elem.documentElement; // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 32588 // whichever is greatest 32589 32590 return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]); 32591 } 32592 32593 return value === undefined ? // Get width or height on the element, requesting but not forcing parseFloat 32594 jQuery.css(elem, type, extra) : // Set width or height on the element 32595 jQuery.style(elem, type, value, extra); 32596 }, type, chainable ? margin : undefined, chainable); 32597 }; 32598 }); 32599 }); 32600 jQuery.each(("blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu").split(" "), function (i, name) { 32601 // Handle event binding 32602 jQuery.fn[name] = function (data, fn) { 32603 return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name); 32604 }; 32605 }); 32606 jQuery.fn.extend({ 32607 hover: function hover(fnOver, fnOut) { 32608 return this.mouseenter(fnOver).mouseleave(fnOut || fnOver); 32609 } 32610 }); 32611 jQuery.fn.extend({ 32612 bind: function bind(types, data, fn) { 32613 return this.on(types, null, data, fn); 32614 }, 32615 unbind: function unbind(types, fn) { 32616 return this.off(types, null, fn); 32617 }, 32618 delegate: function delegate(selector, types, data, fn) { 32619 return this.on(types, selector, data, fn); 32620 }, 32621 undelegate: function undelegate(selector, types, fn) { 32622 // ( namespace ) or ( selector, types [, fn] ) 32623 return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn); 32624 } 32625 }); // Bind a function to a context, optionally partially applying any 32626 // arguments. 32627 // jQuery.proxy is deprecated to promote standards (specifically Function#bind) 32628 // However, it is not slated for removal any time soon 32629 32630 jQuery.proxy = function (fn, context) { 32631 var tmp, args, proxy; 32632 32633 if (typeof context === "string") { 32634 tmp = fn[context]; 32635 context = fn; 32636 fn = tmp; 32637 } // Quick check to determine if target is callable, in the spec 32638 // this throws a TypeError, but we will just return undefined. 32639 32640 32641 if (!isFunction(fn)) { 32642 return undefined; 32643 } // Simulated bind 32644 32645 32646 args = _slice.call(arguments, 2); 32647 32648 proxy = function proxy() { 32649 return fn.apply(context || this, args.concat(_slice.call(arguments))); 32650 }; // Set the guid of unique handler to the same of original handler, so it can be removed 32651 32652 32653 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 32654 return proxy; 32655 }; 32656 32657 jQuery.holdReady = function (hold) { 32658 if (hold) { 32659 jQuery.readyWait++; 32660 } else { 32661 jQuery.ready(true); 32662 } 32663 }; 32664 32665 jQuery.isArray = Array.isArray; 32666 jQuery.parseJSON = JSON.parse; 32667 jQuery.nodeName = nodeName; 32668 jQuery.isFunction = isFunction; 32669 jQuery.isWindow = isWindow; 32670 jQuery.camelCase = camelCase; 32671 jQuery.type = toType; 32672 jQuery.now = Date.now; 32673 32674 jQuery.isNumeric = function (obj) { 32675 // As of jQuery 3.0, isNumeric is limited to 32676 // strings and numbers (primitives or objects) 32677 // that can be coerced to finite numbers (gh-2662) 32678 var type = jQuery.type(obj); 32679 return (type === "number" || type === "string") && // parseFloat NaNs numeric-cast false positives ("") 32680 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 32681 // subtraction forces infinities to NaN 32682 !isNaN(obj - parseFloat(obj)); 32683 }; // Register as a named AMD module, since jQuery can be concatenated with other 32684 // files that may use define, but not via a proper concatenation script that 32685 // understands anonymous AMD modules. A named AMD is safest and most robust 32686 // way to register. Lowercase jquery is used because AMD module names are 32687 // derived from file names, and jQuery is normally delivered in a lowercase 32688 // file name. Do this after creating the global so that if an AMD module wants 32689 // to call noConflict to hide this version of jQuery, it will work. 32690 // Note that for maximum portability, libraries that are not jQuery should 32691 // declare themselves as anonymous modules, and avoid setting a global if an 32692 // AMD loader is present. jQuery is a special case. For more information, see 32693 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 32694 32695 32696 if (true) { 32697 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { 32698 return jQuery; 32699 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), 32700 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 32701 } 32702 32703 var // Map over jQuery in case of overwrite 32704 _jQuery = window.jQuery, 32705 // Map over the $ in case of overwrite 32706 _$ = window.$; 32707 32708 jQuery.noConflict = function (deep) { 32709 if (window.$ === jQuery) { 32710 window.$ = _$; 32711 } 32712 32713 if (deep && window.jQuery === jQuery) { 32714 window.jQuery = _jQuery; 32715 } 32716 32717 return jQuery; 32718 }; // Expose jQuery and $ identifiers, even in AMD 32719 // (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 32720 // and CommonJS for browser emulators (#13566) 32721 32722 32723 if (!noGlobal) { 32724 window.jQuery = window.$ = jQuery; 32725 } 32726 32727 return jQuery; 32728}); 32729/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ "../node_modules/webpack/buildin/module.js")(module))) 32730 32731/***/ }), 32732
vendor: 6,652 bytes, lines 32733-32967
32733/***/ "../node_modules/path-browserify/index.js": 32734/*!************************************************!*\ 32735 !*** ../node_modules/path-browserify/index.js ***! 32736 \************************************************/ 32737/*! no static exports found */ 32738/***/ (function(module, exports, __webpack_require__) { 32739 32740/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors. 32741// 32742// Permission is hereby granted, free of charge, to any person obtaining a 32743// copy of this software and associated documentation files (the 32744// "Software"), to deal in the Software without restriction, including 32745// without limitation the rights to use, copy, modify, merge, publish, 32746// distribute, sublicense, and/or sell copies of the Software, and to permit 32747// persons to whom the Software is furnished to do so, subject to the 32748// following conditions: 32749// 32750// The above copyright notice and this permission notice shall be included 32751// in all copies or substantial portions of the Software. 32752// 32753// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 32754// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 32755// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 32756// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 32757// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 32758// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 32759// USE OR OTHER DEALINGS IN THE SOFTWARE. 32760// resolves . and .. elements in a path array with directory names there 32761// must be no slashes, empty elements, or device names (c:\) in the array 32762// (so also no leading and trailing slashes - it does not distinguish 32763// relative and absolute paths) 32764function normalizeArray(parts, allowAboveRoot) { 32765 // if the path tries to go above the root, `up` ends up > 0 32766 var up = 0; 32767 32768 for (var i = parts.length - 1; i >= 0; i--) { 32769 var last = parts[i]; 32770 32771 if (last === '.') { 32772 parts.splice(i, 1); 32773 } else if (last === '..') { 32774 parts.splice(i, 1); 32775 up++; 32776 } else if (up) { 32777 parts.splice(i, 1); 32778 up--; 32779 } 32780 } // if the path is allowed to go above the root, restore leading ..s 32781 32782 32783 if (allowAboveRoot) { 32784 for (; up--; up) { 32785 parts.unshift('..'); 32786 } 32787 } 32788 32789 return parts; 32790} // Split a filename into [root, dir, basename, ext], unix version 32791// 'root' is just a slash, or nothing. 32792 32793 32794var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; 32795 32796var splitPath = function splitPath(filename) { 32797 return splitPathRe.exec(filename).slice(1); 32798}; // path.resolve([from ...], to) 32799// posix version 32800 32801 32802exports.resolve = function () { 32803 var resolvedPath = '', 32804 resolvedAbsolute = false; 32805 32806 for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { 32807 var path = i >= 0 ? arguments[i] : process.cwd(); // Skip empty and invalid entries 32808 32809 if (typeof path !== 'string') { 32810 throw new TypeError('Arguments to path.resolve must be strings'); 32811 } else if (!path) { 32812 continue; 32813 } 32814 32815 resolvedPath = path + '/' + resolvedPath; 32816 resolvedAbsolute = path.charAt(0) === '/'; 32817 } // At this point the path should be resolved to a full absolute path, but 32818 // handle relative paths to be safe (might happen when process.cwd() fails) 32819 // Normalize the path 32820 32821 32822 resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) { 32823 return !!p; 32824 }), !resolvedAbsolute).join('/'); 32825 return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'; 32826}; // path.normalize(path) 32827// posix version 32828 32829 32830exports.normalize = function (path) { 32831 var isAbsolute = exports.isAbsolute(path), 32832 trailingSlash = substr(path, -1) === '/'; // Normalize the path 32833 32834 path = normalizeArray(filter(path.split('/'), function (p) { 32835 return !!p; 32836 }), !isAbsolute).join('/'); 32837 32838 if (!path && !isAbsolute) { 32839 path = '.'; 32840 } 32841 32842 if (path && trailingSlash) { 32843 path += '/'; 32844 } 32845 32846 return (isAbsolute ? '/' : '') + path; 32847}; // posix version 32848 32849 32850exports.isAbsolute = function (path) { 32851 return path.charAt(0) === '/'; 32852}; // posix version 32853 32854 32855exports.join = function () { 32856 var paths = Array.prototype.slice.call(arguments, 0); 32857 return exports.normalize(filter(paths, function (p, index) { 32858 if (typeof p !== 'string') { 32859 throw new TypeError('Arguments to path.join must be strings'); 32860 } 32861 32862 return p; 32863 }).join('/')); 32864}; // path.relative(from, to) 32865// posix version 32866 32867 32868exports.relative = function (from, to) { 32869 from = exports.resolve(from).substr(1); 32870 to = exports.resolve(to).substr(1); 32871 32872 function trim(arr) { 32873 var start = 0; 32874 32875 for (; start < arr.length; start++) { 32876 if (arr[start] !== '') break; 32877 } 32878 32879 var end = arr.length - 1; 32880 32881 for (; end >= 0; end--) { 32882 if (arr[end] !== '') break; 32883 } 32884 32885 if (start > end) return []; 32886 return arr.slice(start, end - start + 1); 32887 } 32888 32889 var fromParts = trim(from.split('/')); 32890 var toParts = trim(to.split('/')); 32891 var length = Math.min(fromParts.length, toParts.length); 32892 var samePartsLength = length; 32893 32894 for (var i = 0; i < length; i++) { 32895 if (fromParts[i] !== toParts[i]) { 32896 samePartsLength = i; 32897 break; 32898 } 32899 } 32900 32901 var outputParts = []; 32902 32903 for (var i = samePartsLength; i < fromParts.length; i++) { 32904 outputParts.push('..'); 32905 } 32906 32907 outputParts = outputParts.concat(toParts.slice(samePartsLength)); 32908 return outputParts.join('/'); 32909}; 32910 32911exports.sep = '/'; 32912exports.delimiter = ':'; 32913 32914exports.dirname = function (path) { 32915 var result = splitPath(path), 32916 root = result[0], 32917 dir = result[1]; 32918 32919 if (!root && !dir) { 32920 // No dirname whatsoever 32921 return '.'; 32922 } 32923 32924 if (dir) { 32925 // It has a dirname, strip trailing slash 32926 dir = dir.substr(0, dir.length - 1); 32927 } 32928 32929 return root + dir; 32930}; 32931 32932exports.basename = function (path, ext) { 32933 var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? 32934 32935 if (ext && f.substr(-1 * ext.length) === ext) { 32936 f = f.substr(0, f.length - ext.length); 32937 } 32938 32939 return f; 32940}; 32941 32942exports.extname = function (path) { 32943 return splitPath(path)[3]; 32944}; 32945 32946function filter(xs, f) { 32947 if (xs.filter) return xs.filter(f); 32948 var res = []; 32949 32950 for (var i = 0; i < xs.length; i++) { 32951 if (f(xs[i], i, xs)) res.push(xs[i]); 32952 } 32953 32954 return res; 32955} // String.prototype.substr - negative index don't work in IE8 32956 32957 32958var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { 32959 return str.substr(start, len); 32960} : function (str, start, len) { 32961 if (start < 0) start = str.length + start; 32962 return str.substr(start, len); 32963}; 32964/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ "../node_modules/process/browser.js"))) 32965 32966/***/ }), 32967
vendor: 5,348 bytes, lines 32968-33185
32968/***/ "../node_modules/process/browser.js": 32969/*!******************************************!*\ 32970 !*** ../node_modules/process/browser.js ***! 32971 \******************************************/ 32972/*! no static exports found */ 32973/***/ (function(module, exports) { 32974 32975// shim for using process in browser 32976var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it 32977// don't break things. But we need to wrap it in a try catch in case it is 32978// wrapped in strict mode code which doesn't define any globals. It's inside a 32979// function because try/catches deoptimize in certain engines. 32980 32981var cachedSetTimeout; 32982var cachedClearTimeout; 32983 32984function defaultSetTimout() { 32985 throw new Error('setTimeout has not been defined'); 32986} 32987 32988function defaultClearTimeout() { 32989 throw new Error('clearTimeout has not been defined'); 32990} 32991 32992(function () { 32993 try { 32994 if (typeof setTimeout === 'function') { 32995 cachedSetTimeout = setTimeout; 32996 } else { 32997 cachedSetTimeout = defaultSetTimout; 32998 } 32999 } catch (e) { 33000 cachedSetTimeout = defaultSetTimout; 33001 } 33002 33003 try { 33004 if (typeof clearTimeout === 'function') { 33005 cachedClearTimeout = clearTimeout; 33006 } else { 33007 cachedClearTimeout = defaultClearTimeout; 33008 } 33009 } catch (e) { 33010 cachedClearTimeout = defaultClearTimeout; 33011 } 33012})(); 33013 33014function runTimeout(fun) { 33015 if (cachedSetTimeout === setTimeout) { 33016 //normal enviroments in sane situations 33017 return setTimeout(fun, 0); 33018 } // if setTimeout wasn't available but was latter defined 33019 33020 33021 if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { 33022 cachedSetTimeout = setTimeout; 33023 return setTimeout(fun, 0); 33024 } 33025 33026 try { 33027 // when when somebody has screwed with setTimeout but no I.E. maddness 33028 return cachedSetTimeout(fun, 0); 33029 } catch (e) { 33030 try { 33031 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 33032 return cachedSetTimeout.call(null, fun, 0); 33033 } catch (e) { 33034 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error 33035 return cachedSetTimeout.call(this, fun, 0); 33036 } 33037 } 33038} 33039 33040function runClearTimeout(marker) { 33041 if (cachedClearTimeout === clearTimeout) { 33042 //normal enviroments in sane situations 33043 return clearTimeout(marker); 33044 } // if clearTimeout wasn't available but was latter defined 33045 33046 33047 if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { 33048 cachedClearTimeout = clearTimeout; 33049 return clearTimeout(marker); 33050 } 33051 33052 try { 33053 // when when somebody has screwed with setTimeout but no I.E. maddness 33054 return cachedClearTimeout(marker); 33055 } catch (e) { 33056 try { 33057 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 33058 return cachedClearTimeout.call(null, marker); 33059 } catch (e) { 33060 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. 33061 // Some versions of I.E. have different rules for clearTimeout vs setTimeout 33062 return cachedClearTimeout.call(this, marker); 33063 } 33064 } 33065} 33066 33067var queue = []; 33068var draining = false; 33069var currentQueue; 33070var queueIndex = -1; 33071 33072function cleanUpNextTick() { 33073 if (!draining || !currentQueue) { 33074 return; 33075 } 33076 33077 draining = false; 33078 33079 if (currentQueue.length) { 33080 queue = currentQueue.concat(queue); 33081 } else { 33082 queueIndex = -1; 33083 } 33084 33085 if (queue.length) { 33086 drainQueue(); 33087 } 33088} 33089 33090function drainQueue() { 33091 if (draining) { 33092 return; 33093 } 33094 33095 var timeout = runTimeout(cleanUpNextTick); 33096 draining = true; 33097 var len = queue.length; 33098 33099 while (len) { 33100 currentQueue = queue; 33101 queue = []; 33102 33103 while (++queueIndex < len) { 33104 if (currentQueue) { 33105 currentQueue[queueIndex].run(); 33106 } 33107 } 33108 33109 queueIndex = -1; 33110 len = queue.length; 33111 } 33112 33113 currentQueue = null; 33114 draining = false; 33115 runClearTimeout(timeout); 33116} 33117 33118process.nextTick = function (fun) { 33119 var args = new Array(arguments.length - 1); 33120 33121 if (arguments.length > 1) { 33122 for (var i = 1; i < arguments.length; i++) { 33123 args[i - 1] = arguments[i]; 33124 } 33125 } 33126 33127 queue.push(new Item(fun, args)); 33128 33129 if (queue.length === 1 && !draining) { 33130 runTimeout(drainQueue); 33131 } 33132}; // v8 likes predictible objects 33133 33134 33135function Item(fun, array) { 33136 this.fun = fun; 33137 this.array = array; 33138} 33139 33140Item.prototype.run = function () { 33141 this.fun.apply(null, this.array); 33142}; 33143 33144process.title = 'browser'; 33145process.browser = true; 33146process.env = {}; 33147process.argv = []; 33148process.version = ''; // empty string to avoid regexp issues 33149 33150process.versions = {}; 33151 33152function noop() {} 33153 33154process.on = noop; 33155process.addListener = noop; 33156process.once = noop; 33157process.off = noop; 33158process.removeListener = noop; 33159process.removeAllListeners = noop; 33160process.emit = noop; 33161process.prependListener = noop; 33162process.prependOnceListener = noop; 33163 33164process.listeners = function (name) { 33165 return []; 33166}; 33167 33168process.binding = function (name) { 33169 throw new Error('process.binding is not supported'); 33170}; 33171 33172process.cwd = function () { 33173 return '/'; 33174}; 33175 33176process.chdir = function (dir) { 33177 throw new Error('process.chdir is not supported'); 33178}; 33179 33180process.umask = function () { 33181 return 0; 33182}; 33183 33184/***/ }), 33185
vendor: 25,406 bytes, lines 33186-33914
33186/***/ "../node_modules/regenerator-runtime/runtime.js": 33187/*!******************************************************!*\ 33188 !*** ../node_modules/regenerator-runtime/runtime.js ***! 33189 \******************************************************/ 33190/*! no static exports found */ 33191/***/ (function(module, exports, __webpack_require__) { 33192 33193/* WEBPACK VAR INJECTION */(function(global, module) {function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 33194 33195/** 33196 * Copyright (c) 2014, Facebook, Inc. 33197 * All rights reserved. 33198 * 33199 * This source code is licensed under the BSD-style license found in the 33200 * https://raw.github.com/facebook/regenerator/master/LICENSE file. An 33201 * additional grant of patent rights can be found in the PATENTS file in 33202 * the same directory. 33203 */ 33204!function (global) { 33205 "use strict"; 33206 33207 var Op = Object.prototype; 33208 var hasOwn = Op.hasOwnProperty; 33209 var undefined; // More compressible than void 0. 33210 33211 var $Symbol = typeof Symbol === "function" ? Symbol : {}; 33212 var iteratorSymbol = $Symbol.iterator || "@@iterator"; 33213 var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; 33214 var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; 33215 var inModule = ( false ? undefined : _typeof(module)) === "object"; 33216 var runtime = global.regeneratorRuntime; 33217 33218 if (runtime) { 33219 if (inModule) { 33220 // If regeneratorRuntime is defined globally and we're in a module, 33221 // make the exports object identical to regeneratorRuntime. 33222 module.exports = runtime; 33223 } // Don't bother evaluating the rest of this file if the runtime was 33224 // already defined globally. 33225 33226 33227 return; 33228 } // Define the runtime globally (as expected by generated code) as either 33229 // module.exports (if we're in a module) or a new, empty object. 33230 33231 33232 runtime = global.regeneratorRuntime = inModule ? module.exports : {}; 33233 33234 function wrap(innerFn, outerFn, self, tryLocsList) { 33235 // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. 33236 var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; 33237 var generator = Object.create(protoGenerator.prototype); 33238 var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, 33239 // .throw, and .return methods. 33240 33241 generator._invoke = makeInvokeMethod(innerFn, self, context); 33242 return generator; 33243 } 33244 33245 runtime.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion 33246 // record like context.tryEntries[i].completion. This interface could 33247 // have been (and was previously) designed to take a closure to be 33248 // invoked without arguments, but in all the cases we care about we 33249 // already have an existing method we want to call, so there's no need 33250 // to create a new function object. We can even get away with assuming 33251 // the method takes exactly one argument, since that happens to be true 33252 // in every case, so we don't have to touch the arguments object. The 33253 // only additional allocation required is the completion record, which 33254 // has a stable shape and so hopefully should be cheap to allocate. 33255 33256 function tryCatch(fn, obj, arg) { 33257 try { 33258 return { 33259 type: "normal", 33260 arg: fn.call(obj, arg) 33261 }; 33262 } catch (err) { 33263 return { 33264 type: "throw", 33265 arg: err 33266 }; 33267 } 33268 } 33269 33270 var GenStateSuspendedStart = "suspendedStart"; 33271 var GenStateSuspendedYield = "suspendedYield"; 33272 var GenStateExecuting = "executing"; 33273 var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as 33274 // breaking out of the dispatch switch statement. 33275 33276 var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and 33277 // .constructor.prototype properties for functions that return Generator 33278 // objects. For full spec compliance, you may wish to configure your 33279 // minifier not to mangle the names of these two functions. 33280 33281 function Generator() {} 33282 33283 function GeneratorFunction() {} 33284 33285 function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that 33286 // don't natively support it. 33287 33288 33289 var IteratorPrototype = {}; 33290 33291 IteratorPrototype[iteratorSymbol] = function () { 33292 return this; 33293 }; 33294 33295 var getProto = Object.getPrototypeOf; 33296 var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); 33297 33298 if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { 33299 // This environment has a native %IteratorPrototype%; use it instead 33300 // of the polyfill. 33301 IteratorPrototype = NativeIteratorPrototype; 33302 } 33303 33304 var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); 33305 GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; 33306 GeneratorFunctionPrototype.constructor = GeneratorFunction; 33307 GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the 33308 // Iterator interface in terms of a single ._invoke method. 33309 33310 function defineIteratorMethods(prototype) { 33311 ["next", "throw", "return"].forEach(function (method) { 33312 prototype[method] = function (arg) { 33313 return this._invoke(method, arg); 33314 }; 33315 }); 33316 } 33317 33318 runtime.isGeneratorFunction = function (genFun) { 33319 var ctor = typeof genFun === "function" && genFun.constructor; 33320 return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can 33321 // do is to check its .name property. 33322 (ctor.displayName || ctor.name) === "GeneratorFunction" : false; 33323 }; 33324 33325 runtime.mark = function (genFun) { 33326 if (Object.setPrototypeOf) { 33327 Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); 33328 } else { 33329 genFun.__proto__ = GeneratorFunctionPrototype; 33330 33331 if (!(toStringTagSymbol in genFun)) { 33332 genFun[toStringTagSymbol] = "GeneratorFunction"; 33333 } 33334 } 33335 33336 genFun.prototype = Object.create(Gp); 33337 return genFun; 33338 }; // Within the body of any async function, `await x` is transformed to 33339 // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test 33340 // `hasOwn.call(value, "__await")` to determine if the yielded value is 33341 // meant to be awaited. 33342 33343 33344 runtime.awrap = function (arg) { 33345 return { 33346 __await: arg 33347 }; 33348 }; 33349 33350 function AsyncIterator(generator) { 33351 function invoke(method, arg, resolve, reject) { 33352 var record = tryCatch(generator[method], generator, arg); 33353 33354 if (record.type === "throw") { 33355 reject(record.arg); 33356 } else { 33357 var result = record.arg; 33358 var value = result.value; 33359 33360 if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) { 33361 return Promise.resolve(value.__await).then(function (value) { 33362 invoke("next", value, resolve, reject); 33363 }, function (err) { 33364 invoke("throw", err, resolve, reject); 33365 }); 33366 } 33367 33368 return Promise.resolve(value).then(function (unwrapped) { 33369 // When a yielded Promise is resolved, its final value becomes 33370 // the .value of the Promise<{value,done}> result for the 33371 // current iteration. If the Promise is rejected, however, the 33372 // result for this iteration will be rejected with the same 33373 // reason. Note that rejections of yielded Promises are not 33374 // thrown back into the generator function, as is the case 33375 // when an awaited Promise is rejected. This difference in 33376 // behavior between yield and await is important, because it 33377 // allows the consumer to decide what to do with the yielded 33378 // rejection (swallow it and continue, manually .throw it back 33379 // into the generator, abandon iteration, whatever). With 33380 // await, by contrast, there is no opportunity to examine the 33381 // rejection reason outside the generator function, so the 33382 // only option is to throw it from the await expression, and 33383 // let the generator function handle the exception. 33384 result.value = unwrapped; 33385 resolve(result); 33386 }, reject); 33387 } 33388 } 33389 33390 if (_typeof(global.process) === "object" && global.process.domain) { 33391 invoke = global.process.domain.bind(invoke); 33392 } 33393 33394 var previousPromise; 33395 33396 function enqueue(method, arg) { 33397 function callInvokeWithMethodAndArg() { 33398 return new Promise(function (resolve, reject) { 33399 invoke(method, arg, resolve, reject); 33400 }); 33401 } 33402 33403 return previousPromise = // If enqueue has been called before, then we want to wait until 33404 // all previous Promises have been resolved before calling invoke, 33405 // so that results are always delivered in the correct order. If 33406 // enqueue has not been called before, then it is important to 33407 // call invoke immediately, without waiting on a callback to fire, 33408 // so that the async generator function has the opportunity to do 33409 // any necessary setup in a predictable way. This predictability 33410 // is why the Promise constructor synchronously invokes its 33411 // executor callback, and why async functions synchronously 33412 // execute code before the first await. Since we implement simple 33413 // async functions in terms of async generators, it is especially 33414 // important to get this right, even though it requires care. 33415 previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later 33416 // invocations of the iterator. 33417 callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); 33418 } // Define the unified helper method that is used to implement .next, 33419 // .throw, and .return (see defineIteratorMethods). 33420 33421 33422 this._invoke = enqueue; 33423 } 33424 33425 defineIteratorMethods(AsyncIterator.prototype); 33426 33427 AsyncIterator.prototype[asyncIteratorSymbol] = function () { 33428 return this; 33429 }; 33430 33431 runtime.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of 33432 // AsyncIterator objects; they just return a Promise for the value of 33433 // the final result produced by the iterator. 33434 33435 runtime.async = function (innerFn, outerFn, self, tryLocsList) { 33436 var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList)); 33437 return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. 33438 : iter.next().then(function (result) { 33439 return result.done ? result.value : iter.next(); 33440 }); 33441 }; 33442 33443 function makeInvokeMethod(innerFn, self, context) { 33444 var state = GenStateSuspendedStart; 33445 return function invoke(method, arg) { 33446 if (state === GenStateExecuting) { 33447 throw new Error("Generator is already running"); 33448 } 33449 33450 if (state === GenStateCompleted) { 33451 if (method === "throw") { 33452 throw arg; 33453 } // Be forgiving, per 25.3.3.3.3 of the spec: 33454 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume 33455 33456 33457 return doneResult(); 33458 } 33459 33460 context.method = method; 33461 context.arg = arg; 33462 33463 while (true) { 33464 var delegate = context.delegate; 33465 33466 if (delegate) { 33467 var delegateResult = maybeInvokeDelegate(delegate, context); 33468 33469 if (delegateResult) { 33470 if (delegateResult === ContinueSentinel) continue; 33471 return delegateResult; 33472 } 33473 } 33474 33475 if (context.method === "next") { 33476 // Setting context._sent for legacy support of Babel's 33477 // function.sent implementation. 33478 context.sent = context._sent = context.arg; 33479 } else if (context.method === "throw") { 33480 if (state === GenStateSuspendedStart) { 33481 state = GenStateCompleted; 33482 throw context.arg; 33483 } 33484 33485 context.dispatchException(context.arg); 33486 } else if (context.method === "return") { 33487 context.abrupt("return", context.arg); 33488 } 33489 33490 state = GenStateExecuting; 33491 var record = tryCatch(innerFn, self, context); 33492 33493 if (record.type === "normal") { 33494 // If an exception is thrown from innerFn, we leave state === 33495 // GenStateExecuting and loop back for another invocation. 33496 state = context.done ? GenStateCompleted : GenStateSuspendedYield; 33497 33498 if (record.arg === ContinueSentinel) { 33499 continue; 33500 } 33501 33502 return { 33503 value: record.arg, 33504 done: context.done 33505 }; 33506 } else if (record.type === "throw") { 33507 state = GenStateCompleted; // Dispatch the exception by looping back around to the 33508 // context.dispatchException(context.arg) call above. 33509 33510 context.method = "throw"; 33511 context.arg = record.arg; 33512 } 33513 } 33514 }; 33515 } // Call delegate.iterator[context.method](context.arg) and handle the 33516 // result, either by returning a { value, done } result from the 33517 // delegate iterator, or by modifying context.method and context.arg, 33518 // setting context.delegate to null, and returning the ContinueSentinel. 33519 33520 33521 function maybeInvokeDelegate(delegate, context) { 33522 var method = delegate.iterator[context.method]; 33523 33524 if (method === undefined) { 33525 // A .throw or .return when the delegate iterator has no .throw 33526 // method always terminates the yield* loop. 33527 context.delegate = null; 33528 33529 if (context.method === "throw") { 33530 if (delegate.iterator.return) { 33531 // If the delegate iterator has a return method, give it a 33532 // chance to clean up. 33533 context.method = "return"; 33534 context.arg = undefined; 33535 maybeInvokeDelegate(delegate, context); 33536 33537 if (context.method === "throw") { 33538 // If maybeInvokeDelegate(context) changed context.method from 33539 // "return" to "throw", let that override the TypeError below. 33540 return ContinueSentinel; 33541 } 33542 } 33543 33544 context.method = "throw"; 33545 context.arg = new TypeError("The iterator does not provide a 'throw' method"); 33546 } 33547 33548 return ContinueSentinel; 33549 } 33550 33551 var record = tryCatch(method, delegate.iterator, context.arg); 33552 33553 if (record.type === "throw") { 33554 context.method = "throw"; 33555 context.arg = record.arg; 33556 context.delegate = null; 33557 return ContinueSentinel; 33558 } 33559 33560 var info = record.arg; 33561 33562 if (!info) { 33563 context.method = "throw"; 33564 context.arg = new TypeError("iterator result is not an object"); 33565 context.delegate = null; 33566 return ContinueSentinel; 33567 } 33568 33569 if (info.done) { 33570 // Assign the result of the finished delegate to the temporary 33571 // variable specified by delegate.resultName (see delegateYield). 33572 context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). 33573 33574 context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the 33575 // exception, let the outer generator proceed normally. If 33576 // context.method was "next", forget context.arg since it has been 33577 // "consumed" by the delegate iterator. If context.method was 33578 // "return", allow the original .return call to continue in the 33579 // outer generator. 33580 33581 if (context.method !== "return") { 33582 context.method = "next"; 33583 context.arg = undefined; 33584 } 33585 } else { 33586 // Re-yield the result returned by the delegate method. 33587 return info; 33588 } // The delegate iterator is finished, so forget it and continue with 33589 // the outer generator. 33590 33591 33592 context.delegate = null; 33593 return ContinueSentinel; 33594 } // Define Generator.prototype.{next,throw,return} in terms of the 33595 // unified ._invoke helper method. 33596 33597 33598 defineIteratorMethods(Gp); 33599 Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the 33600 // @@iterator function is called on it. Some browsers' implementations of the 33601 // iterator prototype chain incorrectly implement this, causing the Generator 33602 // object to not be returned from this call. This ensures that doesn't happen. 33603 // See https://github.com/facebook/regenerator/issues/274 for more details. 33604 33605 Gp[iteratorSymbol] = function () { 33606 return this; 33607 }; 33608 33609 Gp.toString = function () { 33610 return "[object Generator]"; 33611 }; 33612 33613 function pushTryEntry(locs) { 33614 var entry = { 33615 tryLoc: locs[0] 33616 }; 33617 33618 if (1 in locs) { 33619 entry.catchLoc = locs[1]; 33620 } 33621 33622 if (2 in locs) { 33623 entry.finallyLoc = locs[2]; 33624 entry.afterLoc = locs[3]; 33625 } 33626 33627 this.tryEntries.push(entry); 33628 } 33629 33630 function resetTryEntry(entry) { 33631 var record = entry.completion || {}; 33632 record.type = "normal"; 33633 delete record.arg; 33634 entry.completion = record; 33635 } 33636 33637 function Context(tryLocsList) { 33638 // The root entry object (effectively a try statement without a catch 33639 // or a finally block) gives us a place to store values thrown from 33640 // locations where there is no enclosing try statement. 33641 this.tryEntries = [{ 33642 tryLoc: "root" 33643 }]; 33644 tryLocsList.forEach(pushTryEntry, this); 33645 this.reset(true); 33646 } 33647 33648 runtime.keys = function (object) { 33649 var keys = []; 33650 33651 for (var key in object) { 33652 keys.push(key); 33653 } 33654 33655 keys.reverse(); // Rather than returning an object with a next method, we keep 33656 // things simple and return the next function itself. 33657 33658 return function next() { 33659 while (keys.length) { 33660 var key = keys.pop(); 33661 33662 if (key in object) { 33663 next.value = key; 33664 next.done = false; 33665 return next; 33666 } 33667 } // To avoid creating an additional object, we just hang the .value 33668 // and .done properties off the next function object itself. This 33669 // also ensures that the minifier will not anonymize the function. 33670 33671 33672 next.done = true; 33673 return next; 33674 }; 33675 }; 33676 33677 function values(iterable) { 33678 if (iterable) { 33679 var iteratorMethod = iterable[iteratorSymbol]; 33680 33681 if (iteratorMethod) { 33682 return iteratorMethod.call(iterable); 33683 } 33684 33685 if (typeof iterable.next === "function") { 33686 return iterable; 33687 } 33688 33689 if (!isNaN(iterable.length)) { 33690 var i = -1, 33691 next = function next() { 33692 while (++i < iterable.length) { 33693 if (hasOwn.call(iterable, i)) { 33694 next.value = iterable[i]; 33695 next.done = false; 33696 return next; 33697 } 33698 } 33699 33700 next.value = undefined; 33701 next.done = true; 33702 return next; 33703 }; 33704 33705 return next.next = next; 33706 } 33707 } // Return an iterator with no values. 33708 33709 33710 return { 33711 next: doneResult 33712 }; 33713 } 33714 33715 runtime.values = values; 33716 33717 function doneResult() { 33718 return { 33719 value: undefined, 33720 done: true 33721 }; 33722 } 33723 33724 Context.prototype = { 33725 constructor: Context, 33726 reset: function reset(skipTempReset) { 33727 this.prev = 0; 33728 this.next = 0; // Resetting context._sent for legacy support of Babel's 33729 // function.sent implementation. 33730 33731 this.sent = this._sent = undefined; 33732 this.done = false; 33733 this.delegate = null; 33734 this.method = "next"; 33735 this.arg = undefined; 33736 this.tryEntries.forEach(resetTryEntry); 33737 33738 if (!skipTempReset) { 33739 for (var name in this) { 33740 // Not sure about the optimal order of these conditions: 33741 if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { 33742 this[name] = undefined; 33743 } 33744 } 33745 } 33746 }, 33747 stop: function stop() { 33748 this.done = true; 33749 var rootEntry = this.tryEntries[0]; 33750 var rootRecord = rootEntry.completion; 33751 33752 if (rootRecord.type === "throw") { 33753 throw rootRecord.arg; 33754 } 33755 33756 return this.rval; 33757 }, 33758 dispatchException: function dispatchException(exception) { 33759 if (this.done) { 33760 throw exception; 33761 } 33762 33763 var context = this; 33764 33765 function handle(loc, caught) { 33766 record.type = "throw"; 33767 record.arg = exception; 33768 context.next = loc; 33769 33770 if (caught) { 33771 // If the dispatched exception was caught by a catch block, 33772 // then let that catch block handle the exception normally. 33773 context.method = "next"; 33774 context.arg = undefined; 33775 } 33776 33777 return !!caught; 33778 } 33779 33780 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 33781 var entry = this.tryEntries[i]; 33782 var record = entry.completion; 33783 33784 if (entry.tryLoc === "root") { 33785 // Exception thrown outside of any try block that could handle 33786 // it, so set the completion value of the entire function to 33787 // throw the exception. 33788 return handle("end"); 33789 } 33790 33791 if (entry.tryLoc <= this.prev) { 33792 var hasCatch = hasOwn.call(entry, "catchLoc"); 33793 var hasFinally = hasOwn.call(entry, "finallyLoc"); 33794 33795 if (hasCatch && hasFinally) { 33796 if (this.prev < entry.catchLoc) { 33797 return handle(entry.catchLoc, true); 33798 } else if (this.prev < entry.finallyLoc) { 33799 return handle(entry.finallyLoc); 33800 } 33801 } else if (hasCatch) { 33802 if (this.prev < entry.catchLoc) { 33803 return handle(entry.catchLoc, true); 33804 } 33805 } else if (hasFinally) { 33806 if (this.prev < entry.finallyLoc) { 33807 return handle(entry.finallyLoc); 33808 } 33809 } else { 33810 throw new Error("try statement without catch or finally"); 33811 } 33812 } 33813 } 33814 }, 33815 abrupt: function abrupt(type, arg) { 33816 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 33817 var entry = this.tryEntries[i]; 33818 33819 if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { 33820 var finallyEntry = entry; 33821 break; 33822 } 33823 } 33824 33825 if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { 33826 // Ignore the finally entry if control is not jumping to a 33827 // location outside the try/catch block. 33828 finallyEntry = null; 33829 } 33830 33831 var record = finallyEntry ? finallyEntry.completion : {}; 33832 record.type = type; 33833 record.arg = arg; 33834 33835 if (finallyEntry) { 33836 this.method = "next"; 33837 this.next = finallyEntry.finallyLoc; 33838 return ContinueSentinel; 33839 } 33840 33841 return this.complete(record); 33842 }, 33843 complete: function complete(record, afterLoc) { 33844 if (record.type === "throw") { 33845 throw record.arg; 33846 } 33847 33848 if (record.type === "break" || record.type === "continue") { 33849 this.next = record.arg; 33850 } else if (record.type === "return") { 33851 this.rval = this.arg = record.arg; 33852 this.method = "return"; 33853 this.next = "end"; 33854 } else if (record.type === "normal" && afterLoc) { 33855 this.next = afterLoc; 33856 } 33857 33858 return ContinueSentinel; 33859 }, 33860 finish: function finish(finallyLoc) { 33861 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 33862 var entry = this.tryEntries[i]; 33863 33864 if (entry.finallyLoc === finallyLoc) { 33865 this.complete(entry.completion, entry.afterLoc); 33866 resetTryEntry(entry); 33867 return ContinueSentinel; 33868 } 33869 } 33870 }, 33871 "catch": function _catch(tryLoc) { 33872 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 33873 var entry = this.tryEntries[i]; 33874 33875 if (entry.tryLoc === tryLoc) { 33876 var record = entry.completion; 33877 33878 if (record.type === "throw") { 33879 var thrown = record.arg; 33880 resetTryEntry(entry); 33881 } 33882 33883 return thrown; 33884 } 33885 } // The context.catch method must only be called with a location 33886 // argument that corresponds to a known catch block. 33887 33888 33889 throw new Error("illegal catch attempt"); 33890 }, 33891 delegateYield: function delegateYield(iterable, resultName, nextLoc) { 33892 this.delegate = { 33893 iterator: values(iterable), 33894 resultName: resultName, 33895 nextLoc: nextLoc 33896 }; 33897 33898 if (this.method === "next") { 33899 // Deliberately forget the last sent value so that we don't 33900 // accidentally pass it on to the delegate. 33901 this.arg = undefined; 33902 } 33903 33904 return ContinueSentinel; 33905 } 33906 }; 33907}( // Among the various tricks for obtaining a reference to the global 33908// object, this seems to be the most reliable technique that does not 33909// use indirect eval (which violates Content Security Policy). 33910(typeof global === "undefined" ? "undefined" : _typeof(global)) === "object" ? global : (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object" ? window : (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" ? self : this); 33911/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "../node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../webpack/buildin/module.js */ "../node_modules/webpack/buildin/module.js")(module))) 33912 33913/***/ }), 33914
vendor: 261,030 bytes, lines 33915-41448
33915/***/ "../node_modules/twig/twig.js": 33916/*!************************************!*\ 33917 !*** ../node_modules/twig/twig.js ***! 33918 \************************************/ 33919/*! no static exports found */ 33920/***/ (function(module, exports, __webpack_require__) { 33921 33922/* WEBPACK VAR INJECTION */(function(__dirname, module) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } 33923 33924(function webpackUniversalModuleDefinition(root, factory) { 33925 if (( false ? undefined : _typeof2(exports)) === 'object' && ( false ? undefined : _typeof2(module)) === 'object') module.exports = factory(function webpackLoadOptionalExternalModule() { 33926 try { 33927 return __webpack_require__(/*! fs */ 2); 33928 } catch (e) {} 33929 }(), __webpack_require__(/*! path */ "../node_modules/path-browserify/index.js"));else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! fs */ 2), __webpack_require__(/*! path */ "../node_modules/path-browserify/index.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 33930 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 33931 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 33932 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {} 33933})(this, function (__WEBPACK_EXTERNAL_MODULE_19__, __WEBPACK_EXTERNAL_MODULE_20__) { 33934 return ( 33935 /******/ 33936 function (modules) { 33937 // webpackBootstrap 33938 33939 /******/ 33940 // The module cache 33941 33942 /******/ 33943 var installedModules = {}; 33944 /******/ 33945 // The require function 33946 33947 /******/ 33948 33949 function __webpack_require__(moduleId) { 33950 /******/ 33951 // Check if module is in cache 33952 33953 /******/ 33954 if (installedModules[moduleId]) 33955 /******/ 33956 return installedModules[moduleId].exports; 33957 /******/ 33958 // Create a new module (and put it into the cache) 33959 33960 /******/ 33961 33962 var module = installedModules[moduleId] = { 33963 /******/ 33964 exports: {}, 33965 33966 /******/ 33967 id: moduleId, 33968 33969 /******/ 33970 loaded: false 33971 /******/ 33972 33973 }; 33974 /******/ 33975 // Execute the module function 33976 33977 /******/ 33978 33979 modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 33980 /******/ 33981 // Flag the module as loaded 33982 33983 /******/ 33984 33985 module.loaded = true; 33986 /******/ 33987 // Return the exports of the module 33988 33989 /******/ 33990 33991 return module.exports; 33992 /******/ 33993 } 33994 /******/ 33995 // expose the modules object (__webpack_modules__) 33996 33997 /******/ 33998 33999 34000 __webpack_require__.m = modules; 34001 /******/ 34002 // expose the module cache 34003 34004 /******/ 34005 34006 __webpack_require__.c = installedModules; 34007 /******/ 34008 // __webpack_public_path__ 34009 34010 /******/ 34011 34012 __webpack_require__.p = ""; 34013 /******/ 34014 // Load entry module and return exports 34015 34016 /******/ 34017 34018 return __webpack_require__(0); 34019 /******/ 34020 }( 34021 /************************************************************************/ 34022 34023 /******/ 34024 [ 34025 /* 0 */ 34026 34027 /***/ 34028 function (module, exports, __webpack_require__) { 34029 /** 34030 * Twig.js 34031 * 34032 * @copyright 2011-2016 John Roepke and the Twig.js Contributors 34033 * @license Available under the BSD 2-Clause License 34034 * @link https://github.com/twigjs/twig.js 34035 */ 34036 var Twig = { 34037 VERSION: '0.10.2' 34038 }; 34039 34040 __webpack_require__(1)(Twig); 34041 34042 __webpack_require__(2)(Twig); 34043 34044 __webpack_require__(3)(Twig); 34045 34046 __webpack_require__(5)(Twig); 34047 34048 __webpack_require__(6)(Twig); 34049 34050 __webpack_require__(7)(Twig); 34051 34052 __webpack_require__(17)(Twig); 34053 34054 __webpack_require__(18)(Twig); 34055 34056 __webpack_require__(21)(Twig); 34057 34058 __webpack_require__(22)(Twig); 34059 34060 __webpack_require__(23)(Twig); 34061 34062 __webpack_require__(24)(Twig); 34063 34064 __webpack_require__(25)(Twig); 34065 34066 __webpack_require__(26)(Twig); 34067 34068 __webpack_require__(27)(Twig); 34069 34070 module.exports = Twig.exports; 34071 /***/ 34072 }, 34073 /* 1 */ 34074 34075 /***/ 34076 function (module, exports) { 34077 // ## twig.core.js 34078 // 34079 // This file handles template level tokenizing, compiling and parsing. 34080 module.exports = function (Twig) { 34081 "use strict"; 34082 34083 Twig.trace = false; 34084 Twig.debug = false; // Default caching to true for the improved performance it offers 34085 34086 Twig.cache = true; 34087 34088 Twig.noop = function () {}; 34089 34090 Twig.placeholders = { 34091 parent: "{{|PARENT|}}" 34092 }; 34093 /** 34094 * Fallback for Array.indexOf for IE8 et al 34095 */ 34096 34097 Twig.indexOf = function (arr, searchElement 34098 /*, fromIndex */ 34099 ) { 34100 if (Array.prototype.hasOwnProperty("indexOf")) { 34101 return arr.indexOf(searchElement); 34102 } 34103 34104 if (arr === void 0 || arr === null) { 34105 throw new TypeError(); 34106 } 34107 34108 var t = Object(arr); 34109 var len = t.length >>> 0; 34110 34111 if (len === 0) { 34112 return -1; 34113 } 34114 34115 var n = 0; 34116 34117 if (arguments.length > 0) { 34118 n = Number(arguments[1]); 34119 34120 if (n !== n) { 34121 // shortcut for verifying if it's NaN 34122 n = 0; 34123 } else if (n !== 0 && n !== Infinity && n !== -Infinity) { 34124 n = (n > 0 || -1) * Math.floor(Math.abs(n)); 34125 } 34126 } 34127 34128 if (n >= len) { 34129 // console.log("indexOf not found1 ", JSON.stringify(searchElement), JSON.stringify(arr)); 34130 return -1; 34131 } 34132 34133 var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 34134 34135 for (; k < len; k++) { 34136 if (k in t && t[k] === searchElement) { 34137 return k; 34138 } 34139 } 34140 34141 if (arr == searchElement) { 34142 return 0; 34143 } // console.log("indexOf not found2 ", JSON.stringify(searchElement), JSON.stringify(arr)); 34144 34145 34146 return -1; 34147 }; 34148 34149 Twig.forEach = function (arr, callback, thisArg) { 34150 if (Array.prototype.forEach) { 34151 return arr.forEach(callback, thisArg); 34152 } 34153 34154 var T, k; 34155 34156 if (arr == null) { 34157 throw new TypeError(" this is null or not defined"); 34158 } // 1. Let O be the result of calling ToObject passing the |this| value as the argument. 34159 34160 34161 var O = Object(arr); // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". 34162 // 3. Let len be ToUint32(lenValue). 34163 34164 var len = O.length >>> 0; // Hack to convert O.length to a UInt32 34165 // 4. If IsCallable(callback) is false, throw a TypeError exception. 34166 // See: http://es5.github.com/#x9.11 34167 34168 if ({}.toString.call(callback) != "[object Function]") { 34169 throw new TypeError(callback + " is not a function"); 34170 } // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. 34171 34172 34173 if (thisArg) { 34174 T = thisArg; 34175 } // 6. Let k be 0 34176 34177 34178 k = 0; // 7. Repeat, while k < len 34179 34180 while (k < len) { 34181 var kValue; // a. Let Pk be ToString(k). 34182 // This is implicit for LHS operands of the in operator 34183 // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. 34184 // This step can be combined with c 34185 // c. If kPresent is true, then 34186 34187 if (k in O) { 34188 // i. Let kValue be the result of calling the Get internal method of O with argument Pk. 34189 kValue = O[k]; // ii. Call the Call internal method of callback with T as the this value and 34190 // argument list containing kValue, k, and O. 34191 34192 callback.call(T, kValue, k, O); 34193 } // d. Increase k by 1. 34194 34195 34196 k++; 34197 } // 8. return undefined 34198 34199 }; 34200 34201 Twig.merge = function (target, source, onlyChanged) { 34202 Twig.forEach(Object.keys(source), function (key) { 34203 if (onlyChanged && !(key in target)) { 34204 return; 34205 } 34206 34207 target[key] = source[key]; 34208 }); 34209 return target; 34210 }; 34211 /** 34212 * Exception thrown by twig.js. 34213 */ 34214 34215 34216 Twig.Error = function (message, file) { 34217 this.message = message; 34218 this.name = "TwigException"; 34219 this.type = "TwigException"; 34220 this.file = file; 34221 }; 34222 /** 34223 * Get the string representation of a Twig error. 34224 */ 34225 34226 34227 Twig.Error.prototype.toString = function () { 34228 var output = this.name + ": " + this.message; 34229 return output; 34230 }; 34231 /** 34232 * Wrapper for logging to the console. 34233 */ 34234 34235 34236 Twig.log = { 34237 trace: function trace() { 34238 if (Twig.trace && console) { 34239 console.log(Array.prototype.slice.call(arguments)); 34240 } 34241 }, 34242 debug: function debug() { 34243 if (Twig.debug && console) { 34244 console.log(Array.prototype.slice.call(arguments)); 34245 } 34246 } 34247 }; 34248 34249 if (typeof console !== "undefined") { 34250 if (typeof console.error !== "undefined") { 34251 Twig.log.error = function () { 34252 console.error.apply(console, arguments); 34253 }; 34254 } else if (typeof console.log !== "undefined") { 34255 Twig.log.error = function () { 34256 console.log.apply(console, arguments); 34257 }; 34258 } 34259 } else { 34260 Twig.log.error = function () {}; 34261 } 34262 /** 34263 * Wrapper for child context objects in Twig. 34264 * 34265 * @param {Object} context Values to initialize the context with. 34266 */ 34267 34268 34269 Twig.ChildContext = function (context) { 34270 var ChildContext = function ChildContext() {}; 34271 34272 ChildContext.prototype = context; 34273 return new ChildContext(); 34274 }; 34275 /** 34276 * Container for methods related to handling high level template tokens 34277 * (for example: {{ expression }}, {% logic %}, {# comment #}, raw data) 34278 */ 34279 34280 34281 Twig.token = {}; 34282 /** 34283 * Token types. 34284 */ 34285 34286 Twig.token.type = { 34287 output: 'output', 34288 logic: 'logic', 34289 comment: 'comment', 34290 raw: 'raw', 34291 output_whitespace_pre: 'output_whitespace_pre', 34292 output_whitespace_post: 'output_whitespace_post', 34293 output_whitespace_both: 'output_whitespace_both', 34294 logic_whitespace_pre: 'logic_whitespace_pre', 34295 logic_whitespace_post: 'logic_whitespace_post', 34296 logic_whitespace_both: 'logic_whitespace_both' 34297 }; 34298 /** 34299 * Token syntax definitions. 34300 */ 34301 34302 Twig.token.definitions = [{ 34303 type: Twig.token.type.raw, 34304 open: '{% raw %}', 34305 close: '{% endraw %}' 34306 }, { 34307 type: Twig.token.type.raw, 34308 open: '{% verbatim %}', 34309 close: '{% endverbatim %}' 34310 }, // *Whitespace type tokens* 34311 // 34312 // These typically take the form `{{- expression -}}` or `{{- expression }}` or `{{ expression -}}`. 34313 { 34314 type: Twig.token.type.output_whitespace_pre, 34315 open: '{{-', 34316 close: '}}' 34317 }, { 34318 type: Twig.token.type.output_whitespace_post, 34319 open: '{{', 34320 close: '-}}' 34321 }, { 34322 type: Twig.token.type.output_whitespace_both, 34323 open: '{{-', 34324 close: '-}}' 34325 }, { 34326 type: Twig.token.type.logic_whitespace_pre, 34327 open: '{%-', 34328 close: '%}' 34329 }, { 34330 type: Twig.token.type.logic_whitespace_post, 34331 open: '{%', 34332 close: '-%}' 34333 }, { 34334 type: Twig.token.type.logic_whitespace_both, 34335 open: '{%-', 34336 close: '-%}' 34337 }, // *Output type tokens* 34338 // 34339 // These typically take the form `{{ expression }}`. 34340 { 34341 type: Twig.token.type.output, 34342 open: '{{', 34343 close: '}}' 34344 }, // *Logic type tokens* 34345 // 34346 // These typically take a form like `{% if expression %}` or `{% endif %}` 34347 { 34348 type: Twig.token.type.logic, 34349 open: '{%', 34350 close: '%}' 34351 }, // *Comment type tokens* 34352 // 34353 // These take the form `{# anything #}` 34354 { 34355 type: Twig.token.type.comment, 34356 open: '{#', 34357 close: '#}' 34358 }]; 34359 /** 34360 * What characters start "strings" in token definitions. We need this to ignore token close 34361 * strings inside an expression. 34362 */ 34363 34364 Twig.token.strings = ['"', "'"]; 34365 34366 Twig.token.findStart = function (template) { 34367 var output = { 34368 position: null, 34369 close_position: null, 34370 def: null 34371 }, 34372 i, 34373 token_template, 34374 first_key_position, 34375 close_key_position; 34376 34377 for (i = 0; i < Twig.token.definitions.length; i++) { 34378 token_template = Twig.token.definitions[i]; 34379 first_key_position = template.indexOf(token_template.open); 34380 close_key_position = template.indexOf(token_template.close); 34381 Twig.log.trace("Twig.token.findStart: ", "Searching for ", token_template.open, " found at ", first_key_position); //Special handling for mismatched tokens 34382 34383 if (first_key_position >= 0) { 34384 //This token matches the template 34385 if (token_template.open.length !== token_template.close.length) { 34386 //This token has mismatched closing and opening tags 34387 if (close_key_position < 0) { 34388 //This token's closing tag does not match the template 34389 continue; 34390 } 34391 } 34392 } // Does this token occur before any other types? 34393 34394 34395 if (first_key_position >= 0 && (output.position === null || first_key_position < output.position)) { 34396 output.position = first_key_position; 34397 output.def = token_template; 34398 output.close_position = close_key_position; 34399 } else if (first_key_position >= 0 && output.position !== null && first_key_position === output.position) { 34400 /*This token exactly matches another token, 34401 greedily match to check if this token has a greater specificity*/ 34402 if (token_template.open.length > output.def.open.length) { 34403 //This token's opening tag is more specific than the previous match 34404 output.position = first_key_position; 34405 output.def = token_template; 34406 output.close_position = close_key_position; 34407 } else if (token_template.open.length === output.def.open.length) { 34408 if (token_template.close.length > output.def.close.length) { 34409 //This token's opening tag is as specific as the previous match, 34410 //but the closing tag has greater specificity 34411 if (close_key_position >= 0 && close_key_position < output.close_position) { 34412 //This token's closing tag exists in the template, 34413 //and it occurs sooner than the previous match 34414 output.position = first_key_position; 34415 output.def = token_template; 34416 output.close_position = close_key_position; 34417 } 34418 } else if (close_key_position >= 0 && close_key_position < output.close_position) { 34419 //This token's closing tag is not more specific than the previous match, 34420 //but it occurs sooner than the previous match 34421 output.position = first_key_position; 34422 output.def = token_template; 34423 output.close_position = close_key_position; 34424 } 34425 } 34426 } 34427 } 34428 34429 delete output['close_position']; 34430 return output; 34431 }; 34432 34433 Twig.token.findEnd = function (template, token_def, start) { 34434 var end = null, 34435 found = false, 34436 offset = 0, 34437 // String position variables 34438 str_pos = null, 34439 str_found = null, 34440 pos = null, 34441 end_offset = null, 34442 this_str_pos = null, 34443 end_str_pos = null, 34444 // For loop variables 34445 i, 34446 l; 34447 34448 while (!found) { 34449 str_pos = null; 34450 str_found = null; 34451 pos = template.indexOf(token_def.close, offset); 34452 34453 if (pos >= 0) { 34454 end = pos; 34455 found = true; 34456 } else { 34457 // throw an exception 34458 throw new Twig.Error("Unable to find closing bracket '" + token_def.close + "'" + " opened near template position " + start); 34459 } // Ignore quotes within comments; just look for the next comment close sequence, 34460 // regardless of what comes before it. https://github.com/justjohn/twig.js/issues/95 34461 34462 34463 if (token_def.type === Twig.token.type.comment) { 34464 break; 34465 } // Ignore quotes within raw tag 34466 // Fixes #283 34467 34468 34469 if (token_def.type === Twig.token.type.raw) { 34470 break; 34471 } 34472 34473 l = Twig.token.strings.length; 34474 34475 for (i = 0; i < l; i += 1) { 34476 this_str_pos = template.indexOf(Twig.token.strings[i], offset); 34477 34478 if (this_str_pos > 0 && this_str_pos < pos && (str_pos === null || this_str_pos < str_pos)) { 34479 str_pos = this_str_pos; 34480 str_found = Twig.token.strings[i]; 34481 } 34482 } // We found a string before the end of the token, now find the string's end and set the search offset to it 34483 34484 34485 if (str_pos !== null) { 34486 end_offset = str_pos + 1; 34487 end = null; 34488 found = false; 34489 34490 while (true) { 34491 end_str_pos = template.indexOf(str_found, end_offset); 34492 34493 if (end_str_pos < 0) { 34494 throw "Unclosed string in template"; 34495 } // Ignore escaped quotes 34496 34497 34498 if (template.substr(end_str_pos - 1, 1) !== "\\") { 34499 offset = end_str_pos + 1; 34500 break; 34501 } else { 34502 end_offset = end_str_pos + 1; 34503 } 34504 } 34505 } 34506 } 34507 34508 return end; 34509 }; 34510 /** 34511 * Convert a template into high-level tokens. 34512 */ 34513 34514 34515 Twig.tokenize = function (template) { 34516 var tokens = [], 34517 // An offset for reporting errors locations in the template. 34518 error_offset = 0, 34519 // The start and type of the first token found in the template. 34520 found_token = null, 34521 // The end position of the matched token. 34522 end = null; 34523 34524 while (template.length > 0) { 34525 // Find the first occurance of any token type in the template 34526 found_token = Twig.token.findStart(template); 34527 Twig.log.trace("Twig.tokenize: ", "Found token: ", found_token); 34528 34529 if (found_token.position !== null) { 34530 // Add a raw type token for anything before the start of the token 34531 if (found_token.position > 0) { 34532 tokens.push({ 34533 type: Twig.token.type.raw, 34534 value: template.substring(0, found_token.position) 34535 }); 34536 } 34537 34538 template = template.substr(found_token.position + found_token.def.open.length); 34539 error_offset += found_token.position + found_token.def.open.length; // Find the end of the token 34540 34541 end = Twig.token.findEnd(template, found_token.def, error_offset); 34542 Twig.log.trace("Twig.tokenize: ", "Token ends at ", end); 34543 tokens.push({ 34544 type: found_token.def.type, 34545 value: template.substring(0, end).trim() 34546 }); 34547 34548 if (template.substr(end + found_token.def.close.length, 1) === "\n") { 34549 switch (found_token.def.type) { 34550 case "logic_whitespace_pre": 34551 case "logic_whitespace_post": 34552 case "logic_whitespace_both": 34553 case "logic": 34554 // Newlines directly after logic tokens are ignored 34555 end += 1; 34556 break; 34557 } 34558 } 34559 34560 template = template.substr(end + found_token.def.close.length); // Increment the position in the template 34561 34562 error_offset += end + found_token.def.close.length; 34563 } else { 34564 // No more tokens -> add the rest of the template as a raw-type token 34565 tokens.push({ 34566 type: Twig.token.type.raw, 34567 value: template 34568 }); 34569 template = ''; 34570 } 34571 } 34572 34573 return tokens; 34574 }; 34575 34576 Twig.compile = function (tokens) { 34577 try { 34578 // Output and intermediate stacks 34579 var output = [], 34580 stack = [], 34581 // The tokens between open and close tags 34582 intermediate_output = [], 34583 token = null, 34584 logic_token = null, 34585 unclosed_token = null, 34586 // Temporary previous token. 34587 prev_token = null, 34588 // Temporary previous output. 34589 prev_output = null, 34590 // Temporary previous intermediate output. 34591 prev_intermediate_output = null, 34592 // The previous token's template 34593 prev_template = null, 34594 // Token lookahead 34595 next_token = null, 34596 // The output token 34597 tok_output = null, 34598 // Logic Token values 34599 type = null, 34600 open = null, 34601 next = null; 34602 34603 var compile_output = function compile_output(token) { 34604 Twig.expression.compile.apply(this, [token]); 34605 34606 if (stack.length > 0) { 34607 intermediate_output.push(token); 34608 } else { 34609 output.push(token); 34610 } 34611 }; 34612 34613 var compile_logic = function compile_logic(token) { 34614 // Compile the logic token 34615 logic_token = Twig.logic.compile.apply(this, [token]); 34616 type = logic_token.type; 34617 open = Twig.logic.handler[type].open; 34618 next = Twig.logic.handler[type].next; 34619 Twig.log.trace("Twig.compile: ", "Compiled logic token to ", logic_token, " next is: ", next, " open is : ", open); // Not a standalone token, check logic stack to see if this is expected 34620 34621 if (open !== undefined && !open) { 34622 prev_token = stack.pop(); 34623 prev_template = Twig.logic.handler[prev_token.type]; 34624 34625 if (Twig.indexOf(prev_template.next, type) < 0) { 34626 throw new Error(type + " not expected after a " + prev_token.type); 34627 } 34628 34629 prev_token.output = prev_token.output || []; 34630 prev_token.output = prev_token.output.concat(intermediate_output); 34631 intermediate_output = []; 34632 tok_output = { 34633 type: Twig.token.type.logic, 34634 token: prev_token 34635 }; 34636 34637 if (stack.length > 0) { 34638 intermediate_output.push(tok_output); 34639 } else { 34640 output.push(tok_output); 34641 } 34642 } // This token requires additional tokens to complete the logic structure. 34643 34644 34645 if (next !== undefined && next.length > 0) { 34646 Twig.log.trace("Twig.compile: ", "Pushing ", logic_token, " to logic stack."); 34647 34648 if (stack.length > 0) { 34649 // Put any currently held output into the output list of the logic operator 34650 // currently at the head of the stack before we push a new one on. 34651 prev_token = stack.pop(); 34652 prev_token.output = prev_token.output || []; 34653 prev_token.output = prev_token.output.concat(intermediate_output); 34654 stack.push(prev_token); 34655 intermediate_output = []; 34656 } // Push the new logic token onto the logic stack 34657 34658 34659 stack.push(logic_token); 34660 } else if (open !== undefined && open) { 34661 tok_output = { 34662 type: Twig.token.type.logic, 34663 token: logic_token 34664 }; // Standalone token (like {% set ... %} 34665 34666 if (stack.length > 0) { 34667 intermediate_output.push(tok_output); 34668 } else { 34669 output.push(tok_output); 34670 } 34671 } 34672 }; 34673 34674 while (tokens.length > 0) { 34675 token = tokens.shift(); 34676 prev_output = output[output.length - 1]; 34677 prev_intermediate_output = intermediate_output[intermediate_output.length - 1]; 34678 next_token = tokens[0]; 34679 Twig.log.trace("Compiling token ", token); 34680 34681 switch (token.type) { 34682 case Twig.token.type.raw: 34683 if (stack.length > 0) { 34684 intermediate_output.push(token); 34685 } else { 34686 output.push(token); 34687 } 34688 34689 break; 34690 34691 case Twig.token.type.logic: 34692 compile_logic.call(this, token); 34693 break; 34694 // Do nothing, comments should be ignored 34695 34696 case Twig.token.type.comment: 34697 break; 34698 34699 case Twig.token.type.output: 34700 compile_output.call(this, token); 34701 break; 34702 //Kill whitespace ahead and behind this token 34703 34704 case Twig.token.type.logic_whitespace_pre: 34705 case Twig.token.type.logic_whitespace_post: 34706 case Twig.token.type.logic_whitespace_both: 34707 case Twig.token.type.output_whitespace_pre: 34708 case Twig.token.type.output_whitespace_post: 34709 case Twig.token.type.output_whitespace_both: 34710 if (token.type !== Twig.token.type.output_whitespace_post && token.type !== Twig.token.type.logic_whitespace_post) { 34711 if (prev_output) { 34712 //If the previous output is raw, pop it off 34713 if (prev_output.type === Twig.token.type.raw) { 34714 output.pop(); //If the previous output is not just whitespace, trim it 34715 34716 if (prev_output.value.match(/^\s*$/) === null) { 34717 prev_output.value = prev_output.value.trim(); //Repush the previous output 34718 34719 output.push(prev_output); 34720 } 34721 } 34722 } 34723 34724 if (prev_intermediate_output) { 34725 //If the previous intermediate output is raw, pop it off 34726 if (prev_intermediate_output.type === Twig.token.type.raw) { 34727 intermediate_output.pop(); //If the previous output is not just whitespace, trim it 34728 34729 if (prev_intermediate_output.value.match(/^\s*$/) === null) { 34730 prev_intermediate_output.value = prev_intermediate_output.value.trim(); //Repush the previous intermediate output 34731 34732 intermediate_output.push(prev_intermediate_output); 34733 } 34734 } 34735 } 34736 } //Compile this token 34737 34738 34739 switch (token.type) { 34740 case Twig.token.type.output_whitespace_pre: 34741 case Twig.token.type.output_whitespace_post: 34742 case Twig.token.type.output_whitespace_both: 34743 compile_output.call(this, token); 34744 break; 34745 34746 case Twig.token.type.logic_whitespace_pre: 34747 case Twig.token.type.logic_whitespace_post: 34748 case Twig.token.type.logic_whitespace_both: 34749 compile_logic.call(this, token); 34750 break; 34751 } 34752 34753 if (token.type !== Twig.token.type.output_whitespace_pre && token.type !== Twig.token.type.logic_whitespace_pre) { 34754 if (next_token) { 34755 //If the next token is raw, shift it out 34756 if (next_token.type === Twig.token.type.raw) { 34757 tokens.shift(); //If the next token is not just whitespace, trim it 34758 34759 if (next_token.value.match(/^\s*$/) === null) { 34760 next_token.value = next_token.value.trim(); //Unshift the next token 34761 34762 tokens.unshift(next_token); 34763 } 34764 } 34765 } 34766 } 34767 34768 break; 34769 } 34770 34771 Twig.log.trace("Twig.compile: ", " Output: ", output, " Logic Stack: ", stack, " Pending Output: ", intermediate_output); 34772 } // Verify that there are no logic tokens left in the stack. 34773 34774 34775 if (stack.length > 0) { 34776 unclosed_token = stack.pop(); 34777 throw new Error("Unable to find an end tag for " + unclosed_token.type + ", expecting one of " + unclosed_token.next); 34778 } 34779 34780 return output; 34781 } catch (ex) { 34782 if (this.options.rethrow) { 34783 if (ex.type == 'TwigException' && !ex.file) { 34784 ex.file = this.id; 34785 } 34786 34787 throw ex; 34788 } else { 34789 Twig.log.error("Error compiling twig template " + this.id + ": "); 34790 34791 if (ex.stack) { 34792 Twig.log.error(ex.stack); 34793 } else { 34794 Twig.log.error(ex.toString()); 34795 } 34796 } 34797 } 34798 }; 34799 /** 34800 * Parse a compiled template. 34801 * 34802 * @param {Array} tokens The compiled tokens. 34803 * @param {Object} context The render context. 34804 * 34805 * @return {string} The parsed template. 34806 */ 34807 34808 34809 Twig.parse = function (tokens, context, allow_async) { 34810 var that = this, 34811 output = [], 34812 // Store any error that might be thrown by the promise chain. 34813 err = null, 34814 // This will be set to is_async if template renders synchronously 34815 is_async = true, 34816 promise = null, 34817 // Track logic chains 34818 chain = true; 34819 34820 function handleException(ex) { 34821 if (that.options.rethrow) { 34822 if (typeof ex === 'string') { 34823 ex = new Twig.Error(ex); 34824 } 34825 34826 if (ex.type == 'TwigException' && !ex.file) { 34827 ex.file = that.id; 34828 } 34829 34830 throw ex; 34831 } else { 34832 Twig.log.error("Error parsing twig template " + that.id + ": "); 34833 34834 if (ex.stack) { 34835 Twig.log.error(ex.stack); 34836 } else { 34837 Twig.log.error(ex.toString()); 34838 } 34839 34840 if (Twig.debug) { 34841 return ex.toString(); 34842 } 34843 } 34844 } 34845 34846 promise = Twig.async.forEach(tokens, function parseToken(token) { 34847 Twig.log.debug("Twig.parse: ", "Parsing token: ", token); 34848 34849 switch (token.type) { 34850 case Twig.token.type.raw: 34851 output.push(Twig.filters.raw(token.value)); 34852 break; 34853 34854 case Twig.token.type.logic: 34855 var logic_token = token.token; 34856 return Twig.logic.parseAsync.apply(that, [logic_token, context, chain]).then(function (logic) { 34857 if (logic.chain !== undefined) { 34858 chain = logic.chain; 34859 } 34860 34861 if (logic.context !== undefined) { 34862 context = logic.context; 34863 } 34864 34865 if (logic.output !== undefined) { 34866 output.push(logic.output); 34867 } 34868 }); 34869 break; 34870 34871 case Twig.token.type.comment: 34872 // Do nothing, comments should be ignored 34873 break; 34874 //Fall through whitespace to output 34875 34876 case Twig.token.type.output_whitespace_pre: 34877 case Twig.token.type.output_whitespace_post: 34878 case Twig.token.type.output_whitespace_both: 34879 case Twig.token.type.output: 34880 Twig.log.debug("Twig.parse: ", "Output token: ", token.stack); // Parse the given expression in the given context 34881 34882 return Twig.expression.parseAsync.apply(that, [token.stack, context]).then(function (o) { 34883 output.push(o); 34884 }); 34885 } 34886 }).then(function () { 34887 output = Twig.output.apply(that, [output]); 34888 is_async = false; 34889 return output; 34890 }).catch(function (e) { 34891 if (allow_async) handleException(e); 34892 err = e; 34893 }); // If `allow_async` we will always return a promise since we do not 34894 // know in advance if we are going to run asynchronously or not. 34895 34896 if (allow_async) return promise; // Handle errors here if we fail synchronously. 34897 34898 if (err !== null) return handleException(err); // If `allow_async` is not true we should not allow the user 34899 // to use asynchronous functions or filters. 34900 34901 if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.'); 34902 return output; 34903 }; 34904 /** 34905 * Tokenize and compile a string template. 34906 * 34907 * @param {string} data The template. 34908 * 34909 * @return {Array} The compiled tokens. 34910 */ 34911 34912 34913 Twig.prepare = function (data) { 34914 var tokens, raw_tokens; // Tokenize 34915 34916 Twig.log.debug("Twig.prepare: ", "Tokenizing ", data); 34917 raw_tokens = Twig.tokenize.apply(this, [data]); // Compile 34918 34919 Twig.log.debug("Twig.prepare: ", "Compiling ", raw_tokens); 34920 tokens = Twig.compile.apply(this, [raw_tokens]); 34921 Twig.log.debug("Twig.prepare: ", "Compiled ", tokens); 34922 return tokens; 34923 }; 34924 /** 34925 * Join the output token's stack and escape it if needed 34926 * 34927 * @param {Array} Output token's stack 34928 * 34929 * @return {string|String} Autoescaped output 34930 */ 34931 34932 34933 Twig.output = function (output) { 34934 if (!this.options.autoescape) { 34935 return output.join(""); 34936 } 34937 34938 var strategy = 'html'; 34939 if (typeof this.options.autoescape == 'string') strategy = this.options.autoescape; // [].map would be better but it's not supported by IE8- 34940 34941 var escaped_output = []; 34942 Twig.forEach(output, function (str) { 34943 if (str && str.twig_markup !== true && str.twig_markup != strategy) { 34944 str = Twig.filters.escape(str, [strategy]); 34945 } 34946 34947 escaped_output.push(str); 34948 }); 34949 return Twig.Markup(escaped_output.join("")); 34950 }; // Namespace for template storage and retrieval 34951 34952 34953 Twig.Templates = { 34954 /** 34955 * Registered template loaders - use Twig.Templates.registerLoader to add supported loaders 34956 * @type {Object} 34957 */ 34958 loaders: {}, 34959 34960 /** 34961 * Registered template parsers - use Twig.Templates.registerParser to add supported parsers 34962 * @type {Object} 34963 */ 34964 parsers: {}, 34965 34966 /** 34967 * Cached / loaded templates 34968 * @type {Object} 34969 */ 34970 registry: {} 34971 }; 34972 /** 34973 * Is this id valid for a twig template? 34974 * 34975 * @param {string} id The ID to check. 34976 * 34977 * @throws {Twig.Error} If the ID is invalid or used. 34978 * @return {boolean} True if the ID is valid. 34979 */ 34980 34981 Twig.validateId = function (id) { 34982 if (id === "prototype") { 34983 throw new Twig.Error(id + " is not a valid twig identifier"); 34984 } else if (Twig.cache && Twig.Templates.registry.hasOwnProperty(id)) { 34985 throw new Twig.Error("There is already a template with the ID " + id); 34986 } 34987 34988 return true; 34989 }; 34990 /** 34991 * Register a template loader 34992 * 34993 * @example 34994 * Twig.extend(function(Twig) { 34995 * Twig.Templates.registerLoader('custom_loader', function(location, params, callback, error_callback) { 34996 * // ... load the template ... 34997 * params.data = loadedTemplateData; 34998 * // create and return the template 34999 * var template = new Twig.Template(params); 35000 * if (typeof callback === 'function') { 35001 * callback(template); 35002 * } 35003 * return template; 35004 * }); 35005 * }); 35006 * 35007 * @param {String} method_name The method this loader is intended for (ajax, fs) 35008 * @param {Function} func The function to execute when loading the template 35009 * @param {Object|undefined} scope Optional scope parameter to bind func to 35010 * 35011 * @throws Twig.Error 35012 * 35013 * @return {void} 35014 */ 35015 35016 35017 Twig.Templates.registerLoader = function (method_name, func, scope) { 35018 if (typeof func !== 'function') { 35019 throw new Twig.Error('Unable to add loader for ' + method_name + ': Invalid function reference given.'); 35020 } 35021 35022 if (scope) { 35023 func = func.bind(scope); 35024 } 35025 35026 this.loaders[method_name] = func; 35027 }; 35028 /** 35029 * Remove a registered loader 35030 * 35031 * @param {String} method_name The method name for the loader you wish to remove 35032 * 35033 * @return {void} 35034 */ 35035 35036 35037 Twig.Templates.unRegisterLoader = function (method_name) { 35038 if (this.isRegisteredLoader(method_name)) { 35039 delete this.loaders[method_name]; 35040 } 35041 }; 35042 /** 35043 * See if a loader is registered by its method name 35044 * 35045 * @param {String} method_name The name of the loader you are looking for 35046 * 35047 * @return {boolean} 35048 */ 35049 35050 35051 Twig.Templates.isRegisteredLoader = function (method_name) { 35052 return this.loaders.hasOwnProperty(method_name); 35053 }; 35054 /** 35055 * Register a template parser 35056 * 35057 * @example 35058 * Twig.extend(function(Twig) { 35059 * Twig.Templates.registerParser('custom_parser', function(params) { 35060 * // this template source can be accessed in params.data 35061 * var template = params.data 35062 * 35063 * // ... custom process that modifies the template 35064 * 35065 * // return the parsed template 35066 * return template; 35067 * }); 35068 * }); 35069 * 35070 * @param {String} method_name The method this parser is intended for (twig, source) 35071 * @param {Function} func The function to execute when parsing the template 35072 * @param {Object|undefined} scope Optional scope parameter to bind func to 35073 * 35074 * @throws Twig.Error 35075 * 35076 * @return {void} 35077 */ 35078 35079 35080 Twig.Templates.registerParser = function (method_name, func, scope) { 35081 if (typeof func !== 'function') { 35082 throw new Twig.Error('Unable to add parser for ' + method_name + ': Invalid function regerence given.'); 35083 } 35084 35085 if (scope) { 35086 func = func.bind(scope); 35087 } 35088 35089 this.parsers[method_name] = func; 35090 }; 35091 /** 35092 * Remove a registered parser 35093 * 35094 * @param {String} method_name The method name for the parser you wish to remove 35095 * 35096 * @return {void} 35097 */ 35098 35099 35100 Twig.Templates.unRegisterParser = function (method_name) { 35101 if (this.isRegisteredParser(method_name)) { 35102 delete this.parsers[method_name]; 35103 } 35104 }; 35105 /** 35106 * See if a parser is registered by its method name 35107 * 35108 * @param {String} method_name The name of the parser you are looking for 35109 * 35110 * @return {boolean} 35111 */ 35112 35113 35114 Twig.Templates.isRegisteredParser = function (method_name) { 35115 return this.parsers.hasOwnProperty(method_name); 35116 }; 35117 /** 35118 * Save a template object to the store. 35119 * 35120 * @param {Twig.Template} template The twig.js template to store. 35121 */ 35122 35123 35124 Twig.Templates.save = function (template) { 35125 if (template.id === undefined) { 35126 throw new Twig.Error("Unable to save template with no id"); 35127 } 35128 35129 Twig.Templates.registry[template.id] = template; 35130 }; 35131 /** 35132 * Load a previously saved template from the store. 35133 * 35134 * @param {string} id The ID of the template to load. 35135 * 35136 * @return {Twig.Template} A twig.js template stored with the provided ID. 35137 */ 35138 35139 35140 Twig.Templates.load = function (id) { 35141 if (!Twig.Templates.registry.hasOwnProperty(id)) { 35142 return null; 35143 } 35144 35145 return Twig.Templates.registry[id]; 35146 }; 35147 /** 35148 * Load a template from a remote location using AJAX and saves in with the given ID. 35149 * 35150 * Available parameters: 35151 * 35152 * async: Should the HTTP request be performed asynchronously. 35153 * Defaults to true. 35154 * method: What method should be used to load the template 35155 * (fs or ajax) 35156 * parser: What method should be used to parse the template 35157 * (twig or source) 35158 * precompiled: Has the template already been compiled. 35159 * 35160 * @param {string} location The remote URL to load as a template. 35161 * @param {Object} params The template parameters. 35162 * @param {function} callback A callback triggered when the template finishes loading. 35163 * @param {function} error_callback A callback triggered if an error occurs loading the template. 35164 * 35165 * 35166 */ 35167 35168 35169 Twig.Templates.loadRemote = function (location, params, callback, error_callback) { 35170 var loader; // Default to async 35171 35172 if (params.async === undefined) { 35173 params.async = true; 35174 } // Default to the URL so the template is cached. 35175 35176 35177 if (params.id === undefined) { 35178 params.id = location; 35179 } // Check for existing template 35180 35181 35182 if (Twig.cache && Twig.Templates.registry.hasOwnProperty(params.id)) { 35183 // A template is already saved with the given id. 35184 if (typeof callback === 'function') { 35185 callback(Twig.Templates.registry[params.id]); 35186 } // TODO: if async, return deferred promise 35187 35188 35189 return Twig.Templates.registry[params.id]; 35190 } //if the parser name hasn't been set, default it to twig 35191 35192 35193 params.parser = params.parser || 'twig'; // Assume 'fs' if the loader is not defined 35194 35195 loader = this.loaders[params.method] || this.loaders.fs; 35196 return loader.apply(this, arguments); 35197 }; // Determine object type 35198 35199 35200 function is(type, obj) { 35201 var clas = Object.prototype.toString.call(obj).slice(8, -1); 35202 return obj !== undefined && obj !== null && clas === type; 35203 } 35204 /** 35205 * Create a new twig.js template. 35206 * 35207 * Parameters: { 35208 * data: The template, either pre-compiled tokens or a string template 35209 * id: The name of this template 35210 * blocks: Any pre-existing block from a child template 35211 * } 35212 * 35213 * @param {Object} params The template parameters. 35214 */ 35215 35216 35217 Twig.Template = function (params) { 35218 var data = params.data, 35219 id = params.id, 35220 blocks = params.blocks, 35221 macros = params.macros || {}, 35222 base = params.base, 35223 path = params.path, 35224 url = params.url, 35225 name = params.name, 35226 method = params.method, 35227 // parser options 35228 options = params.options; // # What is stored in a Twig.Template 35229 // 35230 // The Twig Template hold several chucks of data. 35231 // 35232 // { 35233 // id: The token ID (if any) 35234 // tokens: The list of tokens that makes up this template. 35235 // blocks: The list of block this template contains. 35236 // base: The base template (if any) 35237 // options: { 35238 // Compiler/parser options 35239 // 35240 // strict_variables: true/false 35241 // Should missing variable/keys emit an error message. If false, they default to null. 35242 // } 35243 // } 35244 // 35245 35246 this.id = id; 35247 this.method = method; 35248 this.base = base; 35249 this.path = path; 35250 this.url = url; 35251 this.name = name; 35252 this.macros = macros; 35253 this.options = options; 35254 this.reset(blocks); 35255 35256 if (is('String', data)) { 35257 this.tokens = Twig.prepare.apply(this, [data]); 35258 } else { 35259 this.tokens = data; 35260 } 35261 35262 if (id !== undefined) { 35263 Twig.Templates.save(this); 35264 } 35265 }; 35266 35267 Twig.Template.prototype.reset = function (blocks) { 35268 Twig.log.debug("Twig.Template.reset", "Reseting template " + this.id); 35269 this.blocks = {}; 35270 this.importedBlocks = []; 35271 this.originalBlockTokens = {}; 35272 this.child = { 35273 blocks: blocks || {} 35274 }; 35275 this.extend = null; 35276 }; 35277 35278 Twig.Template.prototype.render = function (context, params, allow_async) { 35279 params = params || {}; 35280 var that = this, 35281 // Store any error that might be thrown by the promise chain. 35282 err = null, 35283 // This will be set to is_async if template renders synchronously 35284 is_async = true, 35285 promise = null, 35286 result, 35287 url; 35288 this.context = context || {}; // Clear any previous state 35289 35290 this.reset(); 35291 35292 if (params.blocks) { 35293 this.blocks = params.blocks; 35294 } 35295 35296 if (params.macros) { 35297 this.macros = params.macros; 35298 } 35299 35300 var cb = function cb(output) { 35301 // Does this template extend another 35302 if (that.extend) { 35303 var ext_template; // check if the template is provided inline 35304 35305 if (that.options.allowInlineIncludes) { 35306 ext_template = Twig.Templates.load(that.extend); 35307 35308 if (ext_template) { 35309 ext_template.options = that.options; 35310 } 35311 } // check for the template file via include 35312 35313 35314 if (!ext_template) { 35315 url = Twig.path.parsePath(that, that.extend); 35316 ext_template = Twig.Templates.loadRemote(url, { 35317 method: that.getLoaderMethod(), 35318 base: that.base, 35319 async: false, 35320 id: url, 35321 options: that.options 35322 }); 35323 } 35324 35325 that.parent = ext_template; 35326 return that.parent.renderAsync(that.context, { 35327 blocks: that.blocks 35328 }); 35329 } 35330 35331 if (params.output == 'blocks') { 35332 return that.blocks; 35333 } else if (params.output == 'macros') { 35334 return that.macros; 35335 } else { 35336 return output; 35337 } 35338 }; 35339 35340 promise = Twig.parseAsync.apply(this, [this.tokens, this.context]).then(cb).then(function (v) { 35341 is_async = false; 35342 result = v; 35343 return v; 35344 }).catch(function (e) { 35345 if (allow_async) throw e; 35346 err = e; 35347 }); // If `allow_async` we will always return a promise since we do not 35348 // know in advance if we are going to run asynchronously or not. 35349 35350 if (allow_async) return promise; // Handle errors here if we fail synchronously. 35351 35352 if (err !== null) throw err; // If `allow_async` is not true we should not allow the user 35353 // to use asynchronous functions or filters. 35354 35355 if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.'); 35356 return result; 35357 }; 35358 35359 Twig.Template.prototype.importFile = function (file) { 35360 var url, sub_template; 35361 35362 if (!this.url && this.options.allowInlineIncludes) { 35363 file = this.path ? Twig.path.parsePath(this, file) : file; 35364 sub_template = Twig.Templates.load(file); 35365 35366 if (!sub_template) { 35367 sub_template = Twig.Templates.loadRemote(url, { 35368 id: file, 35369 method: this.getLoaderMethod(), 35370 async: false, 35371 path: file, 35372 options: this.options 35373 }); 35374 35375 if (!sub_template) { 35376 throw new Twig.Error("Unable to find the template " + file); 35377 } 35378 } 35379 35380 sub_template.options = this.options; 35381 return sub_template; 35382 } 35383 35384 url = Twig.path.parsePath(this, file); // Load blocks from an external file 35385 35386 sub_template = Twig.Templates.loadRemote(url, { 35387 method: this.getLoaderMethod(), 35388 base: this.base, 35389 async: false, 35390 options: this.options, 35391 id: url 35392 }); 35393 return sub_template; 35394 }; 35395 35396 Twig.Template.prototype.importBlocks = function (file, override) { 35397 var sub_template = this.importFile(file), 35398 context = this.context, 35399 that = this, 35400 key; 35401 override = override || false; 35402 sub_template.render(context); // Mixin blocks 35403 35404 Twig.forEach(Object.keys(sub_template.blocks), function (key) { 35405 if (override || that.blocks[key] === undefined) { 35406 that.blocks[key] = sub_template.blocks[key]; 35407 that.importedBlocks.push(key); 35408 } 35409 }); 35410 }; 35411 35412 Twig.Template.prototype.importMacros = function (file) { 35413 var url = Twig.path.parsePath(this, file); // load remote template 35414 35415 var remoteTemplate = Twig.Templates.loadRemote(url, { 35416 method: this.getLoaderMethod(), 35417 async: false, 35418 id: url 35419 }); 35420 return remoteTemplate; 35421 }; 35422 35423 Twig.Template.prototype.getLoaderMethod = function () { 35424 if (this.path) { 35425 return 'fs'; 35426 } 35427 35428 if (this.url) { 35429 return 'ajax'; 35430 } 35431 35432 return this.method || 'fs'; 35433 }; 35434 35435 Twig.Template.prototype.compile = function (options) { 35436 // compile the template into raw JS 35437 return Twig.compiler.compile(this, options); 35438 }; 35439 /** 35440 * Create safe output 35441 * 35442 * @param {string} Content safe to output 35443 * 35444 * @return {String} Content wrapped into a String 35445 */ 35446 35447 35448 Twig.Markup = function (content, strategy) { 35449 if (typeof strategy == 'undefined') { 35450 strategy = true; 35451 } 35452 35453 if (typeof content === 'string' && content.length > 0) { 35454 content = new String(content); 35455 content.twig_markup = strategy; 35456 } 35457 35458 return content; 35459 }; 35460 35461 return Twig; 35462 }; 35463 /***/ 35464 35465 }, 35466 /* 2 */ 35467 35468 /***/ 35469 function (module, exports) { 35470 // ## twig.compiler.js 35471 // 35472 // This file handles compiling templates into JS 35473 module.exports = function (Twig) { 35474 /** 35475 * Namespace for compilation. 35476 */ 35477 Twig.compiler = { 35478 module: {} 35479 }; // Compile a Twig Template to output. 35480 35481 Twig.compiler.compile = function (template, options) { 35482 // Get tokens 35483 var tokens = JSON.stringify(template.tokens), 35484 id = template.id, 35485 output; 35486 35487 if (options.module) { 35488 if (Twig.compiler.module[options.module] === undefined) { 35489 throw new Twig.Error("Unable to find module type " + options.module); 35490 } 35491 35492 output = Twig.compiler.module[options.module](id, tokens, options.twig); 35493 } else { 35494 output = Twig.compiler.wrap(id, tokens); 35495 } 35496 35497 return output; 35498 }; 35499 35500 Twig.compiler.module = { 35501 amd: function amd(id, tokens, pathToTwig) { 35502 return 'define(["' + pathToTwig + '"], function (Twig) {\n\tvar twig, templates;\ntwig = Twig.twig;\ntemplates = ' + Twig.compiler.wrap(id, tokens) + '\n\treturn templates;\n});'; 35503 }, 35504 node: function node(id, tokens) { 35505 return 'var twig = require("twig").twig;\n' + 'exports.template = ' + Twig.compiler.wrap(id, tokens); 35506 }, 35507 cjs2: function cjs2(id, tokens, pathToTwig) { 35508 return 'module.declare([{ twig: "' + pathToTwig + '" }], function (require, exports, module) {\n' + '\tvar twig = require("twig").twig;\n' + '\texports.template = ' + Twig.compiler.wrap(id, tokens) + '\n});'; 35509 } 35510 }; 35511 35512 Twig.compiler.wrap = function (id, tokens) { 35513 return 'twig({id:"' + id.replace('"', '\\"') + '", data:' + tokens + ', precompiled: true});\n'; 35514 }; 35515 35516 return Twig; 35517 }; 35518 /***/ 35519 35520 }, 35521 /* 3 */ 35522 35523 /***/ 35524 function (module, exports, __webpack_require__) { 35525 // ## twig.expression.js 35526 // 35527 // This file handles tokenizing, compiling and parsing expressions. 35528 module.exports = function (Twig) { 35529 "use strict"; 35530 35531 function parseParams(thisArg, params, context) { 35532 if (params) return Twig.expression.parseAsync.apply(thisArg, [params, context]); 35533 return Twig.Promise.resolve(false); 35534 } 35535 /** 35536 * Namespace for expression handling. 35537 */ 35538 35539 35540 Twig.expression = {}; 35541 35542 __webpack_require__(4)(Twig); 35543 /** 35544 * Reserved word that can't be used as variable names. 35545 */ 35546 35547 35548 Twig.expression.reservedWords = ["true", "false", "null", "TRUE", "FALSE", "NULL", "_context", "and", "b-and", "or", "b-or", "b-xor", "in", "not in", "if"]; 35549 /** 35550 * The type of tokens used in expressions. 35551 */ 35552 35553 Twig.expression.type = { 35554 comma: 'Twig.expression.type.comma', 35555 operator: { 35556 unary: 'Twig.expression.type.operator.unary', 35557 binary: 'Twig.expression.type.operator.binary' 35558 }, 35559 string: 'Twig.expression.type.string', 35560 bool: 'Twig.expression.type.bool', 35561 slice: 'Twig.expression.type.slice', 35562 array: { 35563 start: 'Twig.expression.type.array.start', 35564 end: 'Twig.expression.type.array.end' 35565 }, 35566 object: { 35567 start: 'Twig.expression.type.object.start', 35568 end: 'Twig.expression.type.object.end' 35569 }, 35570 parameter: { 35571 start: 'Twig.expression.type.parameter.start', 35572 end: 'Twig.expression.type.parameter.end' 35573 }, 35574 subexpression: { 35575 start: 'Twig.expression.type.subexpression.start', 35576 end: 'Twig.expression.type.subexpression.end' 35577 }, 35578 key: { 35579 period: 'Twig.expression.type.key.period', 35580 brackets: 'Twig.expression.type.key.brackets' 35581 }, 35582 filter: 'Twig.expression.type.filter', 35583 _function: 'Twig.expression.type._function', 35584 variable: 'Twig.expression.type.variable', 35585 number: 'Twig.expression.type.number', 35586 _null: 'Twig.expression.type.null', 35587 context: 'Twig.expression.type.context', 35588 test: 'Twig.expression.type.test' 35589 }; 35590 Twig.expression.set = { 35591 // What can follow an expression (in general) 35592 operations: [Twig.expression.type.filter, Twig.expression.type.operator.unary, Twig.expression.type.operator.binary, Twig.expression.type.array.end, Twig.expression.type.object.end, Twig.expression.type.parameter.end, Twig.expression.type.subexpression.end, Twig.expression.type.comma, Twig.expression.type.test], 35593 expressions: [Twig.expression.type._function, Twig.expression.type.bool, Twig.expression.type.string, Twig.expression.type.variable, Twig.expression.type.number, Twig.expression.type._null, Twig.expression.type.context, Twig.expression.type.parameter.start, Twig.expression.type.array.start, Twig.expression.type.object.start, Twig.expression.type.subexpression.start, Twig.expression.type.operator.unary] 35594 }; // Most expressions allow a '.' or '[' after them, so we provide a convenience set 35595 35596 Twig.expression.set.operations_extended = Twig.expression.set.operations.concat([Twig.expression.type.key.period, Twig.expression.type.key.brackets, Twig.expression.type.slice]); // Some commonly used compile and parse functions. 35597 35598 Twig.expression.fn = { 35599 compile: { 35600 push: function push(token, stack, output) { 35601 output.push(token); 35602 }, 35603 push_both: function push_both(token, stack, output) { 35604 output.push(token); 35605 stack.push(token); 35606 } 35607 }, 35608 parse: { 35609 push: function push(token, stack, context) { 35610 stack.push(token); 35611 }, 35612 push_value: function push_value(token, stack, context) { 35613 stack.push(token.value); 35614 } 35615 } 35616 }; // The regular expressions and compile/parse logic used to match tokens in expressions. 35617 // 35618 // Properties: 35619 // 35620 // type: The type of expression this matches 35621 // 35622 // regex: One or more regular expressions that matche the format of the token. 35623 // 35624 // next: Valid tokens that can occur next in the expression. 35625 // 35626 // Functions: 35627 // 35628 // compile: A function that compiles the raw regular expression match into a token. 35629 // 35630 // parse: A function that parses the compiled token into output. 35631 // 35632 35633 Twig.expression.definitions = [{ 35634 type: Twig.expression.type.test, 35635 regex: /^is\s+(not)?\s*([a-zA-Z_][a-zA-Z0-9_]*(\s?as)?)/, 35636 next: Twig.expression.set.operations.concat([Twig.expression.type.parameter.start]), 35637 compile: function compile(token, stack, output) { 35638 token.filter = token.match[2]; 35639 token.modifier = token.match[1]; 35640 delete token.match; 35641 delete token.value; 35642 output.push(token); 35643 }, 35644 parse: function parse(token, stack, context) { 35645 var value = stack.pop(); 35646 return parseParams(this, token.params, context).then(function (params) { 35647 var result = Twig.test(token.filter, value, params); 35648 35649 if (token.modifier == 'not') { 35650 stack.push(!result); 35651 } else { 35652 stack.push(result); 35653 } 35654 }); 35655 } 35656 }, { 35657 type: Twig.expression.type.comma, 35658 // Match a comma 35659 regex: /^,/, 35660 next: Twig.expression.set.expressions.concat([Twig.expression.type.array.end, Twig.expression.type.object.end]), 35661 compile: function compile(token, stack, output) { 35662 var i = stack.length - 1, 35663 stack_token; 35664 delete token.match; 35665 delete token.value; // pop tokens off the stack until the start of the object 35666 35667 for (; i >= 0; i--) { 35668 stack_token = stack.pop(); 35669 35670 if (stack_token.type === Twig.expression.type.object.start || stack_token.type === Twig.expression.type.parameter.start || stack_token.type === Twig.expression.type.array.start) { 35671 stack.push(stack_token); 35672 break; 35673 } 35674 35675 output.push(stack_token); 35676 } 35677 35678 output.push(token); 35679 } 35680 }, { 35681 /** 35682 * Match a number (integer or decimal) 35683 */ 35684 type: Twig.expression.type.number, 35685 // match a number 35686 regex: /^\-?\d+(\.\d+)?/, 35687 next: Twig.expression.set.operations, 35688 compile: function compile(token, stack, output) { 35689 token.value = Number(token.value); 35690 output.push(token); 35691 }, 35692 parse: Twig.expression.fn.parse.push_value 35693 }, { 35694 type: Twig.expression.type.operator.binary, 35695 // Match any of ?:, +, *, /, -, %, ~, <, <=, >, >=, !=, ==, **, ?, :, and, b-and, or, b-or, b-xor, in, not in 35696 // and, or, in, not in can be followed by a space or parenthesis 35697 regex: /(^\?\:|^(b\-and)|^(b\-or)|^(b\-xor)|^[\+\-~%\?]|^[\:](?!\d\])|^[!=]==?|^[!<>]=?|^\*\*?|^\/\/?|^(and)[\(|\s+]|^(or)[\(|\s+]|^(in)[\(|\s+]|^(not in)[\(|\s+]|^\.\.)/, 35698 next: Twig.expression.set.expressions, 35699 transform: function transform(match, tokens) { 35700 switch (match[0]) { 35701 case 'and(': 35702 case 'or(': 35703 case 'in(': 35704 case 'not in(': 35705 //Strip off the ( if it exists 35706 tokens[tokens.length - 1].value = match[2]; 35707 return match[0]; 35708 break; 35709 35710 default: 35711 return ''; 35712 } 35713 }, 35714 compile: function compile(token, stack, output) { 35715 delete token.match; 35716 token.value = token.value.trim(); 35717 var value = token.value, 35718 operator = Twig.expression.operator.lookup(value, token); 35719 Twig.log.trace("Twig.expression.compile: ", "Operator: ", operator, " from ", value); 35720 35721 while (stack.length > 0 && (stack[stack.length - 1].type == Twig.expression.type.operator.unary || stack[stack.length - 1].type == Twig.expression.type.operator.binary) && (operator.associativity === Twig.expression.operator.leftToRight && operator.precidence >= stack[stack.length - 1].precidence || operator.associativity === Twig.expression.operator.rightToLeft && operator.precidence > stack[stack.length - 1].precidence)) { 35722 var temp = stack.pop(); 35723 output.push(temp); 35724 } 35725 35726 if (value === ":") { 35727 // Check if this is a ternary or object key being set 35728 if (stack[stack.length - 1] && stack[stack.length - 1].value === "?") {// Continue as normal for a ternary 35729 } else { 35730 // This is not a ternary so we push the token to the output where it can be handled 35731 // when the assocated object is closed. 35732 var key_token = output.pop(); 35733 35734 if (key_token.type === Twig.expression.type.string || key_token.type === Twig.expression.type.variable) { 35735 token.key = key_token.value; 35736 } else if (key_token.type === Twig.expression.type.number) { 35737 // Convert integer keys into string keys 35738 token.key = key_token.value.toString(); 35739 } else if (key_token.expression && (key_token.type === Twig.expression.type.parameter.end || key_token.type == Twig.expression.type.subexpression.end)) { 35740 token.params = key_token.params; 35741 } else { 35742 throw new Twig.Error("Unexpected value before ':' of " + key_token.type + " = " + key_token.value); 35743 } 35744 35745 output.push(token); 35746 return; 35747 } 35748 } else { 35749 stack.push(operator); 35750 } 35751 }, 35752 parse: function parse(token, stack, context) { 35753 if (token.key) { 35754 // handle ternary ':' operator 35755 stack.push(token); 35756 } else if (token.params) { 35757 // handle "{(expression):value}" 35758 return Twig.expression.parseAsync.apply(this, [token.params, context]).then(function (key) { 35759 token.key = key; 35760 stack.push(token); //If we're in a loop, we might need token.params later, especially in this form of "(expression):value" 35761 35762 if (!context.loop) { 35763 delete token.params; 35764 } 35765 }); 35766 } else { 35767 Twig.expression.operator.parse(token.value, stack); 35768 } 35769 } 35770 }, { 35771 type: Twig.expression.type.operator.unary, 35772 // Match any of not 35773 regex: /(^not\s+)/, 35774 next: Twig.expression.set.expressions, 35775 compile: function compile(token, stack, output) { 35776 delete token.match; 35777 token.value = token.value.trim(); 35778 var value = token.value, 35779 operator = Twig.expression.operator.lookup(value, token); 35780 Twig.log.trace("Twig.expression.compile: ", "Operator: ", operator, " from ", value); 35781 35782 while (stack.length > 0 && (stack[stack.length - 1].type == Twig.expression.type.operator.unary || stack[stack.length - 1].type == Twig.expression.type.operator.binary) && (operator.associativity === Twig.expression.operator.leftToRight && operator.precidence >= stack[stack.length - 1].precidence || operator.associativity === Twig.expression.operator.rightToLeft && operator.precidence > stack[stack.length - 1].precidence)) { 35783 var temp = stack.pop(); 35784 output.push(temp); 35785 } 35786 35787 stack.push(operator); 35788 }, 35789 parse: function parse(token, stack, context) { 35790 Twig.expression.operator.parse(token.value, stack); 35791 } 35792 }, { 35793 /** 35794 * Match a string. This is anything between a pair of single or double quotes. 35795 */ 35796 type: Twig.expression.type.string, 35797 // See: http://blog.stevenlevithan.com/archives/match-quoted-string 35798 regex: /^(["'])(?:(?=(\\?))\2[\s\S])*?\1/, 35799 next: Twig.expression.set.operations_extended, 35800 compile: function compile(token, stack, output) { 35801 var value = token.value; 35802 delete token.match; // Remove the quotes from the string 35803 35804 if (value.substring(0, 1) === '"') { 35805 value = value.replace('\\"', '"'); 35806 } else { 35807 value = value.replace("\\'", "'"); 35808 } 35809 35810 token.value = value.substring(1, value.length - 1).replace(/\\n/g, "\n").replace(/\\r/g, "\r"); 35811 Twig.log.trace("Twig.expression.compile: ", "String value: ", token.value); 35812 output.push(token); 35813 }, 35814 parse: Twig.expression.fn.parse.push_value 35815 }, { 35816 /** 35817 * Match a subexpression set start. 35818 */ 35819 type: Twig.expression.type.subexpression.start, 35820 regex: /^\(/, 35821 next: Twig.expression.set.expressions.concat([Twig.expression.type.subexpression.end]), 35822 compile: function compile(token, stack, output) { 35823 token.value = '('; 35824 output.push(token); 35825 stack.push(token); 35826 }, 35827 parse: Twig.expression.fn.parse.push 35828 }, { 35829 /** 35830 * Match a subexpression set end. 35831 */ 35832 type: Twig.expression.type.subexpression.end, 35833 regex: /^\)/, 35834 next: Twig.expression.set.operations_extended, 35835 validate: function validate(match, tokens) { 35836 // Iterate back through previous tokens to ensure we follow a subexpression start 35837 var i = tokens.length - 1, 35838 found_subexpression_start = false, 35839 next_subexpression_start_invalid = false, 35840 unclosed_parameter_count = 0; 35841 35842 while (!found_subexpression_start && i >= 0) { 35843 var token = tokens[i]; 35844 found_subexpression_start = token.type === Twig.expression.type.subexpression.start; // If we have previously found a subexpression end, then this subexpression start is the start of 35845 // that subexpression, not the subexpression we are searching for 35846 35847 if (found_subexpression_start && next_subexpression_start_invalid) { 35848 next_subexpression_start_invalid = false; 35849 found_subexpression_start = false; 35850 } // Count parameter tokens to ensure we dont return truthy for a parameter opener 35851 35852 35853 if (token.type === Twig.expression.type.parameter.start) { 35854 unclosed_parameter_count++; 35855 } else if (token.type === Twig.expression.type.parameter.end) { 35856 unclosed_parameter_count--; 35857 } else if (token.type === Twig.expression.type.subexpression.end) { 35858 next_subexpression_start_invalid = true; 35859 } 35860 35861 i--; 35862 } // If we found unclosed parameters, return false 35863 // If we didnt find subexpression start, return false 35864 // Otherwise return true 35865 35866 35867 return found_subexpression_start && unclosed_parameter_count === 0; 35868 }, 35869 compile: function compile(token, stack, output) { 35870 // This is basically a copy of parameter end compilation 35871 var stack_token, 35872 end_token = token; 35873 stack_token = stack.pop(); 35874 35875 while (stack.length > 0 && stack_token.type != Twig.expression.type.subexpression.start) { 35876 output.push(stack_token); 35877 stack_token = stack.pop(); 35878 } // Move contents of parens into preceding filter 35879 35880 35881 var param_stack = []; 35882 35883 while (token.type !== Twig.expression.type.subexpression.start) { 35884 // Add token to arguments stack 35885 param_stack.unshift(token); 35886 token = output.pop(); 35887 } 35888 35889 param_stack.unshift(token); 35890 var is_expression = false; //If the token at the top of the *stack* is a function token, pop it onto the output queue. 35891 // Get the token preceding the parameters 35892 35893 stack_token = stack[stack.length - 1]; 35894 35895 if (stack_token === undefined || stack_token.type !== Twig.expression.type._function && stack_token.type !== Twig.expression.type.filter && stack_token.type !== Twig.expression.type.test && stack_token.type !== Twig.expression.type.key.brackets) { 35896 end_token.expression = true; // remove start and end token from stack 35897 35898 param_stack.pop(); 35899 param_stack.shift(); 35900 end_token.params = param_stack; 35901 output.push(end_token); 35902 } else { 35903 // This should never be hit 35904 end_token.expression = false; 35905 stack_token.params = param_stack; 35906 } 35907 }, 35908 parse: function parse(token, stack, context) { 35909 var new_array = [], 35910 array_ended = false, 35911 value = null; 35912 35913 if (token.expression) { 35914 return Twig.expression.parseAsync.apply(this, [token.params, context]).then(function (value) { 35915 stack.push(value); 35916 }); 35917 } else { 35918 throw new Twig.Error("Unexpected subexpression end when token is not marked as an expression"); 35919 } 35920 } 35921 }, { 35922 /** 35923 * Match a parameter set start. 35924 */ 35925 type: Twig.expression.type.parameter.start, 35926 regex: /^\(/, 35927 next: Twig.expression.set.expressions.concat([Twig.expression.type.parameter.end]), 35928 validate: function validate(match, tokens) { 35929 var last_token = tokens[tokens.length - 1]; // We can't use the regex to test if we follow a space because expression is trimmed 35930 35931 return last_token && Twig.indexOf(Twig.expression.reservedWords, last_token.value.trim()) < 0; 35932 }, 35933 compile: Twig.expression.fn.compile.push_both, 35934 parse: Twig.expression.fn.parse.push 35935 }, { 35936 /** 35937 * Match a parameter set end. 35938 */ 35939 type: Twig.expression.type.parameter.end, 35940 regex: /^\)/, 35941 next: Twig.expression.set.operations_extended, 35942 compile: function compile(token, stack, output) { 35943 var stack_token, 35944 end_token = token; 35945 stack_token = stack.pop(); 35946 35947 while (stack.length > 0 && stack_token.type != Twig.expression.type.parameter.start) { 35948 output.push(stack_token); 35949 stack_token = stack.pop(); 35950 } // Move contents of parens into preceding filter 35951 35952 35953 var param_stack = []; 35954 35955 while (token.type !== Twig.expression.type.parameter.start) { 35956 // Add token to arguments stack 35957 param_stack.unshift(token); 35958 token = output.pop(); 35959 } 35960 35961 param_stack.unshift(token); 35962 var is_expression = false; // Get the token preceding the parameters 35963 35964 token = output[output.length - 1]; 35965 35966 if (token === undefined || token.type !== Twig.expression.type._function && token.type !== Twig.expression.type.filter && token.type !== Twig.expression.type.test && token.type !== Twig.expression.type.key.brackets) { 35967 end_token.expression = true; // remove start and end token from stack 35968 35969 param_stack.pop(); 35970 param_stack.shift(); 35971 end_token.params = param_stack; 35972 output.push(end_token); 35973 } else { 35974 end_token.expression = false; 35975 token.params = param_stack; 35976 } 35977 }, 35978 parse: function parse(token, stack, context) { 35979 var new_array = [], 35980 array_ended = false, 35981 value = null; 35982 35983 if (token.expression) { 35984 return Twig.expression.parseAsync.apply(this, [token.params, context]).then(function (value) { 35985 stack.push(value); 35986 }); 35987 } else { 35988 while (stack.length > 0) { 35989 value = stack.pop(); // Push values into the array until the start of the array 35990 35991 if (value && value.type && value.type == Twig.expression.type.parameter.start) { 35992 array_ended = true; 35993 break; 35994 } 35995 35996 new_array.unshift(value); 35997 } 35998 35999 if (!array_ended) { 36000 throw new Twig.Error("Expected end of parameter set."); 36001 } 36002 36003 stack.push(new_array); 36004 } 36005 } 36006 }, { 36007 type: Twig.expression.type.slice, 36008 regex: /^\[(\d*\:\d*)\]/, 36009 next: Twig.expression.set.operations_extended, 36010 compile: function compile(token, stack, output) { 36011 var sliceRange = token.match[1].split(':'); //sliceStart can be undefined when we pass parameters to the slice filter later 36012 36013 var sliceStart = sliceRange[0] ? parseInt(sliceRange[0]) : undefined; 36014 var sliceEnd = sliceRange[1] ? parseInt(sliceRange[1]) : undefined; 36015 token.value = 'slice'; 36016 token.params = [sliceStart, sliceEnd]; //sliceEnd can't be undefined as the slice filter doesn't check for this, but it does check the length 36017 //of the params array, so just shorten it. 36018 36019 if (!sliceEnd) { 36020 token.params = [sliceStart]; 36021 } 36022 36023 output.push(token); 36024 }, 36025 parse: function parse(token, stack, context) { 36026 var input = stack.pop(), 36027 params = token.params; 36028 stack.push(Twig.filter.apply(this, [token.value, input, params])); 36029 } 36030 }, { 36031 /** 36032 * Match an array start. 36033 */ 36034 type: Twig.expression.type.array.start, 36035 regex: /^\[/, 36036 next: Twig.expression.set.expressions.concat([Twig.expression.type.array.end]), 36037 compile: Twig.expression.fn.compile.push_both, 36038 parse: Twig.expression.fn.parse.push 36039 }, { 36040 /** 36041 * Match an array end. 36042 */ 36043 type: Twig.expression.type.array.end, 36044 regex: /^\]/, 36045 next: Twig.expression.set.operations_extended, 36046 compile: function compile(token, stack, output) { 36047 var i = stack.length - 1, 36048 stack_token; // pop tokens off the stack until the start of the object 36049 36050 for (; i >= 0; i--) { 36051 stack_token = stack.pop(); 36052 36053 if (stack_token.type === Twig.expression.type.array.start) { 36054 break; 36055 } 36056 36057 output.push(stack_token); 36058 } 36059 36060 output.push(token); 36061 }, 36062 parse: function parse(token, stack, context) { 36063 var new_array = [], 36064 array_ended = false, 36065 value = null; 36066 36067 while (stack.length > 0) { 36068 value = stack.pop(); // Push values into the array until the start of the array 36069 36070 if (value.type && value.type == Twig.expression.type.array.start) { 36071 array_ended = true; 36072 break; 36073 } 36074 36075 new_array.unshift(value); 36076 } 36077 36078 if (!array_ended) { 36079 throw new Twig.Error("Expected end of array."); 36080 } 36081 36082 stack.push(new_array); 36083 } 36084 }, // Token that represents the start of a hash map '}' 36085 // 36086 // Hash maps take the form: 36087 // { "key": 'value', "another_key": item } 36088 // 36089 // Keys must be quoted (either single or double) and values can be any expression. 36090 { 36091 type: Twig.expression.type.object.start, 36092 regex: /^\{/, 36093 next: Twig.expression.set.expressions.concat([Twig.expression.type.object.end]), 36094 compile: Twig.expression.fn.compile.push_both, 36095 parse: Twig.expression.fn.parse.push 36096 }, // Token that represents the end of a Hash Map '}' 36097 // 36098 // This is where the logic for building the internal 36099 // representation of a hash map is defined. 36100 { 36101 type: Twig.expression.type.object.end, 36102 regex: /^\}/, 36103 next: Twig.expression.set.operations_extended, 36104 compile: function compile(token, stack, output) { 36105 var i = stack.length - 1, 36106 stack_token; // pop tokens off the stack until the start of the object 36107 36108 for (; i >= 0; i--) { 36109 stack_token = stack.pop(); 36110 36111 if (stack_token && stack_token.type === Twig.expression.type.object.start) { 36112 break; 36113 } 36114 36115 output.push(stack_token); 36116 } 36117 36118 output.push(token); 36119 }, 36120 parse: function parse(end_token, stack, context) { 36121 var new_object = {}, 36122 object_ended = false, 36123 token = null, 36124 token_key = null, 36125 has_value = false, 36126 value = null; 36127 36128 while (stack.length > 0) { 36129 token = stack.pop(); // Push values into the array until the start of the object 36130 36131 if (token && token.type && token.type === Twig.expression.type.object.start) { 36132 object_ended = true; 36133 break; 36134 } 36135 36136 if (token && token.type && (token.type === Twig.expression.type.operator.binary || token.type === Twig.expression.type.operator.unary) && token.key) { 36137 if (!has_value) { 36138 throw new Twig.Error("Missing value for key '" + token.key + "' in object definition."); 36139 } 36140 36141 new_object[token.key] = value; // Preserve the order that elements are added to the map 36142 // This is necessary since JavaScript objects don't 36143 // guarantee the order of keys 36144 36145 if (new_object._keys === undefined) new_object._keys = []; 36146 36147 new_object._keys.unshift(token.key); // reset value check 36148 36149 36150 value = null; 36151 has_value = false; 36152 } else { 36153 has_value = true; 36154 value = token; 36155 } 36156 } 36157 36158 if (!object_ended) { 36159 throw new Twig.Error("Unexpected end of object."); 36160 } 36161 36162 stack.push(new_object); 36163 } 36164 }, // Token representing a filter 36165 // 36166 // Filters can follow any expression and take the form: 36167 // expression|filter(optional, args) 36168 // 36169 // Filter parsing is done in the Twig.filters namespace. 36170 { 36171 type: Twig.expression.type.filter, 36172 // match a | then a letter or _, then any number of letters, numbers, _ or - 36173 regex: /^\|\s?([a-zA-Z_][a-zA-Z0-9_\-]*)/, 36174 next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]), 36175 compile: function compile(token, stack, output) { 36176 token.value = token.match[1]; 36177 output.push(token); 36178 }, 36179 parse: function parse(token, stack, context) { 36180 var that = this, 36181 input = stack.pop(); 36182 return parseParams(this, token.params, context).then(function (params) { 36183 return Twig.filter.apply(that, [token.value, input, params]); 36184 }).then(function (value) { 36185 stack.push(value); 36186 }); 36187 } 36188 }, { 36189 type: Twig.expression.type._function, 36190 // match any letter or _, then any number of letters, numbers, _ or - followed by ( 36191 regex: /^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(/, 36192 next: Twig.expression.type.parameter.start, 36193 validate: function validate(match, tokens) { 36194 // Make sure this function is not a reserved word 36195 return match[1] && Twig.indexOf(Twig.expression.reservedWords, match[1]) < 0; 36196 }, 36197 transform: function transform(match, tokens) { 36198 return '('; 36199 }, 36200 compile: function compile(token, stack, output) { 36201 var fn = token.match[1]; 36202 token.fn = fn; // cleanup token 36203 36204 delete token.match; 36205 delete token.value; 36206 output.push(token); 36207 }, 36208 parse: function parse(token, stack, context) { 36209 var that = this, 36210 fn = token.fn, 36211 value; 36212 return parseParams(this, token.params, context).then(function (params) { 36213 if (Twig.functions[fn]) { 36214 // Get the function from the built-in functions 36215 value = Twig.functions[fn].apply(that, params); 36216 } else if (typeof context[fn] == 'function') { 36217 // Get the function from the user/context defined functions 36218 value = context[fn].apply(context, params); 36219 } else { 36220 throw new Twig.Error(fn + ' function does not exist and is not defined in the context'); 36221 } 36222 36223 return value; 36224 }).then(function (result) { 36225 stack.push(result); 36226 }); 36227 } 36228 }, // Token representing a variable. 36229 // 36230 // Variables can contain letters, numbers, underscores and 36231 // dashes, but must start with a letter or underscore. 36232 // 36233 // Variables are retrieved from the render context and take 36234 // the value of 'undefined' if the given variable doesn't 36235 // exist in the context. 36236 { 36237 type: Twig.expression.type.variable, 36238 // match any letter or _, then any number of letters, numbers, _ or - 36239 regex: /^[a-zA-Z_][a-zA-Z0-9_]*/, 36240 next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]), 36241 compile: Twig.expression.fn.compile.push, 36242 validate: function validate(match, tokens) { 36243 return Twig.indexOf(Twig.expression.reservedWords, match[0]) < 0; 36244 }, 36245 parse: function parse(token, stack, context) { 36246 // Get the variable from the context 36247 return Twig.expression.resolveAsync.apply(this, [context[token.value], context]).then(function (value) { 36248 stack.push(value); 36249 }); 36250 } 36251 }, { 36252 type: Twig.expression.type.key.period, 36253 regex: /^\.([a-zA-Z0-9_]+)/, 36254 next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]), 36255 compile: function compile(token, stack, output) { 36256 token.key = token.match[1]; 36257 delete token.match; 36258 delete token.value; 36259 output.push(token); 36260 }, 36261 parse: function parse(token, stack, context, next_token) { 36262 var that = this, 36263 key = token.key, 36264 object = stack.pop(), 36265 value; 36266 return parseParams(this, token.params, context).then(function (params) { 36267 if (object === null || object === undefined) { 36268 if (that.options.strict_variables) { 36269 throw new Twig.Error("Can't access a key " + key + " on an null or undefined object."); 36270 } else { 36271 value = undefined; 36272 } 36273 } else { 36274 var capitalize = function capitalize(value) { 36275 return value.substr(0, 1).toUpperCase() + value.substr(1); 36276 }; // Get the variable from the context 36277 36278 36279 if (_typeof2(object) === 'object' && key in object) { 36280 value = object[key]; 36281 } else if (object["get" + capitalize(key)] !== undefined) { 36282 value = object["get" + capitalize(key)]; 36283 } else if (object["is" + capitalize(key)] !== undefined) { 36284 value = object["is" + capitalize(key)]; 36285 } else { 36286 value = undefined; 36287 } 36288 } // When resolving an expression we need to pass next_token in case the expression is a function 36289 36290 36291 return Twig.expression.resolveAsync.apply(that, [value, context, params, next_token, object]); 36292 }).then(function (result) { 36293 stack.push(result); 36294 }); 36295 } 36296 }, { 36297 type: Twig.expression.type.key.brackets, 36298 regex: /^\[([^\]\:]*)\]/, 36299 next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]), 36300 compile: function compile(token, stack, output) { 36301 var match = token.match[1]; 36302 delete token.value; 36303 delete token.match; // The expression stack for the key 36304 36305 token.stack = Twig.expression.compile({ 36306 value: match 36307 }).stack; 36308 output.push(token); 36309 }, 36310 parse: function parse(token, stack, context, next_token) { 36311 // Evaluate key 36312 var that = this, 36313 params = null, 36314 object, 36315 value; 36316 return parseParams(this, token.params, context).then(function (parameters) { 36317 params = parameters; 36318 return Twig.expression.parseAsync.apply(that, [token.stack, context]); 36319 }).then(function (key) { 36320 object = stack.pop(); 36321 36322 if (object === null || object === undefined) { 36323 if (that.options.strict_variables) { 36324 throw new Twig.Error("Can't access a key " + key + " on an null or undefined object."); 36325 } else { 36326 return null; 36327 } 36328 } // Get the variable from the context 36329 36330 36331 if (_typeof2(object) === 'object' && key in object) { 36332 value = object[key]; 36333 } else { 36334 value = null; 36335 } // When resolving an expression we need to pass next_token in case the expression is a function 36336 36337 36338 return Twig.expression.resolveAsync.apply(that, [value, object, params, next_token]); 36339 }).then(function (result) { 36340 stack.push(result); 36341 }); 36342 } 36343 }, { 36344 /** 36345 * Match a null value. 36346 */ 36347 type: Twig.expression.type._null, 36348 // match a number 36349 regex: /^(null|NULL|none|NONE)/, 36350 next: Twig.expression.set.operations, 36351 compile: function compile(token, stack, output) { 36352 delete token.match; 36353 token.value = null; 36354 output.push(token); 36355 }, 36356 parse: Twig.expression.fn.parse.push_value 36357 }, { 36358 /** 36359 * Match the context 36360 */ 36361 type: Twig.expression.type.context, 36362 regex: /^_context/, 36363 next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]), 36364 compile: Twig.expression.fn.compile.push, 36365 parse: function parse(token, stack, context) { 36366 stack.push(context); 36367 } 36368 }, { 36369 /** 36370 * Match a boolean 36371 */ 36372 type: Twig.expression.type.bool, 36373 regex: /^(true|TRUE|false|FALSE)/, 36374 next: Twig.expression.set.operations, 36375 compile: function compile(token, stack, output) { 36376 token.value = token.match[0].toLowerCase() === "true"; 36377 delete token.match; 36378 output.push(token); 36379 }, 36380 parse: Twig.expression.fn.parse.push_value 36381 }]; 36382 /** 36383 * Resolve a context value. 36384 * 36385 * If the value is a function, it is executed with a context parameter. 36386 * 36387 * @param {string} key The context object key. 36388 * @param {Object} context The render context. 36389 */ 36390 36391 Twig.expression.resolveAsync = function (value, context, params, next_token, object) { 36392 if (typeof value == 'function') { 36393 var promise = Twig.Promise.resolve(params); 36394 /* 36395 If value is a function, it will have been impossible during the compile stage to determine that a following 36396 set of parentheses were parameters for this function. 36397 Those parentheses will have therefore been marked as an expression, with their own parameters, which really 36398 belong to this function. 36399 Those parameters will also need parsing in case they are actually an expression to pass as parameters. 36400 */ 36401 36402 if (next_token && next_token.type === Twig.expression.type.parameter.end) { 36403 //When parsing these parameters, we need to get them all back, not just the last item on the stack. 36404 var tokens_are_parameters = true; 36405 promise = promise.then(function () { 36406 return next_token.params && Twig.expression.parseAsync.apply(this, [next_token.params, context, tokens_are_parameters]); 36407 }).then(function (p) { 36408 //Clean up the parentheses tokens on the next loop 36409 next_token.cleanup = true; 36410 return p; 36411 }); 36412 } 36413 36414 return promise.then(function (params) { 36415 return value.apply(object || context, params || []); 36416 }); 36417 } else { 36418 return Twig.Promise.resolve(value); 36419 } 36420 }; 36421 36422 Twig.expression.resolve = function (value, context, params, next_token, object) { 36423 var is_async = true, 36424 result; 36425 Twig.expression.resolveAsync.apply(this, [value, context, params, next_token, object]).then(function (r) { 36426 is_async = false; 36427 result = r; 36428 }); 36429 if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.'); 36430 return result; 36431 }; 36432 /** 36433 * Registry for logic handlers. 36434 */ 36435 36436 36437 Twig.expression.handler = {}; 36438 /** 36439 * Define a new expression type, available at Twig.logic.type.{type} 36440 * 36441 * @param {string} type The name of the new type. 36442 */ 36443 36444 Twig.expression.extendType = function (type) { 36445 Twig.expression.type[type] = "Twig.expression.type." + type; 36446 }; 36447 /** 36448 * Extend the expression parsing functionality with a new definition. 36449 * 36450 * Token definitions follow this format: 36451 * { 36452 * type: One of Twig.expression.type.[type], either pre-defined or added using 36453 * Twig.expression.extendType 36454 * 36455 * next: Array of types from Twig.expression.type that can follow this token, 36456 * 36457 * regex: A regex or array of regex's that should match the token. 36458 * 36459 * compile: function(token, stack, output) called when this token is being compiled. 36460 * Should return an object with stack and output set. 36461 * 36462 * parse: function(token, stack, context) called when this token is being parsed. 36463 * Should return an object with stack and context set. 36464 * } 36465 * 36466 * @param {Object} definition A token definition. 36467 */ 36468 36469 36470 Twig.expression.extend = function (definition) { 36471 if (!definition.type) { 36472 throw new Twig.Error("Unable to extend logic definition. No type provided for " + definition); 36473 } 36474 36475 Twig.expression.handler[definition.type] = definition; 36476 }; // Extend with built-in expressions 36477 36478 36479 while (Twig.expression.definitions.length > 0) { 36480 Twig.expression.extend(Twig.expression.definitions.shift()); 36481 } 36482 /** 36483 * Break an expression into tokens defined in Twig.expression.definitions. 36484 * 36485 * @param {string} expression The string to tokenize. 36486 * 36487 * @return {Array} An array of tokens. 36488 */ 36489 36490 36491 Twig.expression.tokenize = function (expression) { 36492 var tokens = [], 36493 // Keep an offset of the location in the expression for error messages. 36494 exp_offset = 0, 36495 // The valid next tokens of the previous token 36496 next = null, 36497 // Match information 36498 type, 36499 regex, 36500 regex_array, 36501 // The possible next token for the match 36502 token_next, 36503 // Has a match been found from the definitions 36504 match_found, 36505 invalid_matches = [], 36506 match_function; 36507 36508 match_function = function match_function() { 36509 var match = Array.prototype.slice.apply(arguments), 36510 string = match.pop(), 36511 offset = match.pop(); 36512 Twig.log.trace("Twig.expression.tokenize", "Matched a ", type, " regular expression of ", match); 36513 36514 if (next && Twig.indexOf(next, type) < 0) { 36515 invalid_matches.push(type + " cannot follow a " + tokens[tokens.length - 1].type + " at template:" + exp_offset + " near '" + match[0].substring(0, 20) + "...'"); // Not a match, don't change the expression 36516 36517 return match[0]; 36518 } // Validate the token if a validation function is provided 36519 36520 36521 if (Twig.expression.handler[type].validate && !Twig.expression.handler[type].validate(match, tokens)) { 36522 return match[0]; 36523 } 36524 36525 invalid_matches = []; 36526 tokens.push({ 36527 type: type, 36528 value: match[0], 36529 match: match 36530 }); 36531 match_found = true; 36532 next = token_next; 36533 exp_offset += match[0].length; // Does the token need to return output back to the expression string 36534 // e.g. a function match of cycle( might return the '(' back to the expression 36535 // This allows look-ahead to differentiate between token types (e.g. functions and variable names) 36536 36537 if (Twig.expression.handler[type].transform) { 36538 return Twig.expression.handler[type].transform(match, tokens); 36539 } 36540 36541 return ''; 36542 }; 36543 36544 Twig.log.debug("Twig.expression.tokenize", "Tokenizing expression ", expression); 36545 36546 while (expression.length > 0) { 36547 expression = expression.trim(); 36548 36549 for (type in Twig.expression.handler) { 36550 if (Twig.expression.handler.hasOwnProperty(type)) { 36551 token_next = Twig.expression.handler[type].next; 36552 regex = Twig.expression.handler[type].regex; 36553 Twig.log.trace("Checking type ", type, " on ", expression); 36554 36555 if (regex instanceof Array) { 36556 regex_array = regex; 36557 } else { 36558 regex_array = [regex]; 36559 } 36560 36561 match_found = false; 36562 36563 while (regex_array.length > 0) { 36564 regex = regex_array.pop(); 36565 expression = expression.replace(regex, match_function); 36566 } // An expression token has been matched. Break the for loop and start trying to 36567 // match the next template (if expression isn't empty.) 36568 36569 36570 if (match_found) { 36571 break; 36572 } 36573 } 36574 } 36575 36576 if (!match_found) { 36577 if (invalid_matches.length > 0) { 36578 throw new Twig.Error(invalid_matches.join(" OR ")); 36579 } else { 36580 throw new Twig.Error("Unable to parse '" + expression + "' at template position" + exp_offset); 36581 } 36582 } 36583 } 36584 36585 Twig.log.trace("Twig.expression.tokenize", "Tokenized to ", tokens); 36586 return tokens; 36587 }; 36588 /** 36589 * Compile an expression token. 36590 * 36591 * @param {Object} raw_token The uncompiled token. 36592 * 36593 * @return {Object} The compiled token. 36594 */ 36595 36596 36597 Twig.expression.compile = function (raw_token) { 36598 var expression = raw_token.value, 36599 // Tokenize expression 36600 tokens = Twig.expression.tokenize(expression), 36601 token = null, 36602 output = [], 36603 stack = [], 36604 token_template = null; 36605 Twig.log.trace("Twig.expression.compile: ", "Compiling ", expression); // Push tokens into RPN stack using the Shunting-yard algorithm 36606 // See http://en.wikipedia.org/wiki/Shunting_yard_algorithm 36607 36608 while (tokens.length > 0) { 36609 token = tokens.shift(); 36610 token_template = Twig.expression.handler[token.type]; 36611 Twig.log.trace("Twig.expression.compile: ", "Compiling ", token); // Compile the template 36612 36613 token_template.compile && token_template.compile(token, stack, output); 36614 Twig.log.trace("Twig.expression.compile: ", "Stack is", stack); 36615 Twig.log.trace("Twig.expression.compile: ", "Output is", output); 36616 } 36617 36618 while (stack.length > 0) { 36619 output.push(stack.pop()); 36620 } 36621 36622 Twig.log.trace("Twig.expression.compile: ", "Final output is", output); 36623 raw_token.stack = output; 36624 delete raw_token.value; 36625 return raw_token; 36626 }; 36627 /** 36628 * Parse an RPN expression stack within a context. 36629 * 36630 * @param {Array} tokens An array of compiled expression tokens. 36631 * @param {Object} context The render context to parse the tokens with. 36632 * 36633 * @return {Object} The result of parsing all the tokens. The result 36634 * can be anything, String, Array, Object, etc... based on 36635 * the given expression. 36636 */ 36637 36638 36639 Twig.expression.parse = function (tokens, context, tokens_are_parameters, allow_async) { 36640 var that = this; // If the token isn't an array, make it one. 36641 36642 if (!(tokens instanceof Array)) { 36643 tokens = [tokens]; 36644 } // The output stack 36645 36646 36647 var stack = [], 36648 next_token, 36649 output = null, 36650 promise = null, 36651 is_async = true, 36652 token_template = null, 36653 loop_token_fixups = []; 36654 promise = Twig.async.forEach(tokens, function (token, index) { 36655 //If the token is marked for cleanup, we don't need to parse it 36656 if (token.cleanup) { 36657 return; 36658 } 36659 36660 var result = null; //Determine the token that follows this one so that we can pass it to the parser 36661 36662 if (tokens.length > index + 1) { 36663 next_token = tokens[index + 1]; 36664 } 36665 36666 token_template = Twig.expression.handler[token.type]; 36667 if (token_template.parse) result = token_template.parse.apply(that, [token, stack, context, next_token]); //Store any binary tokens for later if we are in a loop. 36668 36669 if (context.loop && token.type === Twig.expression.type.operator.binary) { 36670 loop_token_fixups.push(token); 36671 } 36672 36673 return result; 36674 }).then(function () { 36675 //Check every fixup and remove "key" as long as they still have "params". This covers the use case where 36676 //a ":" operator is used in a loop with a "(expression):" statement. We need to be able to evaluate the expression 36677 Twig.forEach(loop_token_fixups, function (loop_token_fixup) { 36678 if (loop_token_fixup.params && loop_token_fixup.key) { 36679 delete loop_token_fixup["key"]; 36680 } 36681 }); //If parse has been called with a set of tokens that are parameters, we need to return the whole stack, 36682 //wrapped in an Array. 36683 36684 if (tokens_are_parameters) { 36685 var params = []; 36686 36687 while (stack.length > 0) { 36688 params.unshift(stack.pop()); 36689 } 36690 36691 stack.push(params); 36692 } 36693 36694 if (allow_async) return Twig.Promise.resolve(stack.pop()); 36695 }).then(function (v) { 36696 is_async = false; 36697 return v; 36698 }); 36699 if (allow_async) return promise; 36700 if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.'); // Pop the final value off the stack 36701 36702 return stack.pop(); 36703 }; 36704 36705 return Twig; 36706 }; 36707 /***/ 36708 36709 }, 36710 /* 4 */ 36711 36712 /***/ 36713 function (module, exports) { 36714 // ## twig.expression.operator.js 36715 // 36716 // This file handles operator lookups and parsing. 36717 module.exports = function (Twig) { 36718 "use strict"; 36719 /** 36720 * Operator associativity constants. 36721 */ 36722 36723 Twig.expression.operator = { 36724 leftToRight: 'leftToRight', 36725 rightToLeft: 'rightToLeft' 36726 }; 36727 36728 var containment = function containment(a, b) { 36729 if (b === undefined || b === null) { 36730 return null; 36731 } else if (b.indexOf !== undefined) { 36732 // String 36733 return a === b || a !== '' && b.indexOf(a) > -1; 36734 } else { 36735 var el; 36736 36737 for (el in b) { 36738 if (b.hasOwnProperty(el) && b[el] === a) { 36739 return true; 36740 } 36741 } 36742 36743 return false; 36744 } 36745 }; 36746 /** 36747 * Get the precidence and associativity of an operator. These follow the order that C/C++ use. 36748 * See http://en.wikipedia.org/wiki/Operators_in_C_and_C++ for the table of values. 36749 */ 36750 36751 36752 Twig.expression.operator.lookup = function (operator, token) { 36753 switch (operator) { 36754 case "..": 36755 token.precidence = 20; 36756 token.associativity = Twig.expression.operator.leftToRight; 36757 break; 36758 36759 case ',': 36760 token.precidence = 18; 36761 token.associativity = Twig.expression.operator.leftToRight; 36762 break; 36763 // Ternary 36764 36765 case '?:': 36766 case '?': 36767 case ':': 36768 token.precidence = 16; 36769 token.associativity = Twig.expression.operator.rightToLeft; 36770 break; 36771 36772 case 'or': 36773 token.precidence = 14; 36774 token.associativity = Twig.expression.operator.leftToRight; 36775 break; 36776 36777 case 'and': 36778 token.precidence = 13; 36779 token.associativity = Twig.expression.operator.leftToRight; 36780 break; 36781 36782 case 'b-or': 36783 token.precidence = 12; 36784 token.associativity = Twig.expression.operator.leftToRight; 36785 break; 36786 36787 case 'b-xor': 36788 token.precidence = 11; 36789 token.associativity = Twig.expression.operator.leftToRight; 36790 break; 36791 36792 case 'b-and': 36793 token.precidence = 10; 36794 token.associativity = Twig.expression.operator.leftToRight; 36795 break; 36796 36797 case '==': 36798 case '!=': 36799 token.precidence = 9; 36800 token.associativity = Twig.expression.operator.leftToRight; 36801 break; 36802 36803 case '<': 36804 case '<=': 36805 case '>': 36806 case '>=': 36807 case 'not in': 36808 case 'in': 36809 token.precidence = 8; 36810 token.associativity = Twig.expression.operator.leftToRight; 36811 break; 36812 36813 case '~': // String concatination 36814 36815 case '+': 36816 case '-': 36817 token.precidence = 6; 36818 token.associativity = Twig.expression.operator.leftToRight; 36819 break; 36820 36821 case '//': 36822 case '**': 36823 case '*': 36824 case '/': 36825 case '%': 36826 token.precidence = 5; 36827 token.associativity = Twig.expression.operator.leftToRight; 36828 break; 36829 36830 case 'not': 36831 token.precidence = 3; 36832 token.associativity = Twig.expression.operator.rightToLeft; 36833 break; 36834 36835 default: 36836 throw new Twig.Error("Failed to lookup operator: " + operator + " is an unknown operator."); 36837 } 36838 36839 token.operator = operator; 36840 return token; 36841 }; 36842 /** 36843 * Handle operations on the RPN stack. 36844 * 36845 * Returns the updated stack. 36846 */ 36847 36848 36849 Twig.expression.operator.parse = function (operator, stack) { 36850 Twig.log.trace("Twig.expression.operator.parse: ", "Handling ", operator); 36851 var a, b, c; 36852 36853 if (operator === '?') { 36854 c = stack.pop(); 36855 } 36856 36857 b = stack.pop(); 36858 36859 if (operator !== 'not') { 36860 a = stack.pop(); 36861 } 36862 36863 if (operator !== 'in' && operator !== 'not in') { 36864 if (a && Array.isArray(a)) { 36865 a = a.length; 36866 } 36867 36868 if (b && Array.isArray(b)) { 36869 b = b.length; 36870 } 36871 } 36872 36873 switch (operator) { 36874 case ':': 36875 // Ignore 36876 break; 36877 36878 case '?:': 36879 if (Twig.lib.boolval(a)) { 36880 stack.push(a); 36881 } else { 36882 stack.push(b); 36883 } 36884 36885 break; 36886 36887 case '?': 36888 if (a === undefined) { 36889 //An extended ternary. 36890 a = b; 36891 b = c; 36892 c = undefined; 36893 } 36894 36895 if (Twig.lib.boolval(a)) { 36896 stack.push(b); 36897 } else { 36898 stack.push(c); 36899 } 36900 36901 break; 36902 36903 case '+': 36904 b = parseFloat(b); 36905 a = parseFloat(a); 36906 stack.push(a + b); 36907 break; 36908 36909 case '-': 36910 b = parseFloat(b); 36911 a = parseFloat(a); 36912 stack.push(a - b); 36913 break; 36914 36915 case '*': 36916 b = parseFloat(b); 36917 a = parseFloat(a); 36918 stack.push(a * b); 36919 break; 36920 36921 case '/': 36922 b = parseFloat(b); 36923 a = parseFloat(a); 36924 stack.push(a / b); 36925 break; 36926 36927 case '//': 36928 b = parseFloat(b); 36929 a = parseFloat(a); 36930 stack.push(Math.floor(a / b)); 36931 break; 36932 36933 case '%': 36934 b = parseFloat(b); 36935 a = parseFloat(a); 36936 stack.push(a % b); 36937 break; 36938 36939 case '~': 36940 stack.push((a != null ? a.toString() : "") + (b != null ? b.toString() : "")); 36941 break; 36942 36943 case 'not': 36944 case '!': 36945 stack.push(!Twig.lib.boolval(b)); 36946 break; 36947 36948 case '<': 36949 stack.push(a < b); 36950 break; 36951 36952 case '<=': 36953 stack.push(a <= b); 36954 break; 36955 36956 case '>': 36957 stack.push(a > b); 36958 break; 36959 36960 case '>=': 36961 stack.push(a >= b); 36962 break; 36963 36964 case '===': 36965 stack.push(a === b); 36966 break; 36967 36968 case '==': 36969 stack.push(a == b); 36970 break; 36971 36972 case '!==': 36973 stack.push(a !== b); 36974 break; 36975 36976 case '!=': 36977 stack.push(a != b); 36978 break; 36979 36980 case 'or': 36981 stack.push(a || b); 36982 break; 36983 36984 case 'b-or': 36985 stack.push(a | b); 36986 break; 36987 36988 case 'b-xor': 36989 stack.push(a ^ b); 36990 break; 36991 36992 case 'and': 36993 stack.push(a && b); 36994 break; 36995 36996 case 'b-and': 36997 stack.push(a & b); 36998 break; 36999 37000 case '**': 37001 stack.push(Math.pow(a, b)); 37002 break; 37003 37004 case 'not in': 37005 stack.push(!containment(a, b)); 37006 break; 37007 37008 case 'in': 37009 stack.push(containment(a, b)); 37010 break; 37011 37012 case '..': 37013 stack.push(Twig.functions.range(a, b)); 37014 break; 37015 37016 default: 37017 debugger; 37018 throw new Twig.Error("Failed to parse operator: " + operator + " is an unknown operator."); 37019 } 37020 }; 37021 37022 return Twig; 37023 }; 37024 /***/ 37025 37026 }, 37027 /* 5 */ 37028 37029 /***/ 37030 function (module, exports) { 37031 // ## twig.filters.js 37032 // 37033 // This file handles parsing filters. 37034 module.exports = function (Twig) { 37035 // Determine object type 37036 function is(type, obj) { 37037 var clas = Object.prototype.toString.call(obj).slice(8, -1); 37038 return obj !== undefined && obj !== null && clas === type; 37039 } 37040 37041 Twig.filters = { 37042 // String Filters 37043 upper: function upper(value) { 37044 if (typeof value !== "string") { 37045 return value; 37046 } 37047 37048 return value.toUpperCase(); 37049 }, 37050 lower: function lower(value) { 37051 if (typeof value !== "string") { 37052 return value; 37053 } 37054 37055 return value.toLowerCase(); 37056 }, 37057 capitalize: function capitalize(value) { 37058 if (typeof value !== "string") { 37059 return value; 37060 } 37061 37062 return value.substr(0, 1).toUpperCase() + value.toLowerCase().substr(1); 37063 }, 37064 title: function title(value) { 37065 if (typeof value !== "string") { 37066 return value; 37067 } 37068 37069 return value.toLowerCase().replace(/(^|\s)([a-z])/g, function (m, p1, p2) { 37070 return p1 + p2.toUpperCase(); 37071 }); 37072 }, 37073 length: function length(value) { 37074 if (Twig.lib.is("Array", value) || typeof value === "string") { 37075 return value.length; 37076 } else if (Twig.lib.is("Object", value)) { 37077 if (value._keys === undefined) { 37078 return Object.keys(value).length; 37079 } else { 37080 return value._keys.length; 37081 } 37082 } else { 37083 return 0; 37084 } 37085 }, 37086 // Array/Object Filters 37087 reverse: function reverse(value) { 37088 if (is("Array", value)) { 37089 return value.reverse(); 37090 } else if (is("String", value)) { 37091 return value.split("").reverse().join(""); 37092 } else if (is("Object", value)) { 37093 var keys = value._keys || Object.keys(value).reverse(); 37094 value._keys = keys; 37095 return value; 37096 } 37097 }, 37098 sort: function sort(value) { 37099 if (is("Array", value)) { 37100 return value.sort(); 37101 } else if (is('Object', value)) { 37102 // Sorting objects isn't obvious since the order of 37103 // returned keys isn't guaranteed in JavaScript. 37104 // Because of this we use a "hidden" key called _keys to 37105 // store the keys in the order we want to return them. 37106 delete value._keys; 37107 var keys = Object.keys(value), 37108 sorted_keys = keys.sort(function (a, b) { 37109 var a1, a2; // if a and b are comparable, we're fine :-) 37110 37111 if (value[a] > value[b] == !(value[a] <= value[b])) { 37112 return value[a] > value[b] ? 1 : value[a] < value[b] ? -1 : 0; 37113 } // if a and b can be parsed as numbers, we can compare 37114 // their numeric value 37115 else if (!isNaN(a1 = parseFloat(value[a])) && !isNaN(b1 = parseFloat(value[b]))) { 37116 return a1 > b1 ? 1 : a1 < b1 ? -1 : 0; 37117 } // if one of the values is a string, we convert the 37118 // other value to string as well 37119 else if (typeof value[a] == 'string') { 37120 return value[a] > value[b].toString() ? 1 : value[a] < value[b].toString() ? -1 : 0; 37121 } else if (typeof value[b] == 'string') { 37122 return value[a].toString() > value[b] ? 1 : value[a].toString() < value[b] ? -1 : 0; 37123 } // everything failed - return 'null' as sign, that 37124 // the values are not comparable 37125 else { 37126 return null; 37127 } 37128 }); 37129 value._keys = sorted_keys; 37130 return value; 37131 } 37132 }, 37133 keys: function keys(value) { 37134 if (value === undefined || value === null) { 37135 return; 37136 } 37137 37138 var keyset = value._keys || Object.keys(value), 37139 output = []; 37140 Twig.forEach(keyset, function (key) { 37141 if (key === "_keys") return; // Ignore the _keys property 37142 37143 if (value.hasOwnProperty(key)) { 37144 output.push(key); 37145 } 37146 }); 37147 return output; 37148 }, 37149 url_encode: function url_encode(value) { 37150 if (value === undefined || value === null) { 37151 return; 37152 } 37153 37154 var result = encodeURIComponent(value); 37155 result = result.replace("'", "%27"); 37156 return result; 37157 }, 37158 join: function join(value, params) { 37159 if (value === undefined || value === null) { 37160 return; 37161 } 37162 37163 var join_str = "", 37164 output = [], 37165 keyset = null; 37166 37167 if (params && params[0]) { 37168 join_str = params[0]; 37169 } 37170 37171 if (is("Array", value)) { 37172 output = value; 37173 } else { 37174 keyset = value._keys || Object.keys(value); 37175 Twig.forEach(keyset, function (key) { 37176 if (key === "_keys") return; // Ignore the _keys property 37177 37178 if (value.hasOwnProperty(key)) { 37179 output.push(value[key]); 37180 } 37181 }); 37182 } 37183 37184 return output.join(join_str); 37185 }, 37186 "default": function _default(value, params) { 37187 if (params !== undefined && params.length > 1) { 37188 throw new Twig.Error("default filter expects one argument"); 37189 } 37190 37191 if (value === undefined || value === null || value === '') { 37192 if (params === undefined) { 37193 return ''; 37194 } 37195 37196 return params[0]; 37197 } else { 37198 return value; 37199 } 37200 }, 37201 json_encode: function json_encode(value) { 37202 if (value === undefined || value === null) { 37203 return "null"; 37204 } else if (_typeof2(value) == 'object' && is("Array", value)) { 37205 output = []; 37206 Twig.forEach(value, function (v) { 37207 output.push(Twig.filters.json_encode(v)); 37208 }); 37209 return "[" + output.join(",") + "]"; 37210 } else if (_typeof2(value) == 'object') { 37211 var keyset = value._keys || Object.keys(value), 37212 output = []; 37213 Twig.forEach(keyset, function (key) { 37214 output.push(JSON.stringify(key) + ":" + Twig.filters.json_encode(value[key])); 37215 }); 37216 return "{" + output.join(",") + "}"; 37217 } else { 37218 return JSON.stringify(value); 37219 } 37220 }, 37221 merge: function merge(value, params) { 37222 var obj = [], 37223 arr_index = 0, 37224 keyset = []; // Check to see if all the objects being merged are arrays 37225 37226 if (!is("Array", value)) { 37227 // Create obj as an Object 37228 obj = {}; 37229 } else { 37230 Twig.forEach(params, function (param) { 37231 if (!is("Array", param)) { 37232 obj = {}; 37233 } 37234 }); 37235 } 37236 37237 if (!is("Array", obj)) { 37238 obj._keys = []; 37239 } 37240 37241 if (is("Array", value)) { 37242 Twig.forEach(value, function (val) { 37243 if (obj._keys) obj._keys.push(arr_index); 37244 obj[arr_index] = val; 37245 arr_index++; 37246 }); 37247 } else { 37248 keyset = value._keys || Object.keys(value); 37249 Twig.forEach(keyset, function (key) { 37250 obj[key] = value[key]; 37251 37252 obj._keys.push(key); // Handle edge case where a number index in an object is greater than 37253 // the array counter. In such a case, the array counter is increased 37254 // one past the index. 37255 // 37256 // Example {{ ["a", "b"]|merge({"4":"value"}, ["c", "d"]) 37257 // Without this, d would have an index of "4" and overwrite the value 37258 // of "value" 37259 37260 37261 var int_key = parseInt(key, 10); 37262 37263 if (!isNaN(int_key) && int_key >= arr_index) { 37264 arr_index = int_key + 1; 37265 } 37266 }); 37267 } // mixin the merge arrays 37268 37269 37270 Twig.forEach(params, function (param) { 37271 if (is("Array", param)) { 37272 Twig.forEach(param, function (val) { 37273 if (obj._keys) obj._keys.push(arr_index); 37274 obj[arr_index] = val; 37275 arr_index++; 37276 }); 37277 } else { 37278 keyset = param._keys || Object.keys(param); 37279 Twig.forEach(keyset, function (key) { 37280 if (!obj[key]) obj._keys.push(key); 37281 obj[key] = param[key]; 37282 var int_key = parseInt(key, 10); 37283 37284 if (!isNaN(int_key) && int_key >= arr_index) { 37285 arr_index = int_key + 1; 37286 } 37287 }); 37288 } 37289 }); 37290 37291 if (params.length === 0) { 37292 throw new Twig.Error("Filter merge expects at least one parameter"); 37293 } 37294 37295 return obj; 37296 }, 37297 date: function date(value, params) { 37298 var date = Twig.functions.date(value); 37299 var format = params && params.length ? params[0] : 'F j, Y H:i'; 37300 return Twig.lib.date(format, date); 37301 }, 37302 date_modify: function date_modify(value, params) { 37303 if (value === undefined || value === null) { 37304 return; 37305 } 37306 37307 if (params === undefined || params.length !== 1) { 37308 throw new Twig.Error("date_modify filter expects 1 argument"); 37309 } 37310 37311 var modifyText = params[0], 37312 time; 37313 37314 if (Twig.lib.is("Date", value)) { 37315 time = Twig.lib.strtotime(modifyText, value.getTime() / 1000); 37316 } 37317 37318 if (Twig.lib.is("String", value)) { 37319 time = Twig.lib.strtotime(modifyText, Twig.lib.strtotime(value)); 37320 } 37321 37322 if (Twig.lib.is("Number", value)) { 37323 time = Twig.lib.strtotime(modifyText, value); 37324 } 37325 37326 return new Date(time * 1000); 37327 }, 37328 replace: function replace(value, params) { 37329 if (value === undefined || value === null) { 37330 return; 37331 } 37332 37333 var pairs = params[0], 37334 tag; 37335 37336 for (tag in pairs) { 37337 if (pairs.hasOwnProperty(tag) && tag !== "_keys") { 37338 value = Twig.lib.replaceAll(value, tag, pairs[tag]); 37339 } 37340 } 37341 37342 return value; 37343 }, 37344 format: function format(value, params) { 37345 if (value === undefined || value === null) { 37346 return; 37347 } 37348 37349 return Twig.lib.vsprintf(value, params); 37350 }, 37351 striptags: function striptags(value) { 37352 if (value === undefined || value === null) { 37353 return; 37354 } 37355 37356 return Twig.lib.strip_tags(value); 37357 }, 37358 escape: function escape(value, params) { 37359 if (value === undefined || value === null) { 37360 return; 37361 } 37362 37363 var strategy = "html"; 37364 if (params && params.length && params[0] !== true) strategy = params[0]; 37365 37366 if (strategy == "html") { 37367 var raw_value = value.toString().replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); 37368 return Twig.Markup(raw_value, 'html'); 37369 } else if (strategy == "js") { 37370 var raw_value = value.toString(); 37371 var result = ""; 37372 37373 for (var i = 0; i < raw_value.length; i++) { 37374 if (raw_value[i].match(/^[a-zA-Z0-9,\._]$/)) result += raw_value[i];else { 37375 var char_code = raw_value.charCodeAt(i); 37376 if (char_code < 0x80) result += "\\x" + char_code.toString(16).toUpperCase();else result += Twig.lib.sprintf("\\u%04s", char_code.toString(16).toUpperCase()); 37377 } 37378 } 37379 37380 return Twig.Markup(result, 'js'); 37381 } else if (strategy == "css") { 37382 var raw_value = value.toString(); 37383 var result = ""; 37384 37385 for (var i = 0; i < raw_value.length; i++) { 37386 if (raw_value[i].match(/^[a-zA-Z0-9]$/)) result += raw_value[i];else { 37387 var char_code = raw_value.charCodeAt(i); 37388 result += "\\" + char_code.toString(16).toUpperCase() + " "; 37389 } 37390 } 37391 37392 return Twig.Markup(result, 'css'); 37393 } else if (strategy == "url") { 37394 var result = Twig.filters.url_encode(value); 37395 return Twig.Markup(result, 'url'); 37396 } else if (strategy == "html_attr") { 37397 var raw_value = value.toString(); 37398 var result = ""; 37399 37400 for (var i = 0; i < raw_value.length; i++) { 37401 if (raw_value[i].match(/^[a-zA-Z0-9,\.\-_]$/)) result += raw_value[i];else if (raw_value[i].match(/^[&<>"]$/)) result += raw_value[i].replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);else { 37402 var char_code = raw_value.charCodeAt(i); // The following replaces characters undefined in HTML with 37403 // the hex entity for the Unicode replacement character. 37404 37405 if (char_code <= 0x1f && char_code != 0x09 && char_code != 0x0a && char_code != 0x0d) result += "�";else if (char_code < 0x80) result += Twig.lib.sprintf("&#x%02s;", char_code.toString(16).toUpperCase());else result += Twig.lib.sprintf("&#x%04s;", char_code.toString(16).toUpperCase()); 37406 } 37407 } 37408 37409 return Twig.Markup(result, 'html_attr'); 37410 } else { 37411 throw new Twig.Error("escape strategy unsupported"); 37412 } 37413 }, 37414 37415 /* Alias of escape */ 37416 "e": function e(value, params) { 37417 return Twig.filters.escape(value, params); 37418 }, 37419 nl2br: function nl2br(value) { 37420 if (value === undefined || value === null) { 37421 return; 37422 } 37423 37424 var linebreak_tag = "BACKSLASH_n_replace", 37425 br = "<br />" + linebreak_tag; 37426 value = Twig.filters.escape(value).replace(/\r\n/g, br).replace(/\r/g, br).replace(/\n/g, br); 37427 value = Twig.lib.replaceAll(value, linebreak_tag, "\n"); 37428 return Twig.Markup(value); 37429 }, 37430 37431 /** 37432 * Adapted from: http://phpjs.org/functions/number_format:481 37433 */ 37434 number_format: function number_format(value, params) { 37435 var number = value, 37436 decimals = params && params[0] ? params[0] : undefined, 37437 dec = params && params[1] !== undefined ? params[1] : ".", 37438 sep = params && params[2] !== undefined ? params[2] : ","; 37439 number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); 37440 37441 var n = !isFinite(+number) ? 0 : +number, 37442 prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), 37443 s = '', 37444 toFixedFix = function toFixedFix(n, prec) { 37445 var k = Math.pow(10, prec); 37446 return '' + Math.round(n * k) / k; 37447 }; // Fix for IE parseFloat(0.55).toFixed(0) = 0; 37448 37449 37450 s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); 37451 37452 if (s[0].length > 3) { 37453 s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); 37454 } 37455 37456 if ((s[1] || '').length < prec) { 37457 s[1] = s[1] || ''; 37458 s[1] += new Array(prec - s[1].length + 1).join('0'); 37459 } 37460 37461 return s.join(dec); 37462 }, 37463 trim: function trim(value, params) { 37464 if (value === undefined || value === null) { 37465 return; 37466 } 37467 37468 var str = Twig.filters.escape('' + value), 37469 whitespace; 37470 37471 if (params && params[0]) { 37472 whitespace = '' + params[0]; 37473 } else { 37474 whitespace = " \n\r\t\f\x0B\xA0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u2028\u2029\u3000"; 37475 } 37476 37477 for (var i = 0; i < str.length; i++) { 37478 if (whitespace.indexOf(str.charAt(i)) === -1) { 37479 str = str.substring(i); 37480 break; 37481 } 37482 } 37483 37484 for (i = str.length - 1; i >= 0; i--) { 37485 if (whitespace.indexOf(str.charAt(i)) === -1) { 37486 str = str.substring(0, i + 1); 37487 break; 37488 } 37489 } 37490 37491 return whitespace.indexOf(str.charAt(0)) === -1 ? str : ''; 37492 }, 37493 truncate: function truncate(value, params) { 37494 var length = 30, 37495 preserve = false, 37496 separator = '...'; 37497 value = value + ''; 37498 37499 if (params) { 37500 if (params[0]) { 37501 length = params[0]; 37502 } 37503 37504 if (params[1]) { 37505 preserve = params[1]; 37506 } 37507 37508 if (params[2]) { 37509 separator = params[2]; 37510 } 37511 } 37512 37513 if (value.length > length) { 37514 if (preserve) { 37515 length = value.indexOf(' ', length); 37516 37517 if (length === -1) { 37518 return value; 37519 } 37520 } 37521 37522 value = value.substr(0, length) + separator; 37523 } 37524 37525 return value; 37526 }, 37527 slice: function slice(value, params) { 37528 if (value === undefined || value === null) { 37529 return; 37530 } 37531 37532 if (params === undefined || params.length < 1) { 37533 throw new Twig.Error("slice filter expects at least 1 argument"); 37534 } // default to start of string 37535 37536 37537 var start = params[0] || 0; // default to length of string 37538 37539 var length = params.length > 1 ? params[1] : value.length; // handle negative start values 37540 37541 var startIndex = start >= 0 ? start : Math.max(value.length + start, 0); 37542 37543 if (Twig.lib.is("Array", value)) { 37544 var output = []; 37545 37546 for (var i = startIndex; i < startIndex + length && i < value.length; i++) { 37547 output.push(value[i]); 37548 } 37549 37550 return output; 37551 } else if (Twig.lib.is("String", value)) { 37552 return value.substr(startIndex, length); 37553 } else { 37554 throw new Twig.Error("slice filter expects value to be an array or string"); 37555 } 37556 }, 37557 abs: function abs(value) { 37558 if (value === undefined || value === null) { 37559 return; 37560 } 37561 37562 return Math.abs(value); 37563 }, 37564 first: function first(value) { 37565 if (is("Array", value)) { 37566 return value[0]; 37567 } else if (is("Object", value)) { 37568 if ('_keys' in value) { 37569 return value[value._keys[0]]; 37570 } 37571 } else if (typeof value === "string") { 37572 return value.substr(0, 1); 37573 } 37574 37575 return; 37576 }, 37577 split: function split(value, params) { 37578 if (value === undefined || value === null) { 37579 return; 37580 } 37581 37582 if (params === undefined || params.length < 1 || params.length > 2) { 37583 throw new Twig.Error("split filter expects 1 or 2 argument"); 37584 } 37585 37586 if (Twig.lib.is("String", value)) { 37587 var delimiter = params[0], 37588 limit = params[1], 37589 split = value.split(delimiter); 37590 37591 if (limit === undefined) { 37592 return split; 37593 } else if (limit < 0) { 37594 return value.split(delimiter, split.length + limit); 37595 } else { 37596 var limitedSplit = []; 37597 37598 if (delimiter == '') { 37599 // empty delimiter 37600 // "aabbcc"|split('', 2) 37601 // -> ['aa', 'bb', 'cc'] 37602 while (split.length > 0) { 37603 var temp = ""; 37604 37605 for (var i = 0; i < limit && split.length > 0; i++) { 37606 temp += split.shift(); 37607 } 37608 37609 limitedSplit.push(temp); 37610 } 37611 } else { 37612 // non-empty delimiter 37613 // "one,two,three,four,five"|split(',', 3) 37614 // -> ['one', 'two', 'three,four,five'] 37615 for (var i = 0; i < limit - 1 && split.length > 0; i++) { 37616 limitedSplit.push(split.shift()); 37617 } 37618 37619 if (split.length > 0) { 37620 limitedSplit.push(split.join(delimiter)); 37621 } 37622 } 37623 37624 return limitedSplit; 37625 } 37626 } else { 37627 throw new Twig.Error("split filter expects value to be a string"); 37628 } 37629 }, 37630 last: function last(value) { 37631 if (Twig.lib.is('Object', value)) { 37632 var keys; 37633 37634 if (value._keys === undefined) { 37635 keys = Object.keys(value); 37636 } else { 37637 keys = value._keys; 37638 } 37639 37640 return value[keys[keys.length - 1]]; 37641 } // string|array 37642 37643 37644 return value[value.length - 1]; 37645 }, 37646 raw: function raw(value) { 37647 return Twig.Markup(value); 37648 }, 37649 batch: function batch(items, params) { 37650 var size = params.shift(), 37651 fill = params.shift(), 37652 result, 37653 last, 37654 missing; 37655 37656 if (!Twig.lib.is("Array", items)) { 37657 throw new Twig.Error("batch filter expects items to be an array"); 37658 } 37659 37660 if (!Twig.lib.is("Number", size)) { 37661 throw new Twig.Error("batch filter expects size to be a number"); 37662 } 37663 37664 size = Math.ceil(size); 37665 result = Twig.lib.chunkArray(items, size); 37666 37667 if (fill && items.length % size != 0) { 37668 last = result.pop(); 37669 missing = size - last.length; 37670 37671 while (missing--) { 37672 last.push(fill); 37673 } 37674 37675 result.push(last); 37676 } 37677 37678 return result; 37679 }, 37680 round: function round(value, params) { 37681 params = params || []; 37682 var precision = params.length > 0 ? params[0] : 0, 37683 method = params.length > 1 ? params[1] : "common"; 37684 value = parseFloat(value); 37685 37686 if (precision && !Twig.lib.is("Number", precision)) { 37687 throw new Twig.Error("round filter expects precision to be a number"); 37688 } 37689 37690 if (method === "common") { 37691 return Twig.lib.round(value, precision); 37692 } 37693 37694 if (!Twig.lib.is("Function", Math[method])) { 37695 throw new Twig.Error("round filter expects method to be 'floor', 'ceil', or 'common'"); 37696 } 37697 37698 return Math[method](value * Math.pow(10, precision)) / Math.pow(10, precision); 37699 } 37700 }; 37701 37702 Twig.filter = function (filter, value, params) { 37703 if (!Twig.filters[filter]) { 37704 throw "Unable to find filter " + filter; 37705 } 37706 37707 return Twig.filters[filter].apply(this, [value, params]); 37708 }; 37709 37710 Twig.filter.extend = function (filter, definition) { 37711 Twig.filters[filter] = definition; 37712 }; 37713 37714 return Twig; 37715 }; 37716 /***/ 37717 37718 }, 37719 /* 6 */ 37720 37721 /***/ 37722 function (module, exports) { 37723 // ## twig.functions.js 37724 // 37725 // This file handles parsing filters. 37726 module.exports = function (Twig) { 37727 /** 37728 * @constant 37729 * @type {string} 37730 */ 37731 var TEMPLATE_NOT_FOUND_MESSAGE = 'Template "{name}" is not defined.'; // Determine object type 37732 37733 function is(type, obj) { 37734 var clas = Object.prototype.toString.call(obj).slice(8, -1); 37735 return obj !== undefined && obj !== null && clas === type; 37736 } 37737 37738 Twig.functions = { 37739 // attribute, block, constant, date, dump, parent, random,. 37740 // Range function from http://phpjs.org/functions/range:499 37741 // Used under an MIT License 37742 range: function range(low, high, step) { 37743 // http://kevin.vanzonneveld.net 37744 // + original by: Waldo Malqui Silva 37745 // * example 1: range ( 0, 12 ); 37746 // * returns 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 37747 // * example 2: range( 0, 100, 10 ); 37748 // * returns 2: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 37749 // * example 3: range( 'a', 'i' ); 37750 // * returns 3: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 37751 // * example 4: range( 'c', 'a' ); 37752 // * returns 4: ['c', 'b', 'a'] 37753 var matrix = []; 37754 var inival, endval, plus; 37755 var walker = step || 1; 37756 var chars = false; 37757 37758 if (!isNaN(low) && !isNaN(high)) { 37759 inival = parseInt(low, 10); 37760 endval = parseInt(high, 10); 37761 } else if (isNaN(low) && isNaN(high)) { 37762 chars = true; 37763 inival = low.charCodeAt(0); 37764 endval = high.charCodeAt(0); 37765 } else { 37766 inival = isNaN(low) ? 0 : low; 37767 endval = isNaN(high) ? 0 : high; 37768 } 37769 37770 plus = inival > endval ? false : true; 37771 37772 if (plus) { 37773 while (inival <= endval) { 37774 matrix.push(chars ? String.fromCharCode(inival) : inival); 37775 inival += walker; 37776 } 37777 } else { 37778 while (inival >= endval) { 37779 matrix.push(chars ? String.fromCharCode(inival) : inival); 37780 inival -= walker; 37781 } 37782 } 37783 37784 return matrix; 37785 }, 37786 cycle: function cycle(arr, i) { 37787 var pos = i % arr.length; 37788 return arr[pos]; 37789 }, 37790 dump: function dump() { 37791 var EOL = '\n', 37792 indentChar = ' ', 37793 indentTimes = 0, 37794 out = '', 37795 args = Array.prototype.slice.call(arguments), 37796 indent = function indent(times) { 37797 var ind = ''; 37798 37799 while (times > 0) { 37800 times--; 37801 ind += indentChar; 37802 } 37803 37804 return ind; 37805 }, 37806 displayVar = function displayVar(variable) { 37807 out += indent(indentTimes); 37808 37809 if (_typeof2(variable) === 'object') { 37810 dumpVar(variable); 37811 } else if (typeof variable === 'function') { 37812 out += 'function()' + EOL; 37813 } else if (typeof variable === 'string') { 37814 out += 'string(' + variable.length + ') "' + variable + '"' + EOL; 37815 } else if (typeof variable === 'number') { 37816 out += 'number(' + variable + ')' + EOL; 37817 } else if (typeof variable === 'boolean') { 37818 out += 'bool(' + variable + ')' + EOL; 37819 } 37820 }, 37821 dumpVar = function dumpVar(variable) { 37822 var i; 37823 37824 if (variable === null) { 37825 out += 'NULL' + EOL; 37826 } else if (variable === undefined) { 37827 out += 'undefined' + EOL; 37828 } else if (_typeof2(variable) === 'object') { 37829 out += indent(indentTimes) + _typeof2(variable); 37830 indentTimes++; 37831 37832 out += '(' + function (obj) { 37833 var size = 0, 37834 key; 37835 37836 for (key in obj) { 37837 if (obj.hasOwnProperty(key)) { 37838 size++; 37839 } 37840 } 37841 37842 return size; 37843 }(variable) + ') {' + EOL; 37844 37845 for (i in variable) { 37846 out += indent(indentTimes) + '[' + i + ']=> ' + EOL; 37847 displayVar(variable[i]); 37848 } 37849 37850 indentTimes--; 37851 out += indent(indentTimes) + '}' + EOL; 37852 } else { 37853 displayVar(variable); 37854 } 37855 }; // handle no argument case by dumping the entire render context 37856 37857 37858 if (args.length == 0) args.push(this.context); 37859 Twig.forEach(args, function (variable) { 37860 dumpVar(variable); 37861 }); 37862 return out; 37863 }, 37864 date: function date(_date2, time) { 37865 var dateObj; 37866 37867 if (_date2 === undefined || _date2 === null || _date2 === "") { 37868 dateObj = new Date(); 37869 } else if (Twig.lib.is("Date", _date2)) { 37870 dateObj = _date2; 37871 } else if (Twig.lib.is("String", _date2)) { 37872 if (_date2.match(/^[0-9]+$/)) { 37873 dateObj = new Date(_date2 * 1000); 37874 } else { 37875 dateObj = new Date(Twig.lib.strtotime(_date2) * 1000); 37876 } 37877 } else if (Twig.lib.is("Number", _date2)) { 37878 // timestamp 37879 dateObj = new Date(_date2 * 1000); 37880 } else { 37881 throw new Twig.Error("Unable to parse date " + _date2); 37882 } 37883 37884 return dateObj; 37885 }, 37886 block: function block(_block) { 37887 if (this.originalBlockTokens[_block]) { 37888 return Twig.logic.parse.apply(this, [this.originalBlockTokens[_block], this.context]).output; 37889 } else { 37890 return this.blocks[_block]; 37891 } 37892 }, 37893 parent: function parent() { 37894 // Add a placeholder 37895 return Twig.placeholders.parent; 37896 }, 37897 attribute: function attribute(object, method, params) { 37898 if (Twig.lib.is('Object', object)) { 37899 if (object.hasOwnProperty(method)) { 37900 if (typeof object[method] === "function") { 37901 return object[method].apply(undefined, params); 37902 } else { 37903 return object[method]; 37904 } 37905 } 37906 } // Array will return element 0-index 37907 37908 37909 return object[method] || undefined; 37910 }, 37911 max: function max(values) { 37912 if (Twig.lib.is("Object", values)) { 37913 delete values["_keys"]; 37914 return Twig.lib.max(values); 37915 } 37916 37917 return Twig.lib.max.apply(null, arguments); 37918 }, 37919 min: function min(values) { 37920 if (Twig.lib.is("Object", values)) { 37921 delete values["_keys"]; 37922 return Twig.lib.min(values); 37923 } 37924 37925 return Twig.lib.min.apply(null, arguments); 37926 }, 37927 template_from_string: function template_from_string(template) { 37928 if (template === undefined) { 37929 template = ''; 37930 } 37931 37932 return Twig.Templates.parsers.twig({ 37933 options: this.options, 37934 data: template 37935 }); 37936 }, 37937 random: function random(value) { 37938 var LIMIT_INT31 = 0x80000000; 37939 37940 function getRandomNumber(n) { 37941 var random = Math.floor(Math.random() * LIMIT_INT31); 37942 var limits = [0, n]; 37943 var min = Math.min.apply(null, limits), 37944 max = Math.max.apply(null, limits); 37945 return min + Math.floor((max - min + 1) * random / LIMIT_INT31); 37946 } 37947 37948 if (Twig.lib.is("Number", value)) { 37949 return getRandomNumber(value); 37950 } 37951 37952 if (Twig.lib.is("String", value)) { 37953 return value.charAt(getRandomNumber(value.length - 1)); 37954 } 37955 37956 if (Twig.lib.is("Array", value)) { 37957 return value[getRandomNumber(value.length - 1)]; 37958 } 37959 37960 if (Twig.lib.is("Object", value)) { 37961 var keys = Object.keys(value); 37962 return value[keys[getRandomNumber(keys.length - 1)]]; 37963 } 37964 37965 return getRandomNumber(LIMIT_INT31 - 1); 37966 }, 37967 37968 /** 37969 * Returns the content of a template without rendering it 37970 * @param {string} name 37971 * @param {boolean} [ignore_missing=false] 37972 * @returns {string} 37973 */ 37974 source: function source(name, ignore_missing) { 37975 var templateSource; 37976 var templateFound = false; 37977 var isNodeEnvironment = typeof module !== 'undefined' && typeof module.exports !== 'undefined' && typeof window === 'undefined'; 37978 var loader; 37979 var path; //if we are running in a node.js environment, set the loader to 'fs' and ensure the 37980 // path is relative to the CWD of the running script 37981 //else, set the loader to 'ajax' and set the path to the value of name 37982 37983 if (isNodeEnvironment) { 37984 loader = 'fs'; 37985 path = __dirname + '/' + name; 37986 } else { 37987 loader = 'ajax'; 37988 path = name; 37989 } //build the params object 37990 37991 37992 var params = { 37993 id: name, 37994 path: path, 37995 method: loader, 37996 parser: 'source', 37997 async: false, 37998 fetchTemplateSource: true 37999 }; //default ignore_missing to false 38000 38001 if (typeof ignore_missing === 'undefined') { 38002 ignore_missing = false; 38003 } //try to load the remote template 38004 // 38005 //on exception, log it 38006 38007 38008 try { 38009 templateSource = Twig.Templates.loadRemote(name, params); //if the template is undefined or null, set the template to an empty string and do NOT flip the 38010 // boolean indicating we found the template 38011 // 38012 //else, all is good! flip the boolean indicating we found the template 38013 38014 if (typeof templateSource === 'undefined' || templateSource === null) { 38015 templateSource = ''; 38016 } else { 38017 templateFound = true; 38018 } 38019 } catch (e) { 38020 Twig.log.debug('Twig.functions.source: ', 'Problem loading template ', e); 38021 } //if the template was NOT found AND we are not ignoring missing templates, return the same message 38022 // that is returned by the PHP implementation of the twig source() function 38023 // 38024 //else, return the template source 38025 38026 38027 if (!templateFound && !ignore_missing) { 38028 return TEMPLATE_NOT_FOUND_MESSAGE.replace('{name}', name); 38029 } else { 38030 return templateSource; 38031 } 38032 } 38033 }; 38034 38035 Twig._function = function (_function, value, params) { 38036 if (!Twig.functions[_function]) { 38037 throw "Unable to find function " + _function; 38038 } 38039 38040 return Twig.functions[_function](value, params); 38041 }; 38042 38043 Twig._function.extend = function (_function, definition) { 38044 Twig.functions[_function] = definition; 38045 }; 38046 38047 return Twig; 38048 }; 38049 /***/ 38050 38051 }, 38052 /* 7 */ 38053 38054 /***/ 38055 function (module, exports, __webpack_require__) { 38056 // ## twig.lib.js 38057 // 38058 // This file contains 3rd party libraries used within twig. 38059 // 38060 // Copies of the licenses for the code included here can be found in the 38061 // LICENSES.md file. 38062 // 38063 module.exports = function (Twig) { 38064 // Namespace for libraries 38065 Twig.lib = {}; 38066 Twig.lib.sprintf = __webpack_require__(8); 38067 Twig.lib.vsprintf = __webpack_require__(9); 38068 Twig.lib.round = __webpack_require__(10); 38069 Twig.lib.max = __webpack_require__(11); 38070 Twig.lib.min = __webpack_require__(12); 38071 Twig.lib.strip_tags = __webpack_require__(13); 38072 Twig.lib.strtotime = __webpack_require__(14); 38073 Twig.lib.date = __webpack_require__(15); 38074 Twig.lib.boolval = __webpack_require__(16); 38075 38076 Twig.lib.is = function (type, obj) { 38077 var clas = Object.prototype.toString.call(obj).slice(8, -1); 38078 return obj !== undefined && obj !== null && clas === type; 38079 }; // shallow-copy an object 38080 38081 38082 Twig.lib.copy = function (src) { 38083 var target = {}, 38084 key; 38085 38086 for (key in src) { 38087 target[key] = src[key]; 38088 } 38089 38090 return target; 38091 }; 38092 38093 Twig.lib.extend = function (src, add) { 38094 var keys = Object.keys(add), 38095 i; 38096 i = keys.length; 38097 38098 while (i--) { 38099 src[keys[i]] = add[keys[i]]; 38100 } 38101 38102 return src; 38103 }; 38104 38105 Twig.lib.replaceAll = function (string, search, replace) { 38106 return string.split(search).join(replace); 38107 }; // chunk an array (arr) into arrays of (size) items, returns an array of arrays, or an empty array on invalid input 38108 38109 38110 Twig.lib.chunkArray = function (arr, size) { 38111 var returnVal = [], 38112 x = 0, 38113 len = arr.length; 38114 38115 if (size < 1 || !Twig.lib.is("Array", arr)) { 38116 return []; 38117 } 38118 38119 while (x < len) { 38120 returnVal.push(arr.slice(x, x += size)); 38121 } 38122 38123 return returnVal; 38124 }; 38125 38126 return Twig; 38127 }; 38128 /***/ 38129 38130 }, 38131 /* 8 */ 38132 38133 /***/ 38134 function (module, exports) { 38135 'use strict'; 38136 38137 module.exports = function sprintf() { 38138 // discuss at: http://locutus.io/php/sprintf/ 38139 // original by: Ash Searle (http://hexmen.com/blog/) 38140 // improved by: Michael White (http://getsprink.com) 38141 // improved by: Jack 38142 // improved by: Kevin van Zonneveld (http://kvz.io) 38143 // improved by: Kevin van Zonneveld (http://kvz.io) 38144 // improved by: Kevin van Zonneveld (http://kvz.io) 38145 // improved by: Dj 38146 // improved by: Allidylls 38147 // input by: Paulo Freitas 38148 // input by: Brett Zamir (http://brett-zamir.me) 38149 // example 1: sprintf("%01.2f", 123.1) 38150 // returns 1: '123.10' 38151 // example 2: sprintf("[%10s]", 'monkey') 38152 // returns 2: '[ monkey]' 38153 // example 3: sprintf("[%'#10s]", 'monkey') 38154 // returns 3: '[####monkey]' 38155 // example 4: sprintf("%d", 123456789012345) 38156 // returns 4: '123456789012345' 38157 // example 5: sprintf('%-03s', 'E') 38158 // returns 5: 'E00' 38159 var regex = /%%|%(\d+\$)?([-+'#0 ]*)(\*\d+\$|\*|\d+)?(?:\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g; 38160 var a = arguments; 38161 var i = 0; 38162 var format = a[i++]; 38163 38164 var _pad = function _pad(str, len, chr, leftJustify) { 38165 if (!chr) { 38166 chr = ' '; 38167 } 38168 38169 var padding = str.length >= len ? '' : new Array(1 + len - str.length >>> 0).join(chr); 38170 return leftJustify ? str + padding : padding + str; 38171 }; 38172 38173 var justify = function justify(value, prefix, leftJustify, minWidth, zeroPad, customPadChar) { 38174 var diff = minWidth - value.length; 38175 38176 if (diff > 0) { 38177 if (leftJustify || !zeroPad) { 38178 value = _pad(value, minWidth, customPadChar, leftJustify); 38179 } else { 38180 value = [value.slice(0, prefix.length), _pad('', diff, '0', true), value.slice(prefix.length)].join(''); 38181 } 38182 } 38183 38184 return value; 38185 }; 38186 38187 var _formatBaseX = function _formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad) { 38188 // Note: casts negative numbers to positive ones 38189 var number = value >>> 0; 38190 prefix = prefix && number && { 38191 '2': '0b', 38192 '8': '0', 38193 '16': '0x' 38194 }[base] || ''; 38195 value = prefix + _pad(number.toString(base), precision || 0, '0', false); 38196 return justify(value, prefix, leftJustify, minWidth, zeroPad); 38197 }; // _formatString() 38198 38199 38200 var _formatString = function _formatString(value, leftJustify, minWidth, precision, zeroPad, customPadChar) { 38201 if (precision !== null && precision !== undefined) { 38202 value = value.slice(0, precision); 38203 } 38204 38205 return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar); 38206 }; // doFormat() 38207 38208 38209 var doFormat = function doFormat(substring, valueIndex, flags, minWidth, precision, type) { 38210 var number, prefix, method, textTransform, value; 38211 38212 if (substring === '%%') { 38213 return '%'; 38214 } // parse flags 38215 38216 38217 var leftJustify = false; 38218 var positivePrefix = ''; 38219 var zeroPad = false; 38220 var prefixBaseX = false; 38221 var customPadChar = ' '; 38222 var flagsl = flags.length; 38223 var j; 38224 38225 for (j = 0; j < flagsl; j++) { 38226 switch (flags.charAt(j)) { 38227 case ' ': 38228 positivePrefix = ' '; 38229 break; 38230 38231 case '+': 38232 positivePrefix = '+'; 38233 break; 38234 38235 case '-': 38236 leftJustify = true; 38237 break; 38238 38239 case "'": 38240 customPadChar = flags.charAt(j + 1); 38241 break; 38242 38243 case '0': 38244 zeroPad = true; 38245 customPadChar = '0'; 38246 break; 38247 38248 case '#': 38249 prefixBaseX = true; 38250 break; 38251 } 38252 } // parameters may be null, undefined, empty-string or real valued 38253 // we want to ignore null, undefined and empty-string values 38254 38255 38256 if (!minWidth) { 38257 minWidth = 0; 38258 } else if (minWidth === '*') { 38259 minWidth = +a[i++]; 38260 } else if (minWidth.charAt(0) === '*') { 38261 minWidth = +a[minWidth.slice(1, -1)]; 38262 } else { 38263 minWidth = +minWidth; 38264 } // Note: undocumented perl feature: 38265 38266 38267 if (minWidth < 0) { 38268 minWidth = -minWidth; 38269 leftJustify = true; 38270 } 38271 38272 if (!isFinite(minWidth)) { 38273 throw new Error('sprintf: (minimum-)width must be finite'); 38274 } 38275 38276 if (!precision) { 38277 precision = 'fFeE'.indexOf(type) > -1 ? 6 : type === 'd' ? 0 : undefined; 38278 } else if (precision === '*') { 38279 precision = +a[i++]; 38280 } else if (precision.charAt(0) === '*') { 38281 precision = +a[precision.slice(1, -1)]; 38282 } else { 38283 precision = +precision; 38284 } // grab value using valueIndex if required? 38285 38286 38287 value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++]; 38288 38289 switch (type) { 38290 case 's': 38291 return _formatString(value + '', leftJustify, minWidth, precision, zeroPad, customPadChar); 38292 38293 case 'c': 38294 return _formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad); 38295 38296 case 'b': 38297 return _formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad); 38298 38299 case 'o': 38300 return _formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad); 38301 38302 case 'x': 38303 return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad); 38304 38305 case 'X': 38306 return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase(); 38307 38308 case 'u': 38309 return _formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad); 38310 38311 case 'i': 38312 case 'd': 38313 number = +value || 0; // Plain Math.round doesn't just truncate 38314 38315 number = Math.round(number - number % 1); 38316 prefix = number < 0 ? '-' : positivePrefix; 38317 value = prefix + _pad(String(Math.abs(number)), precision, '0', false); 38318 return justify(value, prefix, leftJustify, minWidth, zeroPad); 38319 38320 case 'e': 38321 case 'E': 38322 case 'f': // @todo: Should handle locales (as per setlocale) 38323 38324 case 'F': 38325 case 'g': 38326 case 'G': 38327 number = +value; 38328 prefix = number < 0 ? '-' : positivePrefix; 38329 method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())]; 38330 textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2]; 38331 value = prefix + Math.abs(number)[method](precision); 38332 return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform](); 38333 38334 default: 38335 return substring; 38336 } 38337 }; 38338 38339 return format.replace(regex, doFormat); 38340 }; 38341 /***/ 38342 38343 }, 38344 /* 9 */ 38345 38346 /***/ 38347 function (module, exports, __webpack_require__) { 38348 'use strict'; 38349 38350 module.exports = function vsprintf(format, args) { 38351 // discuss at: http://locutus.io/php/vsprintf/ 38352 // original by: ejsanders 38353 // example 1: vsprintf('%04d-%02d-%02d', [1988, 8, 1]) 38354 // returns 1: '1988-08-01' 38355 var sprintf = __webpack_require__(8); 38356 38357 return sprintf.apply(this, [format].concat(args)); 38358 }; 38359 /***/ 38360 38361 }, 38362 /* 10 */ 38363 38364 /***/ 38365 function (module, exports) { 38366 'use strict'; 38367 38368 module.exports = function round(value, precision, mode) { 38369 // discuss at: http://locutus.io/php/round/ 38370 // original by: Philip Peterson 38371 // revised by: Onno Marsman (https://twitter.com/onnomarsman) 38372 // revised by: T.Wild 38373 // revised by: RafaÅ Kukawski (http://blog.kukawski.pl) 38374 // input by: Greenseed 38375 // input by: meo 38376 // input by: William 38377 // input by: Josep Sanz (http://www.ws3.es/) 38378 // bugfixed by: Brett Zamir (http://brett-zamir.me) 38379 // note 1: Great work. Ideas for improvement: 38380 // note 1: - code more compliant with developer guidelines 38381 // note 1: - for implementing PHP constant arguments look at 38382 // note 1: the pathinfo() function, it offers the greatest 38383 // note 1: flexibility & compatibility possible 38384 // example 1: round(1241757, -3) 38385 // returns 1: 1242000 38386 // example 2: round(3.6) 38387 // returns 2: 4 38388 // example 3: round(2.835, 2) 38389 // returns 3: 2.84 38390 // example 4: round(1.1749999999999, 2) 38391 // returns 4: 1.17 38392 // example 5: round(58551.799999999996, 2) 38393 // returns 5: 58551.8 38394 var m, f, isHalf, sgn; // helper variables 38395 // making sure precision is integer 38396 38397 precision |= 0; 38398 m = Math.pow(10, precision); 38399 value *= m; // sign of the number 38400 38401 sgn = value > 0 | -(value < 0); 38402 isHalf = value % 1 === 0.5 * sgn; 38403 f = Math.floor(value); 38404 38405 if (isHalf) { 38406 switch (mode) { 38407 case 'PHP_ROUND_HALF_DOWN': 38408 // rounds .5 toward zero 38409 value = f + (sgn < 0); 38410 break; 38411 38412 case 'PHP_ROUND_HALF_EVEN': 38413 // rouds .5 towards the next even integer 38414 value = f + f % 2 * sgn; 38415 break; 38416 38417 case 'PHP_ROUND_HALF_ODD': 38418 // rounds .5 towards the next odd integer 38419 value = f + !(f % 2); 38420 break; 38421 38422 default: 38423 // rounds .5 away from zero 38424 value = f + (sgn > 0); 38425 } 38426 } 38427 38428 return (isHalf ? value : Math.round(value)) / m; 38429 }; 38430 /***/ 38431 38432 }, 38433 /* 11 */ 38434 38435 /***/ 38436 function (module, exports) { 38437 'use strict'; 38438 38439 var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { 38440 return _typeof2(obj); 38441 } : function (obj) { 38442 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj); 38443 }; 38444 38445 module.exports = function max() { 38446 // discuss at: http://locutus.io/php/max/ 38447 // original by: Onno Marsman (https://twitter.com/onnomarsman) 38448 // revised by: Onno Marsman (https://twitter.com/onnomarsman) 38449 // improved by: Jack 38450 // note 1: Long code cause we're aiming for maximum PHP compatibility 38451 // example 1: max(1, 3, 5, 6, 7) 38452 // returns 1: 7 38453 // example 2: max([2, 4, 5]) 38454 // returns 2: 5 38455 // example 3: max(0, 'hello') 38456 // returns 3: 0 38457 // example 4: max('hello', 0) 38458 // returns 4: 'hello' 38459 // example 5: max(-1, 'hello') 38460 // returns 5: 'hello' 38461 // example 6: max([2, 4, 8], [2, 5, 7]) 38462 // returns 6: [2, 5, 7] 38463 var ar; 38464 var retVal; 38465 var i = 0; 38466 var n = 0; 38467 var argv = arguments; 38468 var argc = argv.length; 38469 38470 var _obj2Array = function _obj2Array(obj) { 38471 if (Object.prototype.toString.call(obj) === '[object Array]') { 38472 return obj; 38473 } else { 38474 var ar = []; 38475 38476 for (var i in obj) { 38477 if (obj.hasOwnProperty(i)) { 38478 ar.push(obj[i]); 38479 } 38480 } 38481 38482 return ar; 38483 } 38484 }; 38485 38486 var _compare = function _compare(current, next) { 38487 var i = 0; 38488 var n = 0; 38489 var tmp = 0; 38490 var nl = 0; 38491 var cl = 0; 38492 38493 if (current === next) { 38494 return 0; 38495 } else if ((typeof current === 'undefined' ? 'undefined' : _typeof(current)) === 'object') { 38496 if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') { 38497 current = _obj2Array(current); 38498 next = _obj2Array(next); 38499 cl = current.length; 38500 nl = next.length; 38501 38502 if (nl > cl) { 38503 return 1; 38504 } else if (nl < cl) { 38505 return -1; 38506 } 38507 38508 for (i = 0, n = cl; i < n; ++i) { 38509 tmp = _compare(current[i], next[i]); 38510 38511 if (tmp === 1) { 38512 return 1; 38513 } else if (tmp === -1) { 38514 return -1; 38515 } 38516 } 38517 38518 return 0; 38519 } 38520 38521 return -1; 38522 } else if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') { 38523 return 1; 38524 } else if (isNaN(next) && !isNaN(current)) { 38525 if (current === 0) { 38526 return 0; 38527 } 38528 38529 return current < 0 ? 1 : -1; 38530 } else if (isNaN(current) && !isNaN(next)) { 38531 if (next === 0) { 38532 return 0; 38533 } 38534 38535 return next > 0 ? 1 : -1; 38536 } 38537 38538 if (next === current) { 38539 return 0; 38540 } 38541 38542 return next > current ? 1 : -1; 38543 }; 38544 38545 if (argc === 0) { 38546 throw new Error('At least one value should be passed to max()'); 38547 } else if (argc === 1) { 38548 if (_typeof(argv[0]) === 'object') { 38549 ar = _obj2Array(argv[0]); 38550 } else { 38551 throw new Error('Wrong parameter count for max()'); 38552 } 38553 38554 if (ar.length === 0) { 38555 throw new Error('Array must contain at least one element for max()'); 38556 } 38557 } else { 38558 ar = argv; 38559 } 38560 38561 retVal = ar[0]; 38562 38563 for (i = 1, n = ar.length; i < n; ++i) { 38564 if (_compare(retVal, ar[i]) === 1) { 38565 retVal = ar[i]; 38566 } 38567 } 38568 38569 return retVal; 38570 }; 38571 /***/ 38572 38573 }, 38574 /* 12 */ 38575 38576 /***/ 38577 function (module, exports) { 38578 'use strict'; 38579 38580 var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { 38581 return _typeof2(obj); 38582 } : function (obj) { 38583 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj); 38584 }; 38585 38586 module.exports = function min() { 38587 // discuss at: http://locutus.io/php/min/ 38588 // original by: Onno Marsman (https://twitter.com/onnomarsman) 38589 // revised by: Onno Marsman (https://twitter.com/onnomarsman) 38590 // improved by: Jack 38591 // note 1: Long code cause we're aiming for maximum PHP compatibility 38592 // example 1: min(1, 3, 5, 6, 7) 38593 // returns 1: 1 38594 // example 2: min([2, 4, 5]) 38595 // returns 2: 2 38596 // example 3: min(0, 'hello') 38597 // returns 3: 0 38598 // example 4: min('hello', 0) 38599 // returns 4: 'hello' 38600 // example 5: min(-1, 'hello') 38601 // returns 5: -1 38602 // example 6: min([2, 4, 8], [2, 5, 7]) 38603 // returns 6: [2, 4, 8] 38604 var ar; 38605 var retVal; 38606 var i = 0; 38607 var n = 0; 38608 var argv = arguments; 38609 var argc = argv.length; 38610 38611 var _obj2Array = function _obj2Array(obj) { 38612 if (Object.prototype.toString.call(obj) === '[object Array]') { 38613 return obj; 38614 } 38615 38616 var ar = []; 38617 38618 for (var i in obj) { 38619 if (obj.hasOwnProperty(i)) { 38620 ar.push(obj[i]); 38621 } 38622 } 38623 38624 return ar; 38625 }; 38626 38627 var _compare = function _compare(current, next) { 38628 var i = 0; 38629 var n = 0; 38630 var tmp = 0; 38631 var nl = 0; 38632 var cl = 0; 38633 38634 if (current === next) { 38635 return 0; 38636 } else if ((typeof current === 'undefined' ? 'undefined' : _typeof(current)) === 'object') { 38637 if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') { 38638 current = _obj2Array(current); 38639 next = _obj2Array(next); 38640 cl = current.length; 38641 nl = next.length; 38642 38643 if (nl > cl) { 38644 return 1; 38645 } else if (nl < cl) { 38646 return -1; 38647 } 38648 38649 for (i = 0, n = cl; i < n; ++i) { 38650 tmp = _compare(current[i], next[i]); 38651 38652 if (tmp === 1) { 38653 return 1; 38654 } else if (tmp === -1) { 38655 return -1; 38656 } 38657 } 38658 38659 return 0; 38660 } 38661 38662 return -1; 38663 } else if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') { 38664 return 1; 38665 } else if (isNaN(next) && !isNaN(current)) { 38666 if (current === 0) { 38667 return 0; 38668 } 38669 38670 return current < 0 ? 1 : -1; 38671 } else if (isNaN(current) && !isNaN(next)) { 38672 if (next === 0) { 38673 return 0; 38674 } 38675 38676 return next > 0 ? 1 : -1; 38677 } 38678 38679 if (next === current) { 38680 return 0; 38681 } 38682 38683 return next > current ? 1 : -1; 38684 }; 38685 38686 if (argc === 0) { 38687 throw new Error('At least one value should be passed to min()'); 38688 } else if (argc === 1) { 38689 if (_typeof(argv[0]) === 'object') { 38690 ar = _obj2Array(argv[0]); 38691 } else { 38692 throw new Error('Wrong parameter count for min()'); 38693 } 38694 38695 if (ar.length === 0) { 38696 throw new Error('Array must contain at least one element for min()'); 38697 } 38698 } else { 38699 ar = argv; 38700 } 38701 38702 retVal = ar[0]; 38703 38704 for (i = 1, n = ar.length; i < n; ++i) { 38705 if (_compare(retVal, ar[i]) === -1) { 38706 retVal = ar[i]; 38707 } 38708 } 38709 38710 return retVal; 38711 }; 38712 /***/ 38713 38714 }, 38715 /* 13 */ 38716 38717 /***/ 38718 function (module, exports) { 38719 'use strict'; 38720 38721 module.exports = function strip_tags(input, allowed) { 38722 // eslint-disable-line camelcase 38723 // discuss at: http://locutus.io/php/strip_tags/ 38724 // original by: Kevin van Zonneveld (http://kvz.io) 38725 // improved by: Luke Godfrey 38726 // improved by: Kevin van Zonneveld (http://kvz.io) 38727 // input by: Pul 38728 // input by: Alex 38729 // input by: Marc Palau 38730 // input by: Brett Zamir (http://brett-zamir.me) 38731 // input by: Bobby Drake 38732 // input by: Evertjan Garretsen 38733 // bugfixed by: Kevin van Zonneveld (http://kvz.io) 38734 // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman) 38735 // bugfixed by: Kevin van Zonneveld (http://kvz.io) 38736 // bugfixed by: Kevin van Zonneveld (http://kvz.io) 38737 // bugfixed by: Eric Nagel 38738 // bugfixed by: Kevin van Zonneveld (http://kvz.io) 38739 // bugfixed by: Tomasz Wesolowski 38740 // revised by: RafaÅ Kukawski (http://blog.kukawski.pl) 38741 // example 1: strip_tags('<p>Kevin</p> <br /><b>van</b> <i>Zonneveld</i>', '<i><b>') 38742 // returns 1: 'Kevin <b>van</b> <i>Zonneveld</i>' 38743 // example 2: strip_tags('<p>Kevin <img src="someimage.png" onmouseover="someFunction()">van <i>Zonneveld</i></p>', '<p>') 38744 // returns 2: '<p>Kevin van Zonneveld</p>' 38745 // example 3: strip_tags("<a href='http://kvz.io'>Kevin van Zonneveld</a>", "<a>") 38746 // returns 3: "<a href='http://kvz.io'>Kevin van Zonneveld</a>" 38747 // example 4: strip_tags('1 < 5 5 > 1') 38748 // returns 4: '1 < 5 5 > 1' 38749 // example 5: strip_tags('1 <br/> 1') 38750 // returns 5: '1 1' 38751 // example 6: strip_tags('1 <br/> 1', '<br>') 38752 // returns 6: '1 <br/> 1' 38753 // example 7: strip_tags('1 <br/> 1', '<br><br/>') 38754 // returns 7: '1 <br/> 1' 38755 // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>) 38756 allowed = (((allowed || '') + '').toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); 38757 var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi; 38758 var commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; 38759 return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) { 38760 return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : ''; 38761 }); 38762 }; 38763 /***/ 38764 38765 }, 38766 /* 14 */ 38767 38768 /***/ 38769 function (module, exports) { 38770 'use strict'; 38771 38772 module.exports = function strtotime(text, now) { 38773 // discuss at: http://locutus.io/php/strtotime/ 38774 // original by: Caio Ariede (http://caioariede.com) 38775 // improved by: Kevin van Zonneveld (http://kvz.io) 38776 // improved by: Caio Ariede (http://caioariede.com) 38777 // improved by: A. MatÃas Quezada (http://amatiasq.com) 38778 // improved by: preuter 38779 // improved by: Brett Zamir (http://brett-zamir.me) 38780 // improved by: Mirko Faber 38781 // input by: David 38782 // bugfixed by: Wagner B. Soares 38783 // bugfixed by: Artur Tchernychev 38784 // bugfixed by: Stephan Bösch-Plepelits (http://github.com/plepe) 38785 // note 1: Examples all have a fixed timestamp to prevent 38786 // note 1: tests to fail because of variable time(zones) 38787 // example 1: strtotime('+1 day', 1129633200) 38788 // returns 1: 1129719600 38789 // example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200) 38790 // returns 2: 1130425202 38791 // example 3: strtotime('last month', 1129633200) 38792 // returns 3: 1127041200 38793 // example 4: strtotime('2009-05-04 08:30:00 GMT') 38794 // returns 4: 1241425800 38795 // example 5: strtotime('2009-05-04 08:30:00+00') 38796 // returns 5: 1241425800 38797 // example 6: strtotime('2009-05-04 08:30:00+02:00') 38798 // returns 6: 1241418600 38799 // example 7: strtotime('2009-05-04T08:30:00Z') 38800 // returns 7: 1241425800 38801 var parsed; 38802 var match; 38803 var today; 38804 var year; 38805 var date; 38806 var days; 38807 var ranges; 38808 var len; 38809 var times; 38810 var regex; 38811 var i; 38812 var fail = false; 38813 38814 if (!text) { 38815 return fail; 38816 } // Unecessary spaces 38817 38818 38819 text = text.replace(/^\s+|\s+$/g, '').replace(/\s{2,}/g, ' ').replace(/[\t\r\n]/g, '').toLowerCase(); // in contrast to php, js Date.parse function interprets: 38820 // dates given as yyyy-mm-dd as in timezone: UTC, 38821 // dates with "." or "-" as MDY instead of DMY 38822 // dates with two-digit years differently 38823 // etc...etc... 38824 // ...therefore we manually parse lots of common date formats 38825 38826 var pattern = new RegExp(['^(\\d{1,4})', '([\\-\\.\\/:])', '(\\d{1,2})', '([\\-\\.\\/:])', '(\\d{1,4})', '(?:\\s(\\d{1,2}):(\\d{2})?:?(\\d{2})?)?', '(?:\\s([A-Z]+)?)?$'].join('')); 38827 match = text.match(pattern); 38828 38829 if (match && match[2] === match[4]) { 38830 if (match[1] > 1901) { 38831 switch (match[2]) { 38832 case '-': 38833 // YYYY-M-D 38834 if (match[3] > 12 || match[5] > 31) { 38835 return fail; 38836 } 38837 38838 return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38839 38840 case '.': 38841 // YYYY.M.D is not parsed by strtotime() 38842 return fail; 38843 38844 case '/': 38845 // YYYY/M/D 38846 if (match[3] > 12 || match[5] > 31) { 38847 return fail; 38848 } 38849 38850 return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38851 } 38852 } else if (match[5] > 1901) { 38853 switch (match[2]) { 38854 case '-': 38855 // D-M-YYYY 38856 if (match[3] > 12 || match[1] > 31) { 38857 return fail; 38858 } 38859 38860 return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38861 38862 case '.': 38863 // D.M.YYYY 38864 if (match[3] > 12 || match[1] > 31) { 38865 return fail; 38866 } 38867 38868 return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38869 38870 case '/': 38871 // M/D/YYYY 38872 if (match[1] > 12 || match[3] > 31) { 38873 return fail; 38874 } 38875 38876 return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38877 } 38878 } else { 38879 switch (match[2]) { 38880 case '-': 38881 // YY-M-D 38882 if (match[3] > 12 || match[5] > 31 || match[1] < 70 && match[1] > 38) { 38883 return fail; 38884 } 38885 38886 year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1]; 38887 return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38888 38889 case '.': 38890 // D.M.YY or H.MM.SS 38891 if (match[5] >= 70) { 38892 // D.M.YY 38893 if (match[3] > 12 || match[1] > 31) { 38894 return fail; 38895 } 38896 38897 return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38898 } 38899 38900 if (match[5] < 60 && !match[6]) { 38901 // H.MM.SS 38902 if (match[1] > 23 || match[3] > 59) { 38903 return fail; 38904 } 38905 38906 today = new Date(); 38907 return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000; 38908 } // invalid format, cannot be parsed 38909 38910 38911 return fail; 38912 38913 case '/': 38914 // M/D/YY 38915 if (match[1] > 12 || match[3] > 31 || match[5] < 70 && match[5] > 38) { 38916 return fail; 38917 } 38918 38919 year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5]; 38920 return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; 38921 38922 case ':': 38923 // HH:MM:SS 38924 if (match[1] > 23 || match[3] > 59 || match[5] > 59) { 38925 return fail; 38926 } 38927 38928 today = new Date(); 38929 return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000; 38930 } 38931 } 38932 } // other formats and "now" should be parsed by Date.parse() 38933 38934 38935 if (text === 'now') { 38936 return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0; 38937 } 38938 38939 if (!isNaN(parsed = Date.parse(text))) { 38940 return parsed / 1000 | 0; 38941 } // Browsers !== Chrome have problems parsing ISO 8601 date strings, as they do 38942 // not accept lower case characters, space, or shortened time zones. 38943 // Therefore, fix these problems and try again. 38944 // Examples: 38945 // 2015-04-15 20:33:59+02 38946 // 2015-04-15 20:33:59z 38947 // 2015-04-15t20:33:59+02:00 38948 38949 38950 pattern = new RegExp(['^([0-9]{4}-[0-9]{2}-[0-9]{2})', '[ t]', '([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)', '([\\+-][0-9]{2}(:[0-9]{2})?|z)'].join('')); 38951 match = text.match(pattern); 38952 38953 if (match) { 38954 // @todo: time zone information 38955 if (match[4] === 'z') { 38956 match[4] = 'Z'; 38957 } else if (match[4].match(/^([+-][0-9]{2})$/)) { 38958 match[4] = match[4] + ':00'; 38959 } 38960 38961 if (!isNaN(parsed = Date.parse(match[1] + 'T' + match[2] + match[4]))) { 38962 return parsed / 1000 | 0; 38963 } 38964 } 38965 38966 date = now ? new Date(now * 1000) : new Date(); 38967 days = { 38968 'sun': 0, 38969 'mon': 1, 38970 'tue': 2, 38971 'wed': 3, 38972 'thu': 4, 38973 'fri': 5, 38974 'sat': 6 38975 }; 38976 ranges = { 38977 'yea': 'FullYear', 38978 'mon': 'Month', 38979 'day': 'Date', 38980 'hou': 'Hours', 38981 'min': 'Minutes', 38982 'sec': 'Seconds' 38983 }; 38984 38985 function lastNext(type, range, modifier) { 38986 var diff; 38987 var day = days[range]; 38988 38989 if (typeof day !== 'undefined') { 38990 diff = day - date.getDay(); 38991 38992 if (diff === 0) { 38993 diff = 7 * modifier; 38994 } else if (diff > 0 && type === 'last') { 38995 diff -= 7; 38996 } else if (diff < 0 && type === 'next') { 38997 diff += 7; 38998 } 38999 39000 date.setDate(date.getDate() + diff); 39001 } 39002 } 39003 39004 function process(val) { 39005 // @todo: Reconcile this with regex using \s, taking into account 39006 // browser issues with split and regexes 39007 var splt = val.split(' '); 39008 var type = splt[0]; 39009 var range = splt[1].substring(0, 3); 39010 var typeIsNumber = /\d+/.test(type); 39011 var ago = splt[2] === 'ago'; 39012 var num = (type === 'last' ? -1 : 1) * (ago ? -1 : 1); 39013 39014 if (typeIsNumber) { 39015 num *= parseInt(type, 10); 39016 } 39017 39018 if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) { 39019 return date['set' + ranges[range]](date['get' + ranges[range]]() + num); 39020 } 39021 39022 if (range === 'wee') { 39023 return date.setDate(date.getDate() + num * 7); 39024 } 39025 39026 if (type === 'next' || type === 'last') { 39027 lastNext(type, range, num); 39028 } else if (!typeIsNumber) { 39029 return false; 39030 } 39031 39032 return true; 39033 } 39034 39035 times = '(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec' + '|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?' + '|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)'; 39036 regex = '([+-]?\\d+\\s' + times + '|' + '(last|next)\\s' + times + ')(\\sago)?'; 39037 match = text.match(new RegExp(regex, 'gi')); 39038 39039 if (!match) { 39040 return fail; 39041 } 39042 39043 for (i = 0, len = match.length; i < len; i++) { 39044 if (!process(match[i])) { 39045 return fail; 39046 } 39047 } 39048 39049 return date.getTime() / 1000; 39050 }; 39051 /***/ 39052 39053 }, 39054 /* 15 */ 39055 39056 /***/ 39057 function (module, exports) { 39058 'use strict'; 39059 39060 module.exports = function date(format, timestamp) { 39061 // discuss at: http://locutus.io/php/date/ 39062 // original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com) 39063 // original by: gettimeofday 39064 // parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html) 39065 // improved by: Kevin van Zonneveld (http://kvz.io) 39066 // improved by: MeEtc (http://yass.meetcweb.com) 39067 // improved by: Brad Touesnard 39068 // improved by: Tim Wiel 39069 // improved by: Bryan Elliott 39070 // improved by: David Randall 39071 // improved by: Theriault (https://github.com/Theriault) 39072 // improved by: Theriault (https://github.com/Theriault) 39073 // improved by: Brett Zamir (http://brett-zamir.me) 39074 // improved by: Theriault (https://github.com/Theriault) 39075 // improved by: Thomas Beaucourt (http://www.webapp.fr) 39076 // improved by: JT 39077 // improved by: Theriault (https://github.com/Theriault) 39078 // improved by: RafaÅ Kukawski (http://blog.kukawski.pl) 39079 // improved by: Theriault (https://github.com/Theriault) 39080 // input by: Brett Zamir (http://brett-zamir.me) 39081 // input by: majak 39082 // input by: Alex 39083 // input by: Martin 39084 // input by: Alex Wilson 39085 // input by: Haravikk 39086 // bugfixed by: Kevin van Zonneveld (http://kvz.io) 39087 // bugfixed by: majak 39088 // bugfixed by: Kevin van Zonneveld (http://kvz.io) 39089 // bugfixed by: Brett Zamir (http://brett-zamir.me) 39090 // bugfixed by: omid (http://locutus.io/php/380:380#comment_137122) 39091 // bugfixed by: Chris (http://www.devotis.nl/) 39092 // note 1: Uses global: locutus to store the default timezone 39093 // note 1: Although the function potentially allows timezone info 39094 // note 1: (see notes), it currently does not set 39095 // note 1: per a timezone specified by date_default_timezone_set(). Implementers might use 39096 // note 1: $locutus.currentTimezoneOffset and 39097 // note 1: $locutus.currentTimezoneDST set by that function 39098 // note 1: in order to adjust the dates in this function 39099 // note 1: (or our other date functions!) accordingly 39100 // example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400) 39101 // returns 1: '07:09:40 m is month' 39102 // example 2: date('F j, Y, g:i a', 1062462400) 39103 // returns 2: 'September 2, 2003, 12:26 am' 39104 // example 3: date('Y W o', 1062462400) 39105 // returns 3: '2003 36 2003' 39106 // example 4: var $x = date('Y m d', (new Date()).getTime() / 1000) 39107 // example 4: $x = $x + '' 39108 // example 4: var $result = $x.length // 2009 01 09 39109 // returns 4: 10 39110 // example 5: date('W', 1104534000) 39111 // returns 5: '52' 39112 // example 6: date('B t', 1104534000) 39113 // returns 6: '999 31' 39114 // example 7: date('W U', 1293750000.82); // 2010-12-31 39115 // returns 7: '52 1293750000' 39116 // example 8: date('W', 1293836400); // 2011-01-01 39117 // returns 8: '52' 39118 // example 9: date('W Y-m-d', 1293974054); // 2011-01-02 39119 // returns 9: '52 2011-01-02' 39120 // test: skip-1 skip-2 skip-5 39121 var jsdate, f; // Keep this here (works, but for code commented-out below for file size reasons) 39122 // var tal= []; 39123 39124 var txtWords = ['Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; // trailing backslash -> (dropped) 39125 // a backslash followed by any character (including backslash) -> the character 39126 // empty string -> empty string 39127 39128 var formatChr = /\\?(.?)/gi; 39129 39130 var formatChrCb = function formatChrCb(t, s) { 39131 return f[t] ? f[t]() : s; 39132 }; 39133 39134 var _pad = function _pad(n, c) { 39135 n = String(n); 39136 39137 while (n.length < c) { 39138 n = '0' + n; 39139 } 39140 39141 return n; 39142 }; 39143 39144 f = { 39145 // Day 39146 d: function d() { 39147 // Day of month w/leading 0; 01..31 39148 return _pad(f.j(), 2); 39149 }, 39150 D: function D() { 39151 // Shorthand day name; Mon...Sun 39152 return f.l().slice(0, 3); 39153 }, 39154 j: function j() { 39155 // Day of month; 1..31 39156 return jsdate.getDate(); 39157 }, 39158 l: function l() { 39159 // Full day name; Monday...Sunday 39160 return txtWords[f.w()] + 'day'; 39161 }, 39162 N: function N() { 39163 // ISO-8601 day of week; 1[Mon]..7[Sun] 39164 return f.w() || 7; 39165 }, 39166 S: function S() { 39167 // Ordinal suffix for day of month; st, nd, rd, th 39168 var j = f.j(); 39169 var i = j % 10; 39170 39171 if (i <= 3 && parseInt(j % 100 / 10, 10) === 1) { 39172 i = 0; 39173 } 39174 39175 return ['st', 'nd', 'rd'][i - 1] || 'th'; 39176 }, 39177 w: function w() { 39178 // Day of week; 0[Sun]..6[Sat] 39179 return jsdate.getDay(); 39180 }, 39181 z: function z() { 39182 // Day of year; 0..365 39183 var a = new Date(f.Y(), f.n() - 1, f.j()); 39184 var b = new Date(f.Y(), 0, 1); 39185 return Math.round((a - b) / 864e5); 39186 }, 39187 // Week 39188 W: function W() { 39189 // ISO-8601 week number 39190 var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3); 39191 var b = new Date(a.getFullYear(), 0, 4); 39192 return _pad(1 + Math.round((a - b) / 864e5 / 7), 2); 39193 }, 39194 // Month 39195 F: function F() { 39196 // Full month name; January...December 39197 return txtWords[6 + f.n()]; 39198 }, 39199 m: function m() { 39200 // Month w/leading 0; 01...12 39201 return _pad(f.n(), 2); 39202 }, 39203 M: function M() { 39204 // Shorthand month name; Jan...Dec 39205 return f.F().slice(0, 3); 39206 }, 39207 n: function n() { 39208 // Month; 1...12 39209 return jsdate.getMonth() + 1; 39210 }, 39211 t: function t() { 39212 // Days in month; 28...31 39213 return new Date(f.Y(), f.n(), 0).getDate(); 39214 }, 39215 // Year 39216 L: function L() { 39217 // Is leap year?; 0 or 1 39218 var j = f.Y(); 39219 return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0; 39220 }, 39221 o: function o() { 39222 // ISO-8601 year 39223 var n = f.n(); 39224 var W = f.W(); 39225 var Y = f.Y(); 39226 return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0); 39227 }, 39228 Y: function Y() { 39229 // Full year; e.g. 1980...2010 39230 return jsdate.getFullYear(); 39231 }, 39232 y: function y() { 39233 // Last two digits of year; 00...99 39234 return f.Y().toString().slice(-2); 39235 }, 39236 // Time 39237 a: function a() { 39238 // am or pm 39239 return jsdate.getHours() > 11 ? 'pm' : 'am'; 39240 }, 39241 A: function A() { 39242 // AM or PM 39243 return f.a().toUpperCase(); 39244 }, 39245 B: function B() { 39246 // Swatch Internet time; 000..999 39247 var H = jsdate.getUTCHours() * 36e2; // Hours 39248 39249 var i = jsdate.getUTCMinutes() * 60; // Minutes 39250 // Seconds 39251 39252 var s = jsdate.getUTCSeconds(); 39253 return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3); 39254 }, 39255 g: function g() { 39256 // 12-Hours; 1..12 39257 return f.G() % 12 || 12; 39258 }, 39259 G: function G() { 39260 // 24-Hours; 0..23 39261 return jsdate.getHours(); 39262 }, 39263 h: function h() { 39264 // 12-Hours w/leading 0; 01..12 39265 return _pad(f.g(), 2); 39266 }, 39267 H: function H() { 39268 // 24-Hours w/leading 0; 00..23 39269 return _pad(f.G(), 2); 39270 }, 39271 i: function i() { 39272 // Minutes w/leading 0; 00..59 39273 return _pad(jsdate.getMinutes(), 2); 39274 }, 39275 s: function s() { 39276 // Seconds w/leading 0; 00..59 39277 return _pad(jsdate.getSeconds(), 2); 39278 }, 39279 u: function u() { 39280 // Microseconds; 000000-999000 39281 return _pad(jsdate.getMilliseconds() * 1000, 6); 39282 }, 39283 // Timezone 39284 e: function e() { 39285 // Timezone identifier; e.g. Atlantic/Azores, ... 39286 // The following works, but requires inclusion of the very large 39287 // timezone_abbreviations_list() function. 39288 39289 /* return that.date_default_timezone_get(); 39290 */ 39291 var msg = 'Not supported (see source code of date() for timezone on how to add support)'; 39292 throw new Error(msg); 39293 }, 39294 I: function I() { 39295 // DST observed?; 0 or 1 39296 // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC. 39297 // If they are not equal, then DST is observed. 39298 var a = new Date(f.Y(), 0); // Jan 1 39299 39300 var c = Date.UTC(f.Y(), 0); // Jan 1 UTC 39301 39302 var b = new Date(f.Y(), 6); // Jul 1 39303 // Jul 1 UTC 39304 39305 var d = Date.UTC(f.Y(), 6); 39306 return a - c !== b - d ? 1 : 0; 39307 }, 39308 O: function O() { 39309 // Difference to GMT in hour format; e.g. +0200 39310 var tzo = jsdate.getTimezoneOffset(); 39311 var a = Math.abs(tzo); 39312 return (tzo > 0 ? '-' : '+') + _pad(Math.floor(a / 60) * 100 + a % 60, 4); 39313 }, 39314 P: function P() { 39315 // Difference to GMT w/colon; e.g. +02:00 39316 var O = f.O(); 39317 return O.substr(0, 3) + ':' + O.substr(3, 2); 39318 }, 39319 T: function T() { 39320 // The following works, but requires inclusion of the very 39321 // large timezone_abbreviations_list() function. 39322 39323 /* var abbr, i, os, _default; 39324 if (!tal.length) { 39325 tal = that.timezone_abbreviations_list(); 39326 } 39327 if ($locutus && $locutus.default_timezone) { 39328 _default = $locutus.default_timezone; 39329 for (abbr in tal) { 39330 for (i = 0; i < tal[abbr].length; i++) { 39331 if (tal[abbr][i].timezone_id === _default) { 39332 return abbr.toUpperCase(); 39333 } 39334 } 39335 } 39336 } 39337 for (abbr in tal) { 39338 for (i = 0; i < tal[abbr].length; i++) { 39339 os = -jsdate.getTimezoneOffset() * 60; 39340 if (tal[abbr][i].offset === os) { 39341 return abbr.toUpperCase(); 39342 } 39343 } 39344 } 39345 */ 39346 return 'UTC'; 39347 }, 39348 Z: function Z() { 39349 // Timezone offset in seconds (-43200...50400) 39350 return -jsdate.getTimezoneOffset() * 60; 39351 }, 39352 // Full Date/Time 39353 c: function c() { 39354 // ISO-8601 date. 39355 return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb); 39356 }, 39357 r: function r() { 39358 // RFC 2822 39359 return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb); 39360 }, 39361 U: function U() { 39362 // Seconds since UNIX epoch 39363 return jsdate / 1000 | 0; 39364 } 39365 }; 39366 39367 var _date = function _date(format, timestamp) { 39368 jsdate = timestamp === undefined ? new Date() // Not provided 39369 : timestamp instanceof Date ? new Date(timestamp) // JS Date() 39370 : new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int) 39371 ; 39372 return format.replace(formatChr, formatChrCb); 39373 }; 39374 39375 return _date(format, timestamp); 39376 }; 39377 /***/ 39378 39379 }, 39380 /* 16 */ 39381 39382 /***/ 39383 function (module, exports) { 39384 'use strict'; 39385 39386 module.exports = function boolval(mixedVar) { 39387 // original by: Will Rowe 39388 // example 1: boolval(true) 39389 // returns 1: true 39390 // example 2: boolval(false) 39391 // returns 2: false 39392 // example 3: boolval(0) 39393 // returns 3: false 39394 // example 4: boolval(0.0) 39395 // returns 4: false 39396 // example 5: boolval('') 39397 // returns 5: false 39398 // example 6: boolval('0') 39399 // returns 6: false 39400 // example 7: boolval([]) 39401 // returns 7: false 39402 // example 8: boolval('') 39403 // returns 8: false 39404 // example 9: boolval(null) 39405 // returns 9: false 39406 // example 10: boolval(undefined) 39407 // returns 10: false 39408 // example 11: boolval('true') 39409 // returns 11: true 39410 if (mixedVar === false) { 39411 return false; 39412 } 39413 39414 if (mixedVar === 0 || mixedVar === 0.0) { 39415 return false; 39416 } 39417 39418 if (mixedVar === '' || mixedVar === '0') { 39419 return false; 39420 } 39421 39422 if (Array.isArray(mixedVar) && mixedVar.length === 0) { 39423 return false; 39424 } 39425 39426 if (mixedVar === null || mixedVar === undefined) { 39427 return false; 39428 } 39429 39430 return true; 39431 }; 39432 /***/ 39433 39434 }, 39435 /* 17 */ 39436 39437 /***/ 39438 function (module, exports) { 39439 module.exports = function (Twig) { 39440 'use strict'; 39441 39442 Twig.Templates.registerLoader('ajax', function (location, params, callback, error_callback) { 39443 var template, 39444 xmlhttp, 39445 precompiled = params.precompiled, 39446 parser = this.parsers[params.parser] || this.parser.twig; 39447 39448 if (typeof XMLHttpRequest === "undefined") { 39449 throw new Twig.Error('Unsupported platform: Unable to do ajax requests ' + 'because there is no "XMLHTTPRequest" implementation'); 39450 } 39451 39452 xmlhttp = new XMLHttpRequest(); 39453 39454 xmlhttp.onreadystatechange = function () { 39455 var data = null; 39456 39457 if (xmlhttp.readyState === 4) { 39458 if (xmlhttp.status === 200 || window.cordova && xmlhttp.status == 0) { 39459 Twig.log.debug("Got template ", xmlhttp.responseText); 39460 39461 if (precompiled === true) { 39462 data = JSON.parse(xmlhttp.responseText); 39463 } else { 39464 data = xmlhttp.responseText; 39465 } 39466 39467 params.url = location; 39468 params.data = data; 39469 template = parser.call(this, params); 39470 39471 if (typeof callback === 'function') { 39472 callback(template); 39473 } 39474 } else { 39475 if (typeof error_callback === 'function') { 39476 error_callback(xmlhttp); 39477 } 39478 } 39479 } 39480 }; 39481 39482 xmlhttp.open("GET", location, !!params.async); 39483 xmlhttp.send(); 39484 39485 if (params.async) { 39486 // TODO: return deferred promise 39487 return true; 39488 } else { 39489 return template; 39490 } 39491 }); 39492 }; 39493 /***/ 39494 39495 }, 39496 /* 18 */ 39497 39498 /***/ 39499 function (module, exports, __webpack_require__) { 39500 module.exports = function (Twig) { 39501 'use strict'; 39502 39503 var fs, path; 39504 39505 try { 39506 // require lib dependencies at runtime 39507 fs = __webpack_require__(19); 39508 path = __webpack_require__(20); 39509 } catch (e) {// NOTE: this is in a try/catch to avoid errors cross platform 39510 } 39511 39512 Twig.Templates.registerLoader('fs', function (location, params, callback, error_callback) { 39513 var template, 39514 data = null, 39515 precompiled = params.precompiled, 39516 parser = this.parsers[params.parser] || this.parser.twig; 39517 39518 if (!fs || !path) { 39519 throw new Twig.Error('Unsupported platform: Unable to load from file ' + 'because there is no "fs" or "path" implementation'); 39520 } 39521 39522 var loadTemplateFn = function loadTemplateFn(err, data) { 39523 if (err) { 39524 if (typeof error_callback === 'function') { 39525 error_callback(err); 39526 } 39527 39528 return; 39529 } 39530 39531 if (precompiled === true) { 39532 data = JSON.parse(data); 39533 } 39534 39535 params.data = data; 39536 params.path = params.path || location; // template is in data 39537 39538 template = parser.call(this, params); 39539 39540 if (typeof callback === 'function') { 39541 callback(template); 39542 } 39543 }; 39544 39545 params.path = params.path || location; 39546 39547 if (params.async) { 39548 fs.stat(params.path, function (err, stats) { 39549 if (err || !stats.isFile()) { 39550 if (typeof error_callback === 'function') { 39551 error_callback(new Twig.Error('Unable to find template file ' + params.path)); 39552 } 39553 39554 return; 39555 } 39556 39557 fs.readFile(params.path, 'utf8', loadTemplateFn); 39558 }); // TODO: return deferred promise 39559 39560 return true; 39561 } else { 39562 try { 39563 if (!fs.statSync(params.path).isFile()) { 39564 throw new Twig.Error('Unable to find template file ' + params.path); 39565 } 39566 } catch (err) { 39567 throw new Twig.Error('Unable to find template file ' + params.path); 39568 } 39569 39570 data = fs.readFileSync(params.path, 'utf8'); 39571 loadTemplateFn(undefined, data); 39572 return template; 39573 } 39574 }); 39575 }; 39576 /***/ 39577 39578 }, 39579 /* 19 */ 39580 39581 /***/ 39582 function (module, exports) { 39583 module.exports = __webpack_require__(/*! fs */ 2); 39584 /***/ 39585 }, 39586 /* 20 */ 39587 39588 /***/ 39589 function (module, exports) { 39590 module.exports = __webpack_require__(/*! path */ "../node_modules/path-browserify/index.js"); 39591 /***/ 39592 }, 39593 /* 21 */ 39594 39595 /***/ 39596 function (module, exports) { 39597 // ## twig.logic.js 39598 // 39599 // This file handles tokenizing, compiling and parsing logic tokens. {% ... %} 39600 module.exports = function (Twig) { 39601 "use strict"; 39602 /** 39603 * Namespace for logic handling. 39604 */ 39605 39606 Twig.logic = {}; 39607 /** 39608 * Logic token types. 39609 */ 39610 39611 Twig.logic.type = { 39612 if_: 'Twig.logic.type.if', 39613 endif: 'Twig.logic.type.endif', 39614 for_: 'Twig.logic.type.for', 39615 endfor: 'Twig.logic.type.endfor', 39616 else_: 'Twig.logic.type.else', 39617 elseif: 'Twig.logic.type.elseif', 39618 set: 'Twig.logic.type.set', 39619 setcapture: 'Twig.logic.type.setcapture', 39620 endset: 'Twig.logic.type.endset', 39621 filter: 'Twig.logic.type.filter', 39622 endfilter: 'Twig.logic.type.endfilter', 39623 shortblock: 'Twig.logic.type.shortblock', 39624 block: 'Twig.logic.type.block', 39625 endblock: 'Twig.logic.type.endblock', 39626 extends_: 'Twig.logic.type.extends', 39627 use: 'Twig.logic.type.use', 39628 include: 'Twig.logic.type.include', 39629 spaceless: 'Twig.logic.type.spaceless', 39630 endspaceless: 'Twig.logic.type.endspaceless', 39631 macro: 'Twig.logic.type.macro', 39632 endmacro: 'Twig.logic.type.endmacro', 39633 import_: 'Twig.logic.type.import', 39634 from: 'Twig.logic.type.from', 39635 embed: 'Twig.logic.type.embed', 39636 endembed: 'Twig.logic.type.endembed' 39637 }; // Regular expressions for handling logic tokens. 39638 // 39639 // Properties: 39640 // 39641 // type: The type of expression this matches 39642 // 39643 // regex: A regular expression that matches the format of the token 39644 // 39645 // next: What logic tokens (if any) pop this token off the logic stack. If empty, the 39646 // logic token is assumed to not require an end tag and isn't push onto the stack. 39647 // 39648 // open: Does this tag open a logic expression or is it standalone. For example, 39649 // {% endif %} cannot exist without an opening {% if ... %} tag, so open = false. 39650 // 39651 // Functions: 39652 // 39653 // compile: A function that handles compiling the token into an output token ready for 39654 // parsing with the parse function. 39655 // 39656 // parse: A function that parses the compiled token into output (HTML / whatever the 39657 // template represents). 39658 39659 Twig.logic.definitions = [{ 39660 /** 39661 * If type logic tokens. 39662 * 39663 * Format: {% if expression %} 39664 */ 39665 type: Twig.logic.type.if_, 39666 regex: /^if\s+([\s\S]+)$/, 39667 next: [Twig.logic.type.else_, Twig.logic.type.elseif, Twig.logic.type.endif], 39668 open: true, 39669 compile: function compile(token) { 39670 var expression = token.match[1]; // Compile the expression. 39671 39672 token.stack = Twig.expression.compile.apply(this, [{ 39673 type: Twig.expression.type.expression, 39674 value: expression 39675 }]).stack; 39676 delete token.match; 39677 return token; 39678 }, 39679 parse: function parse(token, context, chain) { 39680 var that = this; 39681 return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (result) { 39682 chain = true; 39683 39684 if (Twig.lib.boolval(result)) { 39685 chain = false; 39686 return Twig.parseAsync.apply(that, [token.output, context]); 39687 } 39688 39689 return ''; 39690 }).then(function (output) { 39691 return { 39692 chain: chain, 39693 output: output 39694 }; 39695 }); 39696 } 39697 }, { 39698 /** 39699 * Else if type logic tokens. 39700 * 39701 * Format: {% elseif expression %} 39702 */ 39703 type: Twig.logic.type.elseif, 39704 regex: /^elseif\s+([^\s].*)$/, 39705 next: [Twig.logic.type.else_, Twig.logic.type.elseif, Twig.logic.type.endif], 39706 open: false, 39707 compile: function compile(token) { 39708 var expression = token.match[1]; // Compile the expression. 39709 39710 token.stack = Twig.expression.compile.apply(this, [{ 39711 type: Twig.expression.type.expression, 39712 value: expression 39713 }]).stack; 39714 delete token.match; 39715 return token; 39716 }, 39717 parse: function parse(token, context, chain) { 39718 var that = this; 39719 return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (result) { 39720 if (chain && Twig.lib.boolval(result)) { 39721 chain = false; 39722 return Twig.parseAsync.apply(that, [token.output, context]); 39723 } 39724 39725 return ''; 39726 }).then(function (output) { 39727 return { 39728 chain: chain, 39729 output: output 39730 }; 39731 }); 39732 } 39733 }, { 39734 /** 39735 * Else if type logic tokens. 39736 * 39737 * Format: {% elseif expression %} 39738 */ 39739 type: Twig.logic.type.else_, 39740 regex: /^else$/, 39741 next: [Twig.logic.type.endif, Twig.logic.type.endfor], 39742 open: false, 39743 parse: function parse(token, context, chain) { 39744 var promise = Twig.Promise.resolve(''); 39745 39746 if (chain) { 39747 promise = Twig.parseAsync.apply(this, [token.output, context]); 39748 } 39749 39750 return promise.then(function (output) { 39751 return { 39752 chain: chain, 39753 output: output 39754 }; 39755 }); 39756 } 39757 }, { 39758 /** 39759 * End if type logic tokens. 39760 * 39761 * Format: {% endif %} 39762 */ 39763 type: Twig.logic.type.endif, 39764 regex: /^endif$/, 39765 next: [], 39766 open: false 39767 }, { 39768 /** 39769 * For type logic tokens. 39770 * 39771 * Format: {% for expression %} 39772 */ 39773 type: Twig.logic.type.for_, 39774 regex: /^for\s+([a-zA-Z0-9_,\s]+)\s+in\s+([^\s].*?)(?:\s+if\s+([^\s].*))?$/, 39775 next: [Twig.logic.type.else_, Twig.logic.type.endfor], 39776 open: true, 39777 compile: function compile(token) { 39778 var key_value = token.match[1], 39779 expression = token.match[2], 39780 conditional = token.match[3], 39781 kv_split = null; 39782 token.key_var = null; 39783 token.value_var = null; 39784 39785 if (key_value.indexOf(",") >= 0) { 39786 kv_split = key_value.split(','); 39787 39788 if (kv_split.length === 2) { 39789 token.key_var = kv_split[0].trim(); 39790 token.value_var = kv_split[1].trim(); 39791 } else { 39792 throw new Twig.Error("Invalid expression in for loop: " + key_value); 39793 } 39794 } else { 39795 token.value_var = key_value; 39796 } // Valid expressions for a for loop 39797 // for item in expression 39798 // for key,item in expression 39799 // Compile the expression. 39800 39801 39802 token.expression = Twig.expression.compile.apply(this, [{ 39803 type: Twig.expression.type.expression, 39804 value: expression 39805 }]).stack; // Compile the conditional (if available) 39806 39807 if (conditional) { 39808 token.conditional = Twig.expression.compile.apply(this, [{ 39809 type: Twig.expression.type.expression, 39810 value: conditional 39811 }]).stack; 39812 } 39813 39814 delete token.match; 39815 return token; 39816 }, 39817 parse: function parse(token, context, continue_chain) { 39818 // Parse expression 39819 var output = [], 39820 len, 39821 index = 0, 39822 keyset, 39823 that = this, 39824 conditional = token.conditional, 39825 buildLoop = function buildLoop(index, len) { 39826 var isConditional = conditional !== undefined; 39827 return { 39828 index: index + 1, 39829 index0: index, 39830 revindex: isConditional ? undefined : len - index, 39831 revindex0: isConditional ? undefined : len - index - 1, 39832 first: index === 0, 39833 last: isConditional ? undefined : index === len - 1, 39834 length: isConditional ? undefined : len, 39835 parent: context 39836 }; 39837 }, 39838 // run once for each iteration of the loop 39839 loop = function loop(key, value) { 39840 var inner_context = Twig.ChildContext(context); 39841 inner_context[token.value_var] = value; 39842 39843 if (token.key_var) { 39844 inner_context[token.key_var] = key; 39845 } // Loop object 39846 39847 39848 inner_context.loop = buildLoop(index, len); 39849 var promise = conditional === undefined ? Twig.Promise.resolve(true) : Twig.expression.parseAsync.apply(that, [conditional, inner_context]); 39850 promise.then(function (condition) { 39851 if (!condition) return; 39852 return Twig.parseAsync.apply(that, [token.output, inner_context]).then(function (o) { 39853 output.push(o); 39854 index += 1; 39855 }); 39856 }).then(function () { 39857 // Delete loop-related variables from the context 39858 delete inner_context['loop']; 39859 delete inner_context[token.value_var]; 39860 delete inner_context[token.key_var]; // Merge in values that exist in context but have changed 39861 // in inner_context. 39862 39863 Twig.merge(context, inner_context, true); 39864 }); 39865 }; 39866 39867 return Twig.expression.parseAsync.apply(this, [token.expression, context]).then(function (result) { 39868 if (Twig.lib.is('Array', result)) { 39869 len = result.length; 39870 Twig.async.forEach(result, function (value) { 39871 var key = index; 39872 return loop(key, value); 39873 }); 39874 } else if (Twig.lib.is('Object', result)) { 39875 if (result._keys !== undefined) { 39876 keyset = result._keys; 39877 } else { 39878 keyset = Object.keys(result); 39879 } 39880 39881 len = keyset.length; 39882 Twig.forEach(keyset, function (key) { 39883 // Ignore the _keys property, it's internal to twig.js 39884 if (key === "_keys") return; 39885 loop(key, result[key]); 39886 }); 39887 } // Only allow else statements if no output was generated 39888 39889 39890 continue_chain = output.length === 0; 39891 return { 39892 chain: continue_chain, 39893 output: Twig.output.apply(that, [output]) 39894 }; 39895 }); 39896 } 39897 }, { 39898 /** 39899 * End if type logic tokens. 39900 * 39901 * Format: {% endif %} 39902 */ 39903 type: Twig.logic.type.endfor, 39904 regex: /^endfor$/, 39905 next: [], 39906 open: false 39907 }, { 39908 /** 39909 * Set type logic tokens. 39910 * 39911 * Format: {% set key = expression %} 39912 */ 39913 type: Twig.logic.type.set, 39914 regex: /^set\s+([a-zA-Z0-9_,\s]+)\s*=\s*([\s\S]+)$/, 39915 next: [], 39916 open: true, 39917 compile: function compile(token) { 39918 var key = token.match[1].trim(), 39919 expression = token.match[2], 39920 // Compile the expression. 39921 expression_stack = Twig.expression.compile.apply(this, [{ 39922 type: Twig.expression.type.expression, 39923 value: expression 39924 }]).stack; 39925 token.key = key; 39926 token.expression = expression_stack; 39927 delete token.match; 39928 return token; 39929 }, 39930 parse: function parse(token, context, continue_chain) { 39931 var key = token.key; 39932 return Twig.expression.parseAsync.apply(this, [token.expression, context]).then(function (value) { 39933 if (value === context) { 39934 /* If storing the context in a variable, it needs to be a clone of the current state of context. 39935 Otherwise we have a context with infinite recursion. 39936 Fixes #341 39937 */ 39938 value = Twig.lib.copy(value); 39939 } 39940 39941 context[key] = value; 39942 return { 39943 chain: continue_chain, 39944 context: context 39945 }; 39946 }); 39947 } 39948 }, { 39949 /** 39950 * Set capture type logic tokens. 39951 * 39952 * Format: {% set key %} 39953 */ 39954 type: Twig.logic.type.setcapture, 39955 regex: /^set\s+([a-zA-Z0-9_,\s]+)$/, 39956 next: [Twig.logic.type.endset], 39957 open: true, 39958 compile: function compile(token) { 39959 var key = token.match[1].trim(); 39960 token.key = key; 39961 delete token.match; 39962 return token; 39963 }, 39964 parse: function parse(token, context, continue_chain) { 39965 var that = this, 39966 key = token.key; 39967 return Twig.parseAsync.apply(this, [token.output, context]).then(function (value) { 39968 // set on both the global and local context 39969 that.context[key] = value; 39970 context[key] = value; 39971 return { 39972 chain: continue_chain, 39973 context: context 39974 }; 39975 }); 39976 } 39977 }, { 39978 /** 39979 * End set type block logic tokens. 39980 * 39981 * Format: {% endset %} 39982 */ 39983 type: Twig.logic.type.endset, 39984 regex: /^endset$/, 39985 next: [], 39986 open: false 39987 }, { 39988 /** 39989 * Filter logic tokens. 39990 * 39991 * Format: {% filter upper %} or {% filter lower|escape %} 39992 */ 39993 type: Twig.logic.type.filter, 39994 regex: /^filter\s+(.+)$/, 39995 next: [Twig.logic.type.endfilter], 39996 open: true, 39997 compile: function compile(token) { 39998 var expression = "|" + token.match[1].trim(); // Compile the expression. 39999 40000 token.stack = Twig.expression.compile.apply(this, [{ 40001 type: Twig.expression.type.expression, 40002 value: expression 40003 }]).stack; 40004 delete token.match; 40005 return token; 40006 }, 40007 parse: function parse(token, context, chain) { 40008 return Twig.parseAsync.apply(this, [token.output, context]).then(function (unfiltered) { 40009 var stack = [{ 40010 type: Twig.expression.type.string, 40011 value: unfiltered 40012 }].concat(token.stack); 40013 return Twig.expression.parseAsync.apply(that, [stack, context]); 40014 }).then(function (output) { 40015 return { 40016 chain: chain, 40017 output: output 40018 }; 40019 }); 40020 } 40021 }, { 40022 /** 40023 * End filter logic tokens. 40024 * 40025 * Format: {% endfilter %} 40026 */ 40027 type: Twig.logic.type.endfilter, 40028 regex: /^endfilter$/, 40029 next: [], 40030 open: false 40031 }, { 40032 /** 40033 * Block logic tokens. 40034 * 40035 * Format: {% block title %} 40036 */ 40037 type: Twig.logic.type.block, 40038 regex: /^block\s+([a-zA-Z0-9_]+)$/, 40039 next: [Twig.logic.type.endblock], 40040 open: true, 40041 compile: function compile(token) { 40042 token.block = token.match[1].trim(); 40043 delete token.match; 40044 return token; 40045 }, 40046 parse: function parse(token, context, chain) { 40047 var that = this, 40048 block_output, 40049 output, 40050 promise = Twig.Promise.resolve(), 40051 isImported = Twig.indexOf(this.importedBlocks, token.block) > -1, 40052 hasParent = this.blocks[token.block] && Twig.indexOf(this.blocks[token.block], Twig.placeholders.parent) > -1; // Don't override previous blocks unless they're imported with "use" 40053 // Loops should be exempted as well. 40054 40055 if (this.blocks[token.block] === undefined || isImported || hasParent || context.loop || token.overwrite) { 40056 if (token.expression) { 40057 promise = Twig.expression.parseAsync.apply(this, [token.output, context]).then(function (value) { 40058 return Twig.expression.parseAsync.apply(that, [{ 40059 type: Twig.expression.type.string, 40060 value: value 40061 }, context]); 40062 }); 40063 } else { 40064 promise = Twig.parseAsync.apply(this, [token.output, context]).then(function (value) { 40065 return Twig.expression.parseAsync.apply(that, [{ 40066 type: Twig.expression.type.string, 40067 value: value 40068 }, context]); 40069 }); 40070 } 40071 40072 promise = promise.then(function (block_output) { 40073 if (isImported) { 40074 // once the block is overridden, remove it from the list of imported blocks 40075 that.importedBlocks.splice(that.importedBlocks.indexOf(token.block), 1); 40076 } 40077 40078 if (hasParent) { 40079 that.blocks[token.block] = Twig.Markup(that.blocks[token.block].replace(Twig.placeholders.parent, block_output)); 40080 } else { 40081 that.blocks[token.block] = block_output; 40082 } 40083 40084 that.originalBlockTokens[token.block] = { 40085 type: token.type, 40086 block: token.block, 40087 output: token.output, 40088 overwrite: true 40089 }; 40090 }); 40091 } 40092 40093 return promise.then(function () { 40094 // Check if a child block has been set from a template extending this one. 40095 if (that.child.blocks[token.block]) { 40096 output = that.child.blocks[token.block]; 40097 } else { 40098 output = that.blocks[token.block]; 40099 } 40100 40101 return { 40102 chain: chain, 40103 output: output 40104 }; 40105 }); 40106 } 40107 }, { 40108 /** 40109 * Block shorthand logic tokens. 40110 * 40111 * Format: {% block title expression %} 40112 */ 40113 type: Twig.logic.type.shortblock, 40114 regex: /^block\s+([a-zA-Z0-9_]+)\s+(.+)$/, 40115 next: [], 40116 open: true, 40117 compile: function compile(token) { 40118 token.expression = token.match[2].trim(); 40119 token.output = Twig.expression.compile({ 40120 type: Twig.expression.type.expression, 40121 value: token.expression 40122 }).stack; 40123 token.block = token.match[1].trim(); 40124 delete token.match; 40125 return token; 40126 }, 40127 parse: function parse(token, context, chain) { 40128 return Twig.logic.handler[Twig.logic.type.block].parse.apply(this, arguments); 40129 } 40130 }, { 40131 /** 40132 * End block logic tokens. 40133 * 40134 * Format: {% endblock %} 40135 */ 40136 type: Twig.logic.type.endblock, 40137 regex: /^endblock(?:\s+([a-zA-Z0-9_]+))?$/, 40138 next: [], 40139 open: false 40140 }, { 40141 /** 40142 * Block logic tokens. 40143 * 40144 * Format: {% extends "template.twig" %} 40145 */ 40146 type: Twig.logic.type.extends_, 40147 regex: /^extends\s+(.+)$/, 40148 next: [], 40149 open: true, 40150 compile: function compile(token) { 40151 var expression = token.match[1].trim(); 40152 delete token.match; 40153 token.stack = Twig.expression.compile.apply(this, [{ 40154 type: Twig.expression.type.expression, 40155 value: expression 40156 }]).stack; 40157 return token; 40158 }, 40159 parse: function parse(token, context, chain) { 40160 var template, 40161 that = this, 40162 innerContext = Twig.ChildContext(context); // Resolve filename 40163 40164 return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) { 40165 // Set parent template 40166 that.extend = file; 40167 40168 if (file instanceof Twig.Template) { 40169 template = file; 40170 } else { 40171 // Import file 40172 template = that.importFile(file); 40173 } // Render the template in case it puts anything in its context 40174 40175 40176 return template.renderAsync(innerContext); 40177 }).then(function () { 40178 // Extend the parent context with the extended context 40179 Twig.lib.extend(context, innerContext); 40180 return { 40181 chain: chain, 40182 output: '' 40183 }; 40184 }); 40185 } 40186 }, { 40187 /** 40188 * Block logic tokens. 40189 * 40190 * Format: {% use "template.twig" %} 40191 */ 40192 type: Twig.logic.type.use, 40193 regex: /^use\s+(.+)$/, 40194 next: [], 40195 open: true, 40196 compile: function compile(token) { 40197 var expression = token.match[1].trim(); 40198 delete token.match; 40199 token.stack = Twig.expression.compile.apply(this, [{ 40200 type: Twig.expression.type.expression, 40201 value: expression 40202 }]).stack; 40203 return token; 40204 }, 40205 parse: function parse(token, context, chain) { 40206 var that = this; // Resolve filename 40207 40208 return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) { 40209 // Import blocks 40210 that.importBlocks(file); 40211 return { 40212 chain: chain, 40213 output: '' 40214 }; 40215 }); 40216 } 40217 }, { 40218 /** 40219 * Block logic tokens. 40220 * 40221 * Format: {% includes "template.twig" [with {some: 'values'} only] %} 40222 */ 40223 type: Twig.logic.type.include, 40224 regex: /^include\s+(.+?)(?:\s|$)(ignore missing(?:\s|$))?(?:with\s+([\S\s]+?))?(?:\s|$)(only)?$/, 40225 next: [], 40226 open: true, 40227 compile: function compile(token) { 40228 var match = token.match, 40229 expression = match[1].trim(), 40230 ignoreMissing = match[2] !== undefined, 40231 withContext = match[3], 40232 only = match[4] !== undefined && match[4].length; 40233 delete token.match; 40234 token.only = only; 40235 token.ignoreMissing = ignoreMissing; 40236 token.stack = Twig.expression.compile.apply(this, [{ 40237 type: Twig.expression.type.expression, 40238 value: expression 40239 }]).stack; 40240 40241 if (withContext !== undefined) { 40242 token.withStack = Twig.expression.compile.apply(this, [{ 40243 type: Twig.expression.type.expression, 40244 value: withContext.trim() 40245 }]).stack; 40246 } 40247 40248 return token; 40249 }, 40250 parse: function parse(token, context, chain) { 40251 // Resolve filename 40252 var innerContext = {}, 40253 i, 40254 template, 40255 that = this, 40256 promise = Twig.Promise.resolve(); 40257 40258 if (!token.only) { 40259 innerContext = Twig.ChildContext(context); 40260 } 40261 40262 if (token.withStack !== undefined) { 40263 promise = Twig.expression.parseAsync.apply(this, [token.withStack, context]).then(function (withContext) { 40264 for (i in withContext) { 40265 if (withContext.hasOwnProperty(i)) innerContext[i] = withContext[i]; 40266 } 40267 }); 40268 } 40269 40270 return promise.then(function () { 40271 return Twig.expression.parseAsync.apply(that, [token.stack, context]); 40272 }).then(function (file) { 40273 if (file instanceof Twig.Template) { 40274 template = file; 40275 } else { 40276 // Import file 40277 try { 40278 template = that.importFile(file); 40279 } catch (err) { 40280 if (token.ignoreMissing) { 40281 return ''; 40282 } 40283 40284 throw err; 40285 } 40286 } 40287 40288 return template.renderAsync(innerContext); 40289 }).then(function (output) { 40290 return { 40291 chain: chain, 40292 output: output 40293 }; 40294 }); 40295 } 40296 }, { 40297 type: Twig.logic.type.spaceless, 40298 regex: /^spaceless$/, 40299 next: [Twig.logic.type.endspaceless], 40300 open: true, 40301 // Parse the html and return it without any spaces between tags 40302 parse: function parse(token, context, chain) { 40303 // Parse the output without any filter 40304 return Twig.parseAsync.apply(this, [token.output, context]).then(function (unfiltered) { 40305 var // A regular expression to find closing and opening tags with spaces between them 40306 rBetweenTagSpaces = />\s+</g, 40307 // Replace all space between closing and opening html tags 40308 output = unfiltered.replace(rBetweenTagSpaces, '><').trim(); // Rewrap output as a Twig.Markup 40309 40310 output = Twig.Markup(output); 40311 return { 40312 chain: chain, 40313 output: output 40314 }; 40315 }); 40316 } 40317 }, // Add the {% endspaceless %} token 40318 { 40319 type: Twig.logic.type.endspaceless, 40320 regex: /^endspaceless$/, 40321 next: [], 40322 open: false 40323 }, { 40324 /** 40325 * Macro logic tokens. 40326 * 40327 * Format: {% maro input(name, value, type, size) %} 40328 * 40329 */ 40330 type: Twig.logic.type.macro, 40331 regex: /^macro\s+([a-zA-Z0-9_]+)\s*\(\s*((?:[a-zA-Z0-9_]+(?:,\s*)?)*)\s*\)$/, 40332 next: [Twig.logic.type.endmacro], 40333 open: true, 40334 compile: function compile(token) { 40335 var macroName = token.match[1], 40336 parameters = token.match[2].split(/[\s,]+/); //TODO: Clean up duplicate check 40337 40338 for (var i = 0; i < parameters.length; i++) { 40339 for (var j = 0; j < parameters.length; j++) { 40340 if (parameters[i] === parameters[j] && i !== j) { 40341 throw new Twig.Error("Duplicate arguments for parameter: " + parameters[i]); 40342 } 40343 } 40344 } 40345 40346 token.macroName = macroName; 40347 token.parameters = parameters; 40348 delete token.match; 40349 return token; 40350 }, 40351 parse: function parse(token, context, chain) { 40352 var template = this; 40353 40354 this.macros[token.macroName] = function () { 40355 // Pass global context and other macros 40356 var macroContext = { 40357 _self: template.macros // Add parameters from context to macroContext 40358 40359 }; 40360 40361 for (var i = 0; i < token.parameters.length; i++) { 40362 var prop = token.parameters[i]; 40363 40364 if (typeof arguments[i] !== 'undefined') { 40365 macroContext[prop] = arguments[i]; 40366 } else { 40367 macroContext[prop] = undefined; 40368 } 40369 } // Render 40370 40371 40372 return Twig.parseAsync.apply(template, [token.output, macroContext]); 40373 }; 40374 40375 return { 40376 chain: chain, 40377 output: '' 40378 }; 40379 } 40380 }, { 40381 /** 40382 * End macro logic tokens. 40383 * 40384 * Format: {% endmacro %} 40385 */ 40386 type: Twig.logic.type.endmacro, 40387 regex: /^endmacro$/, 40388 next: [], 40389 open: false 40390 }, { 40391 /* 40392 * import logic tokens. 40393 * 40394 * Format: {% import "template.twig" as form %} 40395 */ 40396 type: Twig.logic.type.import_, 40397 regex: /^import\s+(.+)\s+as\s+([a-zA-Z0-9_]+)$/, 40398 next: [], 40399 open: true, 40400 compile: function compile(token) { 40401 var expression = token.match[1].trim(), 40402 contextName = token.match[2].trim(); 40403 delete token.match; 40404 token.expression = expression; 40405 token.contextName = contextName; 40406 token.stack = Twig.expression.compile.apply(this, [{ 40407 type: Twig.expression.type.expression, 40408 value: expression 40409 }]).stack; 40410 return token; 40411 }, 40412 parse: function parse(token, context, chain) { 40413 var that = this, 40414 output = { 40415 chain: chain, 40416 output: '' 40417 }; 40418 40419 if (token.expression === '_self') { 40420 context[token.contextName] = this.macros; 40421 return Twig.Promise.resolve(output); 40422 } 40423 40424 return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) { 40425 return that.importFile(file || token.expression); 40426 }).then(function (template) { 40427 context[token.contextName] = template.renderAsync({}, { 40428 output: 'macros' 40429 }); 40430 return output; 40431 }); 40432 } 40433 }, { 40434 /* 40435 * from logic tokens. 40436 * 40437 * Format: {% from "template.twig" import func as form %} 40438 */ 40439 type: Twig.logic.type.from, 40440 regex: /^from\s+(.+)\s+import\s+([a-zA-Z0-9_, ]+)$/, 40441 next: [], 40442 open: true, 40443 compile: function compile(token) { 40444 var expression = token.match[1].trim(), 40445 macroExpressions = token.match[2].trim().split(/\s*,\s*/), 40446 macroNames = {}; 40447 40448 for (var i = 0; i < macroExpressions.length; i++) { 40449 var res = macroExpressions[i]; // match function as variable 40450 40451 var macroMatch = res.match(/^([a-zA-Z0-9_]+)\s+as\s+([a-zA-Z0-9_]+)$/); 40452 40453 if (macroMatch) { 40454 macroNames[macroMatch[1].trim()] = macroMatch[2].trim(); 40455 } else if (res.match(/^([a-zA-Z0-9_]+)$/)) { 40456 macroNames[res] = res; 40457 } else {// ignore import 40458 } 40459 } 40460 40461 delete token.match; 40462 token.expression = expression; 40463 token.macroNames = macroNames; 40464 token.stack = Twig.expression.compile.apply(this, [{ 40465 type: Twig.expression.type.expression, 40466 value: expression 40467 }]).stack; 40468 return token; 40469 }, 40470 parse: function parse(token, context, chain) { 40471 var that = this, 40472 promise = Twig.Promise.resolve(this.macros); 40473 40474 if (token.expression !== "_self") { 40475 promise = Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) { 40476 return that.importFile(file || token.expression); 40477 }).then(function (template) { 40478 return template.renderAsync({}, { 40479 output: 'macros' 40480 }); 40481 }); 40482 } 40483 40484 return promise.then(function (macros) { 40485 for (var macroName in token.macroNames) { 40486 if (macros.hasOwnProperty(macroName)) { 40487 context[token.macroNames[macroName]] = macros[macroName]; 40488 } 40489 } 40490 40491 return { 40492 chain: chain, 40493 output: '' 40494 }; 40495 }); 40496 } 40497 }, { 40498 /** 40499 * The embed tag combines the behaviour of include and extends. 40500 * It allows you to include another template's contents, just like include does. 40501 * 40502 * Format: {% embed "template.twig" [with {some: 'values'} only] %} 40503 */ 40504 type: Twig.logic.type.embed, 40505 regex: /^embed\s+(.+?)(?:\s|$)(ignore missing(?:\s|$))?(?:with\s+([\S\s]+?))?(?:\s|$)(only)?$/, 40506 next: [Twig.logic.type.endembed], 40507 open: true, 40508 compile: function compile(token) { 40509 var match = token.match, 40510 expression = match[1].trim(), 40511 ignoreMissing = match[2] !== undefined, 40512 withContext = match[3], 40513 only = match[4] !== undefined && match[4].length; 40514 delete token.match; 40515 token.only = only; 40516 token.ignoreMissing = ignoreMissing; 40517 token.stack = Twig.expression.compile.apply(this, [{ 40518 type: Twig.expression.type.expression, 40519 value: expression 40520 }]).stack; 40521 40522 if (withContext !== undefined) { 40523 token.withStack = Twig.expression.compile.apply(this, [{ 40524 type: Twig.expression.type.expression, 40525 value: withContext.trim() 40526 }]).stack; 40527 } 40528 40529 return token; 40530 }, 40531 parse: function parse(token, context, chain) { 40532 // Resolve filename 40533 var innerContext = {}, 40534 that = this, 40535 i, 40536 template, 40537 promise = Twig.Promise.resolve(); 40538 40539 if (!token.only) { 40540 for (i in context) { 40541 if (context.hasOwnProperty(i)) innerContext[i] = context[i]; 40542 } 40543 } 40544 40545 if (token.withStack !== undefined) { 40546 promise = Twig.expression.parseAsync.apply(this, [token.withStack, context]).then(function (withContext) { 40547 for (i in withContext) { 40548 if (withContext.hasOwnProperty(i)) innerContext[i] = withContext[i]; 40549 } 40550 }); 40551 } 40552 40553 return promise.then(function () { 40554 return Twig.expression.parseAsync.apply(that, [token.stack, innerContext]); 40555 }).then(function (file) { 40556 if (file instanceof Twig.Template) { 40557 template = file; 40558 } else { 40559 // Import file 40560 try { 40561 template = that.importFile(file); 40562 } catch (err) { 40563 if (token.ignoreMissing) { 40564 return ''; 40565 } 40566 40567 throw err; 40568 } 40569 } // reset previous blocks 40570 40571 40572 that.blocks = {}; // parse tokens. output will be not used 40573 40574 return Twig.parseAsync.apply(that, [token.output, innerContext]).then(function () { 40575 // render tempalte with blocks defined in embed block 40576 return template.renderAsync(innerContext, { 40577 'blocks': that.blocks 40578 }); 40579 }); 40580 }).then(function (output) { 40581 return { 40582 chain: chain, 40583 output: output 40584 }; 40585 }); 40586 } 40587 }, 40588 /* Add the {% endembed %} token 40589 * 40590 */ 40591 { 40592 type: Twig.logic.type.endembed, 40593 regex: /^endembed$/, 40594 next: [], 40595 open: false 40596 }]; 40597 /** 40598 * Registry for logic handlers. 40599 */ 40600 40601 Twig.logic.handler = {}; 40602 /** 40603 * Define a new token type, available at Twig.logic.type.{type} 40604 */ 40605 40606 Twig.logic.extendType = function (type, value) { 40607 value = value || "Twig.logic.type" + type; 40608 Twig.logic.type[type] = value; 40609 }; 40610 /** 40611 * Extend the logic parsing functionality with a new token definition. 40612 * 40613 * // Define a new tag 40614 * Twig.logic.extend({ 40615 * type: Twig.logic.type.{type}, 40616 * // The pattern to match for this token 40617 * regex: ..., 40618 * // What token types can follow this token, leave blank if any. 40619 * next: [ ... ] 40620 * // Create and return compiled version of the token 40621 * compile: function(token) { ... } 40622 * // Parse the compiled token with the context provided by the render call 40623 * // and whether this token chain is complete. 40624 * parse: function(token, context, chain) { ... } 40625 * }); 40626 * 40627 * @param {Object} definition The new logic expression. 40628 */ 40629 40630 40631 Twig.logic.extend = function (definition) { 40632 if (!definition.type) { 40633 throw new Twig.Error("Unable to extend logic definition. No type provided for " + definition); 40634 } else { 40635 Twig.logic.extendType(definition.type); 40636 } 40637 40638 Twig.logic.handler[definition.type] = definition; 40639 }; // Extend with built-in expressions 40640 40641 40642 while (Twig.logic.definitions.length > 0) { 40643 Twig.logic.extend(Twig.logic.definitions.shift()); 40644 } 40645 /** 40646 * Compile a logic token into an object ready for parsing. 40647 * 40648 * @param {Object} raw_token An uncompiled logic token. 40649 * 40650 * @return {Object} A compiled logic token, ready for parsing. 40651 */ 40652 40653 40654 Twig.logic.compile = function (raw_token) { 40655 var expression = raw_token.value.trim(), 40656 token = Twig.logic.tokenize.apply(this, [expression]), 40657 token_template = Twig.logic.handler[token.type]; // Check if the token needs compiling 40658 40659 if (token_template.compile) { 40660 token = token_template.compile.apply(this, [token]); 40661 Twig.log.trace("Twig.logic.compile: ", "Compiled logic token to ", token); 40662 } 40663 40664 return token; 40665 }; 40666 /** 40667 * Tokenize logic expressions. This function matches token expressions against regular 40668 * expressions provided in token definitions provided with Twig.logic.extend. 40669 * 40670 * @param {string} expression the logic token expression to tokenize 40671 * (i.e. what's between {% and %}) 40672 * 40673 * @return {Object} The matched token with type set to the token type and match to the regex match. 40674 */ 40675 40676 40677 Twig.logic.tokenize = function (expression) { 40678 var token = {}, 40679 token_template_type = null, 40680 token_type = null, 40681 token_regex = null, 40682 regex_array = null, 40683 regex = null, 40684 match = null; // Ignore whitespace around expressions. 40685 40686 expression = expression.trim(); 40687 40688 for (token_template_type in Twig.logic.handler) { 40689 if (Twig.logic.handler.hasOwnProperty(token_template_type)) { 40690 // Get the type and regex for this template type 40691 token_type = Twig.logic.handler[token_template_type].type; 40692 token_regex = Twig.logic.handler[token_template_type].regex; // Handle multiple regular expressions per type. 40693 40694 regex_array = []; 40695 40696 if (token_regex instanceof Array) { 40697 regex_array = token_regex; 40698 } else { 40699 regex_array.push(token_regex); 40700 } // Check regular expressions in the order they were specified in the definition. 40701 40702 40703 while (regex_array.length > 0) { 40704 regex = regex_array.shift(); 40705 match = regex.exec(expression.trim()); 40706 40707 if (match !== null) { 40708 token.type = token_type; 40709 token.match = match; 40710 Twig.log.trace("Twig.logic.tokenize: ", "Matched a ", token_type, " regular expression of ", match); 40711 return token; 40712 } 40713 } 40714 } 40715 } // No regex matches 40716 40717 40718 throw new Twig.Error("Unable to parse '" + expression.trim() + "'"); 40719 }; 40720 /** 40721 * Parse a logic token within a given context. 40722 * 40723 * What are logic chains? 40724 * Logic chains represent a series of tokens that are connected, 40725 * for example: 40726 * {% if ... %} {% else %} {% endif %} 40727 * 40728 * The chain parameter is used to signify if a chain is open of closed. 40729 * open: 40730 * More tokens in this chain should be parsed. 40731 * closed: 40732 * This token chain has completed parsing and any additional 40733 * tokens (else, elseif, etc...) should be ignored. 40734 * 40735 * @param {Object} token The compiled token. 40736 * @param {Object} context The render context. 40737 * @param {boolean} chain Is this an open logic chain. If false, that means a 40738 * chain is closed and no further cases should be parsed. 40739 */ 40740 40741 40742 Twig.logic.parse = function (token, context, chain, allow_async) { 40743 var output = '', 40744 promise, 40745 is_async = true, 40746 token_template; 40747 context = context || {}; 40748 Twig.log.debug("Twig.logic.parse: ", "Parsing logic token ", token); 40749 token_template = Twig.logic.handler[token.type]; 40750 40751 if (token_template.parse) { 40752 output = token_template.parse.apply(this, [token, context, chain]); 40753 } 40754 40755 promise = Twig.isPromise(output) ? output : Twig.Promise.resolve(output); 40756 promise.then(function (o) { 40757 is_async = false; 40758 output = o; 40759 }); 40760 if (allow_async) return promise || Twig.Promise.resolve(output); 40761 if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.'); 40762 return output; 40763 }; 40764 40765 return Twig; 40766 }; 40767 /***/ 40768 40769 }, 40770 /* 22 */ 40771 40772 /***/ 40773 function (module, exports) { 40774 module.exports = function (Twig) { 40775 'use strict'; 40776 40777 Twig.Templates.registerParser('source', function (params) { 40778 return params.data || ''; 40779 }); 40780 }; 40781 /***/ 40782 40783 }, 40784 /* 23 */ 40785 40786 /***/ 40787 function (module, exports) { 40788 module.exports = function (Twig) { 40789 'use strict'; 40790 40791 Twig.Templates.registerParser('twig', function (params) { 40792 return new Twig.Template(params); 40793 }); 40794 }; 40795 /***/ 40796 40797 }, 40798 /* 24 */ 40799 40800 /***/ 40801 function (module, exports, __webpack_require__) { 40802 // ## twig.path.js 40803 // 40804 // This file handles path parsing 40805 module.exports = function (Twig) { 40806 "use strict"; 40807 /** 40808 * Namespace for path handling. 40809 */ 40810 40811 Twig.path = {}; 40812 /** 40813 * Generate the canonical version of a url based on the given base path and file path and in 40814 * the previously registered namespaces. 40815 * 40816 * @param {string} template The Twig Template 40817 * @param {string} file The file path, may be relative and may contain namespaces. 40818 * 40819 * @return {string} The canonical version of the path 40820 */ 40821 40822 Twig.path.parsePath = function (template, file) { 40823 var namespaces = null, 40824 file = file || ""; 40825 40826 if (_typeof2(template) === 'object' && _typeof2(template.options) === 'object') { 40827 namespaces = template.options.namespaces; 40828 } 40829 40830 if (_typeof2(namespaces) === 'object' && file.indexOf('::') > 0 || file.indexOf('@') >= 0) { 40831 for (var k in namespaces) { 40832 if (namespaces.hasOwnProperty(k)) { 40833 file = file.replace(k + '::', namespaces[k]); 40834 file = file.replace('@' + k, namespaces[k]); 40835 } 40836 } 40837 40838 return file; 40839 } 40840 40841 return Twig.path.relativePath(template, file); 40842 }; 40843 /** 40844 * Generate the relative canonical version of a url based on the given base path and file path. 40845 * 40846 * @param {Twig.Template} template The Twig.Template. 40847 * @param {string} file The file path, relative to the base path. 40848 * 40849 * @return {string} The canonical version of the path. 40850 */ 40851 40852 40853 Twig.path.relativePath = function (template, file) { 40854 var base, 40855 base_path, 40856 sep_chr = "/", 40857 new_path = [], 40858 file = file || "", 40859 val; 40860 40861 if (template.url) { 40862 if (typeof template.base !== 'undefined') { 40863 base = template.base + (template.base.charAt(template.base.length - 1) === '/' ? '' : '/'); 40864 } else { 40865 base = template.url; 40866 } 40867 } else if (template.path) { 40868 // Get the system-specific path separator 40869 var path = __webpack_require__(20), 40870 sep = path.sep || sep_chr, 40871 relative = new RegExp("^\\.{1,2}" + sep.replace("\\", "\\\\")); 40872 40873 file = file.replace(/\//g, sep); 40874 40875 if (template.base !== undefined && file.match(relative) == null) { 40876 file = file.replace(template.base, ''); 40877 base = template.base + sep; 40878 } else { 40879 base = path.normalize(template.path); 40880 } 40881 40882 base = base.replace(sep + sep, sep); 40883 sep_chr = sep; 40884 } else if ((template.name || template.id) && template.method && template.method !== 'fs' && template.method !== 'ajax') { 40885 // Custom registered loader 40886 base = template.base || template.name || template.id; 40887 } else { 40888 throw new Twig.Error("Cannot extend an inline template."); 40889 } 40890 40891 base_path = base.split(sep_chr); // Remove file from url 40892 40893 base_path.pop(); 40894 base_path = base_path.concat(file.split(sep_chr)); 40895 40896 while (base_path.length > 0) { 40897 val = base_path.shift(); 40898 40899 if (val == ".") {// Ignore 40900 } else if (val == ".." && new_path.length > 0 && new_path[new_path.length - 1] != "..") { 40901 new_path.pop(); 40902 } else { 40903 new_path.push(val); 40904 } 40905 } 40906 40907 return new_path.join(sep_chr); 40908 }; 40909 40910 return Twig; 40911 }; 40912 /***/ 40913 40914 }, 40915 /* 25 */ 40916 40917 /***/ 40918 function (module, exports) { 40919 // ## twig.tests.js 40920 // 40921 // This file handles expression tests. (is empty, is not defined, etc...) 40922 module.exports = function (Twig) { 40923 "use strict"; 40924 40925 Twig.tests = { 40926 empty: function empty(value) { 40927 if (value === null || value === undefined) return true; // Handler numbers 40928 40929 if (typeof value === "number") return false; // numbers are never "empty" 40930 // Handle strings and arrays 40931 40932 if (value.length && value.length > 0) return false; // Handle objects 40933 40934 for (var key in value) { 40935 if (value.hasOwnProperty(key)) return false; 40936 } 40937 40938 return true; 40939 }, 40940 odd: function odd(value) { 40941 return value % 2 === 1; 40942 }, 40943 even: function even(value) { 40944 return value % 2 === 0; 40945 }, 40946 divisibleby: function divisibleby(value, params) { 40947 return value % params[0] === 0; 40948 }, 40949 defined: function defined(value) { 40950 return value !== undefined; 40951 }, 40952 none: function none(value) { 40953 return value === null; 40954 }, 40955 'null': function _null(value) { 40956 return this.none(value); // Alias of none 40957 }, 40958 'same as': function sameAs(value, params) { 40959 return value === params[0]; 40960 }, 40961 sameas: function sameas(value, params) { 40962 console.warn('`sameas` is deprecated use `same as`'); 40963 return Twig.tests['same as'](value, params); 40964 }, 40965 iterable: function iterable(value) { 40966 return value && (Twig.lib.is("Array", value) || Twig.lib.is("Object", value)); 40967 } 40968 /* 40969 constant ? 40970 */ 40971 40972 }; 40973 40974 Twig.test = function (test, value, params) { 40975 if (!Twig.tests[test]) { 40976 throw "Test " + test + " is not defined."; 40977 } 40978 40979 return Twig.tests[test](value, params); 40980 }; 40981 40982 Twig.test.extend = function (test, definition) { 40983 Twig.tests[test] = definition; 40984 }; 40985 40986 return Twig; 40987 }; 40988 /***/ 40989 40990 }, 40991 /* 26 */ 40992 40993 /***/ 40994 function (module, exports) { 40995 // ## twig.async.js 40996 // 40997 // This file handles asynchronous tasks within twig. 40998 module.exports = function (Twig) { 40999 "use strict"; 41000 41001 Twig.parseAsync = function (tokens, context) { 41002 return Twig.parse.apply(this, [tokens, context, true]); 41003 }; 41004 41005 Twig.expression.parseAsync = function (tokens, context, tokens_are_parameters) { 41006 return Twig.expression.parse.apply(this, [tokens, context, tokens_are_parameters, true]); 41007 }; 41008 41009 Twig.logic.parseAsync = function (token, context, chain) { 41010 return Twig.logic.parse.apply(this, [token, context, chain, true]); 41011 }; 41012 41013 Twig.Template.prototype.renderAsync = function (context, params) { 41014 return this.render(context, params, true); 41015 }; 41016 41017 Twig.async = {}; 41018 /** 41019 * Checks for `thenable` objects 41020 */ 41021 41022 Twig.isPromise = function (obj) { 41023 return obj && typeof obj.then == 'function'; 41024 }; 41025 /** 41026 * An alternate implementation of a Promise that does not fully follow 41027 * the spec, but instead works fully synchronous while still being 41028 * thenable. 41029 * 41030 * These promises can be mixed with regular promises at which point 41031 * the synchronous behaviour is lost. 41032 */ 41033 41034 41035 Twig.Promise = function (executor) { 41036 // State 41037 var state = 'unknown'; 41038 var value = null; 41039 var handlers = null; 41040 41041 function changeState(newState, v) { 41042 state = newState; 41043 value = v; 41044 notify(); 41045 } 41046 41047 ; 41048 41049 function onResolve(v) { 41050 changeState('resolve', v); 41051 } 41052 41053 function onReject(e) { 41054 changeState('reject', e); 41055 } 41056 41057 function notify() { 41058 if (!handlers) return; 41059 Twig.forEach(handlers, function (h) { 41060 append(h.resolve, h.reject); 41061 }); 41062 handlers = null; 41063 } 41064 41065 function append(onResolved, onRejected) { 41066 var h = { 41067 resolve: onResolved, 41068 reject: onRejected 41069 }; // The promise has yet to be rejected or resolved. 41070 41071 if (state == 'unknown') { 41072 handlers = handlers || []; 41073 return handlers.push(h); 41074 } // The state has been changed to either resolve, or reject 41075 // which means we should call the handler. 41076 41077 41078 if (h[state]) h[state](value); 41079 } 41080 41081 function run(fn, resolve, reject) { 41082 var done = false; 41083 41084 try { 41085 fn(function (v) { 41086 if (done) return; 41087 done = true; 41088 resolve(v); 41089 }, function (e) { 41090 if (done) return; 41091 done = true; 41092 reject(e); 41093 }); 41094 } catch (e) { 41095 done = true; 41096 reject(e); 41097 } 41098 } 41099 41100 function ready(result) { 41101 try { 41102 if (!Twig.isPromise(result)) { 41103 return onResolve(result); 41104 } 41105 41106 run(result.then.bind(result), ready, onReject); 41107 } catch (e) { 41108 onReject(e); 41109 } 41110 } 41111 41112 run(executor, ready, onReject); 41113 return { 41114 then: function then(onResolved, onRejected) { 41115 var hasResolved = typeof onResolved == 'function'; 41116 var hasRejected = typeof onRejected == 'function'; 41117 return new Twig.Promise(function (resolve, reject) { 41118 append(function (result) { 41119 if (hasResolved) { 41120 try { 41121 resolve(onResolved(result)); 41122 } catch (e) { 41123 reject(e); 41124 } 41125 } else { 41126 resolve(result); 41127 } 41128 }, function (err) { 41129 if (hasRejected) { 41130 try { 41131 resolve(onRejected(err)); 41132 } catch (e) { 41133 reject(e); 41134 } 41135 } else { 41136 reject(err); 41137 } 41138 }); 41139 }); 41140 }, 41141 catch: function _catch(onRejected) { 41142 return this.then(null, onRejected); 41143 } 41144 }; 41145 }; 41146 41147 Twig.Promise.resolve = function (value) { 41148 return new Twig.Promise(function (resolve) { 41149 resolve(value); 41150 }); 41151 }; 41152 41153 Twig.Promise.reject = function (e) { 41154 return new Twig.Promise(function (resolve, reject) { 41155 reject(e); 41156 }); 41157 }; 41158 41159 Twig.Promise.all = function (promises) { 41160 var results = []; 41161 return Twig.async.forEach(promises, function (p, index) { 41162 if (!Twig.isPromise(p)) { 41163 results[index] = p; 41164 return; 41165 } 41166 41167 return p.then(function (v) { 41168 results[index] = v; 41169 }); 41170 }).then(function () { 41171 return results; 41172 }); 41173 }; 41174 /** 41175 * Go over each item in a fashion compatible with Twig.forEach, 41176 * allow the function to return a promise or call the third argument 41177 * to signal it is finished. 41178 * 41179 * Each item in the array will be called sequentially. 41180 */ 41181 41182 41183 Twig.async.forEach = function forEachAsync(arr, callback) { 41184 var arg_index = 0; 41185 var callbacks = {}; 41186 var promise = new Twig.Promise(function (resolve, reject) { 41187 callbacks = { 41188 resolve: resolve, 41189 reject: reject 41190 }; 41191 }); 41192 41193 function fail(err) { 41194 callbacks.reject(err); 41195 } 41196 41197 function next(value) { 41198 if (!Twig.isPromise(value)) return iterate(); 41199 value.then(next, fail); 41200 } 41201 41202 function iterate() { 41203 var index = arg_index++; 41204 41205 if (index == arr.length) { 41206 callbacks.resolve(); 41207 return; 41208 } 41209 41210 next(callback(arr[index], index)); 41211 } 41212 41213 iterate(); 41214 return promise; 41215 }; 41216 41217 return Twig; 41218 }; 41219 /***/ 41220 41221 }, 41222 /* 27 */ 41223 41224 /***/ 41225 function (module, exports) { 41226 // ## twig.exports.js 41227 // 41228 // This file provides extension points and other hooks into the twig functionality. 41229 module.exports = function (Twig) { 41230 "use strict"; 41231 41232 Twig.exports = { 41233 VERSION: Twig.VERSION 41234 }; 41235 /** 41236 * Create and compile a twig.js template. 41237 * 41238 * @param {Object} param Paramteres for creating a Twig template. 41239 * 41240 * @return {Twig.Template} A Twig template ready for rendering. 41241 */ 41242 41243 Twig.exports.twig = function twig(params) { 41244 'use strict'; 41245 41246 var id = params.id, 41247 options = { 41248 strict_variables: params.strict_variables || false, 41249 // TODO: turn autoscape on in the next major version 41250 autoescape: params.autoescape != null && params.autoescape || false, 41251 allowInlineIncludes: params.allowInlineIncludes || false, 41252 rethrow: params.rethrow || false, 41253 namespaces: params.namespaces 41254 }; 41255 41256 if (Twig.cache && id) { 41257 Twig.validateId(id); 41258 } 41259 41260 if (params.debug !== undefined) { 41261 Twig.debug = params.debug; 41262 } 41263 41264 if (params.trace !== undefined) { 41265 Twig.trace = params.trace; 41266 } 41267 41268 if (params.data !== undefined) { 41269 return Twig.Templates.parsers.twig({ 41270 data: params.data, 41271 path: params.hasOwnProperty('path') ? params.path : undefined, 41272 module: params.module, 41273 id: id, 41274 options: options 41275 }); 41276 } else if (params.ref !== undefined) { 41277 if (params.id !== undefined) { 41278 throw new Twig.Error("Both ref and id cannot be set on a twig.js template."); 41279 } 41280 41281 return Twig.Templates.load(params.ref); 41282 } else if (params.method !== undefined) { 41283 if (!Twig.Templates.isRegisteredLoader(params.method)) { 41284 throw new Twig.Error('Loader for "' + params.method + '" is not defined.'); 41285 } 41286 41287 return Twig.Templates.loadRemote(params.name || params.href || params.path || id || undefined, { 41288 id: id, 41289 method: params.method, 41290 parser: params.parser || 'twig', 41291 base: params.base, 41292 module: params.module, 41293 precompiled: params.precompiled, 41294 async: params.async, 41295 options: options 41296 }, params.load, params.error); 41297 } else if (params.href !== undefined) { 41298 return Twig.Templates.loadRemote(params.href, { 41299 id: id, 41300 method: 'ajax', 41301 parser: params.parser || 'twig', 41302 base: params.base, 41303 module: params.module, 41304 precompiled: params.precompiled, 41305 async: params.async, 41306 options: options 41307 }, params.load, params.error); 41308 } else if (params.path !== undefined) { 41309 return Twig.Templates.loadRemote(params.path, { 41310 id: id, 41311 method: 'fs', 41312 parser: params.parser || 'twig', 41313 base: params.base, 41314 module: params.module, 41315 precompiled: params.precompiled, 41316 async: params.async, 41317 options: options 41318 }, params.load, params.error); 41319 } 41320 }; // Extend Twig with a new filter. 41321 41322 41323 Twig.exports.extendFilter = function (filter, definition) { 41324 Twig.filter.extend(filter, definition); 41325 }; // Extend Twig with a new function. 41326 41327 41328 Twig.exports.extendFunction = function (fn, definition) { 41329 Twig._function.extend(fn, definition); 41330 }; // Extend Twig with a new test. 41331 41332 41333 Twig.exports.extendTest = function (test, definition) { 41334 Twig.test.extend(test, definition); 41335 }; // Extend Twig with a new definition. 41336 41337 41338 Twig.exports.extendTag = function (definition) { 41339 Twig.logic.extend(definition); 41340 }; // Provide an environment for extending Twig core. 41341 // Calls fn with the internal Twig object. 41342 41343 41344 Twig.exports.extend = function (fn) { 41345 fn(Twig); 41346 }; 41347 /** 41348 * Provide an extension for use with express 2. 41349 * 41350 * @param {string} markup The template markup. 41351 * @param {array} options The express options. 41352 * 41353 * @return {string} The rendered template. 41354 */ 41355 41356 41357 Twig.exports.compile = function (markup, options) { 41358 var id = options.filename, 41359 path = options.filename, 41360 template; // Try to load the template from the cache 41361 41362 template = new Twig.Template({ 41363 data: markup, 41364 path: path, 41365 id: id, 41366 options: options.settings['twig options'] 41367 }); // Twig.Templates.load(id) || 41368 41369 return function (context) { 41370 return template.render(context); 41371 }; 41372 }; 41373 /** 41374 * Provide an extension for use with express 3. 41375 * 41376 * @param {string} path The location of the template file on disk. 41377 * @param {Object|Function} The options or callback. 41378 * @param {Function} fn callback. 41379 * 41380 * @throws Twig.Error 41381 */ 41382 41383 41384 Twig.exports.renderFile = function (path, options, fn) { 41385 // handle callback in options 41386 if (typeof options === 'function') { 41387 fn = options; 41388 options = {}; 41389 } 41390 41391 options = options || {}; 41392 var settings = options.settings || {}; 41393 var params = { 41394 path: path, 41395 base: settings.views, 41396 load: function load(template) { 41397 // render and return template as a simple string, see https://github.com/twigjs/twig.js/pull/348 for more information 41398 fn(null, '' + template.render(options)); 41399 } 41400 }; // mixin any options provided to the express app. 41401 41402 var view_options = settings['twig options']; 41403 41404 if (view_options) { 41405 for (var option in view_options) { 41406 if (view_options.hasOwnProperty(option)) { 41407 params[option] = view_options[option]; 41408 } 41409 } 41410 } 41411 41412 Twig.exports.twig(params); 41413 }; // Express 3 handler 41414 41415 41416 Twig.exports.__express = Twig.exports.renderFile; 41417 /** 41418 * Shoud Twig.js cache templates. 41419 * Disable during development to see changes to templates without 41420 * reloading, and disable in production to improve performance. 41421 * 41422 * @param {boolean} cache 41423 */ 41424 41425 Twig.exports.cache = function (cache) { 41426 Twig.cache = cache; 41427 }; //We need to export the path module so we can effectively test it 41428 41429 41430 Twig.exports.path = Twig.path; //Export our filters. 41431 //Resolves #307 41432 41433 Twig.exports.filters = Twig.filters; 41434 return Twig; 41435 }; 41436 /***/ 41437 41438 } 41439 /******/ 41440 ]) 41441 ); 41442}); 41443 41444; 41445/* WEBPACK VAR INJECTION */}.call(this, "/", __webpack_require__(/*! ./../webpack/buildin/module.js */ "../node_modules/webpack/buildin/module.js")(module))) 41446 41447/***/ }), 41448
vendor: 1,173 bytes, lines 41449-41478
41449/***/ "../node_modules/webpack/buildin/global.js": 41450/*!*************************************************!*\ 41451 !*** ../node_modules/webpack/buildin/global.js ***! 41452 \*************************************************/ 41453/*! no static exports found */ 41454/***/ (function(module, exports) { 41455 41456function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 41457 41458var g; // This works in non-strict mode 41459 41460g = function () { 41461 return this; 41462}(); 41463 41464try { 41465 // This works if eval is allowed (see CSP) 41466 g = g || new Function("return this")(); 41467} catch (e) { 41468 // This works if the window reference is available 41469 if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window; 41470} // g can still be undefined, but nothing to do about it... 41471// We return undefined, instead of nothing here, so it's 41472// easier to handle this case. if(!global) { ...} 41473 41474 41475module.exports = g; 41476 41477/***/ }), 41478
vendor: 847 bytes, lines 41479-41512
41479/***/ "../node_modules/webpack/buildin/module.js": 41480/*!*************************************************!*\ 41481 !*** ../node_modules/webpack/buildin/module.js ***! 41482 \*************************************************/ 41483/*! no static exports found */ 41484/***/ (function(module, exports) { 41485 41486module.exports = function (module) { 41487 if (!module.webpackPolyfill) { 41488 module.deprecate = function () {}; 41489 41490 module.paths = []; // module.parent = undefined by default 41491 41492 if (!module.children) module.children = []; 41493 Object.defineProperty(module, "loaded", { 41494 enumerable: true, 41495 get: function get() { 41496 return module.l; 41497 } 41498 }); 41499 Object.defineProperty(module, "id", { 41500 enumerable: true, 41501 get: function get() { 41502 return module.i; 41503 } 41504 }); 41505 module.webpackPolyfill = 1; 41506 } 41507 41508 return module; 41509}; 41510 41511/***/ }), 41512
41513/***/ "./common/scripts/app.js": 41514/*!*******************************!*\ 41515 !*** ./common/scripts/app.js ***! 41516 \*******************************/ 41517/*! no exports provided */ 41518/***/ (function(module, __webpack_exports__, __webpack_require__) { 41519 41520"use strict"; 41521__webpack_require__.r(__webpack_exports__); 41522/* harmony import */ var _styles_app_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles/app.scss */ "./common/styles/app.scss"); 41523/* harmony import */ var _styles_app_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_styles_app_scss__WEBPACK_IMPORTED_MODULE_0__); 41524/* harmony import */ var components_mobile_header_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! components/mobile-header/index */ "./components/mobile-header/index.js"); 41525/* harmony import */ var components_hover_effect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! components/hover-effect */ "./components/hover-effect/index.js"); 41526/* harmony import */ var components_forms_telephone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! components/forms/telephone */ "./components/forms/telephone/index.js"); 41527/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js"); 41528/* harmony import */ var components_news__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! components/news */ "./components/news/index.js"); 41529/* harmony import */ var components_popup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! components/popup */ "./components/popup/index.js"); 41530/* harmony import */ var components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! components/popup/inline-popup.twig */ "./components/popup/inline-popup.twig"); 41531/* harmony import */ var components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7__); 41532/* harmony import */ var components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! components/popup/map-popup.twig */ "./components/popup/map-popup.twig"); 41533/* harmony import */ var components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8__); 41534/* harmony import */ var components_preloader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! components/preloader */ "./components/preloader/index.js"); 41535/* harmony import */ var components_slider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! components/slider */ "./components/slider/index.js"); 41536/* harmony import */ var components_forms_submit__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! components/forms/submit */ "./components/forms/submit/index.js"); 41537/* harmony import */ var components_tabs_index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! components/tabs/index */ "./components/tabs/index.js"); 41538/* harmony import */ var components_team__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! components/team */ "./components/team/index.js"); 41539/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 41540/* harmony import */ var components_forms_validation__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! components/forms/validation */ "./components/forms/validation/index.js"); 41541/* harmony import */ var components_yandex_map__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! components/yandex-map */ "./components/yandex-map/index.js"); 41542/* harmony import */ var components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! components/yandex-map/load */ "./components/yandex-map/load.js"); 41543 41544 41545 41546 41547 41548 41549 41550 41551 41552 41553 41554 41555 41556 41557 41558 41559 41560 41561var tabletPortrait = 670; 41562var tabletLandscape = 960; 41563var laptopWidth = 1280; 41564var waitTime = 200; 41565var minWaitTime = 100; 41566var header = new components_mobile_header_index__WEBPACK_IMPORTED_MODULE_1__["default"](); 41567var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_4__["default"](); 41568var borders = document.querySelectorAll('.j-animated-borders'); 41569var bordersSeparated = document.querySelectorAll('.j-animated-borders__separated'); 41570var bordersSeems = document.querySelectorAll('.j-seems-borders'); 41571var verticalBorder = document.querySelectorAll('.j-animated-vertical-border'); 41572var horizontalBorder = document.querySelectorAll('.j-animated-horizontal-border'); 41573var factoids = document.querySelector('.b-main-factoids'); 41574var mainAnimatedTitles = document.querySelectorAll('.b-main-slides__span-second'); 41575var mainsliderContainer = document.querySelector('.j-main-slider'); 41576var disappearingImage = document.querySelector('.j-scroll-image-effect'); 41577var windowWidth = window.innerWidth; 41578var tabsDevelops = document.querySelector('.j-tabs-develop'); 41579var tabsProjects = document.querySelector('.j-tabs-projects'); 41580header.init({ 41581 element: '.j-header', 41582 autoFixed: false, 41583 autoPositionCloseButton: true, 41584 returnPosition: true 41585}); 41586/** 41587 * Ðопап инлайновÑй 41588 */ 41589 41590var inlinePopups = Array.from(document.querySelectorAll('.j-inline-popup')); 41591 41592if (inlinePopups.length) { 41593 inlinePopups.forEach(function (item) { 41594 var popup = new components_popup__WEBPACK_IMPORTED_MODULE_6__["default"](); 41595 popup.init({ 41596 target: item, 41597 template: components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7___default.a 41598 }); 41599 }); 41600} 41601/** 41602 * Ðопап каÑÑа 41603 */ 41604 41605 41606var mapPopups = Array.from(document.querySelectorAll('.j-project-popup-map')); 41607 41608if (mapPopups.length) { 41609 mapPopups.forEach(function (item) { 41610 var popup = new components_popup__WEBPACK_IMPORTED_MODULE_6__["default"](); 41611 popup.init({ 41612 target: item, 41613 template: components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8___default.a 41614 }); 41615 }); 41616 mediator.subscribe('openPopup', function (popup) { 41617 if (popup.type === 'map') { 41618 var _mapSelector = popup.popup.querySelector('.j-project-map'); 41619 41620 if (_mapSelector) { 41621 Object(components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__["default"])().then(function (ymaps) { 41622 var yandexMap = new components_yandex_map__WEBPACK_IMPORTED_MODULE_16__["default"](ymaps); 41623 yandexMap.init({ 41624 wrapper: _mapSelector, 41625 customZoomControl: true, 41626 legend: false 41627 }); 41628 }).catch(function (error) { 41629 // eslint-disable-line 41630 console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u044F\u043D\u0434\u0435\u043A\u0441 \u043A\u0430\u0440\u0442 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(error)); 41631 }); 41632 } 41633 } 41634 }); 41635} 41636/** 41637 * Ð¡Ð»Ð°Ð¹Ð´ÐµÑ Ð¿ÑеимÑÑеÑÑв на главной ÑÑÑаниÑе 41638 * @type {Slider} 41639 */ 41640 41641
41642var benefits = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41643var benefitsSlider = document.querySelector('.j-benefits-slider'); 41644 41645if (benefitsSlider && window.screen.availWidth < laptopWidth) { 41646 benefits.init({ 41647 target: benefitsSlider, 41648 autoplay: true, 41649 infinite: false, 41650 autoplaySpeed: 7000 41651 }); 41652 setTimeout(function () {// const nextBtn = benefitsSlider.querySelector('.slider__arrow-right'); 41653 // 41654 // nextBtn.click(); 41655 }, minWaitTime); 41656} 41657/** 41658 * ÑлайдеÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ видимÑм Ñлайдом 41659 */ 41660 41661 41662var oneSliders = document.querySelectorAll('.j-oneslide-slider'); 41663 41664if (oneSliders) { 41665 oneSliders.forEach(function (slide) { 41666 var oneSlider = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41667 oneSlider.init({ 41668 target: slide 41669 }); 41670 }); 41671} 41672/** 41673 * Ð¡Ð»Ð°Ð¹Ð´ÐµÑ ÑÑпеÑнÑÑ Ð¿ÑоекÑов 41674 */ 41675 41676 41677var columnSliders = document.querySelectorAll('.j-columns-slider'); 41678 41679if (columnSliders && window.screen.availWidth < laptopWidth) { 41680 columnSliders.forEach(function (slide) { 41681 var columnSlider = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41682 columnSlider.init({ 41683 target: slide 41684 }); 41685 }); 41686} 41687 41688var declarations = document.querySelectorAll('.j-declaration-slider'); 41689 41690if (declarations && window.screen.availWidth < tabletPortrait) { 41691 declarations.forEach(function (slide) { 41692 var declarationSlider = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41693 declarationSlider.init({ 41694 target: slide 41695 }); 41696 }); 41697} 41698/** 41699 * Ð¡Ð»Ð°Ð¹Ð´ÐµÑ Ñ ÑÑаÑÑниками ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ 41700 */ 41701 41702 41703var team = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41704var teamPopup = new components_team__WEBPACK_IMPORTED_MODULE_13__["default"](); 41705var teamSlider = document.querySelector('.j-team-slider'); 41706 41707if (teamSlider) { 41708 team.init({ 41709 target: teamSlider, 41710 transitionTime: 150 41711 }); 41712 teamPopup.init(teamSlider); 41713} 41714 41715var teamManual = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41716var teamSliderManual = document.querySelector('.j-team-slider-manual'); 41717 41718if (teamSliderManual) { 41719 teamManual.init({ 41720 target: teamSliderManual, 41721 transitionTime: 150 41722 }); 41723} 41724/** 41725 * Ð¡Ð»Ð°Ð¹Ð´ÐµÑ Ñ Ð»Ð¾Ð³Ð¾Ñипами паÑÑнеÑов 41726 */ 41727 41728 41729var partners = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41730var partnersSlider = document.querySelector('.j-projects-slider'); 41731 41732if (partnersSlider) { 41733 partners.init({ 41734 target: partnersSlider 41735 }); 41736} 41737 41738var principesSlider = document.querySelectorAll('.j-principes-slider'); 41739 41740if (principesSlider) { 41741 principesSlider.forEach(function (slider) { 41742 var principes = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41743 principes.init({ 41744 target: slider 41745 }); 41746 }); 41747} 41748/** 41749 * Ð¡Ð»Ð°Ð¹Ð´ÐµÑ Ð¿ÑеимÑÑеÑÑв пÑоекÑов ÐаÑÑÑа 41750 */ 41751 41752 41753var larusFeatures = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41754var larusFeaturesSlider = document.querySelector('.j-larus-project-feature-slider'); 41755 41756if (larusFeaturesSlider && window.screen.availWidth < tabletLandscape) { 41757 larusFeatures.init({ 41758 target: larusFeaturesSlider 41759 }); 41760} 41761/** 41762 * ÑеиниÑиализиÑÑем ÑлайдеÑ, еÑли он в Ñабе 41763 */ 41764 41765
41766mediator.subscribe('changeTabs', function (element) { 41767 if (element.classList.contains('is-slider')) { 41768 var galleryWrap = element.querySelector('.j-projects-slider'); 41769 41770 if (galleryWrap.classList.contains('b-slider_is_ready')) { 41771 return; 41772 } 41773 41774 var gallery = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"](); 41775 gallery.init({ 41776 target: galleryWrap 41777 }); 41778 } 41779}); 41780/** 41781 * иниÑиализаÑÐ¸Ñ Ñабов 41782 */ 41783 41784if (tabsDevelops) { 41785 tabsDevelops = new components_tabs_index__WEBPACK_IMPORTED_MODULE_12__["default"](); 41786 tabsDevelops.init({ 41787 element: '.j-tabs-develop' 41788 }); 41789} 41790 41791if (tabsProjects) { 41792 tabsProjects = new components_tabs_index__WEBPACK_IMPORTED_MODULE_12__["default"](); 41793 tabsProjects.init({ 41794 element: '.j-tabs-projects' 41795 }); 41796} 41797 41798var tabsProjectsCollapsed = document.querySelector('.j-tabs-projects'); 41799 41800if (window.screen.availWidth < tabletLandscape && tabsProjectsCollapsed) { 41801 var opened = false; 41802 tabsProjectsCollapsed.addEventListener('click', function () { 41803 if (opened) { 41804 tabsProjects.tabsParent.classList.remove('is-opened');
41805 tabsProjects.tabs.forEach(function (link) { 41806 link.style.pointerEvents = 'none'; 41807 }); 41808 opened = false; 41809 } else { 41810 tabsProjects.tabsParent.classList.add('is-opened'); 41811 tabsProjects.tabs.forEach(function (link) { 41812 link.style.pointerEvents = 'auto'; 41813 link.style.width = '100%'; 41814 }); 41815 } 41816 }); 41817 tabsProjects.tabs.forEach(function (link) { 41818 link.addEventListener('click', function (event) { 41819 link.style.width = '0'; 41820 event.target.style.width = 'max-content'; 41821 opened = true; 41822 }); 41823 }); 41824} // Ðвижение ÑакÑоидов 41825 41826 41827if (factoids && window.screen.availWidth < laptopWidth) { 41828 var benefitPosition = 0; 41829 var firstSlide = 0; 41830 var zero = 0; 41831 var one = 1; 41832 var two = 2; 41833 var four = 4; 41834 var factoid = factoids.querySelector('.b-main-factoids__item'); 41835 var mainImages = document.querySelectorAll('.b-main-slides__img img'); 41836 var slideWidth = factoid.offsetWidth; 41837 41838 var makeVisible = function makeVisible(number) { 41839 if (mainImages.length) { 41840 mainImages[number].classList.add('b-main-slides__img-scaling'); 41841 } 41842 }; 41843 41844 var makeHidden = function makeHidden() { 41845 mainImages.forEach(function (image) { 41846 image.classList.remove('b-main-slides__img-scaling'); 41847 }); 41848 }; 41849 41850 var clearTitleAnimation = function clearTitleAnimation() {
41851 mainAnimatedTitles.forEach(function (title) { 41852 title.classList.remove('is-goes-left__long'); 41853 title.classList.remove('is-goes-right__long'); 41854 }); 41855 }; 41856 41857 mainsliderContainer.classList.add('is-autoplay'); 41858 makeHidden(); 41859 makeVisible(firstSlide); 41860 mainAnimatedTitles[firstSlide].classList.add('is-goes-left__long'); 41861 factoids.style.transform = "translateX(".concat(benefitPosition, "px)"); 41862 mediator.subscribe('benefitGoesLeft', function (activeSlide) { 41863 firstSlide = firstSlide - one; 41864 41865 if (window.screen.availWidth >= tabletLandscape) { 41866 benefitPosition = zero; 41867 } else { 41868 benefitPosition = benefitPosition + slideWidth; 41869 } 41870 41871 if (activeSlide === four) { 41872 firstSlide = two; 41873 benefitPosition = -slideWidth * two; 41874 } 41875 41876 makeHidden(); 41877 makeVisible(firstSlide); 41878 factoids.style.transform = "translateX(".concat(benefitPosition, "px)"); 41879 clearTitleAnimation(); 41880 mainAnimatedTitles[firstSlide].classList.remove('is-goes-right__long'); 41881 mainAnimatedTitles[firstSlide].classList.add('is-goes-right__long'); 41882 }); 41883 mediator.subscribe('benefitGoesRight', function (parameters) { 41884 var position = parameters.position; 41885 var activeSlide = parameters.slide; 41886 41887 if (position === zero) { 41888 firstSlide = zero; 41889 benefitPosition = zero; 41890 } else { 41891 if (window.screen.availWidth >= tabletLandscape) { 41892 if (activeSlide !== two) { 41893 benefitPosition = -slideWidth; 41894 } 41895 } else { 41896 benefitPosition = benefitPosition - slideWidth; 41897 } 41898 41899 firstSlide = firstSlide + one; 41900 } 41901 41902 makeHidden(); 41903 makeVisible(firstSlide); 41904 factoids.style.transform = "translateX(".concat(benefitPosition, "px)"); 41905 clearTitleAnimation(); 41906 mainAnimatedTitles[firstSlide].classList.remove('is-goes-left__long'); 41907 mainAnimatedTitles[firstSlide].classList.add('is-goes-left__long'); 41908 }); 41909} 41910/** 41911 * hover ÑÑÑÐµÐºÑ 41912 */ 41913 41914 41915var hoverBlocks = document.querySelectorAll('.j-hover-highlight'); 41916 41917if (hoverBlocks && window.screen.availWidth >= laptopWidth) { 41918 hoverBlocks.forEach(function (block) { 41919 return new components_hover_effect__WEBPACK_IMPORTED_MODULE_2__["default"](block); 41920 }); 41921} 41922 41923mediator.subscribe('receivedNews', function () { 41924 var newsBlocks = document.querySelectorAll('.j-hover-highlight'); 41925 41926 if (newsBlocks && window.screen.availWidth >= laptopWidth) { 41927 newsBlocks.forEach(function (block) { 41928 return new components_hover_effect__WEBPACK_IMPORTED_MODULE_2__["default"](block); 41929 }); 41930 } 41931}); 41932/** 41933 * ÐаÑÑа на главной ÑÑÑаниÑе 41934 */ 41935 41936var mapSelector = document.querySelector('.j-main-map'); 41937 41938if (mapSelector) { 41939 Object(components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__["default"])().then(function (ymaps) { 41940 var yandexMap = new components_yandex_map__WEBPACK_IMPORTED_MODULE_16__["default"](ymaps); 41941 yandexMap.init({ 41942 wrapper: mapSelector, 41943 customZoomControl: true, 41944 legend: true 41945 }); 41946 }).catch(function (error) { 41947 // eslint-disable-line 41948 console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u044F\u043D\u0434\u0435\u043A\u0441 \u043A\u0430\u0440\u0442 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(error)); 41949 }); 41950} 41951/** 41952 * ÐаÑÑа на ÑÑÑаниÑе конÑакÑов 41953 */ 41954 41955 41956var mapContacts = document.querySelector('.j-contacts-map'); 41957 41958if (mapContacts) { 41959 Object(components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__["default"])().then(function (ymaps) { 41960 var yandexMap = new components_yandex_map__WEBPACK_IMPORTED_MODULE_16__["default"](ymaps); 41961 yandexMap.init({ 41962 wrapper: mapContacts, 41963 customZoomControl: true, 41964 gps: true 41965 }); 41966 }).catch(function (error) { 41967 // eslint-disable-line 41968 console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u044F\u043D\u0434\u0435\u043A\u0441 \u043A\u0430\u0440\u0442 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(error)); 41969 }); 41970} 41971/** 41972 * облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи 41973 * @param {Object} element - пÑоÑмаÑÑиваемÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ 41974 * @returns {boolean} - возвÑаÑÐ°ÐµÑ true, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² облаÑÑи видимоÑÑи 41975 */ 41976 41977 41978var isScrolledIntoView = function isScrolledIntoView(element) { 41979 var docViewTop = window.pageYOffset; 41980 var docViewBottom = docViewTop + window.innerHeight; 41981 var elemTop = element.getBoundingClientRect().top + document.documentElement.scrollTop; 41982 var elemBottom = elemTop + element.offsetHeight; 41983 return elemBottom <= docViewBottom && elemTop >= docViewTop; 41984}; 41985/** 41986 * облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи 41987 * @param {Object} element - пÑоÑмаÑÑиваемÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ 41988 * @param {number} offset - ÐÑÑÑÑп ÑвеÑÑ Ñ Ð² пÑоÑенÑÐ°Ñ 41989 * @returns {boolean} - возвÑаÑÐ°ÐµÑ true, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² облаÑÑи видимоÑÑи 41990 */ 41991 41992 41993var isScrolledIntoTop = function isScrolledIntoTop(element, offset) { 41994 var hundred = 100; 41995 var docViewBottom = window.pageYOffset + window.innerHeight; 41996 var elementBounding = element.getBoundingClientRect(); 41997 var elemTop = elementBounding.top + document.documentElement.scrollTop; 41998 var offsetPx = 0; 41999 42000 if (offset) { 42001 offsetPx = elementBounding.height * offset / hundred; 42002 } 42003 42004 return docViewBottom > elemTop + offsetPx; 42005}; 42006/** 42007 * измеÑÑÐµÑ ÑкоÑоÑÑÑ ÑкÑолла 42008 */ 42009 42010/* eslint-disable */ 42011 42012 42013var checkScrollSpeed = function (settings) { 42014 settings = settings || {}; 42015 var lastPos, 42016 newPos, 42017 timer, 42018 delta,
42019 delay = settings.delay || 50; // in "ms" (higher means lower fidelity ) 42020 42021 function clear() { 42022 lastPos = null; 42023 delta = 0; 42024 } 42025 42026 clear(); 42027 return function () { 42028 newPos = window.scrollY; 42029 42030 if (lastPos != null) { 42031 // && newPos < maxScroll 42032 delta = newPos - lastPos; 42033 } 42034 42035 lastPos = newPos; 42036 clearTimeout(timer); 42037 timer = setTimeout(clear, delay); 42038 return delta; 42039 }; 42040}(); 42041/* eslint-enable */ 42042 42043/** 42044 * анимаÑÐ¸Ñ Ð¿Ñи ÑкÑолле ÑÑÑÐ°Ð½Ð¸Ñ 42045 */ 42046 42047 42048var fadeStop = 350; 42049 42050window.onscroll = function () { 42051 // анимаÑÐ¸Ñ Ð»Ð¸Ð½Ð¸Ð¹ 42052 if (window.screen.availWidth >= tabletLandscape) { 42053 borders.forEach(function (div) { 42054 if (isScrolledIntoView(div)) { 42055 div.classList.add('b-animate-borders__horizontal'); 42056 } 42057 }); 42058 bordersSeparated.forEach(function (div) { 42059 var top = 10; 42060 var middle = 50; 42061 var bottom = 100; 42062 42063 if (isScrolledIntoTop(div, top)) {// СÑда анимаÑÑÐ¸Ñ Ð´Ð»Ñ Ð²ÐµÑ Ð½ÐµÐ³Ð¾ боÑдеÑа 42064 } 42065 42066 if (isScrolledIntoTop(div, middle)) {// СÑда анимаÑÑÐ¸Ñ Ð´Ð»Ñ Ð±Ð¾ÐºÐ¾Ð²Ð¾Ð³Ð¾ боÑдеÑа 42067 } 42068 42069 if (isScrolledIntoTop(div, bottom)) { 42070 div.classList.add('b-animate-borders__separated'); 42071 } 42072 }); 42073 verticalBorder.forEach(function (div) { 42074 if (isScrolledIntoView(div)) { 42075 div.classList.add('b-animate-borders__vertical-border'); 42076 } 42077 }); 42078 horizontalBorder.forEach(function (div) { 42079 if (isScrolledIntoView(div)) { 42080 div.classList.add('b-animate-borders__horizontal-border'); 42081 } 42082 }); 42083 /** 42084 * анимаÑÐ¸Ñ Ð½Ð° ÑÑÑаниÑе "пÑÐ¾ÐµÐºÑ ÐаÑÑÑа" 42085 */ 42086 42087 if (disappearingImage) { 42088 var fadeUntil = checkScrollSpeed() > 100 ? window.pageYOffset : 300; // eslint-disable-line 42089 42090 var _one = 1; 42091 var scaleUntil = 2100; 42092 var img = disappearingImage.querySelector('img'); 42093 42094 if (window.pageYOffset <= fadeStop) { 42095 disappearingImage.style.opacity = _one - window.pageYOffset / fadeUntil; 42096 img.style.transform = "scale(".concat(_one + window.pageYOffset / scaleUntil, ")"); 42097 } else { 42098 disappearingImage.style.opacity = 0; 42099 } 42100 } 42101 } 42102}; 42103 42104if (window.screen.availWidth >= tabletLandscape) { 42105 bordersSeems.forEach(function (div) { 42106 if (isScrolledIntoView(div)) { 42107 div.classList.add('b-animate-borders__separated'); 42108 } 42109 }); 42110 42111 if (disappearingImage && window.pageYOffset > fadeStop) { 42112 disappearingImage.classList.add('is-scrolled'); 42113 } 42114} 42115/** 42116 * новоÑÑи 42117 */ 42118 42119 42120var newsForm = document.querySelector('#newsForm'); 42121 42122if (newsForm) { 42123 var news = new components_news__WEBPACK_IMPORTED_MODULE_5__["default"](); 42124 news.init(newsForm); 42125} 42126/** 42127 * новоÑÑи на главной ÑÑÑаниÑе 42128 * @type {Element} 42129 */ 42130 42131 42132var newsMain = document.querySelector('#newsMainpage'); 42133 42134if (newsMain) { 42135 /** 42136 * вÑÑиÑлÑÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° новоÑÑи, добавлÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñй клаÑÑ 42137 * Ð´Ð»Ñ ÑкÑÑÑÐ¸Ñ Ð³ÑÐ°Ð½Ð¸Ñ 42138 */ 42139 var newsBlock = document.querySelectorAll('.b-new__blank'); 42140 var newsMainPosition = newsMain.getBoundingClientRect(); 42141 var leftMin = 0; 42142 var rightMin = -1; 42143 42144 var destroyBorder = function destroyBorder(div) { 42145 var borderElements = div.querySelectorAll('[class*=border]'); 42146 borderElements.forEach(function (border) { 42147 common_scripts_utils__WEBPACK_IMPORTED_MODULE_14__["default"].removeElement(border); 42148 }); 42149 }; 42150 42151 newsBlock.forEach(function (div) { 42152 var blockPosition = div.getBoundingClientRect(); 42153 var leftDifference = blockPosition.left - newsMainPosition.left; 42154 var rightDifference = blockPosition.right - newsMainPosition.right; 42155 42156 if (leftDifference === leftMin) { 42157 div.classList.add('is-left'); 42158 } 42159 42160 if (Math.round(rightDifference) >= rightMin) { 42161 div.classList.add('is-right'); 42162 } 42163 42164 if (window.screen.availWidth < tabletLandscape) { 42165 destroyBorder(div); 42166 } 42167 }); 42168} 42169/** 42170 * ÐалидаÑÐ¸Ñ Ð¸Ð½Ð¿ÑÑов 42171 */ 42172 42173 42174var inputs = Array.from(document.querySelectorAll('.j-input')); 42175 42176if (inputs.length) {
42177 inputs.forEach(function (item) { 42178 var inputValidation = new components_forms_validation__WEBPACK_IMPORTED_MODULE_15__["default"](); 42179 var errorMessage = item.dataset.error; 42180 inputValidation.init({ 42181 target: item, 42182 error: errorMessage 42183 }); 42184 }); 42185} 42186/** 42187 * ÐаÑка Ð´Ð»Ñ Ð¸Ð½Ð¿ÑÑа Ñ ÑелеÑоном 42188 */ 42189 42190 42191var inputTel = new components_forms_telephone__WEBPACK_IMPORTED_MODULE_3__["default"](); 42192var phoneInputs = Array.from(document.querySelectorAll('input[type="tel"]')); 42193 42194if (phoneInputs.length) { 42195 inputTel.init({ 42196 input: phoneInputs 42197 }); 42198} 42199 42200mediator.subscribe('openPopup', function () { 42201 var inputTelInPopup = new components_forms_telephone__WEBPACK_IMPORTED_MODULE_3__["default"](); 42202 var phoneInputsInPopup = Array.from(document.querySelectorAll('input[type="tel"]')); 42203 42204 if (phoneInputsInPopup.length) { 42205 inputTelInPopup.init({ 42206 input: phoneInputsInPopup 42207 }); 42208 } 42209 42210 var inputsInPopup = Array.from(document.querySelectorAll('.j-input')); 42211 42212 if (inputsInPopup.length) { 42213 inputsInPopup.forEach(function (item) { 42214 var inputValidationInPopup = new components_forms_validation__WEBPACK_IMPORTED_MODULE_15__["default"](); 42215 var errorInPopup = item.dataset.error; 42216 inputValidationInPopup.init({ 42217 target: item, 42218 error: errorInPopup 42219 }); 42220 }); 42221 } 42222 42223 var submitSelectorInPopup = Array.from(document.querySelectorAll('.j-input-submit')); 42224 42225 if (submitSelectorInPopup.length) { 42226 submitSelectorInPopup.forEach(function (item) { 42227 var submitInputsInPopup = new components_forms_submit__WEBPACK_IMPORTED_MODULE_11__["default"](); 42228 submitInputsInPopup.init({ 42229 target: item 42230 }); 42231 }); 42232 } 42233}); 42234/** 42235 * ÐбÑабоÑÑик оÑпÑавки ÑоÑÐ¼Ñ Ð¸ валидаÑÐ¸Ñ Ð¿Ñи ÑабмиÑе 42236 */ 42237 42238var submitSelector = Array.from(document.querySelectorAll('.j-input-submit')); 42239 42240if (submitSelector.length) { 42241 submitSelector.forEach(function (item) { 42242 var submitInputs = new components_forms_submit__WEBPACK_IMPORTED_MODULE_11__["default"](); 42243 submitInputs.init({ 42244 target: item 42245 }); 42246 }); 42247} 42248/** 42249 * Ð´Ð»Ñ ÑеиниÑиализаÑии ÑлайдеÑов пÑи ÑеÑайзе окна 42250 */ 42251 42252 42253window.addEventListener('resize', common_scripts_utils__WEBPACK_IMPORTED_MODULE_14__["default"].debounce(function () { 42254 if (window.innerWidth !== windowWidth) { 42255 location.reload(); 42256 } 42257}, waitTime)); 42258 42259if (document.querySelector('.j-preloader')) { 42260 new components_preloader__WEBPACK_IMPORTED_MODULE_9__["default"]().init(); 42261} 42262 42263/***/ }), 42264
42265/***/ "./common/scripts/mediator.js": 42266/*!************************************!*\ 42267 !*** ./common/scripts/mediator.js ***! 42268 \************************************/ 42269/*! exports provided: default */ 42270/***/ (function(module, __webpack_exports__, __webpack_require__) { 42271 42272"use strict"; 42273__webpack_require__.r(__webpack_exports__); 42274function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 42275 42276function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 42277 42278function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 42279 42280/* eslint-disable consistent-this */ 42281var instance = null; 42282 42283var Mediator = 42284/*#__PURE__*/ 42285function () { 42286 function Mediator() { 42287 _classCallCheck(this, Mediator); 42288 42289 if (!instance) { 42290 instance = this; 42291 } 42292 42293 this.channels = {}; 42294 return instance; 42295 } 42296 42297 _createClass(Mediator, [{ 42298 key: "subscribe", 42299 value: function subscribe(channel, fn) { 42300 if (!this.channels[channel]) { 42301 this.channels[channel] = []; 42302 } 42303 42304 this.channels[channel].push({ 42305 context: this, 42306 callback: fn 42307 }); 42308 } 42309 }, { 42310 key: "publish", 42311 value: function publish(channel) { 42312 if (!this.channels[channel]) { 42313 return false; 42314 } 42315 42316 var firstArgument = 1; 42317 var args = Array.prototype.slice.call(arguments, firstArgument); 42318 this.channels[channel].forEach(function (subscription) { 42319 subscription.callback.apply(subscription.context, args); 42320 }); 42321 return this; 42322 } 42323 }, { 42324 key: "installTo", 42325 value: function installTo(obj) { 42326 obj.channels = {}; 42327 obj.publish = this.publish; 42328 obj.subscribe = this.subscribe; 42329 } 42330 }, { 42331 key: "unsubscribe", 42332 value: function unsubscribe(channel) { 42333 if (!this.channels[channel]) { 42334 return; 42335 } 42336 42337 this.channels[channel] = null; 42338 } 42339 }]); 42340 42341 return Mediator; 42342}(); 42343 42344/* harmony default export */ __webpack_exports__["default"] = (Mediator); 42345/* eslint-enable consistent-this */ 42346 42347/***/ }), 42348
42349/***/ "./common/scripts/utils.js": 42350/*!*********************************!*\ 42351 !*** ./common/scripts/utils.js ***! 42352 \*********************************/ 42353/*! exports provided: default */ 42354/***/ (function(module, __webpack_exports__, __webpack_require__) { 42355 42356"use strict"; 42357__webpack_require__.r(__webpack_exports__); 42358/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js"); 42359/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); 42360function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 42361 42362function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 42363 42364function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 42365 42366function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 42367 42368/** 42369 * @version 1.4 42370 * @author Kelnik Studios {http://kelnik.ru} 42371 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/utils.html documentation 42372 */ 42373 42374/** 42375 * DEPENDENCIES 42376 */ 42377 42378 42379var Utils = 42380/*#__PURE__*/ 42381function () { 42382 function Utils() { 42383 _classCallCheck(this, Utils); 42384 } 42385 42386 _createClass(Utils, null, [{ 42387 key: "comfortableAnimationTime", 42388 42389 /** 42390 * ÐеÑод ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐºÐ¾Ð¼ÑоÑнÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñии. 42391 * @return {Number} comfortableAnimationTimeValue - знаÑение в мÑ. 42392 */ 42393 value: function comfortableAnimationTime() { 42394 var comfortableAnimationTimeValue = 300; 42395 return comfortableAnimationTimeValue; 42396 } 42397 /** 42398 * ÐеÑод полноÑÑÑÑ Ð¾ÑиÑÐ°ÐµÑ Ð²ÐµÑÑ html ÑлеменÑ. 42399 * @param {Object} element - DOM-ÑлеменÑ, коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ оÑиÑÑиÑÑ. 42400 */ 42401 42402 }, { 42403 key: "clearHtml", 42404 value: function clearHtml(element) { 42405 element.innerHTML = ''; 42406 } 42407 /** 42408 * ÐеÑод вÑÑавлÑÐµÑ ÑодеÑжимое в блок. 42409 * @param {Object} element - ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² коÑоÑÑй нÑжно вÑÑавиÑÑ. 42410 * @param {Object/string} content - вÑÑавлÑемÑй конÑенÑ. 42411 */ 42412 42413 }, { 42414 key: "insetContent", 42415 value: function insetContent(element, content) { 42416 if (typeof content === 'string') { 42417 element.insertAdjacentHTML('beforeend', content); 42418 } else if (_typeof(content) === 'object') { 42419 element.appendChild(content); 42420 } 42421 } 42422 /** 42423 * ÐеÑод полноÑÑÑÑ ÑдалÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð· DOM-деÑева. 42424 * @param {Object} element - ÑлеменÑ, коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑдалиÑÑ. 42425 */ 42426 42427 }, { 42428 key: "removeElement", 42429 value: function removeElement(element) { 42430 // node.remove() не ÑабоÑÐ°ÐµÑ Ð² IE11 42431 element.parentNode.removeChild(element); 42432 } 42433 /** 42434 * ÐеÑод показÑÐ²Ð°ÐµÑ ÑлеменÑ. 42435 * @param {Node} element - ÑлеменÑ, коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ показаÑÑ. 42436 */ 42437 42438 }, { 42439 key: "show", 42440 value: function show(element) { 42441 element.style.display = 'block'; 42442 } 42443 /** 42444 * ÐеÑод ÑкÑÑÐ²Ð°ÐµÑ ÑлеменÑ. 42445 * @param {Node} element - ÑлеменÑ, коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑкÑÑÑÑ. 42446 */ 42447 42448 }, { 42449 key: "hide", 42450 value: function hide(element) { 42451 element.style.display = 'none'; 42452 } 42453 /** 42454 * ÐеÑод оÑпÑавлÑÐµÑ ajax запÑÐ¾Ñ Ð½Ð° ÑеÑвеÑ. 42455 * @param {Object} data - оÑпÑавлÑемÑе даннÑе. 42456 * @param {String} url - маÑÑÑÑÑ Ð¿Ð¾ коÑоÑÐ¾Ð¼Ñ Ð½Ñжно пÑоизвеÑÑи запÑоÑ. 42457 * @param {Function} callback - ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑаÑного вÑзова, коÑоÑÐ°Ñ Ð¿Ñи ÑÑÐ¿ÐµÑ Ðµ вÑÐ·Ð¾Ð²ÐµÑ success, а пÑи оÑибке error. 42458 * @param {String} method - меÑод запÑоÑа 42459 */ 42460 42461 }, { 42462 key: "send", 42463 value: function send(data, url) { 42464 var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; 42465 var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'POST'; 42466 // eslint-disable-line 42467 var xhr = new XMLHttpRequest(); 42468 var statusSuccess = 200; 42469 var dataToSend = data; 42470 xhr.open(method, url); 42471 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 42472 xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest'); 42473 42474 if (_typeof(dataToSend) === 'object') { 42475 dataToSend = jquery__WEBPACK_IMPORTED_MODULE_0___default.a.param(dataToSend); 42476 } 42477 42478 xhr.send(dataToSend); 42479 42480 xhr.onload = function XHR() { 42481 if (xhr.status === statusSuccess) { 42482 var req = JSON.parse(this.responseText); 42483 callback.success(req); 42484 } else { 42485 callback.error(xhr.status); 42486 } 42487 }; 42488 } 42489 /** 42490 * ÐеÑод пÑовеÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие инÑеÑнеÑа 42491 * @return {boolean} - ÐÑи налиÑии ÑезÑлÑÑаÑом бÑÐ´ÐµÑ true, а пÑи оÑÑÑÑÑвии false. 42492 */ 42493 42494 }, { 42495 key: "checkInternetConnection", 42496 value: function checkInternetConnection() { 42497 return navigator.onLine; 42498 } 42499 /** 42500 * ÐеÑод пÑовеÑÑÐµÑ Ð¿ÑиÑÑÑÑÑвÑÐµÑ Ð»Ð¸ клÑÑ Ð² обÑекÑе 42501 * @param {Object} object - пÑовеÑÑем обÑÐµÐºÑ 42502 * @param {String} key - клÑÑ, налиÑие коÑоÑого пÑовеÑÑÐµÑ Ð² обÑекÑе 42503 * @return {boolean} - пÑиÑÑÑÑÑвÑÐµÑ Ð¸Ð»Ð¸ Ð½ÐµÑ ÐºÐ»ÑÑ Ð² обÑекÑе 42504 */ 42505 42506 }, { 42507 key: "keyExist", 42508 value: function keyExist(object, key) { 42509 return Object.prototype.hasOwnProperty.call(object, key); 42510 } 42511 /** 42512 * ÐеÑод пÑовеÑÑÐµÑ Ð¿ÑÑÑой обÑÐµÐºÑ Ð¸Ð»Ð¸ Ð½ÐµÑ 42513 * @param {Object} object - обÑÐµÐºÑ Ð¿ÑовеÑÑемÑй на пÑÑÑоÑÑ 42514 * @return {boolean} - true еÑли пÑÑÑой и false еÑли полнÑй 42515 */ 42516 42517 }, { 42518 key: "isEmptyObject", 42519 value: function isEmptyObject(object) { 42520 var empty = 0; 42521 return Object.keys(object).length === empty; 42522 } 42523 /** 42524 * ÐÑовеÑÑÐµÑ Ð¿ÐµÑеданнÑе даннÑе на ÑÑÑÐ¾ÐºÑ 42525 * @param {String} string - даннÑе на пÑовеÑÐºÑ 42526 * @return {boolean} - возÑаÑÐ°ÐµÑ true, еÑли ÑÑÑока, и false наобоÑÐ¾Ñ 42527 */ 42528 42529 }, { 42530 key: "isString", 42531 value: function isString(string) { 42532 return typeof string === 'string'; 42533 } 42534 /** 42535 * Ð£Ð·Ð½Ð°ÐµÑ index ÑлеменÑа в ÑодиÑелÑÑкой ÑÐ»ÐµÐ¼ÐµÐ½Ñ 42536 * Ðналог jquery.index() 42537 * @param {Node} element - иÑкомÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ 42538 * @return {number} - поÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ (индекÑ) в ÑодиÑелÑÑком ÑлеменÑе 42539 */ 42540 42541 }, { 42542 key: "getElementIndex", 42543 value: function getElementIndex(element) { 42544 return Array.from(element.parentNode.children).indexOf(element); 42545 } 42546 /** 42547 * ÐÑовеÑÑеÑ, поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð»Ð¸ ÑÑÑÑойÑÑво touch-ÑобÑÑÐ¸Ñ 42548 * @return {boolean} - возÑаÑÐ°ÐµÑ true, еÑли Touch-ÑÑÑÑойÑÑво, и false наобоÑÐ¾Ñ 42549 */ 42550 42551 }, { 42552 key: "isTouch", 42553 value: function isTouch() { 42554 return Boolean(typeof window !== 'undefined' && ('ontouchstart' in window || window.DocumentTouch && typeof document !== 'undefined' && document instanceof window.DocumentTouch)) || Boolean(typeof navigator !== 'undefined' && (navigator.maxTouchPoints || navigator.msMaxTouchPoints)); 42555 } 42556 /** 42557 * Ð£Ð·Ð½Ð°ÐµÑ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¾ вÑÑпоÑÑе 42558 * @param {Node} element - иÑкомÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ 42559 * @return {boolean} - возÑаÑÐ°ÐµÑ true, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¸Ð´ÐµÐ½ на ÑкÑане, и false наобоÑÐ¾Ñ 42560 */ 42561 42562 }, { 42563 key: "isInViewport", 42564 value: function isInViewport(element) { 42565 var rect = element.getBoundingClientRect(); 42566 var windowHeight = window.innerHeight || document.documentElement.clientHeight; 42567 var windowWidth = window.innerWidth || document.documentElement.clientWidth; 42568 var belowViewport = 0; 42569 var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= belowViewport; 42570 var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= belowViewport; 42571 return verticalInView && horizontalInView; 42572 } 42573 /** 42574 * ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑедаваемÑÑ ÑÑнкÑÐ¸Ñ Ð½Ðµ ÑаÑе, Ñем Ñаз в wait Ð¼Ñ 42575 * @param {Object} func - ÑÑнкÑÐ¸Ñ 42576 * @param {number} wait - вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ, Ð¼Ñ 42577 * @returns {Function} - func 42578 */ 42579 42580 }, { 42581 key: "debounce", 42582 value: function debounce(func, wait) { 42583 /* eslint-disable */ 42584 var timeout; 42585 return function () { 42586 var _this = this; 42587 42588 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 42589 args[_key] = arguments[_key]; 42590 } 42591 42592 clearTimeout(timeout); 42593 timeout = setTimeout(function () { 42594 func.apply(_this, args); 42595 }, wait); 42596 }; 42597 /* eslint-enable */ 42598 } 42599 }, { 42600 key: "closest", 42601 value: function closest(element, selector) { 42602 if (!selector) { 42603 return false;
42604 } 42605 42606 var first = 0; 42607 var foundElements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).closest(selector); 42608 42609 if (!foundElements.length) { 42610 return false; 42611 } 42612 42613 return foundElements[first]; 42614 } 42615 }]); 42616 42617 return Utils; 42618}(); 42619 42620/* harmony default export */ __webpack_exports__["default"] = (Utils); 42621 42622/***/ }), 42623
42624/***/ "./common/styles/app.scss": 42625/*!********************************!*\ 42626 !*** ./common/styles/app.scss ***! 42627 \********************************/ 42628/*! no static exports found */ 42629/***/ (function(module, exports, __webpack_require__) { 42630 42631// extracted by mini-css-extract-plugin 42632 42633/***/ }), 42634
42635/***/ "./components/forms/submit/index.js": 42636/*!******************************************!*\ 42637 !*** ./components/forms/submit/index.js ***! 42638 \******************************************/ 42639/*! exports provided: default */ 42640/***/ (function(module, __webpack_exports__, __webpack_require__) { 42641 42642"use strict"; 42643__webpack_require__.r(__webpack_exports__); 42644/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/forms/validation/validation.twig */ "./components/forms/validation/validation.twig"); 42645/* harmony import */ var components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0__); 42646/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 42647/* harmony import */ var components_forms_validation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! components/forms/validation */ "./components/forms/validation/index.js"); 42648function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 42649 42650function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 42651 42652function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 42653 42654 42655 42656 42657 42658var Submit = 42659/*#__PURE__*/ 42660function () { 42661 function Submit() { 42662 _classCallCheck(this, Submit); 42663 } 42664 42665 _createClass(Submit, [{ 42666 key: "init", 42667 value: function init(options) { 42668 this.target = options.target; 42669 this.form = this.target.closest('form'); 42670 this.formWrap = this.target.closest('.b-callback__form'); 42671 this.replyWrap = this.formWrap.nextElementSibling; 42672 this.url = this.form.getAttribute('action'); 42673 this.method = this.form.getAttribute('method'); 42674 this.inputs = this.form.querySelectorAll('.j-input'); 42675 this.noErrors = 0; 42676 this.bindEvents(); 42677 } 42678 }, { 42679 key: "bindEvents", 42680 value: function bindEvents() { 42681 var _this = this; 42682 42683 this.target.addEventListener('click', function (event) { 42684 event.preventDefault(); 42685 42686 _this.validationCheck(); 42687 }); 42688 } 42689 }, { 42690 key: "validationCheck", 42691 value: function validationCheck() { 42692 this.inputs.forEach(function (item) { 42693 var inputValidation = new components_forms_validation__WEBPACK_IMPORTED_MODULE_2__["default"](); 42694 var errorMessage = item.dataset.error; 42695 inputValidation.init({ 42696 target: item, 42697 error: errorMessage 42698 }); 42699 inputValidation.validate(); 42700 }); 42701 42702 if (document.querySelectorAll('.has-error').length === this.noErrors) { 42703 this.send(); 42704 } 42705 } 42706 }, { 42707 key: "send", 42708 value: function send() { 42709 var that = this; 42710 var formData = $(this.form).serialize(); 42711 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].send(formData, this.url, { 42712 success: function success(respond) { 42713 that.showSuccessMessage(respond); 42714 }, 42715 error: function error(_error) { 42716 console.error("\u043E\u0448\u0438\u0431\u043A\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435: ".concat(_error)); 42717 } 42718 }, this.method); 42719 } 42720 }, { 42721 key: "showSuccessMessage", 42722 value: function showSuccessMessage(data) { 42723 this.formWrap.style.display = 'none'; 42724 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].insetContent(this.replyWrap, components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0___default()(data.data)); 42725 } 42726 }]); 42727 42728 return Submit; 42729}(); 42730 42731/* harmony default export */ __webpack_exports__["default"] = (Submit);
42732/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js"))) 42733 42734/***/ }), 42735
42736/***/ "./components/forms/telephone/index.js": 42737/*!*********************************************!*\ 42738 !*** ./components/forms/telephone/index.js ***! 42739 \*********************************************/ 42740/*! exports provided: default */ 42741/***/ (function(module, __webpack_exports__, __webpack_require__) { 42742 42743"use strict"; 42744__webpack_require__.r(__webpack_exports__); 42745/* harmony import */ var inputmask__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! inputmask */ "../node_modules/inputmask/index.js"); 42746/* harmony import */ var inputmask__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(inputmask__WEBPACK_IMPORTED_MODULE_0__); 42747function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 42748 42749function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 42750 42751function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 42752 42753/** 42754 * @version 1.0alpha 42755 * @author Kelnik Studios {http://kelnik.ru} 42756 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/forms/input-tel.html documentation 42757 */ 42758 42759/** 42760 * Dependencies 42761 */ 42762 42763/** 42764 * ÐодÑÐ»Ñ Ð²Ð²ÐµÑÐ°ÐµÑ Ð¼Ð°ÑÐºÑ Ð½Ð° input Ñипом tel 42765 */ 42766 42767var InputTelephone = 42768/*#__PURE__*/ 42769function () { 42770 function InputTelephone() { 42771 _classCallCheck(this, InputTelephone); 42772 } 42773 42774 _createClass(InputTelephone, [{ 42775 key: "init", 42776 value: function init(options) { 42777 this.input = options.input; 42778 this.mask = options.mask || '+7(999) 999-99-99'; 42779 this.setMask(); 42780 } 42781 /** 42782 * УÑÑанавливаем маÑÐºÑ Ð½Ð° инпÑÑ 42783 */ 42784 42785 }, { 42786 key: "setMask", 42787 value: function setMask() { 42788 inputmask__WEBPACK_IMPORTED_MODULE_0___default()({ 42789 mask: this.mask 42790 }).mask(this.input); 42791 } 42792 }]); 42793 42794 return InputTelephone; 42795}(); 42796 42797/* harmony default export */ __webpack_exports__["default"] = (InputTelephone); 42798 42799/***/ }), 42800
42801/***/ "./components/forms/validation/index.js": 42802/*!**********************************************!*\ 42803 !*** ./components/forms/validation/index.js ***! 42804 \**********************************************/ 42805/*! exports provided: default */ 42806/***/ (function(module, __webpack_exports__, __webpack_require__) { 42807 42808"use strict"; 42809__webpack_require__.r(__webpack_exports__); 42810/* harmony import */ var hyperform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hyperform */ "../node_modules/hyperform/src/hyperform.js"); 42811/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 42812function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 42813 42814function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 42815 42816function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 42817 42818/** 42819 * Dependencies 42820 */ 42821 42822 42823var focusClass = 'is-focused'; 42824 42825var Validation = 42826/*#__PURE__*/ 42827function () { 42828 function Validation() { 42829 _classCallCheck(this, Validation); 42830 42831 this.errorClass = 'has-error'; 42832 this.errorWrapClass = 'b-form-error'; 42833 } 42834 42835 _createClass(Validation, [{ 42836 key: "init", 42837 value: function init(options) { 42838 this.input = options.target; 42839 this.errorMessage = options.error || 'ÐведиÑе ÑекÑÑ Ð² поле ввода'; 42840 this.inputWrap = this.input.closest('div'); 42841 this.errorWrap = this.inputWrap.querySelector(".".concat(this.errorWrapClass)); 42842 this.bindEvents(); 42843 } 42844 }, { 42845 key: "bindEvents", 42846 value: function bindEvents() { 42847 this.input.addEventListener('blur', this.validate.bind(this)); 42848 this.input.addEventListener('input', this.validate.bind(this)); 42849 } 42850 }, { 42851 key: "createErrorWrap", 42852 value: function createErrorWrap() { 42853 if (this.errorWrap === null) { 42854 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].insetContent(this.inputWrap, "<div class=\"".concat(this.errorWrapClass, "\"></div>")); 42855 } 42856 42857 this.errorWrap = this.inputWrap.querySelector(".".concat(this.errorWrapClass)); 42858 } 42859 }, { 42860 key: "validate", 42861 value: function validate() { 42862 this.createErrorWrap(); 42863 this.labelConduct(); 42864 42865 if (hyperform__WEBPACK_IMPORTED_MODULE_0__["default"].willValidate(this.input)) { 42866 var isValid = hyperform__WEBPACK_IMPORTED_MODULE_0__["default"].ValidityState(this.input).valid; // eslint-disable-line 42867 42868 if (isValid) { 42869 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].clearHtml(this.errorWrap); 42870 this.inputWrap.classList.remove(this.errorClass); 42871 } else { 42872 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].clearHtml(this.errorWrap); 42873 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].insetContent(this.errorWrap, this.errorMessage); 42874 this.inputWrap.classList.add(this.errorClass); 42875 } 42876 } 42877 } 42878 }, { 42879 key: "labelConduct", 42880 value: function labelConduct() { 42881 this.label = this.input.nextSibling.nextSibling; 42882 42883 if (this.input.value === '') { 42884 this.label.classList.remove(focusClass); 42885 } else { 42886 this.label.classList.add(focusClass); 42887 } 42888 } 42889 }]); 42890 42891 return Validation; 42892}(); 42893 42894/* harmony default export */ __webpack_exports__["default"] = (Validation); 42895 42896/***/ }), 42897 42898/***/ "./components/forms/validation/validation.twig": 42899/*!*****************************************************!*\ 42900 !*** ./components/forms/validation/validation.twig ***! 42901 \*****************************************************/ 42902/*! no static exports found */ 42903/***/ (function(module, exports, __webpack_require__) { 42904 42905var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 42906 template = twig({"id":"92660d3c46547e89a434052b65c6ab22f5bd306bd8fb4ee2cf62243e66bdf97d3df5bb8eb96e216d6d69665acedc40186823db6c4b27c0cbbd7f67d76a9894e0","data":[{"type":"raw","value":"<h4 class=\"b-callback-reply__title\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"</h4>\n<div class=\"b-callback-reply__text\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"message","match":["message"]}]},{"type":"raw","value":"</div>\n<div class=\"b-callback-reply__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"152\" height=\"152\" viewBox=\"0 0 152 152\"><defs>
42906<path id=\"vv93a\" d=\"M644 475c0-41.974 34.026-76 76-76s76 34.026 76 76-34.026 76-76 76-76-34.026-76-76z\"/><path id=\"vv93b\" d=\"M716.25 477.5l17.5-17.5 6.25 6.25L716.25 490 700 473.75l6.25-6.25z\"/></defs><g><g opacity=\".2\" transform=\"translate(-644 -399)\"><use fill=\"#d69d3a\" xlink:href=\"#vv93a\"/></g><g transform=\"translate(-644 -399)\"><use fill=\"#d69d3a\" xlink:href=\"#vv93b\"/></g></g></svg>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 42907 42908module.exports = function(context) { return template.render(context); } 42909 42910/***/ }), 42911
42912/***/ "./components/hover-effect/index.js": 42913/*!******************************************!*\ 42914 !*** ./components/hover-effect/index.js ***! 42915 \******************************************/ 42916/*! exports provided: default */ 42917/***/ (function(module, __webpack_exports__, __webpack_require__) { 42918 42919"use strict"; 42920__webpack_require__.r(__webpack_exports__); 42921function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 42922 42923function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 42924 42925function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 42926 42927var defaultPosition = 0; 42928var half = 2; 42929var rightClassIn = 'is-goes-right'; 42930var leftClassIn = 'is-goes-left'; 42931var rightClassOut = 'is-goes-right__out'; 42932var leftClassOut = 'is-goes-left__out'; 42933var itemWithBgImg = 'is-goes-with-image'; 42934 42935var HoverEffect = 42936/*#__PURE__*/ 42937function () { 42938 function HoverEffect(element) { 42939 _classCallCheck(this, HoverEffect); 42940 42941 this.width = element.offsetWidth; 42942 this.title = element.querySelector('[class*=ttl]'); 42943 element.classList.add('b-highlight-parent'); // ÐÑли Ñон Ñ Ð¸Ð·Ð¾Ð±Ñажением Ñо делаем клип и на Ñам ÑекÑÑ 42944 42945 this.withBgImg = element.dataset.withBgImg; 42946 this.createLayer(element); 42947 this.checkElementWithBg(this.title); 42948 42949 this._loadEvents(element); 42950 } 42951 /** 42952 * Ð¡Ð¾Ð·Ð´Ð°ÐµÑ Ñлой-маÑÐºÑ 42953 * @param {Object} element - div 42954 */ 42955 42956 42957 _createClass(HoverEffect, [{ 42958 key: "createLayer", 42959 value: function createLayer(element) { 42960 this.layer = document.createElement('div'); 42961 this.layer.className = 'b-highlight-layer'; 42962 element.appendChild(this.layer); 42963 } 42964 }, { 42965 key: "_loadEvents", 42966 value: function _loadEvents(element) { 42967 var _this = this; 42968 42969 element.addEventListener('mouseenter', function (event) { 42970 _this.layer.style.left = '0'; 42971 42972 _this.getCursorDirection(event); 42973 42974 _this.moveLayerIn(_this.direction); 42975 }); 42976 element.addEventListener('mouseleave', function (event) { 42977 _this.getCursorDirection(event); 42978 42979 _this.moveLayerOut(_this.direction); 42980 }); 42981 } 42982 }, { 42983 key: "getCursorDirection", 42984 value: function getCursorDirection(event) { 42985 this.direction = event.offsetX; 42986 return this.direction; 42987 } 42988 /** 42989 * пеÑемеÑÐ°ÐµÑ ÑозданнÑй Ñлой повеÑÑ ÑодиÑелÑÑкого блока 42990 * @param {Number} coordX - знаÑение кооÑдинаÑÑ x кÑÑÑоÑа 42991 */ 42992 42993 }, { 42994 key: "moveLayerIn", 42995 value: function moveLayerIn(coordX) { 42996 if (coordX > this.width / half) { 42997 this.title.classList.add(rightClassIn); 42998 } else { 42999 this.title.classList.add(leftClassIn); 43000 } 43001 43002 this.title.classList.remove(rightClassOut); 43003 this.title.classList.remove(leftClassOut); 43004 } 43005 /** 43006 * пеÑемеÑÐ°ÐµÑ ÑозданнÑй Ñлой за пÑÐµÐ´ÐµÐ»Ñ ÑодиÑелÑÑкого блока 43007 * @param {Number} coordX - знаÑение кооÑдинаÑÑ x кÑÑÑоÑа 43008 */ 43009 43010 }, { 43011 key: "moveLayerOut", 43012 value: function moveLayerOut(coordX) { 43013 if (coordX > defaultPosition) { 43014 this.layer.style.left = '100%'; 43015 this.title.classList.add('is-goes-left__out'); 43016 } else { 43017 this.layer.style.left = '-100%'; 43018 this.title.classList.add('is-goes-right__out'); 43019 } 43020 43021 this.title.classList.remove(rightClassIn); 43022 this.title.classList.remove(leftClassIn); 43023 } 43024 }, { 43025 key: "checkElementWithBg", 43026 value: function checkElementWithBg(title) { 43027 if (typeof this.withBgImg !== 'undefined') { 43028 title.classList.add(itemWithBgImg); 43029 } 43030 } 43031 }]); 43032 43033 return HoverEffect; 43034}(); 43035 43036/* harmony default export */ __webpack_exports__["default"] = (HoverEffect); 43037 43038/***/ }), 43039
43040/***/ "./components/mobile-header/index.js": 43041/*!*******************************************!*\ 43042 !*** ./components/mobile-header/index.js ***! 43043 \*******************************************/ 43044/*! exports provided: default */ 43045/***/ (function(module, __webpack_exports__, __webpack_require__) { 43046 43047"use strict"; 43048__webpack_require__.r(__webpack_exports__); 43049/* harmony import */ var _mobile_header_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mobile-header.scss */ "./components/mobile-header/mobile-header.scss"); 43050/* harmony import */ var _mobile_header_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_mobile_header_scss__WEBPACK_IMPORTED_MODULE_0__); 43051/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hammerjs */ "../node_modules/hammerjs/hammer.js"); 43052/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(hammerjs__WEBPACK_IMPORTED_MODULE_1__); 43053function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 43054 43055function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 43056 43057function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 43058 43059/** 43060 * @version 1.1alpha 43061 * @author Kelnik Studios {http://kelnik.ru} 43062 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/mobile-header.html documentation 43063 */ 43064 43065/** 43066 * Dependencies 43067 */ 43068 43069 43070/** 43071 * Component 43072 */ 43073 43074var Header = 43075/*#__PURE__*/ 43076function () { 43077 function Header() { 43078 _classCallCheck(this, Header); 43079 } 43080 43081 _createClass(Header, [{ 43082 key: "init", 43083 value: function init(options) { 43084 this.headerParent = document.querySelector(options.element) || null; 43085 /** 43086 * ÐÑовеÑка на налиÑие Ñ ÑдеÑа 43087 */ 43088 43089 if (!this.headerParent) { 43090 console.error('Need target element - https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/mobile-header.html'); 43091 return; 43092 } 43093 43094 this.body = document.body; 43095 this.header = this.headerParent.querySelector('.b-header-wrap'); 43096 this.menu = this.headerParent.querySelector('.b-header__mobile-menu'); 43097 this.openButton = this.headerParent.querySelector('.b-header__open-menu'); 43098 this.closeButton = this.headerParent.querySelector('.b-header__mobile-menu-close'); 43099 this.scrollPosition = 0; 43100 this.autoFixed = options.autoFixed; 43101 this.autoPositionCloseButton = options.autoPositionCloseButton; 43102 this.returnPosition = options.returnPosition; 43103 this.swipeDirection = options.swipeDirection || 'right'; 43104 /** 43105 * ÐÑовеÑка на коÑÑекÑное Ñказание напÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñвайпа (доÑÑÑпно ÑолÑко Ñлева напÑаво, и ÑпÑава налево) 43106 */ 43107 43108 if (this.swipeDirection !== 'left' && this.swipeDirection !== 'right') { 43109 console.error('Wrong direction swipe - https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/mobile-header.html'); 43110 } 43111 43112 this.useOptions(); 43113 this.bindEvents(); 43114 this.setHeightHeader(); 43115 } 43116 /** 43117 * СобÑÑÐ¸Ñ 43118 */ 43119 43120 }, { 43121 key: "bindEvents", 43122 value: function bindEvents() { 43123 var _this = this; 43124 43125 /** 43126 * CобÑÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð·Ð¸ÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ закÑÑÑÑ Ð¸ ÑÑÑановки вÑÑоÑÑ Ñ ÑдеÑÑ 43127 */ 43128 window.addEventListener('resize', this.changePositionCloseButton.bind(this)); 43129 window.addEventListener('resize', this.setHeightHeader.bind(this)); 43130 /** 43131 * CобÑÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑкÑÑÑиÑ/закÑÑÑÐ¸Ñ Ð¼ÐµÐ½Ñ 43132 */ 43133 43134 this.openButton.addEventListener('click', this.openMenu.bind(this)); 43135 this.closeButton.addEventListener('click', this.closeMenu.bind(this)); 43136 /** 43137 * ÐакÑÑÑие Ð¼ÐµÐ½Ñ Ð¿Ð¾ ÑÐ²Ð°Ð¹Ð¿Ñ (по ÑмолÑÐ°Ð½Ð¸Ñ - Ñлева напÑаво) 43138 */ 43139 43140 new hammerjs__WEBPACK_IMPORTED_MODULE_1___default.a(this.menu).on("swipe".concat(this.swipeDirection), function () { 43141 _this.closeMenu(); 43142 }); 43143 } 43144 /** 43145 * ÐеÑод пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°ÑÑÑоек 43146 */ 43147 43148 }, { 43149 key: "useOptions", 43150 value: function useOptions() { 43151 /** 43152 * ÐапÑÑк ÑкÑипÑа ÑкÑолла пÑи наÑÑÑойке autoFixed: true 43153 * @type {boolean} 43154 */ 43155 if (this.autoFixed) { 43156 this.header.classList.add('b-header_position_fixed'); 43157 this.changePositionHeader(); 43158 } 43159 } 43160 /** 43161 * ÐеÑод ÑеализаÑии поÑвлениÑ/ÑкÑÑÑÐ¸Ñ Ñ ÑдеÑа 43162 */ 43163 43164 }, { 43165 key: "changePositionHeader", 43166 value: function changePositionHeader() { 43167 var _this2 = this; 43168 43169 // Ñаг вÑемени задеÑжки оÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑнкÑии ÑкÑÑÑÐ¸Ñ Ñ ÑдеÑа 43170 var stepScrollTop = -5; // Ñаг вÑемени задеÑжки оÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑнкÑии оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑдеÑа 43171 43172 var stepScrollBottom = 5; 43173 var heightHeader = this.header.offsetHeight; // ÑекÑÑÐ°Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑкÑолла 43174 43175 var scrollPosition = 0; 43176 var minScrollPosition = 0; 43177 document.addEventListener('scroll', function () { 43178 /** 43179 * ÐÑклÑÑение меÑода еÑли Ð¼ÐµÐ½Ñ Ð¾ÑкÑÑÑо 43180 */ 43181 if (_this2.menu.classList.contains('b-header__mobile-menu_state_open')) { 43182 return; 43183 } 43184 43185 var scrollTopPosition = window.pageYOffset; 43186 /** 43187 * CкÑолл вниз пÑи ÑÑловии, ÑÑо пÑоÑла половина вÑÑоÑÑ Ñ ÑдеÑа 43188 */ 43189 43190 if (scrollTopPosition > heightHeader && scrollTopPosition - scrollPosition > stepScrollBottom) { 43191 _this2.header.classList.add('b-header_position_fixed'); 43192 43193 _this2.header.classList.add('b-header_position_hide'); 43194 } 43195 /** 43196 * CкÑолл ввеÑÑ 43197 */ 43198 43199 43200 if (scrollTopPosition - scrollPosition < stepScrollTop) { 43201 _this2.header.classList.remove('b-header_position_hide'); 43202 } 43203 /** 43204 * ÐÑÑиÑаÑелÑнÑй ÑкÑолл (пÑокÑÑÑка ввеÑÑ , Ð½Ð°Ñ Ð¾Ð´ÑÑÑ Ð¿Ñи ÑÑом в Ñамой веÑÑ Ð½ÐµÐ¹ ÑоÑке) 43205 */ 43206 43207 43208 if (scrollTopPosition < minScrollPosition) { 43209 _this2.header.classList.remove('b-header_position_fixed'); 43210 } 43211 43212 scrollPosition = scrollTopPosition; 43213 }); 43214 } 43215 /** 43216 * ÐеÑод оÑкÑÑÑÐ¸Ñ Ð¼ÐµÐ½Ñ 43217 */ 43218 43219 }, { 43220 key: "openMenu", 43221 value: function openMenu() { 43222 var _this3 = this; 43223 43224 this.scrollPosition = window.pageYOffset; 43225 this.menu.classList.add('b-header__mobile-menu_state_open'); 43226 this.changePositionCloseButton(); 43227 var defaultSpeed = 300; 43228 setTimeout(function () { 43229 _this3.body.classList.add('body-fixed'); 43230 }, defaultSpeed); // this.setHeightMenu(); //!BUG 43231 } 43232 /** 43233 * ÐеÑод закÑÑÑÐ¸Ñ Ð¼ÐµÐ½Ñ 43234 */ 43235 43236 }, { 43237 key: "closeMenu", 43238 value: function closeMenu() { 43239 this.menu.classList.remove('b-header__mobile-menu_state_open'); 43240 this.body.classList.remove('body-fixed'); 43241 this.returnContentPosition(); 43242 } 43243 /** 43244 * ÐеÑод возвÑаÑа позиÑии конÑенÑа пÑи закÑÑÑии Ð¼ÐµÐ½Ñ 43245 */ 43246 43247 }, { 43248 key: "returnContentPosition", 43249 value: function returnContentPosition() { 43250 if (!this.returnPosition) { 43251 return; 43252 } 43253 43254 var topScrollPosition = 0; 43255 window.scrollBy(topScrollPosition, this.scrollPosition); 43256 } 43257 /** 43258 * ÐеÑод позиÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ закÑÑÑÐ¸Ñ 43259 */ 43260 43261 }, { 43262 key: "changePositionCloseButton", 43263 value: function changePositionCloseButton() { 43264 if (!this.autoPositionCloseButton) { 43265 return; 43266 } 43267 43268 var positionOpenButtonTop = this.openButton.getBoundingClientRect().top; 43269 var positionOpenButtonLeft = this.openButton.getBoundingClientRect().left; 43270 this.closeButton.style.left = "".concat(positionOpenButtonLeft, "px"); 43271 this.closeButton.style.top = "".concat(positionOpenButtonTop, "px"); 43272 } 43273 /** 43274 * ÐеÑод ÑÑÑановки вÑÑоÑÑ Ñ ÑдеÑÑ 43275 */ 43276 43277 }, { 43278 key: "setHeightHeader", 43279 value: function setHeightHeader() { 43280 this.headerParent.style.height = "".concat(this.header.offsetHeight, "px"); 43281 } 43282 /** 43283 * BUG! ÐеÑод ÑÑÑановки вÑÑоÑÑ Ð¼ÐµÐ½Ñ Ð¸ÑÑ Ð¾Ð´Ñ Ð¸Ð· вÑÑоÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð¹ облаÑÑи ÑкÑана 43284 */ 43285 43286 }, { 43287 key: "setHeightMenu", 43288 value: function setHeightMenu() { 43289 var heightScreen = document.documentElement.clientHeight; 43290 this.menu.style.height = "".concat(heightScreen, "px"); 43291 } 43292 }]); 43293 43294 return Header; 43295}(); 43296 43297/* harmony default export */ __webpack_exports__["default"] = (Header); 43298 43299/***/ }), 43300
43301/***/ "./components/mobile-header/mobile-header.scss": 43302/*!*****************************************************!*\ 43303 !*** ./components/mobile-header/mobile-header.scss ***! 43304 \*****************************************************/ 43305/*! no static exports found */ 43306/***/ (function(module, exports, __webpack_require__) { 43307 43308// extracted by mini-css-extract-plugin 43309 43310/***/ }), 43311 43312/***/ "./components/news/basicTemplate.twig": 43313/*!********************************************!*\ 43314 !*** ./components/news/basicTemplate.twig ***! 43315 \********************************************/ 43316/*! no static exports found */ 43317/***/ (function(module, exports, __webpack_require__) { 43318 43319var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 43320 template = twig({"id":"1278d551cb715797107065bf20ed23797da32e9ef3065033e45ecaf200d4e9d8a140ccb76a046be55bc6422a9fa084c6ebed4d6bae27e0f6aa68684e21dbc81a","data":[{"type":"raw","value":"<a href=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"link","match":["link"]}]},{"type":"raw","value":"\" class=\"b-new__blank b-animate-borders__separated j-hover-highlight\">\n <div class=\"b-top-border\"></div>\n <div class=\"b-left-border\"></div>\n <div class=\"b-right-border\"></div>\n <div class=\"b-bottom-border\"></div>\n <div class=\"b-new__date\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"date","match":["date"]}]},{"type":"raw","value":"</div>\n <div class=\"b-new__ttl\" data-text=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"</div>\n <div class=\"b-new__text\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"announce","match":["announce"]}]},{"type":"raw","value":"</div>\n</a>\n"}],"allowInlineIncludes":true,"rethrow":true}); 43321 43322module.exports = function(context) { return template.render(context); } 43323 43324/***/ }), 43325 43326/***/ "./components/news/imageTemplate.twig": 43327/*!********************************************!*\ 43328 !*** ./components/news/imageTemplate.twig ***! 43329 \********************************************/ 43330/*! no static exports found */ 43331/***/ (function(module, exports, __webpack_require__) { 43332 43333var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 43334 template = twig({"id":"bdb480e764186af2aa09ca35cd51a74910de3c11c0b3a9705e9d4b1b53e1935557464b344dff9c6283ec74e18290d9a8a737eb496fa24c62b39dd472ecb11657","data":[{"type":"raw","value":"<a href=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"link","match":["link"]}]},{"type":"raw","value":"\" class=\"b-new__background j-hover-highlight\" data-with-bg-img style=\"background-image: url('"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"image","match":["image"]}]},{"type":"raw","value":"')\">\n <div class=\"b-new__date\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"date","match":["date"]}]},{"type":"raw","value":"</div>\n <div class=\"b-new__ttl\" data-text=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"\"><span>"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"</span></div>\n <div class=\"b-new__text\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"announce","match":["announce"]}]},{"type":"raw","value":"</div>\n</a>\n"}],"allowInlineIncludes":true,"rethrow":true}); 43335 43336module.exports = function(context) { return template.render(context); } 43337 43338/***/ }), 43339
43340/***/ "./components/news/index.js": 43341/*!**********************************!*\ 43342 !*** ./components/news/index.js ***! 43343 \**********************************/ 43344/*! exports provided: default */ 43345/***/ (function(module, __webpack_exports__, __webpack_require__) { 43346 43347"use strict"; 43348__webpack_require__.r(__webpack_exports__); 43349/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/news/basicTemplate.twig */ "./components/news/basicTemplate.twig"); 43350/* harmony import */ var components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0__); 43351/* harmony import */ var components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! components/news/imageTemplate.twig */ "./components/news/imageTemplate.twig"); 43352/* harmony import */ var components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1__); 43353/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js"); 43354/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 43355function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 43356 43357function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 43358 43359function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 43360 43361 43362 43363 43364 43365var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_2__["default"](); 43366var tabletLandscape = 960; 43367var hiddenClass = 'is-hidden'; 43368 43369var News = 43370/*#__PURE__*/ 43371function () { 43372 function News() { 43373 var _this = this; 43374 43375 _classCallCheck(this, News); 43376 43377 this.moreBtn = document.querySelector('.j-load-more'); 43378 this.filters = document.querySelectorAll('.j-news-filter'); 43379 this.pageInput = document.querySelector('#page'); 43380 this.parent = document.querySelector('#news'); 43381 this.moreBtn.addEventListener('click', function () { 43382 _this.pageInput.value++; // eslint-disable-line 43383 43384 _this.send(); 43385 }); 43386 this.filters.forEach(function (input) { 43387 input.addEventListener('change', function () { 43388 _this.filterChange(); 43389 }); 43390 }); 43391 } 43392 43393 _createClass(News, [{ 43394 key: "init", 43395 value: function init(form) { 43396 this.form = form; 43397 this.url = this.form.getAttribute('action'); 43398 this.method = this.form.getAttribute('method'); 43399 this.send(); 43400 } 43401 }, { 43402 key: "filterChange", 43403 value: function filterChange() { 43404 common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].clearHtml(this.parent); 43405 this.pageInput.value = 1; 43406 this.send(); 43407 } 43408 }, { 43409 key: "send", 43410 value: function send() { 43411 var that = this; 43412 this.dataToSend = $(this.form).serialize(); 43413 common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].send(this.dataToSend, this.url, { 43414 success: function success(respond) { 43415 respond.data.forEach(function (item) { 43416 that.insertTemplate(item); 43417 }); 43418 that.getBlockPosition(); 43419 43420 if (respond.request.isLast) { 43421 that.hideBtn(); 43422 } else { 43423 that.showBtn(); 43424 } 43425 43426 mediator.publish('receivedNews'); 43427 }, 43428 error: function error(_error) { 43429 console.error("\u043E\u0448\u0438\u0431\u043A\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435: ".concat(_error)); 43430 } 43431 }); 43432 } 43433 }, { 43434 key: "insertTemplate", 43435 value: function insertTemplate(data) { 43436 var template = data.image ? components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1___default.a : components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0___default.a; 43437 this.parent.insertAdjacentHTML('beforeend', template(data)); 43438 } 43439 /** 43440 * вÑÑиÑлÑÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° новоÑÑи, добавлÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñй клаÑÑ
43441 * Ð´Ð»Ñ ÑкÑÑÑÐ¸Ñ Ð³ÑÐ°Ð½Ð¸Ñ 43442 */ 43443 43444 }, { 43445 key: "getBlockPosition", 43446 value: function getBlockPosition() { 43447 var _this2 = this; 43448 43449 var block = document.querySelectorAll('.b-new__blank'); 43450 var parentPosition = this.parent.getBoundingClientRect(); 43451 var leftMin = 0; 43452 var rightMin = -1; 43453 block.forEach(function (div) { 43454 var blockPosition = div.getBoundingClientRect(); 43455 var leftDifference = blockPosition.left - parentPosition.left; 43456 var rightDifference = blockPosition.right - parentPosition.right; 43457 43458 if (leftDifference === leftMin) { 43459 div.classList.add('is-left'); 43460 } 43461 43462 if (Math.round(rightDifference) >= rightMin) { 43463 div.classList.add('is-right'); 43464 } 43465 43466 if (window.screen.availWidth < tabletLandscape) { 43467 _this2.destroyBorder(div); 43468 } 43469 }); 43470 } 43471 }, { 43472 key: "destroyBorder", 43473 value: function destroyBorder(div) { 43474 var borders = div.querySelectorAll('[class*=border]'); 43475 borders.forEach(function (border) { 43476 common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeElement(border); 43477 }); 43478 } 43479 }, { 43480 key: "showBtn", 43481 value: function showBtn() { 43482 this.moreBtn.classList.remove(hiddenClass); 43483 } 43484 }, { 43485 key: "hideBtn", 43486 value: function hideBtn() { 43487 this.moreBtn.classList.add(hiddenClass); 43488 } 43489 }]); 43490 43491 return News; 43492}(); 43493 43494/* harmony default export */ __webpack_exports__["default"] = (News); 43495/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js"))) 43496 43497/***/ }), 43498
43499/***/ "./components/popup/index.js": 43500/*!***********************************!*\ 43501 !*** ./components/popup/index.js ***! 43502 \***********************************/ 43503/*! exports provided: default */ 43504/***/ (function(module, __webpack_exports__, __webpack_require__) { 43505 43506"use strict"; 43507__webpack_require__.r(__webpack_exports__); 43508/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js"); 43509/* harmony import */ var components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! components/popup/popup.twig */ "./components/popup/popup.twig"); 43510/* harmony import */ var components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1__); 43511/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 43512function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 43513 43514function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 43515 43516function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 43517 43518/** 43519 * @version 1.1beta 43520 * @author Kelnik Studios {http://kelnik.ru} 43521 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/popup.html documentation 43522 */ 43523 43524/** 43525 * DEPENDENCIES 43526 */ 43527 43528 43529 43530var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__["default"](); 43531 43532var Popup = 43533/*#__PURE__*/ 43534function () { 43535 function Popup() { 43536 _classCallCheck(this, Popup); 43537 } 43538 43539 _createClass(Popup, [{ 43540 key: "init", 43541 value: function init(options) { 43542 this.body = document.body; 43543 this.template = options.template || components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1___default.a; 43544 this.templateContent = options.templateContent || false; 43545 this.target = options.target; 43546 this.closeButtonAriaLabel = options.closeButtonAriaLabel || 'ÐакÑÑÑÑ Ð²ÑплÑваÑÑее окно'; 43547 this.stateClass = 'b-popup_state_open'; 43548 this.bindEvents(); 43549 } 43550 /** 43551 * ÐеÑаем ÑлÑÑаÑелей ÑобÑÑий 43552 */ 43553 43554 }, { 43555 key: "bindEvents", 43556 value: function bindEvents() { 43557 var _this = this; 43558 43559 this.target.addEventListener('click', this.makeOpen.bind(this)); 43560 document.addEventListener('keyup', function (element) { 43561 _this.closeOnPressButton(element); 43562 }); 43563 } 43564 /** 43565 * Ðайнд ÑобÑÑий поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ popup. 43566 */ 43567 43568 }, { 43569 key: "bindEventsAfterOpen", 43570 value: function bindEventsAfterOpen() { 43571 var _this2 = this; 43572 43573 this.closeButton.addEventListener('click', this.close.bind(this)); 43574 this.popup.addEventListener('click', function (element) { 43575 _this2.closeOnClickOverlay(element); 43576 }); 43577 } 43578 /** 43579 * ÐобавлÑÐµÑ body position:fixed, Ð´Ð°Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿ÑокÑÑÑки ÑÑÑаниÑÑ Ð¿Ñи оÑкÑÑÑом попапе. 43580 * Ðогда-нибÑÐ´Ñ Ð¿ÐµÑенеÑем в Mediator. 43581 */ 43582 43583 }, { 43584 key: "fixedBody", 43585 value: function fixedBody() { 43586 this.body.classList.toggle('body-fixed'); 43587 } 43588 /** 43589 * ÐапÑÑк попапа пÑи клике на кнопкÑ. 43590 */ 43591 43592 }, { 43593 key: "makeOpen", 43594 value: function makeOpen() { 43595 this.contentTypeCheck(); 43596 } 43597 /** 43598 * ÐÑовеÑка Ñипа попапа - ÑÑаÑика/ajax. 43599 */ 43600 43601 }, { 43602 key: "contentTypeCheck", 43603 value: function contentTypeCheck() { 43604 var dataAttributeHref = this.target.dataset.href; 43605 var dataAttributeAjax = this.target.dataset.ajax; 43606 var dataAttributeAjaxData = $.param(this.target.dataset); 43607 this.type = this.target.dataset.type || 'default'; 43608 43609 if (dataAttributeHref) { 43610 var contentId = document.getElementById(dataAttributeHref); 43611 43612 if (!contentId) { 43613 console.error("\u0421\u043E\u0437\u0434\u0430\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u043D\u044B\u0439 \u0431\u043B\u043E\u043A \u043F\u043E\u043F\u0430\u043F\u0430 \u0441 id \"".concat(dataAttributeHref, "\"")); 43614 return; 43615 } 43616 43617 var staticContent = contentId.innerHTML; 43618 this.outputOnDisplay(staticContent); 43619 this.open(); 43620 } else if (dataAttributeAjax) { 43621 this.outputOnDisplay(); 43622 this.send(dataAttributeAjaxData, this.open.bind(this)); 43623 } 43624 } 43625 /** 43626 * ÐÑвод попапа на ÑкÑан. 43627 * @param {String} content - конÑÐµÐ½Ñ Ð¸Ð· ÑÑаÑики или из json. 43628 */ 43629 43630 }, { 43631 key: "outputOnDisplay", 43632 value: function outputOnDisplay(content) { 43633 this.setData(content); 43634 this.insertTemplate(); 43635 this.getElements(); 43636 } 43637 /** 43638 * ÐодгоÑовка даннÑÑ Ð´Ð»Ñ Ñаблона 43639 * @param {String} content - конÑÐµÐ½Ñ Ð¸Ð· ÑÑаÑики или из json. 43640 */ 43641 43642 }, { 43643 key: "setData", 43644 value: function setData(content) { 43645 this.data = { 43646 content: content, 43647 buttonAriaLabel: this.closeButtonAriaLabel 43648 }; 43649 } 43650 /** 43651 * ÐÑÑавка Ñаблона. 43652 */ 43653 43654 }, { 43655 key: "insertTemplate", 43656 value: function insertTemplate() { 43657 this.body.insertAdjacentHTML('afterbegin', this.template(this.data)); 43658 } 43659 /** 43660 * ÐолÑÑаем попап и его ÑлеменÑÑ, веÑаем ÑобÑÑиÑ. 43661 */ 43662 43663 }, { 43664 key: "getElements", 43665 value: function getElements() { 43666 this.popup = document.querySelector('.b-popup'); 43667 this.content = document.querySelector('.b-popup__content'); 43668 this.closeButton = this.popup.querySelector('.b-popup__close');
43669 this.overlay = this.popup.querySelector('.b-popup__overlay'); 43670 this.bindEventsAfterOpen(); 43671 } 43672 /** 43673 * ÐÑÑавка конÑенÑа 43674 * @param {String} popup - ÑлеменÑ, кÑда вÑÑавлÑеÑÑÑ ÐºÐ¾Ð½ÑенÑ. (не Ñам попап, а его конÑенÑÐ½Ð°Ñ ÑаÑÑÑ!) 43675 * @param {String} content - вÑÑавлÑемÑй конÑенÑ. 43676 */ 43677 43678 }, { 43679 key: "send", 43680 43681 /** 43682 * ÐеÑод оÑпÑавки ajax запÑоÑа 43683 * @param {Object} sentData - оÑпÑавлÑемÑе даннÑе. 43684 * @param {Function} complete - ÑÑнкÑÐ¸Ñ Ð¾ÑкÑÑÑÐ¸Ñ Ð¿Ð¾Ð¿Ð°Ð¿Ð° 43685 * @return {Boolean} - false - еÑли Ð½ÐµÑ Ð¸Ð½ÑеÑнеÑа, запÑÐ¾Ñ Ð¿ÑеÑÑваеÑÑÑ. 43686 * @return {Boolean} - true - ÑÑпеÑное вÑполнение запÑоÑа. 43687 */ 43688 value: function send(sentData) { 43689 var complete = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; 43690 43691 if (!this.checkInternet()) { 43692 this.resending(sentData); 43693 return false; 43694 } 43695 43696 var that = this; 43697 var url = this.target.dataset.ajax; 43698 var callback = { 43699 success: function success(req) { 43700 if (req.request.result) { 43701 if (that.templateContent) { 43702 Popup.insetContent(that.content, that.templateContent(req.data)); 43703 } else { 43704 Popup.insetContent(that.content, req.data.content); 43705 } 43706 43707 complete(); 43708 } else { 43709 that.errorHandler('data'); 43710 console.error(req.request.errors); 43711 } 43712 }, 43713 error: function error(err) { 43714 that.errorHandler('server'); 43715 console.error("server error ".concat(err)); 43716 } 43717 }; 43718 common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].send(sentData, url, callback); 43719 return true; 43720 } 43721 /** 43722 * ÐеÑод закÑÑÑÐ¸Ñ Ð¿Ð¾Ð¿Ð°Ð¿Ð° по ÐºÐ»Ð¸ÐºÑ Ð½Ð° овеÑлей. 43723 * @param {Object} element - ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ð¾ коÑоÑÐ¾Ð¼Ñ Ð¿ÑоизоÑло ÑобÑÑие. Cм. меÑод bindEventsAfterOpen 43724 */ 43725 43726 }, { 43727 key: "closeOnClickOverlay", 43728 value: function closeOnClickOverlay(element) { 43729 if (element.target === this.overlay) { 43730 this.close(); 43731 } 43732 } 43733 /** 43734 * ÐеÑод закÑÑÑÐ¸Ñ Ð¿Ð¾Ð¿Ð°Ð¿Ð° по нажаÑÐ¸Ñ Ð½Ð° ESC 43735 * @param {Object} element - ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ð¾ коÑоÑÐ¾Ð¼Ñ Ð¿ÑоизоÑло ÑобÑÑие. Cм. меÑод bindEvents 43736 */ 43737 43738 }, { 43739 key: "closeOnPressButton", 43740 value: function closeOnPressButton(element) { 43741 var keyCodeESC = 27; 43742 43743 if (element.keyCode === keyCodeESC) { 43744 this.close(); 43745 } 43746 } 43747 /** 43748 * ÐеÑод оÑкÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð¿Ð°Ð¿ 43749 */ 43750 43751 }, { 43752 key: "open", 43753 value: function open() { 43754 this.popup.classList.add(this.stateClass); 43755 this.fixedBody(); 43756 mediator.publish('openPopup', this); 43757 } 43758 /** 43759 * ÐеÑод закÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð¿Ð°Ð¿ 43760 */ 43761 43762 }, { 43763 key: "close", 43764 value: function close() { 43765 this.popup.classList.remove(this.stateClass); 43766 this.remove(); 43767 this.fixedBody(); 43768 mediator.publish('closePopup', this); 43769 } 43770 /** 43771 * Удаление попапа Ñо ÑÑÑаниÑÑ. 43772 */ 43773 43774 }, { 43775 key: "remove", 43776 value: function remove() { 43777 common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].removeElement(this.popup); 43778 } 43779 /** 43780 * ÐеÑод обÑабоÑки оÑибок. 43781 * @param {String} typeError - Ñип оÑибки. 43782 */ 43783 43784 }, { 43785 key: "errorHandler", 43786 value: function errorHandler(typeError) { 43787 var _this3 = this; 43788 43789 var errorList = [{ 43790 type: 'internet', 43791 html: '<h1>ÐÑ Ð½Ðµ подклÑÑÐµÐ½Ñ Ðº инÑеÑнеÑÑ. ÐовÑоÑиÑе запÑÐ¾Ñ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ</h1>' 43792 }, { 43793 type: 'server', 43794 html: '<h1>Ðа ÑеÑвеÑе пÑоизоÑла оÑибка. ÐовÑоÑиÑе запÑÐ¾Ñ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ</h1>' 43795 }, { 43796 type: 'data', 43797 html: '<h1>Ðа ÑеÑвеÑе пÑоизоÑла оÑибка. ÐовÑоÑиÑе запÑÐ¾Ñ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ</h1>' 43798 }]; 43799 errorList.forEach(function (item) { 43800 if (typeError === item.type) { 43801 Popup.insetContent(_this3.content, item.html); 43802 } 43803 }); 43804 } 43805 /** 43806 * ÐÑовеÑка на налиÑие инÑеÑнеÑа. 43807 * @return {boolean} true - инÑеÑÐ½ÐµÑ ÐµÑÑÑ. 43808 * @return {boolean} false - инÑеÑнеÑa неÑ. 43809 */ 43810 43811 }, { 43812 key: "checkInternet", 43813 value: function checkInternet() { 43814 clearInterval(this.setInterval); 43815 43816 if (!common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].checkInternetConnection()) { 43817 this.errorHandler('internet'); 43818 return false;
43819 } 43820 43821 return true; 43822 } 43823 /** 43824 * ÐовÑоÑнÑй запÑÐ¾Ñ Ð½Ð° ÑеÑвеÑ. 43825 * @param {object} sentData - оÑÑпÑавлÑемÑе даннÑе. 43826 * 43827 */ 43828 43829 }, { 43830 key: "resending", 43831 value: function resending(sentData) { 43832 var interval = 5000; 43833 var that = this; 43834 this.setInterval = setInterval(function () { 43835 that.send(sentData); 43836 }, interval); 43837 } 43838 }], [{ 43839 key: "insetContent", 43840 value: function insetContent(popup, content) { 43841 common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].clearHtml(popup); 43842 common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].insetContent(popup, content); 43843 } 43844 }]); 43845 43846 return Popup; 43847}(); 43848 43849/* harmony default export */ __webpack_exports__["default"] = (Popup); 43850/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js"))) 43851 43852/***/ }), 43853 43854/***/ "./components/popup/inline-popup.twig": 43855/*!********************************************!*\ 43856 !*** ./components/popup/inline-popup.twig ***! 43857 \********************************************/ 43858/*! no static exports found */ 43859/***/ (function(module, exports, __webpack_require__) { 43860 43861var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 43862 template = twig({"id":"ce815a20b2dc8fd2706482ba71b5709c49e2d23b63c26b94c8d0a5b5ce4ec5d0d5b771148bcd9676d07c08613cb5ecc35c6f3304f502b923f73feaf23be13024","data":[{"type":"raw","value":"<div class=\"b-popup\">\n <div class=\"b-popup__overlay\"></div>\n\n <div class=\"b-popup__inline-wrap\">\n <button class=\"b-popup__close\"\n aria-label=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"buttonAriaLabel","match":["buttonAriaLabel"]},{"type":"Twig.expression.type.filter","value":"default","match":["|default","default"],"params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"ÐакÑÑÑÑ Ð²ÑплÑваÑÑее окно"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type._function","fn":"source","params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"/local/templates/larus/icons/popup/media/close.svg"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\n </button>\n <div class=\"b-popup__inline-content\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"content","match":["content"]}]},{"type":"raw","value":"\n </div>\n </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 43863 43864module.exports = function(context) { return template.render(context); } 43865 43866/***/ }), 43867 43868/***/ "./components/popup/map-popup.twig": 43869/*!*****************************************!*\ 43870 !*** ./components/popup/map-popup.twig ***! 43871 \*****************************************/ 43872/*! no static exports found */ 43873/***/ (function(module, exports, __webpack_require__) { 43874 43875__webpack_require__(/*! ./media/close.svg.twig */ "./components/popup/media/close.svg.twig"); 43876 43877var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 43878 template = twig({"id":"298d819fa2c96ad054bf1564ba612560cf863d2aaee4a0e46ece75e7974a856a69c9f30f08c21158bbee5a67cda62ab1958b3ac92b7bf0fb657d2f29fa64d16a","data":[{"type":"raw","value":"<div class=\"b-popup b-popup_for_map\">\n <div class=\"b-popup__overlay\"></div>\n\n <div class=\"b-popup__inline-wrap\">\n <button class=\"b-popup__close\"\n aria-label=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"buttonAriaLabel","match":["buttonAriaLabel"]},{"type":"Twig.expression.type.filter","value":"default","match":["|default","default"],"params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"ÐакÑÑÑÑ Ð²ÑплÑваÑÑее окно"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\">\n "},{"type":"logic","token":{"type":"Twig.logic.type.include","only":false,"ignoreMissing":false,"stack":[{"type":"Twig.expression.type.string","value":"ae89ff9261739113d94bf7246acf11e5812364b9ca2b06a470b646a87c6c6783bff23afaee96a7af898541dbdb826ffc69ccc87f47432fa8c74e25b63cfccb36"}]}},{"type":"raw","value":" </button>\n <div class=\"b-popup__inline-content\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"content","match":["content"]}]},{"type":"raw","value":"\n </div>\n </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 43879 43880module.exports = function(context) { return template.render(context); } 43881 43882/***/ }), 43883 43884/***/ "./components/popup/media/close.svg.twig": 43885/*!***********************************************!*\ 43886 !*** ./components/popup/media/close.svg.twig ***! 43887 \***********************************************/ 43888/*! no static exports found */ 43889/***/ (function(module, exports, __webpack_require__) { 43890 43891var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 43892 template = twig({"id":"ae89ff9261739113d94bf7246acf11e5812364b9ca2b06a470b646a87c6c6783bff23afaee96a7af898541dbdb826ffc69ccc87f47432fa8c74e25b63cfccb36","data":[{"type":"raw","value":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\"><defs><path id=\"73hta\" d=\"M1051.444 73L1050 71.556 1061.556 60 1050 48.444l
438921.444-1.444L1063 58.556 1074.556 47l1.444 1.444L1064.444 60 1076 71.556 1074.556 73 1063 61.444z\"/></defs><g><g transform=\"translate(-1050 -47)\"><use xlink:href=\"#73hta\"/></g></g></svg>\n"}],"allowInlineIncludes":true,"rethrow":true}); 43893 43894module.exports = function(context) { return template.render(context); } 43895 43896/***/ }), 43897 43898/***/ "./components/popup/popup.twig": 43899/*!*************************************!*\ 43900 !*** ./components/popup/popup.twig ***! 43901 \*************************************/ 43902/*! no static exports found */ 43903/***/ (function(module, exports, __webpack_require__) { 43904 43905var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 43906 template = twig({"id":"10f75d32d063079414a9d912a5dc70f4a43aa635b135aa0c00c34edc5bad75ed2d89f539e5dbd533fa35230be4e1f6702fff80a0ca53eddbc277ca1f7a07fd35","data":[{"type":"raw","value":"<div class=\"b-popup\">\n <div class=\"b-popup__overlay\"></div>\n\n <button class=\"b-popup__close\" aria-label=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"buttonAriaLabel","match":["buttonAriaLabel"]},{"type":"Twig.expression.type.filter","value":"default","match":["|default","default"],"params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"ÐакÑÑÑÑ Ð²ÑплÑваÑÑее окно"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type._function","fn":"source","params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"/local/templates/larus/images/popup/close.svg"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\n </button>\n\n <div class=\"b-popup__wrap\">\n <div class=\"b-popup__content\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"content","match":["content"]}]},{"type":"raw","value":"\n </div>\n </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 43907 43908module.exports = function(context) { return template.render(context); } 43909 43910/***/ }), 43911
43912/***/ "./components/preloader/index.js": 43913/*!***************************************!*\ 43914 !*** ./components/preloader/index.js ***! 43915 \***************************************/ 43916/*! exports provided: default */ 43917/***/ (function(module, __webpack_exports__, __webpack_require__) { 43918 43919"use strict"; 43920__webpack_require__.r(__webpack_exports__); 43921/* harmony import */ var _common_scripts_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/scripts/utils */ "./common/scripts/utils.js"); 43922function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 43923 43924function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 43925 43926function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 43927 43928 43929 43930var Preloader = 43931/*#__PURE__*/ 43932function () { 43933 function Preloader() { 43934 _classCallCheck(this, Preloader); 43935 43936 this.preloaderSelector = '.j-preloader'; 43937 this.duration = 300; 43938 } 43939 43940 _createClass(Preloader, [{ 43941 key: "init", 43942 value: function init() { 43943 this._initElements(); 43944 43945 if (!this.preloader) { 43946 console.error("Preloader '".concat(this.preloaderSelector, "' not found")); 43947 return; 43948 } 43949 43950 if (this._isNotFirstLoad()) { 43951 this._hidePreloader(); 43952 43953 return; 43954 } 43955 43956 this._bindEvents(); 43957 } 43958 }, { 43959 key: "_initElements", 43960 value: function _initElements() { 43961 this.preloader = document.querySelector(this.preloaderSelector); 43962 } 43963 }, { 43964 key: "_bindEvents", 43965 value: function _bindEvents() { 43966 var _this = this; 43967 43968 window.onload = function () { 43969 _this._saveInStore(); 43970 43971 _this._hidePreloader(); 43972 }; 43973 } 43974 }, { 43975 key: "_isNotFirstLoad", 43976 value: function _isNotFirstLoad() { 43977 return localStorage.getItem('pageLoaded') === 'true'; 43978 } 43979 }, { 43980 key: "_hidePreloader", 43981 value: function _hidePreloader() { 43982 var _this2 = this; 43983 43984 this.preloader.classList.add('is-hide'); 43985 setTimeout(function () { 43986 _common_scripts_utils__WEBPACK_IMPORTED_MODULE_0__["default"].hide(_this2.preloader); 43987 }, this.duration); 43988 } 43989 }, { 43990 key: "_saveInStore", 43991 value: function _saveInStore() { 43992 localStorage.setItem('pageLoaded', 'true'); 43993 } 43994 }]); 43995 43996 return Preloader; 43997}(); 43998 43999/* harmony default export */ __webpack_exports__["default"] = (Preloader); 44000 44001/***/ }), 44002
44003/***/ "./components/slider/index.js": 44004/*!************************************!*\ 44005 !*** ./components/slider/index.js ***! 44006 \************************************/ 44007/*! exports provided: default */ 44008/***/ (function(module, __webpack_exports__, __webpack_require__) { 44009 44010"use strict"; 44011__webpack_require__.r(__webpack_exports__); 44012/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js"); 44013/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hammerjs */ "../node_modules/hammerjs/hammer.js"); 44014/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(hammerjs__WEBPACK_IMPORTED_MODULE_1__); 44015/* harmony import */ var _slider_twig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./slider.twig */ "./components/slider/slider.twig"); 44016/* harmony import */ var _slider_twig__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_slider_twig__WEBPACK_IMPORTED_MODULE_2__); 44017/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 44018function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 44019 44020function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 44021 44022function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 44023 44024/** 44025 * @version 2.0alpha 44026 * @author Kelnik Studios {http://kelnik.ru} 44027 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/пока Ð½ÐµÑ documentation 44028 */ 44029 44030/** 44031 * DEPENDENCIES 44032 */ 44033 44034/* eslint-disable */ 44035 44036 44037 44038 44039var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__["default"](); 44040 44041var Slider = 44042/*#__PURE__*/ 44043function () { 44044 function Slider() { 44045 _classCallCheck(this, Slider); 44046 } 44047 44048 _createClass(Slider, [{ 44049 key: "init", 44050 44051 /** 44052 * ÐниÑиализаÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов 44053 */ 44054 value: function init(options) { 44055 this.gallery = options.target; 44056 this.transitionTime = options.transitionTime || 300; 44057 this.infinite = options.infinite || false; 44058 this.autoplay = options.autoplay || false; 44059 this.autoplayTurn = 'right'; 44060 this.autoplaySpeed = options.autoplaySpeed || 3000; 44061 this.dots = options.dots || false; 44062 this.childrens = Array.from(this.gallery.children); 44063 this.itemsCount = this.childrens.length; 44064 this.activeSlide = 1; 44065 this.width = 0; 44066 this.position = 0; 44067 this.flexHeight = false; // Utils.clearHtml(this.gallery); //поÑÐµÐ¼Ñ Ñо в IE оÑиÑÐ°ÐµÑ - this.childrens 44068 44069 this.createGallery(); 44070 } 44071 /** 44072 * ÐлавнÑй меÑод. Ð¡Ð¾Ð·Ð´Ð°ÐµÑ Ð²ÐµÑÑ ÑлайдеÑ. 44073 */ 44074 44075 }, { 44076 key: "createGallery", 44077 value: function createGallery() { 44078 common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].insetContent(this.gallery, _slider_twig__WEBPACK_IMPORTED_MODULE_2___default()()); 44079 44080 if (!this.gallery) { 44081 console.error('Такого конÑейнеÑа Ð´Ð»Ñ ÑлайдеÑа не ÑÑÑеÑÑвÑеÑ!'); 44082 return false; 44083 } 44084 44085 this.getElements(); 44086 44087 if (this.dots) { 44088 this.createDots(); 44089 } 44090 44091 this.bindEvents(); 44092 this.appendChilds(); 44093 this.setHeight(); 44094 this.dotActivate(); 44095 this.ready(); 44096 this.autoplayStart(); 44097 this.createCounter(); 44098 this.swipeFactoids(); 44099 44100 if (this.itemsCount === 1) { 44101 var counter = this.gallery.querySelector('.b-slider__counter'); 44102 var arrows = this.gallery.querySelector('.b-slider__arrows'); 44103 counter.style.display = 'none'; 44104 arrows.style.display = 'none'; 44105 } 44106 44107 if (this.gallery.classList.contains('b-principe-carousel-view-2')) { 44108 // Ñ ÑÑого ÑлайдеÑа оÑобое положение ÑÑÑелок 44109 this.setArrowsCustomPosition(); 44110 } 44111 } 44112 /** 44113 * ÐолÑÑаем ÑлеменÑÑ ÑлайдеÑа. 44114 */ 44115 44116 }, { 44117 key: "getElements", 44118 value: function getElements() {
44119 this.dotsWrapper = this.gallery.querySelector('.b-slider__dots'); 44120 this.wrapper = this.gallery.querySelector('.b-slider__wrapper'); 44121 this.arrowLeft = this.gallery.querySelector('.slider__arrow-left'); 44122 this.arrowRight = this.gallery.querySelector('.slider__arrow-right'); 44123 this.countActive = this.gallery.querySelector('.b-slider__counter-active'); 44124 this.countAll = this.gallery.querySelector('.b-slider__counter-all'); 44125 } 44126 }, { 44127 key: "swipeFactoids", 44128 value: function swipeFactoids() { 44129 var container = this.gallery.closest('.j-main-slider'); 44130 44131 if (!container) { 44132 return; 44133 } 44134 44135 this.factoidsWrapper = container.querySelector('.j-factoids-wrapper'); 44136 var touchEvent = new hammerjs__WEBPACK_IMPORTED_MODULE_1___default.a(this.factoidsWrapper); 44137 touchEvent.on('swiperight', this.isSlideLeft.bind(this)); 44138 touchEvent.on('swipeleft', this.isSlideRight.bind(this)); 44139 } 44140 }, { 44141 key: "createCounter", 44142 value: function createCounter() { 44143 this.countActive.innerHTML = this.numberFormat(this.activeSlide); 44144 this.countAll.innerHTML = this.numberFormat(this.itemsCount); 44145 } 44146 /** 44147 * возвÑаÑÐ°ÐµÑ ÑиÑло в ÑоÑмаÑе 00 (дизайн) 44148 * @param {Number} number - ÑиÑло 44149 * @returns {string} 44150 */ 44151 44152 }, { 44153 key: "numberFormat", 44154 value: function numberFormat(number) { 44155 return ('0' + number).slice(-2); 44156 } 44157 /** 44158 * СоздаÑÑ ÑоÑки в html. 44159 */ 44160 44161 }, { 44162 key: "createDots", 44163 value: function createDots() { 44164 for (var i = 0; i < this.itemsCount; i++) { 44165 this.dotsWrapper.appendChild(this.createDot()); 44166 } 44167 } 44168 /** 44169 * СоздаÑÑ ÑоÑкÑ. 44170 * @return {HTMLButtonElement} 44171 */ 44172 44173 }, { 44174 key: "createDot", 44175 value: function createDot() { 44176 var dot = document.createElement('button'); 44177 dot.classList.add('b-slider__dot'); 44178 return dot; 44179 } 44180 /** 44181 * ÐавеÑÐ¸Ð²Ð°ÐµÑ ÑобÑÑÐ¸Ñ Ð½Ð° конÑÑÐ¾Ð»Ñ 44182 */ 44183 44184 }, { 44185 key: "bindEvents", 44186 value: function bindEvents() { 44187 var _this = this; 44188 44189 var touchEvent = new hammerjs__WEBPACK_IMPORTED_MODULE_1___default.a(this.gallery); 44190 touchEvent.on('swiperight', this.isSlideLeft.bind(this)); 44191 touchEvent.on('swipeleft', this.isSlideRight.bind(this)); 44192 this.arrowLeft.classList.add('is-last'); 44193 this.arrowLeft.addEventListener('click', this.isSlideLeft.bind(this), false); 44194 this.arrowRight.addEventListener('click', this.isSlideRight.bind(this), false); 44195 this.dotsWrapper.addEventListener('click', function (event) { 44196 var index = common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].getElementIndex(event.target) + 1; 44197 _this.activeSlide = index; 44198 44199 _this.dotActivate(); 44200 44201 _this.slideTo(_this.goTo(index)); 44202 }); 44203 window.addEventListener('resize', function () { 44204 _this.refresh(); 44205 }); 44206 } 44207 }, { 44208 // key: "refresh", 44209 // value: function refresh() { 44210 // this.width = this.gallery.querySelectorAll('.b-slider__item')[this.activeSlide].offsetWidth; 44211 // this.position = -(this.width * (this.activeSlide - 1)); 44212 // this.slideTo(this.position); 44213 // this.setHeight(); 44214 // } 44215 44216 key: "refresh", 44217 value: function refresh() { 44218 var slides = this.gallery.querySelectorAll('.b-slider__item'); 44219 var safeIndex = this.activeSlide % slides.length; 44220 44221 this.width = slides[safeIndex].offsetWidth; 44222 this.position = -(this.width * (this.activeSlide - 1)); 44223 this.slideTo(this.position); 44224 this.setHeight(); 44225 } 44226 44227 /** 44228 * ÐобавлÑÐµÑ ÑлайдÑ. 44229 */ 44230 44231 }, { 44232 key: "appendChilds", 44233 value: function appendChilds() { 44234 for (var i = 0; i < this.childrens.length; i++) { 44235 var item = document.createElement('div'); 44236 item.classList.add('b-slider__item'); 44237 item.appendChild(this.childrens[i]); 44238 this.wrapper.appendChild(item); 44239 this.width = this.wrapper.offsetWidth - this.getScrollbarWidth(); 44240 } 44241 } 44242 }, { 44243 key: "getScrollbarWidth", 44244 value: function getScrollbarWidth() { 44245 var outer = document.createElement('div'); 44246 outer.style.visibility = 'hidden'; 44247 outer.style.width = '100px'; 44248 document.body.appendChild(outer); 44249 var widthNoScroll = outer.offsetWidth; 44250 outer.style.overflow = 'scroll'; 44251 var inner = document.createElement('div'); 44252 inner.style.width = '100%'; 44253 outer.appendChild(inner); 44254 var widthWithScroll = inner.offsetWidth; 44255 outer.parentNode.removeChild(outer); 44256 return widthNoScroll - widthWithScroll; 44257 } 44258 /** 44259 * ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑнÑÑ Ð²ÑÑоÑÑ Ñлайдов, и ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐµÐµ обеÑÑке (). 44260 */ 44261 44262 }, { 44263 key: "setHeight", 44264 value: function setHeight() { 44265 var _this2 = this; 44266 44267 var currentSlide = this.wrapper.querySelector(".b-slider__item:nth-child(".concat(this.activeSlide, ")")); 44268 var currentImg = currentSlide.querySelector('img'); 44269 44270 if (currentImg) { 44271 currentImg.onload = function () { 44272 var slideHeight = currentSlide.offsetHeight; 44273 44274 _this2.wrapper.style.setProperty('height', "".concat(slideHeight, "px"), ''); 44275 }; 44276 } 44277 } 44278 /** 44279 * ÐенÑÐµÑ Ð°ÐºÑивное знаÑение Ñ ÑоÑки. 44280 */ 44281 44282 }, { 44283 key: "dotActivate", 44284 value: function dotActivate() { 44285 var _this3 = this; 44286 44287 this.allDots = Array.from(this.gallery.querySelectorAll('.b-slider__dot')); 44288 var activeDotClass = 'b-slider__dot_is_active';
44289 this.allDots.forEach(function (element, index) { 44290 if (_this3.activeSlide - 1 === index) { 44291 element.classList.add(activeDotClass); 44292 44293 _this3.transitionControl(); 44294 } else { 44295 element.classList.remove(activeDotClass); 44296 } 44297 }); 44298 } 44299 /** 44300 * ÐоказÑÐ²Ð°ÐµÑ ÑÐ»Ð°Ð¹Ð´ÐµÑ ÐºÐ¾Ð³Ð´Ð° вÑе меÑÐ¾Ð´Ñ Ð²ÑполнÑÑÑÑ. 44301 */ 44302 44303 }, { 44304 key: "ready", 44305 value: function ready() { 44306 this.gallery.classList.add('b-slider_is_ready'); 44307 } 44308 /** 44309 * ÐеÑелиÑÑÑÐ²Ð°ÐµÑ Ðº пеÑеданной позиÑии. 44310 * @param {Number} toPosition - позиÑÐ¸Ñ ÑлайдеÑа по X оÑи. 44311 */ 44312 44313 }, { 44314 key: "slideTo", 44315 value: function slideTo(toPosition) { 44316 this.wrapper.style.transform = "translateX(".concat(toPosition, "px)"); 44317 } 44318 /** 44319 * ÐиÑÑÐ°ÐµÑ ÑÐ»Ð°Ð¹Ð´ÐµÑ Ð²Ð¿Ñаво. 44320 */ 44321 44322 }, { 44323 key: "slideLeft", 44324 value: function slideLeft() { 44325 this.transitionControl(); 44326 this.slideTo(this.position); 44327 this.activeSlide -= 1; 44328 this.dotActivate(); 44329 this.refresh(); 44330 } 44331 /** 44332 * ÐиÑÑÐ°ÐµÑ ÑÐ»Ð°Ð¹Ð´ÐµÑ Ð²Ð»ÐµÐ²Ð¾. 44333 */ 44334 44335 }, { 44336 key: "slideRight", 44337 value: function slideRight() { 44338 this.transitionControl(); 44339 this.slideTo(this.position); 44340 this.activeSlide += 1; 44341 this.dotActivate(); 44342 this.refresh(); 44343 } 44344 /** 44345 * ÐÑовеÑÑÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ли лиÑÑаÑÑ Ð²Ð»ÐµÐ²Ð¾ (еÑли не нÑжен инÑиниÑи ÑкÑолл, Ñо в if пÑоÑÑо веÑнÑÑÑ false). 44346 */ 44347 44348 }, { 44349 key: "isSlideLeft", 44350 value: function isSlideLeft() { 44351 this.arrowRight.classList.remove('is-last'); 44352 this.clearAutoplay(); 44353 44354 if (this.position >= 0) { 44355 if (!this.infinite) { 44356 return false; 44357 } 44358 44359 this.position = -((this.itemsCount - 1) * this.width); 44360 this.activeSlide = this.itemsCount + 1; 44361 } else { 44362 this.position += this.width; 44363 } 44364 44365 if (this.gallery.classList.contains('j-benefits-slider')) { 44366 mediator.publish('benefitGoesLeft', this.activeSlide); 44367 } 44368 44369 if (this.activeSlide === 2) { 44370 this.arrowLeft.classList.add('is-last'); 44371 } 44372 44373 this.countActive.innerHTML = this.numberFormat(this.activeSlide - 1); 44374 this.slideLeft(); 44375 return true; 44376 } 44377 /** 44378 * ÐÑовеÑÑÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ли лиÑÑаÑÑ Ð²Ð¿Ñаво (еÑли не нÑжен инÑиниÑи ÑкÑолл, Ñо в if пÑоÑÑо веÑнÑÑÑ false). 44379 */ 44380 44381 }, { 44382 key: "isSlideRight", 44383 value: function isSlideRight() { 44384 var parentWidth = this.gallery.offsetWidth; 44385 var slideWidth = this.gallery.querySelector('.b-slider__item').offsetWidth; 44386 var slideStop = Math.round(parentWidth / slideWidth); 44387 this.arrowLeft.classList.remove('is-last'); 44388 this.clearAutoplay(); 44389 44390 if (this.position <= -(this.width * (this.itemsCount - slideStop))) { 44391 if (!this.infinite) { 44392 return false; 44393 } 44394 44395 this.position = 0; 44396 this.activeSlide = 0; 44397 } else { 44398 this.position -= this.width; 44399 } 44400 44401 if (this.gallery.classList.contains('j-benefits-slider')) { 44402 mediator.publish('benefitGoesRight', { 44403 position: this.position, 44404 slide: this.activeSlide 44405 }); 44406 } 44407 44408 if (this.activeSlide === this.itemsCount - 1) { 44409 this.arrowRight.classList.add('is-last'); 44410 } 44411 44412 this.countActive.innerHTML = this.numberFormat(this.activeSlide + 1); 44413 this.slideRight(); 44414 return true; 44415 } 44416 /** 44417 * ÐпÑеделÑÐµÑ Ð½Ð¾Ð²ÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ñлайда в завиÑимоÑÑи на какÑÑ ÑоÑÐºÑ Ð½Ð°Ð¶Ð°Ð»Ð¸. 44418 * @param value {number} - ÐоÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ Ñлайда. 44419 * @return {number} - ÐÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑиÑ. 44420 */ 44421 44422 }, { 44423 key: "goTo", 44424 value: function goTo(value) { 44425 var newPosition = -(this.width * (value - 1)); 44426 this.position = newPosition; 44427 return newPosition; 44428 } 44429 /** 44430 * ÐобавлÑÐµÑ transition ÑолÑко на вÑÐµÐ¼Ñ Ñлайда (ÑÑÐ¾Ð±Ñ Ð½ÐµÐ±Ñло анимаÑии пÑи ÑеÑайзе) 44431 */ 44432 44433 }, { 44434 key: "transitionControl", 44435 value: function transitionControl() { 44436 var _this4 = this; 44437 44438 this.wrapper.style.transitionDuration = "".concat(100 / this.transitionTime, "s"); 44439 setTimeout(function () { 44440 _this4.wrapper.style.removeProperty('transition-duration'); 44441 }, this.transitionTime); 44442 } 44443 /** 44444 * ÐеÑод авÑопÑолиÑÑÑÐ²Ð°Ð½Ð¸Ñ Ñлайдов. 44445 * @return {boolean}
44445 - еÑли авÑоплÑй не задан либо false, Ñо ÑеÑинÑеÑвал не ÑабоÑÐ°ÐµÑ 44446 */ 44447 44448 }, { 44449 key: "autoplayStart", 44450 value: function autoplayStart() { 44451 var _this5 = this; 44452 44453 if (!this.autoplay) { 44454 return false; 44455 } 44456 44457 this.autoplayTime = setInterval(function () { 44458 if (_this5.autoplayTurn === 'right') { 44459 if (!_this5.isSlideRight()) { 44460 _this5.autoplayTurn = 'left'; 44461 44462 _this5.isSlideLeft(); 44463 } 44464 } else { 44465 if (!_this5.isSlideLeft()) { 44466 _this5.autoplayTurn = 'left'; 44467 44468 _this5.isSlideRight(); 44469 } 44470 } 44471 }, this.autoplaySpeed); 44472 } 44473 }, { 44474 key: "clearAutoplay", 44475 value: function clearAutoplay() { 44476 clearInterval(this.autoplayTime); 44477 this.autoplayStart(); 44478 } 44479 }, { 44480 key: "setArrowsCustomPosition", 44481 value: function setArrowsCustomPosition() { 44482 var arrows = this.gallery.querySelector('.b-slider__arrows'); 44483 var height = this.gallery.querySelector('.b-principe-carousel__img').offsetHeight; 44484 arrows.style.top = "".concat(height, "px"); 44485 } 44486 }]); 44487 44488 return Slider; 44489}(); 44490 44491/* harmony default export */ __webpack_exports__["default"] = (Slider); 44492/* eslint-enable */ 44493 44494/***/ }), 44495 44496/***/ "./components/slider/media/arrow-left.svg.twig": 44497/*!*****************************************************!*\ 44498 !*** ./components/slider/media/arrow-left.svg.twig ***! 44499 \*****************************************************/ 44500/*! no static exports found */ 44501/***/ (function(module, exports, __webpack_require__) { 44502 44503var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 44504 template = twig({"id":"fe9879fdd68fe9032cd7497262fe10d9b15908a9c22621f13968dfc894cb2f4fc3e09a2b25d1bfcc5236bb87f70baeb5f37344bfed3a34cf0e6bffea533ac22c","data":[{"type":"raw","value":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"17\" height=\"16\"\n viewBox=\"0 0 17 16\">\n <defs>\n <path id=\"s6e7a\" d=\"M272.431 220.8v-1.26h-14.193l6.65-6.651L264 212l-8 8 8 8 .889-.889-6.311-6.311z\"/>\n </defs>\n <g>\n <g transform=\"translate(-256 -212)\">\n <use xlink:href=\"#s6e7a\"/>\n </g>\n </g>\n</svg>\n"}],"allowInlineIncludes":true,"rethrow":true}); 44505 44506module.exports = function(context) { return template.render(context); } 44507 44508/***/ }), 44509 44510/***/ "./components/slider/media/arrow-right.svg.twig": 44511/*!******************************************************!*\ 44512 !*** ./components/slider/media/arrow-right.svg.twig ***! 44513 \******************************************************/ 44514/*! no static exports found */ 44515/***/ (function(module, exports, __webpack_require__) { 44516 44517var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 44518 template = twig({"id":"aa2b0ba6f255f8404308558f36b96a08de1cac5b8a2a7dfded2b75e69bb90c9b1d58347596fd431cd6ec5391e07154ba904f0b582f0803434e793bb48f5c1b23","data":[{"type":"raw","value":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"17\" height=\"16\"\n viewBox=\"0 0 17 16\">\n <defs>\n <path id=\"dzoza\" d=\"M286 220.8v-1.26h14.194l-6.652-6.651.89-.889 8 8-8 8-.89-.889 6.312-6.311z\"/>\n </defs>\n <g>\n <g transform=\"translate(-286 -212)\">\n <use xlink:href=\"#dzoza\"/>\n </g>\n </g>\n</svg>\n"}],"allowInlineIncludes":true,"rethrow":true}); 44519 44520module.exports = function(context) { return template.render(context); } 44521 44522/***/ }), 44523 44524/***/ "./components/slider/slider.twig": 44525/*!***************************************!*\ 44526 !*** ./components/slider/slider.twig ***! 44527 \***************************************/ 44528/*! no static exports found */ 44529/***/ (function(module, exports, __webpack_require__) { 44530 44531__webpack_require__(/*! ./media/arrow-right.svg.twig */ "./components/slider/media/arrow-right.svg.twig"); 44532 44533__webpack_require__(/*! ./media/arrow-left.svg.twig */ "./components/slider/media/arrow-left.svg.twig"); 44534 44535var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 44536 template = twig({"id":"44e4643878a44c1e77a8243a6d2705ad47cf77733af6aef1c362aa4eafff9f24451e4dc861814a89426ae32e4b395d0133e02a61c6557285ac24e79da25bbe88","data":[{"type":"raw","value":"\n<div class=\"b-slider__wrapper\">\n\n</div>\n\n"},{"type":"raw","value":"\n<div class=\"b-slider__counter\">\n <span class=\"b-slider__counter-active\"></span>\n <span>/</span>\n <span class=\"b-slider__counter-all\"></span>\n</div>\n\n"},{"type":"raw","value":"\n<div class=\"b-slider__arrows\">\n <button class=\"b-slider__arrow slider__arrow-left\">\n "},{"type":"logic","token":{"type":"Twig.logic.type.include","only":false,"ignoreMissing":false,"stack":[{"type":"Twig.expression.type.string","value":"fe9879fdd68fe9032cd7497262fe10d9b15908a9c22621f13968dfc894cb2f4fc3e09a2b25d1bfcc5236bb87f70baeb5f37344bfed3a34cf0e6bffea533ac22c"}]}},{"type":"raw","value":" </button>\n <button class=\"b-slider__arrow slider__arrow-right\">\n "},{"type":"logic","token":{"type":"Twig.logic.type.include","only":false,"ignoreMissing":false,"stack":[{"type":"Twig.expression.type.string","value":"aa2b0ba6f255f8404308558f36b96a08de1cac5b8a2a7dfded2b75e69bb90c9b1d58347596fd431cd6ec5391e07154ba904f0b582f0803434e793bb48f5c1b23"}]}},{"type":"raw","value":" </button>\n</div>\n"},{"type":"raw","value":"\n<div class=\"b-slider__dots\" style=\"display: none;\">\n\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 44537 44538module.exports = function(context) { return template.render(context); } 44539 44540/***/ }), 44541
44542/***/ "./components/tabs/index.js": 44543/*!**********************************!*\ 44544 !*** ./components/tabs/index.js ***! 44545 \**********************************/ 44546/*! exports provided: default */ 44547/***/ (function(module, __webpack_exports__, __webpack_require__) { 44548 44549"use strict"; 44550__webpack_require__.r(__webpack_exports__); 44551/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js"); 44552function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 44553 44554function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 44555 44556function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 44557 44558/** 44559 * @version 2.0alpha 44560 * @author Kelnik Studios {http://kelnik.ru} 44561 */ 44562 44563/** 44564 * Dependencies 44565 */ 44566// import template from './template/content.twig'; 44567// import Utils from '../../common/scripts/utils'; 44568 44569/** 44570 * Variables && constants 44571 */ 44572// маÑÑив get паÑамеÑÑов из ÑÑла. ÐÑдем ÑÑавниваÑÑ Ð´Ð°Ñа Ñаб аÑÑибÑÑÑ Ñабов из вÑÐµÑ ÑкземплÑÑов клаÑÑа Ñ Ð´Ð°Ð½Ð½Ñми из 44573// маÑÑива, ÑÑо Ð±Ñ Ð¾ÑкÑÑваÑÑ Ð½ÑжнÑе ÑÐ°Ð±Ñ Ð¿Ñи оÑкÑÑÑии ÑÑÑаниÑÑ Ð¿Ð¾ ÑÑÑлке 44574// let urlArray = []; 44575 44576/** 44577 * Ð¢Ð°Ð±Ñ 44578 * @param {Object} element - обеÑаÑка вÑего блока 44579 * @constructor 44580 */ 44581 44582var Tabs = 44583/*#__PURE__*/ 44584function () { 44585 function Tabs() { 44586 _classCallCheck(this, Tabs); 44587 44588 this.mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__["default"](); // нода ÑодиÑÐµÐ»Ñ Ñабов (ÑлеменÑов пеÑеклÑÑÐµÐ½Ð¸Ñ Ñабов) 44589 44590 this.tabsParent = {}; // маÑÑив Ñабов (ÑлеменÑов пеÑеклÑÑÐµÐ½Ð¸Ñ Ñабов) 44591 44592 this.tabs = []; // нода ÑодиÑÐµÐ»Ñ ÐºÐ¾Ð½ÑенÑа Ñабов 44593 44594 this.contentsParent = {}; // маÑÑив ÑлеменÑов Ñ ÐºÐ¾Ð½ÑенÑов Ñабов 44595 44596 this.contents = []; // запиÑÑваем даннÑе Ñаба на коÑоÑом пÑоизоÑло ÑобÑÑие клика 44597 44598 this.dataTab = {}; // ÐлаÑÑ Ð°ÐºÑивного(вÑбÑанного) Ñаба 44599 44600 this.active = 'is-active'; // ÐлаÑÑ Ð·Ð°Ð´Ð¸Ñабленного Ñаба 44601 44602 this.disabled = 'is-disabled'; 44603 } 44604 44605 _createClass(Tabs, [{ 44606 key: "init", 44607 value: function init(options) { 44608 this.tabsParent = document.querySelector(options.element) || null; // ÐÑовеÑка на налиÑие Ñабов 44609 44610 if (!this.tabsParent) { 44611 console.error('Need target element - ' + 'https://kelnik.gitbooks.io/kelnik-documentation/front-end/components/tabs.html'); 44612 return; 44613 } // Ð½Ð°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑÐ°Ð±Ñ Ð¸ пÑиводим коллекÑÐ¸Ñ Ð½Ð¾Ð´ к маÑÑивÑ. ÐÐ»Ñ ÑабоÑÑ Ñ forEach в ÐÐ. 44614 44615 44616 this.tabs = Array.from(this.tabsParent.querySelectorAll('.b-tabs__item')); 44617 this.contentsParent = document.querySelector(".".concat(this.tabsParent.dataset.content)); // Ð½Ð°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ ÐºÐ¾Ð½ÑенÑа и пÑиводим коллекÑÐ¸Ñ Ð½Ð¾Ð´ к маÑÑивÑ. ÐÐ»Ñ ÑабоÑÑ Ñ forEach в ÐÐ. 44618 44619 this.contents = Array.from(this.contentsParent.querySelectorAll('.b-tabs-content__item')); 44620 this.bindEvents(); // this.checkUrlParam(); 44621 } 44622 /** 44623 * ÐеÑаем ÑлÑÑаÑÐµÐ»Ñ Ð½Ð° ÑÐ°Ð±Ñ 44624 */ 44625 44626 }, { 44627 key: "bindEvents", 44628 value: function bindEvents() { 44629 var _this = this; 44630
44631 this.tabs.forEach(function (tab) { 44632 tab.addEventListener('click', _this.toggleTab.bind(_this)); 44633 }); 44634 } 44635 /** 44636 * ÐеÑеклÑÑаем ÑÐ°Ð±Ñ 44637 * @param {event} event - пеÑедаем ÑобÑÑие 44638 */ 44639 44640 }, { 44641 key: "toggleTab", 44642 value: function toggleTab(event) { 44643 event.preventDefault(); 44644 var tab = event.currentTarget; 44645 44646 if (tab.classList.contains(this.disabled)) { 44647 return; 44648 } 44649 44650 this.setData(tab); 44651 this.changeState(); // this.stateUrl(tab); 44652 44653 this.mediator.publish('tabSwitched'); 44654 } 44655 /** 44656 * ÐолÑÑаем знаÑÐµÐ½Ð¸Ñ data аÑÑибÑÑов Ñаба 44657 * @param {node} activeTab - нода Ñаба по коÑоÑÐ¾Ð¼Ñ Ð¿ÑоизоÑло ÑобÑÑие клика 44658 */ 44659 44660 }, { 44661 key: "setData", 44662 value: function setData(activeTab) { 44663 this.dataTab = { 44664 tab: activeTab, 44665 id: activeTab.dataset.tab, 44666 url: activeTab.getAttribute('href'), 44667 ajax: activeTab.dataset.ajax 44668 }; 44669 } 44670 /** 44671 * ÐÑовеÑÑем еÑÑÑ Ð»Ð¸ в url'e паÑамеÑÑÑ. 44672 */ 44673 // checkUrlParam() { 44674 // if (window.location.search) { 44675 // this.getUrlParams(); 44676 // } 44677 // } 44678 44679 /** 44680 * ÐÑовеÑÑем налиÑие в href ÑÑÑлки (жмакнÑÑÑй Ñаб) налиÑие ÑÑÑоки Ñ Ð°Ð´ÑеÑом. 44681 * пÑовеÑÑеÑÑÑ Ñам ÑÐ°ÐºÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð±Ð¾Ð»ÐµÐµ одного Ñимвола (в пÑÑÑой ÑÑÑлке вÑегда должен бÑÑÑ #) 44682 * @returns {boolean} true or false 44683 */ 44684 44685 }, { 44686 key: "isLink", 44687 value: function isLink() { 44688 var arrSlice = { 44689 begin: 0, 44690 end: -1 44691 }; 44692 return this.dataTab.url.slice(arrSlice.begin, arrSlice.end); 44693 } 44694 /** 44695 * ÐÑовеÑÑем налиÑие клаÑÑа is-disabled Ñ Ð¶Ð¼Ð°ÐºÐ½ÑÑого Ñаба 44696 * @returns {boolean} false or true 44697 */ 44698 44699 }, { 44700 key: "isDisableTab", 44701 value: function isDisableTab() { 44702 return this.dataTab.tab.classList.contains(this.disabled); 44703 } 44704 /** 44705 * ÐенÑем ÑоÑÑоÑние Ñабов 44706 */ 44707 44708 }, { 44709 key: "changeState", 44710 value: function changeState() { 44711 var _this2 = this; 44712 44713 // ниÑего не делаем еÑли Ñаб неакÑивен 44714 if (this.isDisableTab()) { 44715 return; 44716 } // пеÑÐµÑ Ð¾Ð´Ð¸Ð¼ по ÑÑÑлке в Ñабе пÑи ее налиÑии 44717 44718 44719 if (this.isLink()) { 44720 location.href = this.dataTab.url; 44721 return; 44722 } // закÑÑжаем конÑÐµÐ½Ñ ajax'ом 44723 // if (this.dataTab.ajax) { 44724 // this.ajaxLoad(); 44725 // } 44726 // менÑем ÑоÑÑоÑние Ñабов 44727 44728
44729 this.tabs.forEach(function (element) { 44730 if (element.dataset.tab === _this2.dataTab.id) { 44731 element.classList.add(_this2.active); 44732 return; 44733 } 44734 44735 element.classList.remove(_this2.active); 44736 }); // и показÑваем нÑжнÑй конÑÐµÐ½Ñ 44737 44738 this.contents.forEach(function (element) { 44739 if (element.dataset.tabContent === _this2.dataTab.id) { 44740 element.classList.add(_this2.active); 44741 44742 _this2.mediator.publish('changeTabs', element); 44743 44744 return; 44745 } 44746 44747 element.classList.remove(_this2.active); 44748 }); 44749 } 44750 /** 44751 * СÑавниваем get паÑамеÑÑÑ Ð¸Ð· Url'a Ñо знаÑениÑми data-tab аÑÑибÑÑа жмакнÑÑого Ñаба 44752 * @param {Object} activeTab - Ñаб на коÑоÑом пÑоизоÑло ÑобÑÑие клик 44753 */ 44754 // забÑл JSDOC - ÑÑо Ñакое activeTav? из Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð½ÑÑно, но Ñ JSDOC лÑÑÑе 44755 // меÑод оÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑой не понÑÑно, ÑÑо ÑвлÑеÑÑÑ ÑезÑлÑÑаÑм ÑабоÑÑ Ð¼ÐµÑода 44756 // по идее Ñаз ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ , Ñо должен веÑнÑÑÑ true или false 44757 // stateUrl(activeTab) { 44758 // // const tabId = activeTab.dataset.tab; 44759 // const tabId = this.dataTab.id; 44760 // const tabUrl = activeTab.getAttribute('href'); 44761 // const getUrl = window.location.search.slice(1); 44762 // const getArray = getUrl.split('&'); 44763 // let congruenceTabUrl = true; 44764 // 44765 // const arrSlice = { 44766 // begin: 0, 44767 // end : -1 44768 // }; 44769 // 44770 // // пÑовеÑÑем, еÑÑÑ Ð»Ð¸ url в href 44771 // if (tabUrl.slice(arrSlice.begin, arrSlice.end)) { 44772 // return; 44773 // } 44774 // 44775 // // пÑовеÑÑем, еÑÑÑ Ð»Ð¸ get паÑамеÑÑ Ð² url'e и еÑли его еÑе пока неÑ, пеÑедаем ÑÑда знаÑение data-tab аÑÑибÑÑа 44776 // // жмакнÑÑого Ñаба 44777 // if (!getUrl) { 44778 // urlArray[urlArray.length] = tabId; 44779 // this.changeUrl(); 44780 // 44781 // return; 44782 // } 44783 // 44784 // 44785 // for (let i = 0; i < getArray.length; i++) { 44786 // if (getArray[i] === tabId) { 44787 // i = getArray.length; 44788 // 44789 // return; 44790 // } 44791 // 44792 // for (let tabIndex = 0; tabIndex < this.tabs.length; tabIndex++) { 44793 // if (getArray[i] === this.tabs[tabIndex].dataset.tab) { 44794 // urlArray[getArray.indexOf(getArray[i])] = tabId; 44795 // tabIndex = this.tabs.length; 44796 // i = getArray.length; 44797 // this.changeUrl(); 44798 // 44799 // return; 44800 // } 44801 // 44802 // congruenceTabUrl = false; 44803 // } 44804 // } 44805 // 44806 // if (!congruenceTabUrl) { 44807 // urlArray[urlArray.length] = tabId; 44808 // this.changeUrl(); 44809 // } 44810 // } 44811 44812 /** 44813 * ФоÑмиÑÑем ÑÑÑÐ¾ÐºÑ Ñ get паÑамеÑÑами Ð´Ð»Ñ ÑÐ¼ÐµÐ½Ñ url'a 44814 */ 44815 // changeUrl() { 44816 // const urlString = urlArray.join('&'); 44817 // 44818 // window.history.replaceState(`?${urlString}`, null, `?${urlString}`); 44819 // } 44820 // /** 44821 // * ÐодгÑÑжаем ajax 44822 // */ 44823 // ajaxLoad() { 44824 // const that = this; 44825 // const ajaxUrl = `/tests/${that.dataTab.ajax}`; 44826 // 44827 // Utils.send(null, ajaxUrl, 44828 // { 44829 // success(req) { 44830 // that.addPageContent(req, that.dataTab.tab); 44831 // }, 44832 // error(err) { 44833 // console.error(`оÑибка на ÑеÑвеÑе: ${err}`); 44834 // } 44835 // }); 44836 // } 44837 // 44838 // /** 44839 // * ÐобавлÑем конÑÐµÐ½Ñ Ð¿ÑиÑедÑий Ñ ÑеÑвеÑа на ÑÑÑаниÑÑ 44840 // * @param {object} data - оÑÐ²ÐµÑ Ð¾Ñ ÑеÑвеÑа пÑи ajax запÑоÑе 44841 // * @param {node} activeTab - Ñаб по коÑоÑÐ¾Ð¼Ñ Ð¿ÑоизоÑел клик 44842 // */ 44843 // addPageContent(data, activeTab) {
44844 // this.contents.forEach((element) => { 44845 // if (element.dataset.tabContent === activeTab.dataset.tab) { 44846 // element.innerHTML = template(data); 44847 // activeTab.removeAttribute('data-ajax'); 44848 // } 44849 // }); 44850 // } 44851 44852 /** 44853 * ÐÑи Ñоздании ÑкземплÑÑа клаÑÑа, пÑовеÑÑем еÑÑÑ Ð»Ð¸ Ñ Ð½Ð°Ñ Ð¿Ð°ÑамеÑÑÑ Ð² адÑеÑной ÑÑÑоке. 44854 * ÐÑли еÑÑÑ - вÑÑаÑкиваем Ð¸Ñ Ð² маÑÑив. 44855 */ 44856 // getUrlParams() { 44857 // // беÑем ÑÑÑÐ¾ÐºÑ Ð¸Ð· ÑÑла и обÑезаем ÐµÐ¼Ñ Ð¿ÐµÑвÑй Ñимвол и ппÑеобÑазÑем в маÑÑив 44858 // const getArray = window.location.search.replace('?', '').split('&'); 44859 // 44860 // if (getArray.length) { 44861 // // пеÑедаем маÑÑив Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ data-tab аÑибÑÑами 44862 // this.comparisonTabUrl(getArray); 44863 // urlArray = getArray; 44864 // } 44865 // } 44866 44867 /** 44868 * ÐÑли в get паÑамеÑÑÐ°Ñ url'a еÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑие знаÑениÑм data-tab аÑÑибÑÑов, Ñо оÑкÑÑваем ÑÑÐ¾Ñ Ñаб 44869 * @param {array} getArray - маÑÑив get паÑамеÑÑов из url'a Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð·Ð½Ð°ÑениÑми data-tab аÑÑибÑÑов 44870 */ 44871 // comparisonTabUrl(getArray) { 44872 // // пÑÐ¾Ñ Ð¾Ð´Ð¸Ð¼ по маÑÑÐ¸Ð²Ñ Ð¸Ð· знаÑений взÑÑÑÑ Ð² ÑÑле 44873 // getArray.forEach((element) => { 44874 // // пÑÐ¾Ñ Ð¾Ð´Ð¸Ð¼ по маÑÑÐ¸Ð²Ñ data-tab ÑлеменÑов
44875 // this.tabs.forEach((tab) => { 44876 // // иÑем Ñовпадение знаÑений data-tab аÑиÑÑбÑов Ñо знаÑениÑми из ÑÑла 44877 // if (tab.dataset.tab === element) { 44878 // // вÑзÑваем меÑод ÑÐ¼ÐµÐ½Ñ Ñабов в ÑлÑÑае ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ 44879 // this.setData(tab); 44880 // this.changeState(); 44881 // } 44882 // }); 44883 // }); 44884 // } 44885 44886 }]); 44887 44888 return Tabs; 44889}(); 44890 44891/* harmony default export */ __webpack_exports__["default"] = (Tabs); 44892 44893/***/ }), 44894
44895/***/ "./components/team/index.js": 44896/*!**********************************!*\ 44897 !*** ./components/team/index.js ***! 44898 \**********************************/ 44899/*! exports provided: default */ 44900/***/ (function(module, __webpack_exports__, __webpack_require__) { 44901 44902"use strict"; 44903__webpack_require__.r(__webpack_exports__); 44904/* harmony import */ var components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/team/popup.twig */ "./components/team/popup.twig"); 44905/* harmony import */ var components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0__); 44906/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 44907function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 44908 44909function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 44910 44911function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 44912 44913 44914 44915 44916var teamPopup = 44917/*#__PURE__*/ 44918function () { 44919 function teamPopup() { 44920 _classCallCheck(this, teamPopup); 44921 44922 this.tabButtons = Array.from(document.querySelectorAll('.j-team-tab-button')); 44923 this.tabContents = Array.from(document.querySelectorAll('.j-team-tab-content')); 44924 this.tabButtonActive = 'b-team-text__button_is_active'; 44925 this.tabContentHide = 'b-team-text__tab_is_hide'; 44926 } 44927 44928 _createClass(teamPopup, [{ 44929 key: "init", 44930 value: function init(object) { 44931 var _this = this; 44932 44933 this.body = document.body; 44934 var items = object.querySelectorAll('.b-team-slides__modal'); 44935 items.forEach(function (item) { 44936 var container = common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].closest(item, '.b-team-slides__item'); 44937 item.addEventListener('click', function () { 44938 _this.setData(container); 44939 44940 _this.insertTemplate(); 44941 44942 _this.fixedBody(); 44943 }); 44944 }); 44945 44946 this._bindEvents(); 44947 } 44948 }, { 44949 key: "_bindEvents", 44950 value: function _bindEvents() { 44951 var _this2 = this; 44952 44953 this.tabButtons.forEach(function (tabButton) { 44954 tabButton.addEventListener('click', function () { 44955 if (tabButton.classList.contains(_this2.tabButtonActive)) { 44956 tabButton.classList.remove(_this2.tabButtonActive); 44957 44958 _this2._hideTabContents(); 44959 44960 return; 44961 } 44962 44963 _this2._removeActiveButton(); 44964 44965 tabButton.classList.add(_this2.tabButtonActive); 44966 var idTabContent = tabButton.dataset.tab; 44967 var tabContent = document.getElementById(idTabContent); 44968 44969 _this2._hideTabContents(); 44970 44971 tabContent.classList.remove(_this2.tabContentHide); 44972 }); 44973 }); 44974 } 44975 }, { 44976 key: "_removeActiveButton", 44977 value: function _removeActiveButton() { 44978 var _this3 = this; 44979 44980 this.tabButtons.forEach(function (tabButton) { 44981 tabButton.classList.remove(_this3.tabButtonActive); 44982 }); 44983 } 44984 }, { 44985 key: "_hideTabContents", 44986 value: function _hideTabContents() { 44987 var _this4 = this; 44988 44989 this.tabContents.forEach(function (tabContents) { 44990 tabContents.classList.add(_this4.tabContentHide); 44991 }); 44992 } 44993 }, { 44994 key: "setData", 44995 value: function setData(element) { 44996 var textElement = element.querySelector('.b-team-slides__legend'); 44997 this.data = { 44998 name: element.querySelector('.b-team-slides__ttl').innerHTML, 44999 status: element.querySelector('.b-team-slides__text').innerHTML, 45000 position: element.querySelector('.b-team-slides__text-hidden').innerHTML, 45001 text: textElement ? textElement.innerHTML : '', 45002 image: element.querySelector('.b-team-slides__img').src 45003 }; 45004 } 45005 }, { 45006 key: "insertTemplate", 45007 value: function insertTemplate() { 45008 document.body.insertAdjacentHTML('afterbegin', components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0___default()(this.data)); 45009 this.initCloseBtn(); 45010 } 45011 }, { 45012 key: "initCloseBtn", 45013 value: function initCloseBtn() { 45014 var _this5 = this; 45015 45016 var close = document.querySelector('.j-popup-close'); 45017 close.addEventListener('click', function () { 45018 _this5.destroyPopup(); 45019 45020 _this5.fixedBody(); 45021 }); 45022 } 45023 }, {
45024 key: "destroyPopup", 45025 value: function destroyPopup() { 45026 var popup = document.querySelector('.b-team-popup'); 45027 common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeElement(popup); 45028 } 45029 /** 45030 * ÐобавлÑÐµÑ body position:fixed, Ð´Ð°Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿ÑокÑÑÑки ÑÑÑаниÑÑ Ð¿Ñи оÑкÑÑÑом попапе. 45031 */ 45032 45033 }, { 45034 key: "fixedBody", 45035 value: function fixedBody() { 45036 this.body.classList.toggle('body-fixed'); 45037 } 45038 }]); 45039 45040 return teamPopup; 45041}(); 45042 45043/* harmony default export */ __webpack_exports__["default"] = (teamPopup); 45044 45045/***/ }), 45046 45047/***/ "./components/team/popup.twig": 45048/*!************************************!*\ 45049 !*** ./components/team/popup.twig ***! 45050 \************************************/ 45051/*! no static exports found */ 45052/***/ (function(module, exports, __webpack_require__) { 45053 45054var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 45055 template = twig({"id":"c01309fea05918e066c9f5666e5c26479104b94f5364c7025d3cfe5c7a6fade0a74f41906224d8dbc782d67641d7cee75930750201f6007ed5e45c71de4045bf","data":[{"type":"raw","value":"<div class=\"b-team-popup\">\n <div class=\"b-team-popup__inline-wrapper\">\n <button class=\"b-team-popup__close j-popup-close\" aria-label=\"ÐакÑÑÑÑ Ð²ÑплÑваÑÑее окно\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\"><defs><path id=\"73hta\" d=\"M1051.444 73L1050 71.556 1061.556 60 1050 48.444l1.444-1.444L1063 58.556 1074.556 47l1.444 1.444L1064.444 60 1076 71.556 1074.556 73 1063 61.444z\"/></defs><g><g transform=\"translate(-1050 -47)\"><use fill=\"#fff\" xlink:href=\"#73hta\"/></g></g></svg>\n </button>\n\n <div class=\"b-team-popup__header\">\n <div class=\"b-team-popup__name\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"name","match":["name"]}]},{"type":"raw","value":"</div>\n <div class=\"b-team-popup__status\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"status","match":["status"]}]},{"type":"raw","value":"</div>\n <div class=\"b-team-popup__position\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"position","match":["position"]}]},{"type":"raw","value":"</div>\n <div class=\"b-team-popup__image-wrap\">\n <img src=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"image","match":["image"]}]},{"type":"raw","value":"\" class=\"b-team-popup__image\" alt=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"name","match":["name"]}]},{"type":"raw","value":"\">\n </div>\n </div>\n\n "},{"type":"logic","token":{"type":"Twig.logic.type.if","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}],"output":[{"type":"raw","value":" <div class=\"b-team-popup__body\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}]},{"type":"raw","value":"\n </div>\n "}]}},{"type":"raw","value":" </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 45056 45057module.exports = function(context) { return template.render(context); } 45058 45059/***/ }), 45060
45061/***/ "./components/yandex-map/index.js": 45062/*!****************************************!*\ 45063 !*** ./components/yandex-map/index.js ***! 45064 \****************************************/ 45065/*! exports provided: default */ 45066/***/ (function(module, __webpack_exports__, __webpack_require__) { 45067 45068"use strict"; 45069__webpack_require__.r(__webpack_exports__); 45070/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./templates/markers/main.twig */ "./components/yandex-map/templates/markers/main.twig"); 45071/* harmony import */ var _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0__); 45072/* harmony import */ var _templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./templates/markers/secondary.twig */ "./components/yandex-map/templates/markers/secondary.twig"); 45073/* harmony import */ var _templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1__); 45074/* harmony import */ var _templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./templates/markers/text.twig */ "./components/yandex-map/templates/markers/text.twig"); 45075/* harmony import */ var _templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2__); 45076/* harmony import */ var _templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./templates/ballons/link.twig */ "./components/yandex-map/templates/ballons/link.twig"); 45077/* harmony import */ var _templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3__); 45078/* harmony import */ var _templates_legend_twig__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./templates/legend.twig */ "./components/yandex-map/templates/legend.twig"); 45079/* harmony import */ var _templates_legend_twig__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_templates_legend_twig__WEBPACK_IMPORTED_MODULE_4__); 45080/* harmony import */ var _templates_controls_twig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./templates/control
45080s.twig */ "./components/yandex-map/templates/controls.twig"); 45081/* harmony import */ var _templates_controls_twig__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_templates_controls_twig__WEBPACK_IMPORTED_MODULE_5__); 45082/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js"); 45083/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js"); 45084function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } 45085 45086function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } 45087 45088function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } 45089 45090function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } 45091 45092function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 45093 45094function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 45095 45096function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 45097 45098/* eslint-disable */ 45099 45100/** 45101 * @version 1.0 45102 * @author Kelnik Studios {http://kelnik.ru} 45103 * ÐзÑÑо Ñ https://gitlab.kelnik.pro/samolet/himki/blob/dev/src/scripts/app/yandex-maps.js 45104 */ 45105 45106 45107 45108 45109 45110 45111 45112 45113var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_7__["default"](); 45114 45115var YandexMap = 45116/*#__PURE__*/ 45117function () { 45118 function YandexMap(ymaps) { 45119 _classCallCheck(this, YandexMap); 45120 45121 /** 45122 * ÐкземплÑÑ Ð·Ð°Ð³ÑÑженнÑÑ ÑÐ½Ð´ÐµÐºÑ ÐºÐ°ÑÑ. 45123 */ 45124 this.ymaps = ymaps; 45125 /** 45126 * ÐÑе наÑÑÑоки каÑÑÑ 45127 * @type {Object} 45128 */ 45129 45130 this.settings = {}; 45131 /** 45132 * ЯндекÑовÑй обÑÐµÐºÑ ÐºÐ°ÑÑÑ 45133 * @type {null} 45134 */ 45135 45136 this.map = {}; 45137 /** 45138 * URL по коÑоÑÐ¾Ð¼Ñ Ð±ÑÐ´ÐµÑ Ð²Ñполнен ajax запÑÐ¾Ñ Ð·Ð° даннÑми 45139 */ 45140 45141 this.url = ''; 45142 /** 45143 * ÐлаÑÑа DOM-ÑлеменÑа в коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑÑавлена каÑÑа 45144 */ 45145 45146 this.base = '.b-yandex-map__base'; 45147 } 45148 /** 45149 * @param {Object} outerOptions - наÑÑÑойки из внеÑнего Ñайла 45150 * @param {Function} initYandexMap - ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑаÑного вÑзова, ÑÑабаÑÑваеÑ, когда каÑÑа Ñже загÑÑзилаÑÑ 45151 * и показÑваеÑÑÑ 45152 */ 45153 45154 45155 _createClass(YandexMap, [{ 45156 key: "init", 45157 value: function init(outerOptions) { 45158 var _this = this; 45159 45160 this.mapWrapper = outerOptions.wrapper; 45161 this.content = this.mapWrapper.querySelector(this.base); 45162 this.id = this.content.id; 45163 this.url = this.mapWrapper.dataset.ajax; 45164 this.json = this.mapWrapper.dataset.json; 45165 45166 if (this.json) { 45167 this.json = JSON.parse(atob(this.json)); 45168 } 45169 45170 this.completeSettings(outerOptions, function () { 45171 _this.initYandexMap(function () { 45172 _this.initControls(); 45173 45174 _this.initScrollZoom(); 45175 45176 _this.initMarkers(); 45177 45178 _this.initTabs(); 45179 45180 _this.initCircles(); 45181 45182 _this.disableMobileDrag(); 45183 45184 _this.initLegend(); 45185 45186 _this.initGPS(); 45187 }); 45188 }); 45189 } 45190 /** 45191 * ÐепоÑÑедÑÑвенное Ñоздание ÑкземплÑÑа Ð¯Ð½Ð´ÐµÐºÑ ÐаÑÑ 45192 * @param initMapCallback - коллбÑк оÑÑалÑнÑÑ Ð¼ÐµÑодов модÑлÑ. СÑабоÑаÑÑ ÑолÑко Ñогда, когда каÑÑа бÑÐ´ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ñоздана 45193 */ 45194 45195 }, { 45196 key: "initYandexMap", 45197 value: function initYandexMap() { 45198 var initMapCallback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {}; 45199 this.map = new this.ymaps.Map(this.id, this.settings); 45200 initMapCallback(); 45201 } 45202 }, { 45203 key: "initLegend", 45204 value: function initLegend() { 45205 if (!this.settings.legend) { 45206 return; 45207 } 45208 45209 var CustomControlClass = function CustomControlClass(options) { 45210 CustomControlClass.superclass.constructor.call(this, options); 45211 this._$content = null; 45212 this._geocoderDeferred = null; 45213 }; // наÑледÑем Ð¾Ñ collection.Item 45214 45215 45216 ymaps.util.augment(CustomControlClass, ymaps.collection.Item, { 45217 onAddToMap: function onAddToMap(map) { 45218 CustomControlClass.superclass.onAddToMap.call(this, map); 45219 this._lastCenter = null; 45220 this.getParent().getChildElement(this).then(this._onGetChildElement, this); 45221 }, 45222 onRemoveFromMap: function onRemoveFromMap(oldMap) { 45223 this._lastCenter = null; 45224 45225 if (this._$content) { 45226 this._$content.remove(); 45227 45228 this._mapEventGroup.removeAll(); 45229 } 45230 45231 CustomControlClass.superclass.onRemoveFromMap.call(this, oldMap); 45232 }, 45233 _onGetChildElement: function _onGetChildElement(parentDomContainer) { 45234 // Создаем HTML-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÑекÑÑом. 45235 this._$content = $(_templates_legend_twig__WEBPACK_IMPORTED_MODULE_4___default()()).appendTo(parentDomContainer); 45236 } 45237 }); 45238 var customControl = new CustomControlClass(); 45239 this.map.controls.add(customControl, { 45240 float: 'none', 45241 position: { 45242 top: 0, 45243 left: 0 45244 } 45245 }); 45246 } 45247 }, { 45248 key: "initGPS", 45249 value: function initGPS() { 45250 if (!this.settings.gps) { 45251 return; 45252 } // Создаем ÑобÑÑвеннÑй клаÑÑ. 45253 45254 45255 var GPSClass = function GPSClass(options) { 45256 GPSClass.superclass.constructor.call(this, options); 45257 this._$content = null; 45258 this._geocoderDeferred = null; 45259 }; // РнаÑледÑем его Ð¾Ñ collection.Item. 45260 45261 45262 ymaps.util.augment(GPSClass, ymaps.collection.Item, { 45263 onAddToMap: function onAddToMap(map) { 45264 GPSClass.superclass.onAddToMap.call(this, map); 45265 this._lastCenter = null; 45266 this.getParent().getChildElement(this).then(this._onGetChildElement, this); 45267 }, 45268 onRemoveFromMap: function onRemoveFromMap(oldMap) { 45269 this._lastCenter = null; 45270 45271 if (this._$content) { 45272 this._$content.remove(); 45273 45274 this._mapEventGroup.removeAll(); 45275 } 45276 45277 GPSClass.superclass.onRemoveFromMap.call(this, oldMap); 45278 }, 45279 _onGetChildElement: function _onGetChildElement(parentDomContainer) { 45280 // Создаем HTML-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÑекÑÑом. 45281 this._$content = $('<button class="b-yandex-map__gps-btn j-get-geolocation"></button>').appendTo(parentDomContainer); // this._mapEventGroup = this.getMap().events.group(); 45282 }, 45283 _createRequest: function _createRequest() { 45284 var lastCenter = this._lastCenter = this.getMap().getCenter().join(','); // ÐапÑаÑиваем инÑоÑмаÑÐ¸Ñ Ð¾ меÑÑе по кооÑдинаÑам ÑенÑÑа каÑÑÑ. 45285 45286 ymaps.geocode(this._lastCenter, {
45287 // УказÑваем, ÑÑо оÑÐ²ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð² ÑоÑмаÑе JSON. 45288 json: true, 45289 // УÑÑанавливаем Ð»Ð¸Ð¼Ð¸Ñ Ð½Ð° кол-во запиÑей в оÑвеÑе. 45290 results: 1 45291 }).then(function (result) { 45292 // ÐÑдем обÑабаÑÑваÑÑ ÑолÑко оÑÐ²ÐµÑ Ð¾Ñ Ð¿Ð¾Ñледнего запÑоÑа. 45293 if (lastCenter == this._lastCenter) { 45294 this._onServerResponse(result); 45295 } 45296 }, this); 45297 }, 45298 _onServerResponse: function _onServerResponse(result) { 45299 // ÐаннÑе Ð¾Ñ ÑеÑвеÑа бÑли полÑÑÐµÐ½Ñ Ð¸ ÑепеÑÑ Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ оÑобÑазиÑÑ. 45300 // ÐпиÑание оÑвеÑа в ÑоÑмаÑе JSON. 45301 var members = result.GeoObjectCollection.featureMember, 45302 geoObjectData = members && members.length ? members[0].GeoObject : null; 45303 45304 if (geoObjectData) { 45305 this._$content.text(geoObjectData.metaDataProperty.GeocoderMetaData.text); 45306 } 45307 } 45308 }); 45309 var gps = new GPSClass(); 45310 this.map.controls.add(gps, { 45311 float: 'none', 45312 position: { 45313 top: this.settings.height / 2 + 16, 45314 right: 15 45315 } 45316 }); 45317 } 45318 }, { 45319 key: "getGeoLocation", 45320 value: function getGeoLocation() { 45321 var geolocation = ymaps.geolocation; // СÑавним положение, вÑÑиÑленное по ip полÑзоваÑÐµÐ»Ñ Ð¸ 45322 // положение, вÑÑиÑленное ÑÑедÑÑвами бÑаÑзеÑа. 45323 45324 geolocation.get({ 45325 provider: 'yandex', 45326 mapStateAutoApply: true 45327 }).then(function (result) { 45328 // ÐÑаÑнÑм ÑвеÑом помеÑим положение, вÑÑиÑленное ÑеÑез ip. 45329 result.geoObjects.options.set('preset', 'islands#redCircleIcon'); 45330 result.geoObjects.get(0).properties.set({ 45331 balloonContentBody: 'Ðое меÑÑоположение' 45332 }); 45333 myMap.geoObjects.add(result.geoObjects); 45334 }); 45335 geolocation.get({ 45336 provider: 'browser', 45337 mapStateAutoApply: true 45338 }).then(function (result) { 45339 // Синим ÑвеÑом помеÑим положение, полÑÑенное ÑеÑез бÑаÑзеÑ. 45340 // ÐÑли бÑаÑÐ·ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑÑ ÑÑнкÑионалÑноÑÑÑ, меÑка не бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° на каÑÑÑ. 45341 result.geoObjects.options.set('preset', 'islands#blueCircleIcon'); 45342 myMap.geoObjects.add(result.geoObjects); 45343 }); 45344 } 45345 /** 45346 * Ð¡ÐºÐ»ÐµÐ¸Ð²Ð°ÐµÑ Ð²Ñе наÑÑÑойки каÑÑÑ Ð² Ð¾Ð´Ð½Ñ Ð¿ÐµÑменнÑÑ 45347 */ 45348 45349 }, { 45350 key: "completeSettings", 45351 value: function completeSettings(outerOptions) { 45352 var initCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; 45353 45354 if (this.url) { 45355 this.connectSettings(this.setDefaultSettings()); 45356 this.connectSettings(this.getScriptSettings(outerOptions));
45357 this.getServerSettings(this.url, initCallback); 45358 return; 45359 } 45360 45361 this.connectSettings(this.setDefaultSettings()); 45362 this.connectSettings(this.getScriptSettings(outerOptions)); 45363 this.connectSettings(this.json); 45364 initCallback(); 45365 } 45366 /** 45367 * ÐолÑÑÐ°ÐµÑ Ð½Ð°ÑÑÑойки Ð¾Ñ ÑеÑвеÑа 45368 */ 45369 45370 }, { 45371 key: "getServerSettings", 45372 value: function getServerSettings(url) { 45373 var _this2 = this; 45374 45375 var serverSuccess = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; 45376 common_scripts_utils__WEBPACK_IMPORTED_MODULE_6__["default"].send('', url, { 45377 success: function success(response) { 45378 _this2.connectSettings(response.data); 45379 45380 serverSuccess(); 45381 }, 45382 error: function error(_error) { 45383 console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(_error)); 45384 } 45385 }, 'GET'); 45386 } 45387 /** 45388 * Ð¡ÐºÐ»ÐµÐ¸Ð²Ð°ÐµÑ ÐºÐ¾Ð½ÐºÑÑенÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ Ð² обÑÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ Ð²Ñей каÑÑÑ 45389 * @param {Object} outerSettings - обÑÐµÐºÑ Ð½Ð°ÑÑÑоек каÑÑÑ 45390 */ 45391 45392 }, { 45393 key: "connectSettings", 45394 value: function connectSettings(outerSettings) { 45395 if (typeof outerSettings === "object") { 45396 Object.assign(this.settings, outerSettings); 45397 } 45398 } 45399 /** 45400 * УÑÑÐ°Ð½Ð°Ð»Ð¸Ð²Ð°ÐµÑ Ð½Ð°ÑÑÑойки по ÑмолÑÐ°Ð½Ð¸Ñ 45401 * @return {{center: {lat, lng}, zoom: number, minZoom: number, maxZoom: number, zoomStep: number}} - 45402 * обÑÐµÐºÑ Ð½Ð°ÑÑÑоек каÑÑÑ 45403 */ 45404 45405 }, { 45406 key: "setDefaultSettings", 45407 value: function setDefaultSettings() { 45408 var latCenter = 59.939014; 45409 var lngCenter = 30.315545; // вÑÑÑиÑÑваем вÑÑоÑÑ Ð¾Ð±ÐµÑÑки каÑÑÑ, а Ñавно вÑÑоÑÑ ÐºÐ°ÑÑÑ, Ð´Ð»Ñ Ð¿Ð¾Ð·Ð¸ÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑлеменÑов ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ 45410 45411 var heightMap = this.content.offsetHeight; 45412 return { 45413 center: [latCenter, lngCenter], 45414 mapTypeControl: false, 45415 zoom: 12, 45416 minZoom: 10, 45417 maxZoom: 18, 45418 zoomStep: 1, 45419 controls: [], 45420 zoomControl: true, 45421 customZoomControl: false, 45422 fullScreenControl: true, 45423 customFullScreenControl: false, 45424 height: heightMap, 45425 zoomScroll: false 45426 }; 45427 } 45428 /** 45429 * УÑÑÐ°Ð½Ð°Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие наÑÑÑойки 45430 * @return {object} - обÑÐµÐºÑ Ð½Ð°ÑÑÑоек каÑÑÑ Ð¸Ð· ÑкÑипÑа Ñо ÑÑÑаниÑÑ 45431 */ 45432 45433 }, { 45434 key: "getScriptSettings", 45435 value: function getScriptSettings(outerOptions) { 45436 return outerOptions; 45437 } 45438 /** 45439 * ÐобавлÑем ÑлеменÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° каÑÑÑ 45440 */ 45441 45442 }, { 45443 key: "initControls", 45444 value: function initControls() { 45445 var _this3 = this; 45446 45447 if (!this.settings.height) { 45448 mediator.subscribe('tabSwitched', function () { 45449 _this3.settings.height = _this3.mapWrapper.offsetHeight; 45450 45451 _this3.addZoomControl(); 45452 }); 45453 } else { 45454 this.addZoomControl(); 45455 } 45456 45457 this.addFullScreenControl(); 45458 } 45459 /** 45460 * ÐобавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑÑабом каÑÑÑ 45461 */ 45462 45463 }, { 45464 key: "addZoomControl", 45465 value: function addZoomControl() { 45466 // ÐÑовеÑÑем оÑклÑÑен ли показ ÑлеменÑов ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¾Ð¾Ð±Ñе 45467 // ÐÑли да, Ñо ниÑего не показÑваем 45468 if (!this.settings.zoomControl || this.addZoomControl.flag) { 45469 return; 45470 } // ÐÑовеÑÑем нÑжно ли показÑваÑÑ ÐºÐ°ÑÑомнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпÑавление 45471 // ÐÑли Ð½ÐµÑ Ñо показÑваем ÑÑандаÑÑнÑе 45472 45473 45474 if (!this.settings.customZoomControl) { 45475 this.map.controls.add("zoomControl"); 45476 return; 45477 } // ÐоказÑваем каÑÑомнÑе ÑлеменÑÑ ÑпÑавление 45478 45479 45480 var zoomControl = new ymaps.control.ZoomControl({ 45481 options: { 45482 layout: this.createLayoutZoomControl() 45483 } 45484 }); 45485 this.map.controls.add(zoomControl, { 45486 float: 'none', 45487 position: { 45488 top: this.mapWrapper.offsetHeight / 2 - 70, 45489 right: '15px' 45490 } 45491 }); 45492 this.addZoomControl.flag = true; 45493 } 45494 }, { 45495 key: "initScrollZoom", 45496 value: function initScrollZoom() { 45497 var scrollZoom = this.settings.zoomScroll; 45498 45499 switch (scrollZoom) { 45500 case true: 45501 this.map.behaviors.enable('scrollZoom'); 45502 break; 45503 45504 case false: 45505 this.map.behaviors.disable('scrollZoom'); 45506 } 45507 } 45508 /** 45509 * Создаем дизайнеÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°ÑÑой 45510 * @return {object} - обÑÐµÐºÑ ÐºÐ°ÑÑомного макеÑа кнопок зÑммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°ÑÑÑ 45511 */ 45512 45513 }, { 45514 key: "createLayoutZoomControl", 45515 value: function createLayoutZoomControl() { 45516 // еÑли на ÑÑÑаниÑе более одной каÑÑÑ, Ñо id кнопок зÑммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑлиÑаÑÑÑÑ 45517 // инаÑе зÑм бÑÐ´ÐµÑ ÑÑабаÑÑваÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно на вÑÐµÑ ÐºÐ°ÑÑÐ°Ñ 45518 // mapId пеÑедаем в ÑаблоннÑÑ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑникалÑнÑÑ id кнопок 45519 var mapId = this.id; // Создадим полÑзоваÑелÑÑкий Ð¼Ð°ÐºÐµÑ Ð¿Ð¾Ð»Ð·Ñнка маÑÑÑаба. 45520 45521 var zoomLayout = ymaps.templateLayoutFactory.createClass(_templates_controls_twig__WEBPACK_IMPORTED_MODULE_5___default()({ 45522 id: mapId 45523 }), { 45524 // ÐеÑеопÑеделÑем меÑÐ¾Ð´Ñ Ð¼Ð°ÐºÐµÑа, ÑÑÐ¾Ð±Ñ Ð²ÑполнÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дейÑÑÐ²Ð¸Ñ 45525 // пÑи поÑÑÑоении и оÑиÑÑке макеÑа. 45526 build: function build() { 45527 // ÐÑзÑваем ÑодиÑелÑÑкий меÑод build. 45528 zoomLayout.superclass.build.call(this); // ÐÑивÑзÑваем ÑÑнкÑии-обÑабоÑÑики к конÑекÑÑÑ Ð¸ ÑÐ¾Ñ ÑанÑем ÑÑÑлки 45529 // на Ð½Ð¸Ñ , ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ñом оÑпиÑаÑÑÑÑ Ð¾Ñ ÑобÑÑий. 45530 45531 this.zoomInCallback = ymaps.util.bind(this.zoomIn, this); 45532 this.zoomOutCallback = ymaps.util.bind(this.zoomOut, this); // ÐаÑинаем ÑлÑÑаÑÑ ÐºÐ»Ð¸ÐºÐ¸ на ÐºÐ½Ð¾Ð¿ÐºÐ°Ñ Ð¼Ð°ÐºÐµÑа. 45533 45534 $("#".concat(mapId, "-in")).bind('click', this.zoomInCallback); 45535 $("#".concat(mapId, "-out")).bind('click', this.zoomOutCallback); 45536 }, 45537 clear: function clear() { 45538 // Снимаем обÑабоÑÑики кликов. 45539 $("#".concat(mapId, "-in")).unbind('click', this.zoomInCallback); 45540 $("#".concat(mapId, "-out")).unbind('click', this.zoomOutCallback); // ÐÑзÑваем ÑодиÑелÑÑкий меÑод clear. 45541 45542 zoomLayout.superclass.clear.call(this); 45543 }, 45544 zoomIn: function zoomIn() { 45545 var map = this.getData().control.getMap(); 45546 map.setZoom(map.getZoom() + 1, { 45547 checkZoomRange: true 45548 }); 45549 }, 45550 zoomOut: function zoomOut() { 45551 var map = this.getData().control.getMap(); 45552 map.setZoom(map.getZoom() - 1, { 45553 checkZoomRange: true 45554 }); 45555 } 45556 }); 45557 return zoomLayout; 45558 } 45559 /** 45560 * ÐобавлÑÐµÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¾ÑкÑÑÑÐ¸Ñ ÐºÐ°ÑÑÑ Ð½Ð° полнÑй ÑкÑан 45561 */ 45562 45563 }, { 45564 key: "addFullScreenControl", 45565 value: function addFullScreenControl() { 45566 if (!this.settings.fullScreenControl) { 45567 return; 45568 } 45569 45570 if (!this.settings.customFullScreenControl) { 45571 var takeOptions = {}; 45572 45573 if (this.settings.fullScreenControlOptions) { 45574 takeOptions = this.settings.fullScreenControlOptions; 45575 } 45576 45577 var fullscreenControl = new ymaps.control.FullscreenControl({ 45578 options: takeOptions 45579 }); 45580 this.map.controls.add(fullscreenControl); 45581 return; 45582 } //ÑÑÑ Ð²ÑзÑваем меÑод ÑоздаÑÑий каÑÑомнÑй конÑÑол 45583 45584 } 45585 /** 45586 * ÐоказÑваем маÑкеÑÑ Ð¾Ð±ÑекÑов инÑÑаÑÑÑÑкÑÑÑÑ Ð½Ð° каÑÑе 45587 */ 45588 45589 }, { 45590 key: "initMarkers", 45591 value: function initMarkers() { 45592 var _this4 = this; 45593 45594 var markers = this.settings.markers; 45595 45596 if (typeof markers !== "object") { 45597 return; 45598 } 45599 45600 if (this.settings.htmlMarkers) { 45601 this.initHtmlMarkers(); 45602 } 45603
45604 markers.forEach(function (element) { 45605 // пÑовеÑÑем еÑÑÑ Ð»Ð¸ ÑвойÑÑво offset Ñ Ð¼Ð°ÑкеÑа, еÑли Ð½ÐµÑ 45606 // Ñоздаем маÑÑив знаÑений ÑмеÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑкеÑа на Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ Ñвоей ÑиÑÐ¸Ð½Ñ Ð¸ вÑÑоÑÑ 45607 // Ð´Ð»Ñ Ñого, ÑÑо Ð±Ñ ÐºÐ¾Ð¾ÑдинаÑа маÑкеÑа и ÑенÑÑ Ð¸ÐºÐ¾Ð½ÐºÐ¸ маÑкеÑа бÑли ÑовмеÑÐµÐ½Ñ 45608 var markerOffset = element.offset ? element.offset : element.size.map(function (size) { 45609 return -(size / 2); 45610 }); // пÑовеÑÑем ÑвлÑеÑÑÑ Ð»Ð¸ маÑÐºÐµÑ Ð¼Ð°ÑкеÑом ÐÐ. 45611 45612 var iconBalloon = ""; 45613 var objectType = ""; 45614 var balloonLogo = element.logo || ''; 45615 var balloonLink = element.link || ''; 45616 var complex = "complex"; 45617 45618 if (element.type === 0) { 45619 iconBalloon = element.iconBalloon; 45620 objectType = iconBalloon ? complex : false; 45621 } else { 45622 iconBalloon = element.iconBalloon ? element.iconBalloon : element.icon; 45623 objectType = element.objectType; 45624 } // еÑли в обÑекÑе маÑкеÑа Ð½ÐµÑ Ð½Ð¸ ÑекÑÑа ни заголовка, Ñо баллÑн не показÑваем 45625 45626 45627 if (!element.title && !element.text) { 45628 var _marker = new ymaps.Placemark(element.coords, { 45629 type: element.type 45630 }, { 45631 iconLayout: 'default#image', 45632 iconImageHref: element.icon, 45633 iconImageSize: element.size, 45634 iconImageOffset: markerOffset 45635 }); 45636 45637 _this4.map.geoObjects.add(_marker); 45638 45639 _this4.closeBallonOnClickMap(); 45640 45641 return; 45642 } // вÑводим клаÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¾Ñ Ð´Ð»Ñ ÑазмеÑки баллÑна маÑкеÑа ÐÐ, вне завиÑимоÑÑи - еÑÑÑ Ð² обÑекÑе маÑкеÑа 45643 // objectType или Ð½ÐµÑ 45644 45645 45646 var marker = new ymaps.Placemark(element.coords, { 45647 type: element.type, 45648 balloonIcon: objectType !== undefined ? element.image : iconBalloon, 45649 balloonHeader: element.title, 45650 balloonContent: element.text, 45651 balloonLogo: balloonLogo, 45652 hintContent: element.title 45653 }, { 45654 balloonShadow: false, 45655 balloonLayout: _this4.createBalloonLayout(objectType), 45656 balloonContentLayout: _this4.createBalloonContentLayout(iconBalloon, balloonLogo, balloonLink), 45657 balloonPanelMaxMapArea: 0, 45658 // hintLayout : this.createBalloonLayout(objectType), 45659 // hintContentLayout : this.createBalloonContentLayout(iconBalloon), 45660 // Ðе ÑкÑÑваем Ð¸ÐºÐ¾Ð½ÐºÑ Ð¿Ñи оÑкÑÑÑом балÑне. 45661 hideIconOnBalloonOpen: false, 45662 iconLayout: 'default#image', 45663 iconImageHref: element.icon, 45664 iconImageSize: element.size, 45665 iconImageOffset: markerOffset 45666 }); 45667 45668 _this4.map.geoObjects.add(marker); 45669 }); 45670 } 45671 /** 45672 * ÐоказÑваем html маÑкеÑÑ Ð¾Ð±ÑекÑов инÑÑаÑÑÑÑкÑÑÑÑ Ð½Ð° каÑÑе 45673 */ 45674 45675 }, { 45676 key: "initHtmlMarkers", 45677 value: function initHtmlMarkers() { 45678 var _this5 = this; 45679 45680 var htmlMarkers = this.settings.htmlMarkers; 45681 var template = null; 45682 htmlMarkers.forEach(function (element) { 45683 switch (element.layout) { 45684 case 'main': 45685 template = _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0___default.a; 45686 break; 45687 45688 case 'secondary': 45689 template = _templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1___default.a; 45690 break; 45691 45692 case 'text': 45693 template = _templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2___default.a; 45694 break; 45695 45696 default: 45697 template = _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0___default.a; 45698 } 45699 45700 var properties = element; //Ðак-Ñо по дÑÑÐ³Ð¾Ð¼Ñ Ð¿ÐµÑедаваÑаÑÑ Ð½Ð°ÑÑÑойки 45701 45702 var CustomLayoutClass = ymaps.templateLayoutFactory.createClass(template(properties)); 45703 var placemark = new ymaps.Placemark(element.coords, {}, { 45704 iconLayout: CustomLayoutClass 45705 }); 45706 45707 _this5.map.geoObjects.add(placemark); 45708 }); 45709 } 45710 /** 45711 * ÐавеÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð±ÑабоÑÑки ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸Ðº по каÑÑе и геобÑекÑам Ð´Ð»Ñ Ð·Ð°ÐºÑÑÑÐ¸Ñ Ð±Ð°Ð»
45711Ñнов. 45712 */ 45713 45714 }, { 45715 key: "closeBallonOnClickMap", 45716 value: function closeBallonOnClickMap() { 45717 var _this6 = this; 45718 45719 this.map.geoObjects.events.add('click', function () { 45720 _this6.map.balloon.close(); 45721 }); 45722 this.map.events.add('click', function () { 45723 _this6.map.balloon.close(); 45724 }); 45725 } 45726 /** 45727 * @param {string} iconBalloon - ÑÑÑока: знаÑение ÑвойÑÑва iconBalloon обÑекÑа маÑкеÑа 45728 * @returns {Object} - обÑÐµÐºÑ Ð¼Ð°ÐºÐµÑа конÑенÑа балÑна 45729 */ 45730 45731 }, { 45732 key: "createBalloonContentLayout", 45733 value: function createBalloonContentLayout(iconBalloon, balloonLogo, balloonLink) { 45734 var iconHtml = ""; 45735 var logoHtml = ""; 45736 var linkHtml = ""; 45737 45738 if (iconBalloon) { 45739 iconHtml = "<img class=\"b-yandex-map__balloon-icon\" src=\"$[properties.balloonIcon]\" alt=\"icon map\">"; 45740 } 45741 45742 if (balloonLogo) { 45743 logoHtml = "<img class=\"b-yandex-map__balloon-logo\" src=\"$[properties.balloonLogo]\">"; 45744 } 45745 45746 if (balloonLink) { 45747 linkHtml = "<a href=\"".concat(balloonLink, "\" class=\"b-yandex-map__balloon-link\">").concat(_templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3___default()(), " \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435</a>"); 45748 } 45749 45750 var html = "\n <div class=\"b-yandex-map__balloon-img-wrap\">\n ".concat(iconHtml, "\n ").concat(logoHtml, "\n </div>\n <div class=\"b-yandex-map__balloon-title\">$[properties.balloonHeader]</div>\n <div class=\"b-yandex-map__balloon-content\">$[properties.balloonContent]</div>\n ").concat(linkHtml, "\n "); 45751 var balloonContentLayout = ymaps.templateLayoutFactory.createClass(html); 45752 return balloonContentLayout; 45753 } 45754 /** 45755 * 45756 * @param {string} classModify - ÑÑÑока: знаÑение ÑвойÑÑва objectType обÑекÑа маÑкеÑа 45757 * @returns {object} - обÑÐµÐºÑ Ð¼Ð°ÐºÐµÑа баллÑна 45758 */ 45759 45760 }, { 45761 key: "createBalloonLayout", 45762 value: function createBalloonLayout(classModify) { 45763 var balloonClass = "b-yandex-map__balloon"; 45764 var balloomClassModify = classModify ? "".concat(balloonClass, "_theme_").concat(classModify) : ""; 45765 var balloonClose = "b-map-balloon__close"; 45766 var balloonArrow = "b-map-balloon__arrow"; 45767 var balloonContentWrap = "b-map-balloon__content-wrap"; 45768 var classTab = ".b-map-tabs__item"; 45769 45770 var tabItems = _toConsumableArray(this.mapWrapper.querySelectorAll(classTab)); 45771 45772 var customBalloon = document.querySelector('.b-yandex-map__info'); // Создание макеÑа балÑна 45773 45774 var balloonLayout = ymaps.templateLayoutFactory.createClass("<div class=\"".concat(balloonClass, " ").concat(balloomClassModify, "\">\n <div class=\"").concat(balloonClose, "\"></div>\n <div class=\"").concat(balloonArrow, "\"></div>\n <div class=\"").concat(balloonContentWrap, "\">\n $[[options.contentLayout]]\n </div>\n </div>"), { 45775 /** 45776 * СÑÑÐ¾Ð¸Ñ ÑкземплÑÑ Ð¼Ð°ÐºÐµÑа на оÑнове Ñаблона и добавлÑÐµÑ ÐµÐ³Ð¾ в ÑодиÑелÑÑкий HTML-ÑлеменÑ. 45777 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#build 45778 * @function 45779 * @name build 45780 */ 45781 build: function build() { 45782 var _this7 = this; 45783 45784 this.constructor.superclass.build.call(this); 45785 this._$element = $(".".concat(balloonClass), this.getParentElement()); 45786 this.applyElementOffset(); 45787 45788 this._$element.find(".".concat(balloonClose)).on('click', $.proxy(this.onCloseClick, this)); 45789 45790 tabItems.forEach(function (tab) { 45791 tab.addEventListener('click', $.proxy(_this7.onCloseClick, _this7)); 45792 }); 45793 customBalloon.innerHTML = this._$element[0].innerHTML; 45794 this.closeCustomBalloon(); 45795 }, 45796 closeCustomBalloon: function closeCustomBalloon() { 45797 var closeBtn = customBalloon.querySelector('.b-map-balloon__close'); 45798 closeBtn.addEventListener('click', function () { 45799 closeBtn.parentElement.innerHTML = ''; 45800 }); 45801 }, 45802 45803 /** 45804 * УдалÑÐµÑ ÑодеÑжимое макеÑа из DOM. 45805 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#clear 45806 * @function 45807 * @name clear 45808 */ 45809 clear: function clear() { 45810 this._$element.find(".".concat(balloonClose)).off('click'); 45811 45812 this.constructor.superclass.clear.call(this); 45813 }, 45814 45815 /** 45816 * ÐеÑод бÑÐ´ÐµÑ Ð²Ñзван ÑиÑÑемой Ñаблонов ÐÐРпÑи изменении ÑазмеÑов вложенного макеÑа. 45817 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 45818 * @function 45819 * @name onSublayoutSizeChange 45820 */ 45821 onSublayoutSizeChange: function onSublayoutSizeChange() { 45822 balloonLayout.superclass.onSublayoutSizeChange.apply(this, arguments); 45823 45824 if (!this._isElement(this._$element)) { 45825 return; 45826 } 45827 45828 this.applyElementOffset(); 45829 this.events.fire('shapechange'); 45830 }, 45831 45832 /** 45833 * Сдвигаем балÑн, ÑÑÐ¾Ð±Ñ "Ñ Ð²Ð¾ÑÑик" Ñказ
45833Ñвал на ÑоÑÐºÑ Ð¿ÑивÑзки. 45834 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 45835 * @function 45836 * @name applyElementOffset 45837 */ 45838 applyElementOffset: function applyElementOffset() { 45839 this._$element.css({ 45840 /*left: -(this._$element[0].offsetWidth / 2), 45841 top : -(this._$element[0].offsetHeight + 45842 this._$element.find(`.${balloonArrow}`)[0].offsetHeight * 2)*/ 45843 visibility: 'hidden' 45844 }); 45845 }, 45846 45847 /** 45848 * ÐакÑÑÐ²Ð°ÐµÑ Ð±Ð°Ð»Ñн пÑи клике на кÑеÑÑик, ÐºÐ¸Ð´Ð°Ñ ÑобÑÑие "userclose" на макеÑе. 45849 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 45850 * @function 45851 * @param {event} event - ÑобÑÑие 45852 * @name onCloseClick 45853 */ 45854 onCloseClick: function onCloseClick(event) { 45855 event.preventDefault(); 45856 this.events.fire('userclose'); 45857 }, 45858 45859 /** 45860 * ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð°Ð²ÑопозиÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ (balloonAutoPan). 45861 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ILayout.xml#getClientBounds 45862 * @function 45863 * @returns {object} - ÐооÑдинаÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ веÑÑ Ð½ÐµÐ³Ð¾ и пÑавого нижнего Ñглов Ñаблона оÑноÑиÑелÑно 45864 * ÑоÑки пÑивÑзки. 45865 * @name getShape 45866 */ 45867 getShape: function getShape() { 45868 if (!this._isElement(this._$element)) { 45869 return balloonLayout.superclass.getShape.call(this); 45870 } 45871 45872 var position = this._$element.position(); 45873 45874 return new ymaps.shape.Rectangle(new ymaps.geometry.pixel.Rectangle([[position.left, position.top], [position.left + this._$element[0].offsetWidth, position.top + this._$element[0].offsetHeight + this._$element.find(".".concat(balloonArrow))[0].offsetHeight]])); 45875 }, 45876 45877 /** 45878 * ÐÑовеÑÑем налиÑие ÑлеменÑа (в ÐРи ÐпеÑе его еÑе Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ). 45879 * @function 45880 * @private 45881 * @name _isElement 45882 * @param {jQuery} [element] ÐлеменÑ. 45883 * @returns {Boolean} Флаг налиÑиÑ. 45884 */ 45885 _isElement: function _isElement(element) { 45886 return element && element[0] && element.find(".".concat(balloonArrow))[0]; 45887 } 45888 }); 45889 return balloonLayout; 45890 } 45891 /** 45892 * ÐниÑиализиÑÑем ÑÐ°Ð±Ñ 45893 */ 45894 45895 }, { 45896 key: "initTabs", 45897 value: function initTabs() { 45898 var _this8 = this; 45899 45900 var classTab = ".b-yandex-map__tab-item"; 45901 var tabItems = this.mapWrapper.querySelectorAll(classTab); // ÐÑовеÑÑем налиÑие Ñабов 45902 45903 if (!tabItems.length) { 45904 return; 45905 } 45906 45907 var tabsArray = _toConsumableArray(tabItems); 45908 45909 tabsArray.forEach(function (tab) { 45910 tab.addEventListener("click", function (event) { 45911 event.preventDefault(); 45912 45913 _this8.toggleTabs(tab); 45914 45915 _this8.toggleMarkers(tab); 45916 }); 45917 }); 45918 } 45919 /** 45920 * ÐоказÑваем/ÑкÑÑваем маÑкеÑÑ Ð½Ð° каÑÑе 45921 * @param {node} tab - нода Ñаба по коÑоÑÐ¾Ð¼Ñ Ð¿ÑоизоÑол клик 45922 */ 45923 45924 }, { 45925 key: "toggleMarkers", 45926 value: function toggleMarkers(tab) { 45927 var classLink = ".b-yandex-map__tab-link"; 45928 var type = parseInt(tab.querySelector(classLink).dataset.type); 45929 this.map.geoObjects.each(function (geoObject) { 45930 var currentType = parseInt(geoObject.properties.get('type')); 45931 45932 if (currentType) { 45933 if (type === 0) { 45934 geoObject.options.set('visible', true); 45935 } else if (currentType === 0) { 45936 geoObject.options.set('visible', true); 45937 } else if (currentType !== type) { 45938 geoObject.options.set('visible', false); 45939 } else { 45940 geoObject.options.set('visible', true); 45941 } 45942 } 45943 }); 45944 } 45945 /** 45946 * ÐеÑеклÑÑаем ÑÐ°Ð±Ñ 45947 * @param {node} tab - нода Ñаба по коÑоÑÐ¾Ð¼Ñ Ð¿ÑоизоÑол клик 45948 */ 45949 45950 }, { 45951 key: "toggleTabs", 45952 value: function toggleTabs(tab) { 45953 var isActive = "is-active"; 45954 var classLink = ".b-yandex-map__tab-link"; 45955 var classTab = ".b-yandex-map__tab-item"; 45956 var activeType = tab.querySelector(classLink).dataset.type; 45957 45958 var tabItems = _toConsumableArray(this.mapWrapper.querySelectorAll(classTab)); 45959
45960 tabItems.forEach(function (item) { 45961 var itemType = item.querySelector(classLink).dataset.type; 45962 45963 if (itemType === activeType) { 45964 item.classList.add(isActive); 45965 return; 45966 } 45967 45968 item.classList.remove(isActive); 45969 }); 45970 } 45971 /** 45972 * ÐниÑиализаÑÐ¸Ñ ÑадиÑÑов 45973 */ 45974 45975 }, { 45976 key: "initCircles", 45977 value: function initCircles() { 45978 var _this9 = this; 45979 45980 var circles = this.settings.circles; 45981 45982 if (circles) { 45983 circles.forEach(function (circle) { 45984 var myCircle = new ymaps.Circle([circle.center, circle.radius], {}, { 45985 fillColor: circle.fillColor, 45986 fillOpacity: circle.fillOpacity, 45987 strokeColor: circle.strokeColor, 45988 strokeOpacity: circle.strokeOpacity, 45989 strokeWidth: circle.strokeWidth, 45990 strokeStyle: circle.strokeStyle 45991 }); 45992 45993 _this9.map.geoObjects.add(myCircle); 45994 }); 45995 } 45996 } 45997 /** 45998 * ÐÑклÑÑаем пеÑеÑаÑкивание каÑÑÑ Ð¿Ñи пÑокÑÑÑке одним палÑÑем на мобилке 45999 */ 46000 // TODO ÐеÑепиÑаÑÑ Ð¿ÑавилÑно, ÑÑо Ð±Ñ ÑбÑаÑÑ Ð¸Ð³Ð½Ð¾ÑиÑование линÑом 46001 46002 /* eslint-disable */ 46003 46004 }, { 46005 key: "disableMobileDrag", 46006 value: function disableMobileDrag() { 46007 var isMobile = { 46008 Android: function Android() { 46009 return navigator.userAgent.match(/Android/i); 46010 }, 46011 BlackBerry: function BlackBerry() { 46012 return navigator.userAgent.match(/BlackBerry/i); 46013 }, 46014 iOS: function iOS() { 46015 return navigator.userAgent.match(/iPhone|iPad|iPod/i); 46016 }, 46017 Opera: function Opera() { 46018 return navigator.userAgent.match(/Opera Mini/i); 46019 }, 46020 Windows: function Windows() { 46021 return navigator.userAgent.match(/IEMobile/i); 46022 }, 46023 any: function any() { 46024 return isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows(); 46025 } 46026 }; 46027 46028 if (isMobile.any()) { 46029 this.map.behaviors.disable('drag'); 46030 } 46031 } 46032 }]); 46033 46034 return YandexMap; 46035}(); 46036 46037/* harmony default export */ __webpack_exports__["default"] = (YandexMap); 46038/* eslint-enable */ 46039/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js"))) 46040 46041/***/ }), 46042
46043/***/ "./components/yandex-map/load.js": 46044/*!***************************************!*\ 46045 !*** ./components/yandex-map/load.js ***! 46046 \***************************************/ 46047/*! exports provided: default */ 46048/***/ (function(module, __webpack_exports__, __webpack_require__) { 46049 46050"use strict"; 46051__webpack_require__.r(__webpack_exports__); 46052/* harmony default export */ __webpack_exports__["default"] = (function () { 46053 return new Promise(function (resolve, reject) { 46054 var script = document.createElement('script'); 46055 script.src = "https://api-maps.yandex.ru/2.1/?lang=ru_RU"; 46056 script.async = true; 46057 script.defer = true; 46058 script.type = 'text/javascript'; 46059 script.onload = resolve; 46060 46061 script.onerror = function (error) { 46062 reject(error); 46063 }; 46064 46065 document.body.appendChild(script); 46066 }).then(function () { 46067 return new Promise(function (resolve) { 46068 window.ymaps.ready(resolve); 46069 }); 46070 }); 46071}); 46072 46073/***/ })
46073, 46074 46075/***/ "./components/yandex-map/templates/ballons/link.twig": 46076/*!***********************************************************!*\ 46077 !*** ./components/yandex-map/templates/ballons/link.twig ***! 46078 \***********************************************************/ 46079/*! no static exports found */ 46080/***/ (function(module, exports, __webpack_require__) { 46081 46082var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 46083 template = twig({"id":"0bb5892bcde02c3b4637dba981d29665afbe8b138198698c5451333a64258d9b50b2df32cbc33058ba3f81f7220a7b1f1a142dfef3ac6c194b8c32a3b6deebd8","data":[{"type":"raw","value":"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"#D69D3A\"\n d=\"M13.6906399,17.0862931 C15.0822696,12.312546 19.1528131,10.7653756 24,10.1210339 L24,8 C19.6313007,8.51693203 15.7085408,8.98042792 13.2770608,12.7023499 L11.999668,14.6576842 L10.7227407,12.7020459 C8.29260345,8.98024502 4.3698796,8.51676861 0,8 L0,10.120995 C4.84776924,10.7651878 8.91788794,12.3119857 10.3105928,17.0862931 L13.6906399,17.0862931 Z\">\n <animate attributeName=\"d\" dur=\"2500ms\" repeatCount=\"indefinite\" values=\"M13.6906399,17.0862931 C15.0822696,12.312546 19.1528131,10.7653756 24,10.1210339 L24,8 C19.6313007,8.51693203 15.7085408,8.98042792 13.2770608,12.7023499 L11.999668,14.6576842 L10.7227407,12.7020459 C8.29260345,8.98024502 4.3698796,8.51676861 0,8 L0,10.120995 C4.84776924,10.7651878 8.91788794,12.3119857 10.3105928,17.0862931 L13.6906399,17.0862931 Z;\n M13.6906399,18.0862931 C15.0822696,13.312546 18.1528131,11.7653756 23,11.1210339 L24,9.00004954 C19.6313007,9.51693203 15.7085408,9.98042792 13.2770608,13.7023499 L11.999668,15.6576842 L10.7227407,13.7020459 C8.09055882,10.5167686 4.3698796,10.5167686 4.54747351e-13,10 L1,12.120995 C5.84776924,12.7651878 8.91788794,13.3119857 10.3105928,18.0862931 L13.6906399,18.0862931 Z;\n M12.6906399,18.0862931 C14.0822696,13.312546 19.1528131,14.7653756 24,14.1210339 L24,12.0000495 C19.6313007,12.516932 15.7085408,9.98042792 13.2770608,13.7023499 L11.999668,15.6576842 L10.7227407,13.7020459 C8.29260345,9.98024502 4.3698796,12.5167686 4.54747351e-13,12 L0,14.120995 C4.84776924,14.7651878 9.91788794,13.3119857 11.3105928,18.0862931 L12.6906399,18.0862931 Z;\n M12.6906399,18.0862931 C14.0822696,13.312546 18.1528131,12.7653756 23,12.1210339 L23,10.0000495 C18.6313007,10.516932 15.7085408,9.98042792 13.2770608,13.7023499 L11.999668,15.6576842 L10.7227407,13.7020459 C8.29260345,9.98024502 5.3698796,8.51676861 1,8 L1,10.120995 C5.84776924,10.7651878 9.91788794,13.3119857 11.3105928,18.0862931 L12.6906399,18.0862931 Z;\n M13.6906399,17.0862931 C15.0822696,12.312546 19.1528131,10.7653756 24,10.1210339 L24,8 C19.6313007,8.51693203 15.7085408,8.98042792 13.2770608,12.7023499 L11.999668,14.6576842 L10.7227407,12.7020459 C8.29260345,8.98024502 4.3698796,8.51676861 0,8 L0,10.120995 C4.84776924,10.7651878 8.91788794,12.3119857 10.3105928,17.0862931 L13.6906399,17.0862931 Z\"></animate>\n </path>\n</svg>\n"}],"allowInlineIncludes":true,"rethrow":true}); 46084 46085module.exports = function(context) { return template.render(context); } 46086 46087/***/ }), 46088
46089/***/ "./components/yandex-map/templates/controls.twig": 46090/*!*******************************************************!*\ 46091 !*** ./components/yandex-map/templates/controls.twig ***! 46092 \*******************************************************/ 46093/*! no static exports found */ 46094/***/ (function(module, exports, __webpack_require__) { 46095 46096var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 46097 template = twig({"id":"6552024d57740b0e56935e28b295e120908d85dcb36de8526d8701b165c51dba02aed70342ceea08200c2c6d858639e1328819363ec4bc2fdcb403e9481a632e","data":[{"type":"raw","value":"<div class='b-yandex-map__zoom-controls'>\n <button type=\"button\" id=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"id","match":["id"]}]},{"type":"raw","value":"-in\" class=\"b-yandex-map__zoom-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n class=\"b-yandex-map__zoom-icon b-yandex-map__zoom-icon_plus_icon\">\n <path id=\"d3l0a\" d=\"M1772 1247a1 1 0 0 1 2 0v10a1 1 0 0 1-2 0z\"></path>\n <path id=\"d3l0b\" d=\"M1778 1251a1 1 0 0 1 0 2h-10a1 1 0 0 1 0-2z\"></path>\n <g transform=\"translate(-1767 -1246)\">\n <use fill=\"#666\" xlink:href=\"#d3l0a\"></use>\n </g>\n <g transform=\"translate(-1767 -1246)\">\n <use fill=\"#666\" xlink:href=\"#d3l0b\"></use>\n </g>\n </svg>\n </button>\n <button type=\"button\" id=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"id","match":["id"]}]},{"type":"raw","value":"-out\" class=\"b-yandex-map__zoom-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"12\"\n height=\"12\"\n viewB
46097ox=\"0 0 12 2\"\n class=\"b-yandex-map__zoom-icon b-yandex-map__zoom-icon_minus_icon\">\n <path id=\"cihja\" d=\"M1778 1283a1 1 0 0 1 0 2h-10a1 1 0 0 1 0-2z\"></path>\n <g transform=\"translate(-1767 -1283)\">\n <use fill=\"#666\" xlink:href=\"#cihja\"></use>\n </g>\n </svg>\n </button>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true}); 46098 46099module.exports = function(context) { return template.render(context); } 46100 46101/***/ }), 46102 46103/***/ "./components/yandex-map/templates/legend.twig": 46104/*!*****************************************************!*\ 46105 !*** ./components/yandex-map/templates/legend.twig ***! 46106 \*****************************************************/ 46107/*! no static exports found */ 46108/***/ (function(module, exports, __webpack_require__) { 46109 46110var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 46111 template = twig({"id":"c13581a9da7a2169bba6dd0b23a8443fa3d31c53491e80a08ca2d4310e4027e6e37f8bd0d851b3b2102d86b6d6a2a8976d9a63f51c7e3fa3c758a14daaadb31d","data":[{"type":"raw","value":"<ul class=\"b-legend-list\">\n <li>\n <img src=\"/local/templates/larus/images/yandex-map/pin-yellow.png\" class=\"b-legend-list__img\" alt=\"ТекÑÑие пÑоекÑÑ\">\n ТекÑÑие пÑоекÑÑ\n </li>\n <li>\n <img src=\"/local/templates/larus/images/yandex-map/pin-white.png\" class=\"b-legend-list__img\" alt=\"РеализованнÑе пÑоекÑÑ\">\n РеализованнÑе пÑоекÑÑ\n </li>\n</ul>\n"}],"allowInlineIncludes":true,"rethrow":true}); 46112 46113module.exports = function(context) { return template.render(context); } 46114 46115/***/ }), 46116 46117/***/ "./components/yandex-map/templates/markers/main.twig": 46118/*!***********************************************************!*\ 46119 !*** ./components/yandex-map/templates/markers/main.twig ***! 46120 \***********************************************************/ 46121/*! no static exports found */ 46122/***/ (function(module, exports, __webpack_require__) { 46123 46124var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 46125 template = twig({"id":"a33044ec7657bad6bb7bc41742f825672fe35840b13375776bb298816bd433ac6cf3b3ea5f9d84798058cc23ba4e343ecb9a504dfab1933c3658f884e376187d","data":[{"type":"raw","value":"<div class=\"b-yandex-map__html-marker\">\n <div class=\"b-yandex-map__html-marker-title\"> "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":" </div>\n <div class=\"b-yandex-map__html-marker-text\"> "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}]},{"type":"raw","value":" </div>\n <div class=\"b-yandex-map__html-marker-icon\">\n <img src=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"icon","match":["icon"]},{"type":"Twig.expression.type.key.period","key":"src"}]},{"type":"raw","value":"\" alt=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"icon","match":["icon"]},{"type":"Twig.expression.type.key.period","key":"alt"}]},{"type":"raw","value":"\">\n </div>\n</div>"}],"allowInlineIncludes":true,"rethrow":true}); 46126 46127module.exports = function(context) { return template.render(context); } 46128 46129/***/ }), 46130 46131/***/ "./components/yandex-map/templates/markers/secondary.twig": 46132/*!****************************************************************!*\ 46133 !*** ./components/yandex-map/templates/markers/secondary.twig ***! 46134 \****************************************************************/ 46135/*! no static exports found */ 46136/***/ (function(module, exports, __webpack_require__) { 46137 46138var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 46139 template = twig({"id":"f609061db4850bb07859b90304403ed805d17b1b771a9df5cf018696b212512e6d6713a2275ead59c02a6118bfa17b151af68d56833423a11b7844aae00b5c5f","data":[{"type":"raw","value":"<div class=\"b-yandex-map__html-marker-2\"> "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":" </div>"}],"allowInlineIncludes":true,"rethrow":true}); 46140 46141module.exports = function(context) { return template.render(context); } 46142 46143/***/ }), 46144 46145/***/ "./components/yandex-map/templates/markers/text.twig": 46146/*!***********************************************************!*\ 46147 !*** ./components/yandex-map/templates/markers/text.twig ***! 46148 \***********************************************************/ 46149/*! no static exports found */ 46150/***/ (function(module, exports, __webpack_require__) { 46151 46152var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig, 46153 template = twig({"id":"9c13f08ed767416695fb484b7898edc9ef3537de6458353d60fd7ad0ab497eb03a8092ae190f878eec2083811e266771a658b45808423d77a30d12ad8fc548fc","data":[{"type":"raw","value":"<div class=\"b-yandex-map__html-text\">\n "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}]},{"type":"raw","value":"\n</div>"}],"allowInlineIncludes":true,"rethrow":true}); 46154 46155module.exports = function(context) { return template.render(context); } 46156 46157/***/ }), 46158 46159/***/ 1: 46160/*!*************************************************!*\ 46161 !*** multi babel-polyfill ./common/scripts/app ***! 46162 \*************************************************/ 46163/*! no static exports found */ 46164/***/ (function(module, exports, __webpack_require__) { 46165 46166__webpack_require__(/*! babel-polyfill */"../node_modules/babel-polyfill/lib/index.js"); 46167module.exports = __webpack_require__(/*! ./common/scripts/app */"./common/scripts/app.js"); 46168 46169 46170/***/ }), 46171 46172/***/ 2: 46173/*!********************!*\
46174 !*** fs (ignored) ***! 46175 \********************/ 46176/*! no static exports found */ 46177/***/ (function(module, exports) { 46178 46179/* (ignored) */ 46180 46181/***/ }) 46182 46183/******/ }); 46184//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vcmVnZXhwL2VzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmxhdHRlbi1pbnRvLWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZnVuY3Rpb24tdG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2xpYnJhcnkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG
461840xLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1zYXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZXBsYWNlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NhbWUtdmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy1leHQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubWFwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvbWUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jbHozMi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmltdWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2luaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS
461845qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hc2FwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguZGVnLXBlci1yYWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5zaWduYml0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC51bXVsaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3lzdGVtLmdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstbWFwLmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2
46184RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstc2V0LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oYW1tZXJqcy9oYW1tZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL2NvbXBvbmVudHMvY3VzdG9tX21lc3NhZ2VzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL2hvb2tzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL2xvY2FsaXphdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvY29tcG9uZW50cy9tZXNzYWdlX3N0b3JlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL3JlbmRlcmVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL3N0ZXBfZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL2NvbXBvbmVudHMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL2NvbXBvbmVudHMvd3JhcHBlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvaHlwZXJmb3JtLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9wb2x5ZmlsbHMvY2hlY2tWYWxpZGl0eS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3Byb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy9yZXBvcnRWYWxpZGl0eS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3NldEN1c3RvbVZhbGlkaXR5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9wb2x5ZmlsbHMvc3RlcERvd24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy9zdGVwVXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy92YWxpZGF0aW9uTWVzc2FnZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3ZhbGlkaXR5U3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy92YWx1ZUFzRGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3ZhbHVlQXNOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy93aWxsVmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2NhdGNoX3N1Ym1pdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvY29tbWFfc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2RhdGVfdG9fc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9mb3JtYXRfZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2VuZXJhdGVfaWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2dldF9kYXRlX2Zyb21fd2Vlay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2V0X25leHRfdmFsaWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2dldF9yYWRpb2dyb3VwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9nZXRfdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2V0X3dlZWtfb2ZfeWVhci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvaXNfZmllbGQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2lzX3ZhbGlkYXRpb25fY2FuZGlkYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9tYXJrLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9tYXRjaGVzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvcG9seXVuZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvcHJvcGVydHlfaW5zdGFsbGVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9wcm9wZXJ0eV91bmluc3RhbGxlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvcmV0dXJuX2hvb2tfb3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeX
46184BlcmZvcm0vc3JjL3Rvb2xzL3NwcmludGYuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL3N0cmluZ190b19kYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9zdHJpbmdfdG9fbnVtYmVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy90cmlnZ2VyX2V2ZW50LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy90cmltLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy91bmljb2RlX3N0cmluZ19sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL3ZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy92YWxpZGF0b3JzL2JhZF9pbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9tYXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3ZhbGlkYXRvcnMvbWF4bGVuZ3RoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy92YWxpZGF0b3JzL21pbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9taW5sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3ZhbGlkYXRvcnMvcGF0dGVybi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9zdGVwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy92YWxpZGF0b3JzL3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pbnB1dG1hc2svZGlzdC9pbnB1dG1hc2svZGVwZW5kZW5jeUxpYnMvaW5wdXRtYXNrLmRlcGVuZGVuY3lMaWIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pbnB1dG1hc2svZGlzdC9pbnB1dG1hc2svZ2xvYmFsL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2lucHV0bWFzay9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2suZGF0ZS5leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaW5wdXRtYXNrL2Rpc3QvaW5wdXRtYXNrL2lucHV0bWFzay5leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaW5wdXRtYXNrL2Rpc3QvaW5wdXRtYXNrL2lucHV0bWFzay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2lucHV0bWFzay9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2subnVtZXJpYy5leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaW5wdXRtYXNrL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvdHdpZy90d2lnLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vY29tbW9uL3NjcmlwdHMvYXBwLmpzIiwid2VicGFjazovLy8uL2NvbW1vbi9zY3JpcHRzL21lZGlhdG9yLmpzIiwid2VicGFjazovLy8uL2NvbW1vbi9zY3JpcHRzL3V0aWxzLmpzIiwid2VicGFjazovLy8uL2NvbW1vbi9zdHlsZXMvYXBwLnNjc3M/NDNkMiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm1zL3N1Ym1pdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm1zL3RlbGVwaG9uZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm1zL3ZhbGlkYXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3Jtcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2hvdmVyLWVmZmVjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL21vYmlsZS1oZWFkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9tb2JpbGUtaGVhZGVyL21vYmlsZS1oZWFkZXIuc2Nzcz82NTBmIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvbmV3cy9iYXNpY1RlbXBsYXRlLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9uZXdzL2ltYWdlVGVtcGxhdGUudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL25ld3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9wb3B1cC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3BvcHVwL2lubGluZS1wb3B1cC50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvcG9wdXAvbWFwLXBvcHVwLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9wb3B1cC9tZWRpYS9jbG9zZS5zdmcudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3BvcHVwL3BvcHVwLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9wcmVsb2FkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9zbGlkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9zbGlkZXIvbWVkaWEvYXJyb3ctbGVmdC5zdmcudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3NsaWRlci9tZWRpYS9hcnJvdy1yaWdodC5zdmcudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3NsaWRlci9zbGlkZXIudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3RhYnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy90ZWFtL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvdGVhbS9wb3B1cC50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3lhbmRleC1tYXAvbG9hZC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3lhbmRleC1tYXAvdGVtcGxhdGVzL2JhbGxvbnMvbGluay50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC90ZW1wbGF0ZXMvY29udHJvbHMudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3lhbmRleC1tYXAvdGVtcGxhdGVzL2xlZ2VuZC50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC90ZW1wbGF0ZXMvbWFya2Vycy9tYWluLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy95YW5kZXgtbWFwL3RlbXBsYXRlcy9tYXJrZXJzL3NlY29uZGFyeS50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC90ZW1wbGF0ZXMvbWFya2Vycy90ZXh0LnR3aWciLCJ3ZWJwYWNrOi8vL2ZzIChpZ25vcmVkKSJdLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybi
46184BpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvc2hpbVwiKTtcblxucmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vcmVnZXhwL2VzY2FwZVwiKTtcblxuaWYgKGdsb2JhbC5fYmFiZWxQb2x5ZmlsbCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IG9uZSBpbnN0YW5jZSBvZiBiYWJlbC1wb2x5ZmlsbCBpcyBhbGxvd2VkXCIpO1xufVxuZ2xvYmFsLl9iYWJlbFBvbHlmaWxsID0gdHJ1ZTtcblxudmFyIERFRklORV9QUk9QRVJUWSA9IFwiZGVmaW5lUHJvcGVydHlcIjtcbmZ1bmN0aW9uIGRlZmluZShPLCBrZXksIHZhbHVlKSB7XG4gIE9ba2V5XSB8fCBPYmplY3RbREVGSU5FX1BST1BFUlRZXShPLCBrZXksIHtcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH0pO1xufVxuXG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRMZWZ0XCIsIFwiXCIucGFkU3RhcnQpO1xuZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIFwicGFkUmlnaHRcIiwgXCJcIi5wYWRFbmQpO1xuXG5cInBvcCxyZXZlcnNl
46184LHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXMsaW5kZXhPZixldmVyeSxzb21lLGZvckVhY2gsbWFwLGZpbHRlcixmaW5kLGZpbmRJbmRleCxpbmNsdWRlcyxqb2luLHNsaWNlLGNvbmNhdCxwdXNoLHNwbGljZSx1bnNoaWZ0LHNvcnQsbGFzdEluZGV4T2YscmVkdWNlLHJlZHVjZVJpZ2h0LGNvcHlXaXRoaW4sZmlsbFwiLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgW11ba2V5XSAmJiBkZWZpbmUoQXJyYXksIGtleSwgRnVuY3Rpb24uY2FsbC5iaW5kKFtdW2tleV0pKTtcbn0pOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWdFeHAuZXNjYXBlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIG1zZykge1xuICBpZiAodHlwZW9mIGl0ICE9ICdudW1iZXInICYmIGNvZihpdCkgIT0gJ051bWJlcicpIHRocm93IFR5cGVFcnJvcihtc2cpO1xuICByZXR1cm4gK2l0O1xufTtcbiIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuIC8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQgLyogPSAwICovLCBzdGFydCAvKiA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIHRvID0gdG9BYnNvbHV0ZUluZGV4KHRhcmdldCwgbGVuKTtcbiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0byk7XG4gIHZhciBpbmMgPSAxO1xuICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7XG4gICAgaW5jID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59O1xuIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybi
46184BPO1xufTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFMZW4sIG1lbW8sIGlzUmlnaHQpIHtcbiAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMDtcbiAgdmFyIGkgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICBpZiAoYUxlbiA8IDIpIGZvciAoOzspIHtcbiAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCArPSBpO1xuICAgIGlmIChpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gI
46184H1cbiAgZm9yICg7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICB9XG4gIHJldHVybiBtZW1vO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIiwiLy8gOS40LjIuMyBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKVxudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwsIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWwpKShsZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoRiwgbGVuLCBhcmdzKSB7XG4gIGlmICghKGxlbiBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBuW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBmbiA9IGFGdW5jdGlvbih0aGlzKTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uICgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmIChpc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybi
46184BlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2Y
46184XIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChjbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2VhayA9IHJlcXVpcmUoJy4vX21ldGEnKS5nZXRXZWFrO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGNyZWF0ZUFycmF
461845TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbnZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gYXJyYXlGaW5kKHN0b3JlLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IGlkKys7ICAgICAgLy8gY29sbGVjdGlvbiBpZFxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgLy8gbGVhayBzdG9yZSBmb3IgdW5jYXVnaHQgZnJvemVuIG9iamVjdHNcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2Y
46184XIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKSAmJiBkZWxldGUgZGF0YVt0aGlzLl9pXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gZ2V0V2Vhayhhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgZWxzZSBkYXRhW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIHVmc3RvcmU6IHVuY2F1Z2h0RnJvemVuU3RvcmVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkaXRlckRldGVjdCA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSykge1xuICB2YXIgQmFzZSA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIEMgPSBCYXNlO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlO1xuICB2YXIgTyA9IHt9O1xuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciBmbiA9IHByb3RvW0tFWV07XG4gICAgcmVkZWZpbmUocHJvdG8sIEtFWSxcbiAgICAgIEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IHVuZGVmaW5lZCA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQoYSkgeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IHJldHVybiB0aGlzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gc2V0KGEsIGIpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEsIGIpOyByZXR1cm4gdGhpczsgfVxuICAgICk7XG4gIH07XG4gIGlmICh0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IEMoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+ICBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHsgbmV3IEMoaXRlcik7IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2Y
46184XIgJGluc3RhbmNlID0gbmV3IEMoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0YXJnZXQsIGl0ZXJhYmxlKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSgpLCB0YXJnZXQsIEMpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDO1xuICAgIH1cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZiAoSVNfV0VBSyAmJiBwcm90by5jbGVhcikgZGVsZXRlIHByb3RvLmNsZWFyO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKEMgIT0gQmFzZSksIE8pO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTtcbiIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjYuNScgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG4iLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMC4zLjQuMzYgLyAxNS45LjUuNDMgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc
46184oKVxudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBnZXRUaW1lID0gRGF0ZS5wcm90b3R5cGUuZ2V0VGltZTtcbnZhciAkdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcblxudmFyIGx6ID0gZnVuY3Rpb24gKG51bSkge1xuICByZXR1cm4gbnVtID4gOSA/IG51bSA6ICcwJyArIG51bTtcbn07XG5cbi8vIFBoYW50b21KUyAvIG9sZCBXZWJLaXQgaGFzIGEgYnJva2VuIGltcGxlbWVudGF0aW9uc1xubW9kdWxlLmV4cG9ydHMgPSAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJHRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoLTVlMTMgLSAxKSkgIT0gJzAzODUtMDctMjVUMDc6MDY6MzkuOTk5Wic7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAkdG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZShOYU4pKTtcbn0pKSA/IGZ1bmN0aW9uIHRvSVNPU3RyaW5nKCkge1xuICBpZiAoIWlzRmluaXRlKGdldFRpbWUuY2FsbCh0aGlzKSkpIHRocm93IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpO1xuICB2YXIgZCA9IHRoaXM7XG4gIHZhciB5ID0gZC5nZXRVVENGdWxsWWVhcigpO1xuICB2YXIgbSA9IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHZhciBzID0geSA8IDAgPyAnLScgOiB5ID4gOTk5OSA/ICcrJyA6ICcnO1xuICByZXR1cm4gcyArICgnMDAwMDAnICsgTWF0aC5hYnMoeSkpLnNsaWNlKHMgPyAtNiA6IC00KSArXG4gICAgJy0nICsgbHooZC5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKyBseihkLmdldFVUQ0RhdGUoKSkgK1xuICAgICdUJyArIGx6KGQuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBseihkLmdldFVUQ01pbnV0ZXMoKSkgK1xuICAgICc6JyArIGx6KGQuZ2V0VVRDU2Vjb25kcygpKSArICcuJyArIChtID4gOTkgPyBtIDogJzAnICsgbHoobSkpICsgJ1onO1xufSA6ICR0b0lTT1N0cmluZztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgTlVNQkVSID0gJ251bWJlcic7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhpbnQpIHtcbiAgaWYgKGhpbnQgIT09ICdzdHJpbmcnICYmIGhpbnQgIT09IE5VTUJFUiAmJiBoaW50ICE9PSAnZGVmYXVsdCcpIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGhpbnQnKTtcbiAgcmV0dXJuIHRvUHJpbWl0aXZlKGFuT2JqZWN0KHRoaXMpLCBoaW50ICE9IE5VTUJFUik7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSk7XG4gIHZhciBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgP
46184SAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmICh0YXJnZXQpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmIChleHBvcnRzW2tleV0gIT0gb3V0KSBoaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZiAoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpIGV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5leGVjJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5cbnZhciBTUEVDSUVTID0gd2tzKCdzcGVjaWVzJyk7XG5cbnZhciBSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vICNyZXBsYWNlIG5lZWRzIGJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGdyb3Vwcy5cbiAgLy8gI21hdGNoIHdvcmtzIGZpbmUgYmVjYXVzZSBpdCBqdXN0IHJldHVybiB0aGUgZXhlYyByZXN1bHRzLCBldmVuIGlmIGl0IGhhc1xuICAvLyBhIFwiZ3JvcHNcIiBwcm9wZXJ0eS5cbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBDaHJvbWUgNTEgaGFzIGEgYnVnZ3kgXCJzcGxpdFwiIGltcGxlbWVudGF0aW9uIHdoZW4gUmVnRXhwI2V4ZWMgIT09IG5hdGl2ZUV4ZWNcbiAgdmFyIHJlID0gLyg/OikvO1xuICB2YXIgb3JpZ2luYWxFeGVjID0gcmUuZXhlYztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9yaWdpbmFsRXhlYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICB2YXIgcmVzdWx0ID0gJ2FiJy5zcGxpdChyZSk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoID09PSAyICYmIHJlc3VsdFswXSA9PT0gJ2EnICYmIHJlc3VsdFsxXSA9PT0gJ2InO1xufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMpIHtcbiAgdmFyIFNZTUJPTCA9IHdrcyhLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgPyAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN5bWJvbC1uYW1lZCBSZWdFeHAgbWV0aG9kcyBjYWxsIC5leGVjXG4gICAgdmFyIGV4ZWNDYWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgcmUgPSAvYS87XG4gICAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgZXhlY0NhbGxlZCA9IHRydWU7IHJldHVybiBudWxsOyB9O1xuICAgIGlmIChLRVkgPT09ICdzcGxpdCcpIHtcbiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzXG4gICAgICAvLyBhIG5ldyBvbmUuIFdlIG5lZWQgdG8gcmV0dXJuIHRoZSBwYXRjaGVkIHJlZ2V4IHdoZW4gY3JlYXRpbmcgdGhlIG5ldyBvbmUuXG4gICAgICByZS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTtcbiAgICB9XG4gICAgcmVbU1lNQk9MXSgnJyk7XG4gICAgcmV0dXJuICFleGVjQ2FsbGVkO1xuICB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAoXG4gICAgIURFTEVHQVRFU19UT19TWU1CT0wgfHxcbiAgICAhREVMRUdBVEVTX1RPX0VYRUMgfHxcbiAgICAoS0VZID09PSAncmVwbGFjZScgJiYgIVJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTKSB8fFxuICAgIChLRVkgPT09ICdzcGxpdCcgJiYgIVNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQylcbiAgKSB7XG4gICAgdmFyIG5hdGl2ZVJlZ0V4cE1ldGhvZCA9IC8uL1tTWU1CT0xdO1xuICAgIHZhciBmbnMgPSBleGVjKFxuICAgICAgZGVmaW5lZCxcbiAgICAgIFNZTUJPTCxcbiAgICAgICcnW0tFWV0sXG4gICAgICBmdW5jdGlvbiBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWV0aG9kLCByZWdleHAsIHN0ciwgYXJnMiwgZm9yY2VTd
46184HJpbmdNZXRob2QpIHtcbiAgICAgICAgaWYgKHJlZ2V4cC5leGVjID09PSByZWdleHBFeGVjKSB7XG4gICAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmF0aXZlIFN0cmluZyBtZXRob2QgYWxyZWFkeSBkZWxlZ2F0ZXMgdG8gQEBtZXRob2QgKHRoaXNcbiAgICAgICAgICAgIC8vIHBvbHlmaWxsZWQgZnVuY3Rpb24pLCBsZWFzaW5nIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlUmVnRXhwTWV0aG9kLmNhbGwocmVnZXhwLCBzdHIsIGFyZzIpIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVNZXRob2QuY2FsbChzdHIsIHJlZ2V4cCwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICk7XG4gICAgdmFyIHN0cmZuID0gZm5zWzBdO1xuICAgIHZhciByeGZuID0gZm5zWzFdO1xuXG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJmbik7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMsIGFyZyk7IH1cbiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKVxuICAgICAgLy8gMjEuMi41LjkgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF0oc3RyaW5nKVxuICAgICAgOiBmdW5jdGlvbiAoc3RyaW5nKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzKTsgfVxuICAgICk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXlcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSByZXF1aXJlKCcuL193a3MnKSgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG5cbmZ1bmN0aW9uIGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgc291cmNlLCBzb3VyY2VMZW4sIHN0YXJ0LCBkZXB0aCwgbWFwcGVyLCB0aGlzQXJnKSB7XG4gIHZhciB0YXJnZXRJbmRleCA9IHN0YXJ0O1xuICB2YXIgc291cmNlSW5kZXggPSAwO1xuICB2YXIgbWFwRm4gPSBtYXBwZXIgPyBjdHgobWFwcGVyLCB0aGlzQXJnLCAzKSA6IGZhbHNlO1xuICB2YXIgZWxlbWVudCwgc3ByZWFkYWJsZTtcblxuICB3aGlsZSAoc291cmNlSW5kZXggPCBzb3VyY2VMZW4pIHtcbiAgICBpZiAoc291cmNlSW5kZXggaW4gc291cmNlKSB7XG4gICAgICBlbGVtZW50ID0gbWFwRm4gPyBtYXBGbihzb3VyY2Vbc291cmNlSW5kZXhdLCBzb3VyY2VJbmRleCwgb3JpZ2luYWwpIDogc291cmNlW3NvdXJjZUluZGV4XTtcblxuICAgICAgc3ByZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKGlzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgICAgIHNwcmVhZGFibGUgPSBlbGVtZW50W0lTX0NPTkNBVF9TUFJFQURBQkxFXTtcbiAgICAgICAgc3ByZWFkYWJsZSA9IHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcHJlYWRhYmxlICYmIGRlcHRoID4gMCkge1xuICAgICAgICB0YXJnZXRJbmRleCA9IGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgZWxlbWVudCwgdG9MZW5ndGgoZWxlbWVudC5sZW5ndGgpLCB0YXJnZXRJbmRleCwgZGVwdGggLSAxKSAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gMHgxZmZmZmZmZmZmZmZmZikgdGhyb3cgVHlwZUVycm9yKCk7XG4gICAgICAgIHRhcmdldFt0YXJnZXRJbmRleF0gPSBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0YXJnZXRJbmRleCsrO1xuICAgIH1cbiAgICBzb3VyY2VJbmRleCsrO1xuICB9XG4gIHJldHVybiB0YXJnZXRJbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuSW50b0FycmF5O1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9
46184iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIHRhcmdldCwgQykge1xuICB2YXIgUyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgdmFyIFA7XG4gIGlmIChTICE9PSBDICYmIHR5cGVvZiBTID09ICdmdW5jdGlvbicgJiYgKFAgPSBTLnByb3RvdHlwZSkgIT09IEMucHJvdG90eXBlICYmIGlzT2JqZWN0KFApICYmIHNldFByb3RvdHlwZU9mKSB7XG4gICAgc2V0UHJvdG90eXBlT2YodGhhdCwgUCk7XG4gIH0gcmV0dXJuIHRoYXQ7XG59O1xuIiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgYXJncywgdGhhdCkge1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJncyk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEFycmF
461845UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwiLy8gNy4yLjggSXNSZWdFeHAoYXJndW1lbnQpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVH
46184ID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG0xID0gTWF0aC5leHBtMTtcbm1vZHVsZS5leHBvcnRzID0gKCEkZXhwbTFcbiAgLy8gT2xkIEZGIGJ1Z1xuICB8fCAkZXhwbTEoMTApID4gMjIwMjUuNDY1Nzk0ODA2NzE5IHx8ICRleHBtMSgxMCkgPCAyMjAyNS40NjU3OTQ4MDY3MTY1MTY4XG4gIC8vIFRvciBCcm93c2VyIGJ1Z1xuICB8fCAkZXhwbTEoLTJlLTE3KSAhPSAtMmUtMTdcbikgPyBmdW5jdGlvbiBleHBtMSh4KSB7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBNYXRoLmV4cCh4KSAtIDE7XG59IDogJGV4cG0xO1xuIiwiLy8gMjAuMi4yLjE2IE1hdGguZnJvdW5kKHgpXG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIEVQU0lMT04gPSBwb3coMiwgLTUyKTtcbnZhciBFUFNJTE9OMzIgPSBwb3coMiwgLTIzKTtcbnZhciBNQVgzMiA9IHBvdygyLCAxMjcpICogKDIgLSBFUFNJTE9OMzIpO1xudmFyIE1JTjMyID0gcG93KDIsIC0xMjYpO1xuXG52YXIgcm91bmRUaWVzVG9FdmVuID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIG4gKyAxIC8gRVBTSUxPTiAtIDEgLyBFUFNJTE9OO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmZyb3VuZCB8fCBmdW5jdGlvbiBmcm91bmQoeCkge1xuICB2YXIgJGFicyA9IE1hdGguYWJzKHgpO1xuICB2YXIgJHNpZ24gPSBzaWduKHgpO1xuICB2YXIgYSwgcmVzdWx0O1xuICBpZiAoJGFicyA8IE1JTjMyKSByZXR1cm4gJHNpZ24gKiByb3VuZFRpZXNUb0V2ZW4oJGFicyAvIE1JTjMyIC8gRVBTSUxPTjMyKSAqIE1JTjMyICogRVBTSUxPTjMyO1xuICBhID0gKDEgKyBFUFNJTE9OMzIgLyBFUFNJTE9OKSAqICRhYnM7XG4gIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIGlmIChyZXN1bHQgPiBNQVgzMiB8fCByZXN1bHQgIT0gcmVzdWx0KSByZXR1cm4gJHNpZ24gKiBJbmZpbml0eTtcbiAgcmV0dXJuICRzaWduICogcmVzdWx0O1xufTtcbiIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCkge1xuICByZXR1cm4gKHggPSAreCkgPiAtMWUtOCAmJiB4IDwgMWUtOCA/IHggLSB4ICoge
46184CAvIDIgOiBNYXRoLmxvZygxICsgeCk7XG59O1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNjYWxlIHx8IGZ1bmN0aW9uIHNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkge1xuICBpZiAoXG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgeCAhPSB4XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICB8fCBpbkxvdyAhPSBpbkxvd1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgaW5IaWdoICE9IGluSGlnaFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgb3V0TG93ICE9IG91dExvd1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgb3V0SGlnaCAhPSBvdXRIaWdoXG4gICkgcmV0dXJuIE5hTjtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkgcmV0dXJuIHg7XG4gIHJldHVybiAoeCAtIGluTG93KSAqIChvdXRIaWdoIC0gb3V0TG93KSAvIChpbkhpZ2ggLSBpbkxvdykgKyBvdXRMb3c7XG59O1xuIiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24gc2lnbih4KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxO1xufTtcbiIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsInZhciBNYXAgPSByZXF1aXJlKCcuL2VzNi5tYXAnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ21ldGFkYXRhJyk7XG52YXIgc3RvcmUgPSBzaGFyZWQuc3RvcmUgfHwgKHNoYXJlZC5zdG9yZSA9IG5ldyAocmVxdWlyZSgnLi9lczYud2Vhay1tYXAnKSkoKSk7XG5cbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBjcmVhdGUpIHtcbiAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7XG4gIGlmICghdGFyZ2V0TWV0YWRhdGEpIHtcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdG9yZS5zZXQodGFyZ2V0LCB0YXJnZXRNZXRhZGF0YSA9IG5ldyBNYXAoKSk7XG4gIH1cbiAgdmFyIGtleU1ldGFkYXRhID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KHRhcmdldEtleSk7XG4gIGlmICgha2V5TWV0YWRhdGEpIHtcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXAoKSk7XG4gIH0gcmV0dXJuIGtleU1ldGFkYXRhO1xufTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpO1xuICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogbWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgdHJ1ZSkuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbn07XG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHRhcmdldEtleSwgZmFsc2UpO1xuICB2YXIga2V5cyA9IFtdO1xuICBpZiAobWV0YWRhdGFNYXApIG1ldGFkYXRhTWFwLmZvckVhY2goZnVuY3Rpb24gKF8sIGtleSkgeyBrZXlzLnB1c2goa2V5KTsgfSk7XG4gIHJldHVybi
46184BrZXlzO1xufTtcbnZhciB0b01ldGFLZXkgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcbnZhciBleHAgPSBmdW5jdGlvbiAoTykge1xuICAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCBPKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdG9yZTogc3RvcmUsXG4gIG1hcDogZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCxcbiAgaGFzOiBvcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICBnZXQ6IG9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gIHNldDogb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAga2V5czogb3JkaW5hcnlPd25NZXRhZGF0YUtleXMsXG4gIGtleTogdG9NZXRhS2V5LFxuICBleHA6IGV4cFxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjt
46184cbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybi
46184BUO1xufSA6ICRhc3NpZ247XG4iLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRm9yY2VkIHJlcGxhY2VtZW50IHByb3RvdHlwZSBhY2Nlc3NvcnMgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19saWJyYXJ5JykgfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgSyA9IE1hdGgucmFuZG9tKCk7XG4gIC8vIEluIEZGIHRocm93cyBvbmx5IGRlZmluZSBtZXRob2RzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiwgbm8tdXNlbGVzcy1jYWxsXG4gIF9fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLCBLLCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICBkZWxldGUgcmVxdWlyZSgnLi9fZ2xvYmFsJylbS107XG59KTtcbiIsInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgP
46184SByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcbiIsInZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgaXNFbnVtID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpc0VudHJpZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IGdldEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG4iLCIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJi
46184BSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdPUE4uZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsInZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlRmxvYXQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG5cbm1vZHVsZS5leHBvcnRzID0gMSAvICRwYXJzZUZsb2F0KHJlcXVpcmUoJy4vX3N0cmluZy13cycpICsgJy0wJykgIT09IC1JbmZpbml0eSA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyKSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHZhciByZXN1bHQgPSAkcGFyc2VGbG9hdChzdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG4iLCJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd3MgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBoZXggPSAvXlstK10/MFt4WF0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICRwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3cyArICcweDE2JykgIT09IDIyID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgJHRvU3RyaW5nID0gcmVxdWlyZSgnLi9fZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciBUUEwgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWwsIHNhZmUpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmIChPW2tleV0gPT09IHZhbCkgcmV0dXJuO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSBpZiAoIXNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9IGVsc2UgaWYgKE9ba2V5XSkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBidWlsdGluRXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcblxuIC8vIGBSZWdFeHBFeGVjYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cGV4ZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHtcbiAgdmFyIGV4ZWMgPSBSLmV4ZWM7XG4gIGlmICh0eXBlb2YgZXhlYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWdFeHAgZXhlYyBtZXRob2QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gT2JqZWN0IG9yIG51bGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoY2xhc3NvZihSKSAhPT0gJ1JlZ0V4cCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWx0aW5FeGVjLmNhbGwoUiwgUyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVnZXhwRmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xuXG52YXIgbmF0aXZlRXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbi8vIFRoaXMgYWx3YXlzIHJlZmVycyB0byB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlIHRoZVxuLy8gU3RyaW5nI3JlcGxhY2UgcG9seWZpbGwgdXNlcyAuL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMsXG4vLyB3aGljaCBsb2FkcyB0aGlzIGZpbGUgYmVmb3JlIHBhdGNoaW5nIHRoZSBtZXRob2QuXG52YXIgbmF0aXZlUmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcblxudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcblxudmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcblxudmFyIFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciByZTEgPSAvYS8sXG4gICAgICByZTIgPSAvYiovZztcbiAgbmF0aXZlRXhlYy5jYWxsKHJlMSwgJ2EnKTtcbiAgbmF0aXZlRXhlYy5jYWxsKHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMVtMQVNUX0lOREVYXSAhPT0gMCB8fCByZTJbTEFTVF9JTkRFWF0gIT09IDA7XG59KSgpO1xuXG4vLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cCwgY29waWVkIGZyb20gZXM1LXNoaW0ncyBTdHJpbmcjc3BsaXQgcGF0Y2guXG52YXIgTlBDR19JTkNMVURFRCA9IC8oKT8/Ly5leGVjKCcnKVsxXSAhPT0gdW5kZWZpbmVkO1xuXG52YXIgUEFUQ0ggPSBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgfHwgTlBDR19JTkNMVURFRDtcblxuaWYgKFBBVENIKSB7XG4gIHBhdGNoZWRFeGVjID0gZnVuY3Rpb24gZXhlYyhzdHIpIHtcbiAgICB2YXIgcmUgPSB0aGlzO1xuICAgIHZhciBsYXN0SW5kZXgsIHJlQ29weSwgbWF0Y2gsIGk7XG5cbiAgICBpZiAoTlBDR19JTkNMVURFRCkge1xuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyByZS5zb3VyY2UgKyAnJCg/IVxcXFxzKScsIHJlZ2V4cEZsYWdzLmNhbGwocmUpKTtcbiAgICB9XG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORykgbGFzdEluZGV4ID0gcmVbTEFTVF9JTkRFWF07XG5cbiAgICBtYXRjaCA9IG5hdGl2ZUV4ZWMuY2FsbChyZSwgc3RyKTtcblxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlW0xBU1RfSU5ERVhdID0gcmUuZ2xvYmFsID8gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggOiBsYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAvLyBmb3IgTlBDRywgbGlrZSBJRTguIE5PVEU6IFRoaXMgZG9lc24nIHdvcmsgZm9yIC8oLj8pPy9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtY
46184XRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoZWRFeGVjO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVnRXhwLCByZXBsYWNlKSB7XG4gIHZhciByZXBsYWNlciA9IHJlcGxhY2UgPT09IE9iamVjdChyZXBsYWNlKSA/IGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgcmV0dXJuIHJlcGxhY2VbcGFydF07XG4gIH0gOiByZXBsYWNlO1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIFN0cmluZyhpdCkucmVwbGFjZShyZWdFeHAsIHJlcGxhY2VyKTtcbiAgfTtcbn07XG4iLCIvLyA3LjIuOSBTYW1lVmFsdWUoeCwgeSlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmlzIHx8IGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IGZyb206IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1hcHBpbmcsIEEsIG4sIGNiO1xuICAgIGFGdW5jdGlvbih0aGlzKTtcbiAgICBtYXBwaW5nID0gbWFwRm4gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAobWFwcGluZykgYUZ1bmN0aW9uKG1hcEZuKTtcbiAgICBpZiAoc291cmNlID09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyB0aGlzKCk7XG4gICAgQSA9IFtdO1xuICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICBuID0gMDtcbiAgICAgIGNiID0gY3R4KG1hcEZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7XG4gICAgICAgIEEucHVzaChjYihuZXh0SXRlbSwgbisrKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgQS5wdXNoLCBBKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgP
46184SByZXF1aXJlKCcuL19jdHgnKShGdW5jdGlvbi5jYWxsLCByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xuICB9KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIHNlYXJjaFN0cmluZywgTkFNRSkge1xuICBpZiAoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSkgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmcjJyArIE5BTUUgKyBcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7XG4gIHJldHVybi
46184BTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG59O1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBxdW90ID0gL1wiL2c7XG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbnZhciBjcmVhdGVIVE1MID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUsIGV4ZWMpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tOQU1FXSA9IGV4ZWMoY3JlYXRlSFRNTCk7XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcsIGxlZnQpIHtcbiAgdmFyIFMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gIHZhciBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aDtcbiAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZyk7XG4gIHZhciBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICBpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCB8fCBmaWxsU3RyID09ICcnKSByZXR1cm4gUztcbiAgdmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG4gIHZhciBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBNYXRoLmNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICByZXR1cm4gbGVmdCA/IHN0cmluZ0ZpbGxlciArIFMgOiBTICsgc3RyaW5nRmlsbGVyO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKTtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB0aHJvdyBSYW5nZUVycm9yKFwiQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmVcIik7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBx
46184dWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW5kZXhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgdmFyIG51bWJlciA9IHRvSW50ZWdlcihpdCk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChudW1iZXIpO1xuICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCEnKTtcbiAgcmV0dXJuIGxlbmd0aDtcbn07XG4iLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybi
46184BJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykpIHtcbiAgdmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG4gIHZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbiAgdmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbiAgdmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiAgdmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG4gIHZhciAkYnVmZmVyID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJyk7XG4gIHZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbiAgdmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xuICB2YXIgcHJvcGVydHlEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuICB2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbiAgdmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG4gIHZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG4gIHZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuICB2YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG4gIHZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xuICB2YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbiAgdmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xuICB2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbiAgdmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4gIHZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xuICB2YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG4gIHZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG4gIHZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbiAgdmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG4gIHZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuICB2YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG4gIHZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbiAgdmFyIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xuICB2YXIgY3JlYXRlQXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJyk7XG4gIHZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG4gIHZhciBBcnJheUl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG4gIHZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbiAgdmFyICRpdGVyRGV0ZWN0ID0gcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKTtcbiAgdmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuL19zZXQtc3BlY2llcycpO1xuICB2YXIgYXJyYXlGaWxsID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpO1xuICB2YXIgYXJyYXlDb3B5V2l0aGluID0gcmVxdWlyZSgnLi9fYXJyYXktY29weS13aXRoaW4nKTtcbiAgdmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuICB2YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xuICB2YXIgZFAgPSAkRFAuZjtcbiAgdmFyIGdPUEQgPSAkR09QRC5mO1xuICB2YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuICB2YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbiAgdmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcbiAgdmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG4gIHZhciBTSEFSRURfQlVGRkVSID0gJ1NoYXJlZCcgKyBBUlJBWV9CVUZGRVI7XG4gIHZhciBCWVRFU19QRVJfRUxFTUVOVCA9ICdCWVRFU19QRVJfRUxFTUVOVCc7XG4gIHZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbiAgdmFyIEFycmF
461845UHJvdG8gPSBBcnJheVtQUk9UT1RZUEVdO1xuICB2YXIgJEFycmF5QnVmZmVyID0gJGJ1ZmZlci5BcnJheUJ1ZmZlcjtcbiAgdmFyICREYXRhVmlldyA9ICRidWZmZXIuRGF0YVZpZXc7XG4gIHZhciBhcnJheUZvckVhY2ggPSBjcmVhdGVBcnJheU1ldGhvZCgwKTtcbiAgdmFyIGFycmF5RmlsdGVyID0gY3JlYXRlQXJyYXlNZXRob2QoMik7XG4gIHZhciBhcnJheVNvbWUgPSBjcmVhdGVBcnJheU1ldGhvZCgzKTtcbiAgdmFyIGFycmF5RXZlcnkgPSBjcmVhdGVBcnJheU1ldGhvZCg0KTtcbiAgdmFyIGFycmF5RmluZCA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpO1xuICB2YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbiAgdmFyIGFycmF5SW5jbHVkZXMgPSBjcmVhdGVBcnJheUluY2x1ZGVzKHRydWUpO1xuICB2YXIgYXJyYXlJbmRleE9mID0gY3JlYXRlQXJyYXlJbmNsdWRlcyhmYWxzZSk7XG4gIHZhciBhcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JzLnZhbHVlcztcbiAgdmFyIGFycmF5S2V5cyA9IEFycmF5SXRlcmF0b3JzLmtleXM7XG4gIHZhciBhcnJheUVudHJpZXMgPSBBcnJheUl0ZXJhdG9ycy5lbnRyaWVzO1xuICB2YXIgYXJyYXlMYXN0SW5kZXhPZiA9IEFycmF5UHJvdG8ubGFzdEluZGV4T2Y7XG4gIHZhciBhcnJheVJlZHVjZSA9IEFycmF5UHJvdG8ucmVkdWNlO1xuICB2YXIgYXJyYXlSZWR1Y2VSaWdodCA9IEFycmF5UHJvdG8ucmVkdWNlUmlnaHQ7XG4gIHZhciBhcnJheUpvaW4gPSBBcnJheVByb3RvLmpvaW47XG4gIHZhciBhcnJheVNvcnQgPSBBcnJheVByb3RvLnNvcnQ7XG4gIHZhciBhcnJheVNsaWNlID0gQXJyYXlQcm90by5zbGljZTtcbiAgdmFyIGFycmF5VG9TdHJpbmcgPSBBcnJheVByb3RvLnRvU3RyaW5nO1xuICB2YXIgYXJyYXlUb0xvY2FsZVN0cmluZyA9IEFycmF5UHJvdG8udG9Mb2NhbGVTdHJpbmc7XG4gIHZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbiAgdmFyIFRBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbiAgdmFyIFRZUEVEX0NPTlNUUlVDVE9SID0gdWlkKCd0eXBlZF9jb25zdHJ1Y3RvcicpO1xuICB2YXIgREVGX0NPTlNUUlVDVE9SID0gdWlkKCdkZWZfY29uc3RydWN0b3InKTtcbiAgdmFyIEFMTF9DT05TVFJVQ1RPUlMgPSAkdHlwZWQuQ09OU1RSO1xuICB2YXIgVFlQRURfQVJSQVkgPSAkdHlwZWQuVFlQRUQ7XG4gIHZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG4gIHZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoISc7XG5cbiAgdmFyICRtYXAgPSBjcmVhdGVBcnJheU1ldGhvZCgxLCBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFsbG9jYXRlKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsZW5ndGgpO1xuICB9KTtcblxuICB2YXIgTElUVExFX0VORElBTiA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQxNkFycmF
461845KFsxXSkuYnVmZmVyKVswXSA9PT0gMTtcbiAgfSk7XG5cbiAgdmFyIEZPUkNFRF9TRVQgPSAhIVVpbnQ4QXJyYXkgJiYgISFVaW50OEFycmF5W1BST1RPVFlQRV0uc2V0ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgVWludDhBcnJheSgxKS5zZXQoe30pO1xuICB9KTtcblxuICB2YXIgdG9PZmZzZXQgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihpdCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9O1xuXG4gIHZhciB2YWxpZGF0ZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIGlmIChpc09iamVjdChpdCkgJiYgVFlQRURfQVJSQVkgaW4gaXQpIHJldHVybiBpdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IScpO1xuICB9O1xuXG4gIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIChDLCBsZW5ndGgpIHtcbiAgICBpZiAoIShpc09iamVjdChDKSAmJiBUWVBFRF9DT05TVFJVQ1RPUiBpbiBDKSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciEnKTtcbiAgICB9IHJldHVybiBuZXcgQyhsZW5ndGgpO1xuICB9O1xuXG4gIHZhciBzcGVjaWVzRnJvbUxpc3QgPSBmdW5jdGlvbiAoTywgbGlzdCkge1xuICAgIHJldHVybiBmcm9tTGlzdChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGlzdCk7XG4gIH07XG5cbiAgdmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUoQywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChpdCwga2V5LCBpbnRlcm5hbCkge1xuICAgIGRQKGl0LCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kW2ludGVybmFsXTsgfSB9KTtcbiAgfTtcblxuICB2YXIgJGZyb20gPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChzb3VyY2UpO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgaSwgbGVuZ3RoLCB2YWx1ZXMsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIWlzQXJyYXlJdGVyKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgdmFsdWVzID0gW10sIGkgPSAwOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGkrKykge1xuICAgICAgICB2YWx1ZXMucHVzaChzdGVwLnZhbHVlKTtcbiAgICAgIH0gTyA9IHZhbHVlcztcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcgJiYgYUxlbiA+IDIpIG1hcGZuID0gY3R4KG1hcGZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKSwgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciAkb2YgPSBmdW5jdGlvbiBvZigvKiAuLi5pdGVtcyAqLykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gaU9TIFNhZmFyaSA2LnggZmFpbHMgaGVyZVxuICB2YXIgVE9fTE9DQUxFX0JVRyA9ICEhVWludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9Mb2NhbGVTdHJpbmcuY2FsbChuZXcgVWludDhBcnJheSgxKSk7IH0pO1xuXG4gIHZhciAkdG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgICByZXR1cm4gYXJyYXlUb0xvY2FsZVN0cmluZy5hcHBseShUT19MT0NBTEVfQlVHID8gYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpKSA6IHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHZhciBwcm90byA9IHtcbiAgICBjb3B5V2l0aGluOiBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgc3RhcnQgLyogLCBlbmQgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUNvcHlXaXRoaW4uY2FsbCh2YWxpZGF0ZSh0aGlzKSwgdGFyZ2V0LCBzdGFydCwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlFdmVyeSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmlsbDogZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiAsIHN0YXJ0LCBlbmQgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5RmlsbC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5RmlsdGVyKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLFxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpO1xuICAgIH0sXG4gICAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kKHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybi
46184BhcnJheUZpbmRJbmRleCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICBhcnJheUZvckVhY2godmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZih2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUluY2x1ZGVzKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlKb2luLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5TGFzdEluZGV4T2YuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiAkbWFwKHZhbGlkYXRlKHRoaXMpLCBtYXBmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2VSaWdodC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgbGVuZ3RoID0gdmFsaWRhdGUodGhhdCkubGVuZ3RoO1xuICAgICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuZ3RoIC8gMik7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgbWlkZGxlKSB7XG4gICAgICAgIHZhbHVlID0gdGhhdFtpbmRleF07XG4gICAgICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTtcbiAgICAgICAgdGhhdFtsZW5ndGhdID0gdmFsdWU7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH0sXG4gICAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5U29tZSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICAgIHJldHVybiBhcnJheVNvcnQuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgY29tcGFyZWZuKTtcbiAgICB9LFxuICAgIHN1YmFycmF5OiBmdW5jdGlvbiBzdWJhcnJheShiZWdpbiwgZW5kKSB7XG4gICAgICB2YXIgTyA9IHZhbGlkYXRlKHRoaXMpO1xuICAgICAgdmFyIGxlbmd0aCA9IE8ubGVuZ3RoO1xuICAgICAgdmFyICRiZWdpbiA9IHRvQWJzb2x1dGVJbmRleChiZWdpbiwgbGVuZ3RoKTtcbiAgICAgIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pKShcbiAgICAgICAgTy5idWZmZXIsXG4gICAgICAgIE8uYnl0ZU9mZnNldCArICRiZWdpbiAqIE8uQllURVNfUEVSX0VMRU1FTlQsXG4gICAgICAgIHRvTGVuZ3RoKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCkpIC0gJGJlZ2luKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyICRzbGljZSA9IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgc3RhcnQsIGVuZCkpO1xuICB9O1xuXG4gIHZhciAkc2V0ID0gZnVuY3Rpb24gc2V0KGFycmF5TGlrZSAvKiAsIG9mZnNldCAqLykge1xuICAgIHZhbGlkYXRlKHRoaXMpO1xuICAgIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHNbMV0sIDEpO1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICB2YXIgc3JjID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgoc3JjLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBpZiAobGVuICsgb2Zmc2V0ID4gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgd2hpbGUgKGluZGV4IDwgbGVuKSB0aGlzW29mZnNldCArIGluZGV4XSA9IHNyY1tpbmRleCsrXTtcbiAgfTtcblxuICB2YXIgJGl0ZXJhdG9ycyA9IHtcbiAgICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGFycmF5RW50cmllcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlLZXlzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlWYWx1ZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc1RBSW5kZXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodGFyZ2V0KVxuICAgICAgJiYgdGFyZ2V0W1RZUEVEX0FSUkFZXVxuICAgICAgJiYgdHlwZW9mIGtleSAhPSAnc3ltYm9sJ1xuICAgICAgJiYga2V5IGluIHRhcmdldFxuICAgICAgJiYgU3RyaW5nKCtrZXkpID09IFN0cmluZyhrZXkpO1xuICB9O1xuICB2YXIgJGdldERlc2MgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIHtcbiAgICByZXR1cm4gaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgID8gcHJvcGVydHlEZXNjKDIsIHRhcmdldFtrZXldKVxuICAgICAgOiBnT1BEKHRhcmdldCwga2V5KTtcbiAgfTtcbiAgdmFyICRzZXREZXNjID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICBpZiAoaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgICYmIGlzT2JqZWN0KGRlc2MpXG4gICAgICAmJiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICAgICYmICFoYXMoZGVzYywgJ2dldCcpXG4gICAgICAmJiAhaGFzKGRlc2MsICdzZXQnKVxuICAgICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnNcbiAgICAgICYmICFkZXNjLmNvbmZpZ3VyYWJsZVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ3dyaXRhYmxlJykgfHwgZGVzYy53cml0YWJsZSlcbiAgICAgICYmICghaGFzKGRlc2MsICdlbnVtZXJhYmxlJykgfHwgZGVzYy5lbnVtZXJhYmxlKVxuICAgICkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBkZXNjLnZhbHVlO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IHJldHVybiBkUCh0YXJnZXQsIGtleSwgZGVzYyk7XG4gIH07XG5cbiAgaWYgKCFBTExfQ09OU1RSVUNUT1JTKSB7XG4gICAgJEdPUEQuZiA9ICRnZXREZXNjO1xuICAgICREUC5mID0gJHNldERlc2M7XG4gIH1cblxuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFBTExfQ09OU1RSVUNUT1JTLCAnT2JqZWN0Jywge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldERlc2MsXG4gICAgZGVmaW5lUHJvcGVydHk6ICRzZXREZXNjXG4gIH0pO1xuXG4gIGlmIChmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9TdHJpbmcuY2FsbCh7fSk7IH0pKSB7XG4gICAgYXJyYXlUb1N0cmluZyA9IGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybi
46184BhcnJheUpvaW4uY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyICRUeXBlZEFycmF5UHJvdG90eXBlJCA9IHJlZGVmaW5lQWxsKHt9LCBwcm90byk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJGl0ZXJhdG9ycyk7XG4gIGhpZGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBJVEVSQVRPUiwgJGl0ZXJhdG9ycy52YWx1ZXMpO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIHtcbiAgICBzbGljZTogJHNsaWNlLFxuICAgIHNldDogJHNldCxcbiAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeyAvKiBub29wICovIH0sXG4gICAgdG9TdHJpbmc6IGFycmF5VG9TdHJpbmcsXG4gICAgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZ1xuICB9KTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J1ZmZlcicsICdiJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlT2Zmc2V0JywgJ28nKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVMZW5ndGgnLCAnbCcpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnbGVuZ3RoJywgJ2UnKTtcbiAgZFAoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBUQUcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbVFlQRURfQVJSQVldOyB9XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIEJZVEVTLCB3cmFwcGVyLCBDTEFNUEVEKSB7XG4gICAgQ0xBTVBFRCA9ICEhQ0xBTVBFRDtcbiAgICB2YXIgTkFNRSA9IEtFWSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBLRVk7XG4gICAgdmFyIFNFVFRFUiA9ICdzZXQnICsgS0VZO1xuICAgIHZhciBUeXBlZEFycmF5ID0gZ2xvYmFsW05BTUVdO1xuICAgIHZhciBCYXNlID0gVHlwZWRBcnJheSB8fCB7fTtcbiAgICB2YXIgVEFDID0gVHlwZWRBcnJheSAmJiBnZXRQcm90b3R5cGVPZihUeXBlZEFycmF5KTtcbiAgICB2YXIgRk9SQ0VEID0gIVR5cGVkQXJyYXkgfHwgISR0eXBlZC5BQlY7XG4gICAgdmFyIE8gPSB7fTtcbiAgICB2YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkgJiYgVHlwZWRBcnJheVtQUk9UT1RZUEVdO1xuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIHJldHVybiBkYXRhLnZbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICB2Y
46184XIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICBpZiAoQ0xBTVBFRCkgdmFsdWUgPSAodmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKSkgPCAwID8gMCA6IHZhbHVlID4gMHhmZiA/IDB4ZmYgOiB2YWx1ZSAmIDB4ZmY7XG4gICAgICBkYXRhLnZbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCB2YWx1ZSwgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgYWRkRWxlbWVudCA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgZFAodGhhdCwgaW5kZXgsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldHRlcih0aGlzLCBpbmRleCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHNldHRlcih0aGlzLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIHtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSwgJ19kJyk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgYnVmZmVyLCBieXRlTGVuZ3RoLCBsZW5ndGgsIGtsYXNzO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3ICRBcnJheUJ1ZmZlcihieXRlTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgYnVmZmVyID0gZGF0YTtcbiAgICAgICAgICBvZmZzZXQgPSB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyk7XG4gICAgICAgICAgdmFyICRsZW4gPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgaWYgKCRsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKCRsZW4gJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9ICRsZW4gLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIG9mZnNldCA+ICRsZW4pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTO1xuICAgICAgICB9IGVsc2UgaWYgKFRZUEVEX0FSUkFZIGluIGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSh0aGF0LCAnX2QnLCB7XG4gICAgICAgICAgYjogYnVmZmVyLFxuICAgICAgICAgIG86IG9mZnNldCxcbiAgICAgICAgICBsOiBieXRlTGVuZ3RoLFxuICAgICAgICAgIGU6IGxlbmd0aCxcbiAgICAgICAgICB2OiBuZXcgJERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IGNyZWF0ZSgkVHlwZWRBcnJheVByb3RvdHlwZSQpO1xuICAgICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBUeXBlZEFycmF5KDEpO1xuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSkgfHwgISRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkobnVsbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheSgxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoaXRlcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSwgdHJ1ZSkpIHtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSk7XG4gICAgICAgIHZhciBrbGFzcztcbiAgICAgICAgLy8gYHdzYCBtb2R1bGUgYnVnLCB0ZW1wb3JhcmlseSByZW1vdmUgdmFsaWRhdGlvbiBsZW5ndGggZm9yIFVpbnQ4QXJyYXlcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvcHVsbC82NDVcbiAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkgcmV0dXJuIG5ldyBCYXNlKHRvSW5kZXgoZGF0YSkpO1xuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUikge1xuICAgICAgICAgIHJldHVybiAkbGVuZ3RoICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpLCAkbGVuZ3RoKVxuICAgICAgICAgICAgOiAkb2Zmc2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbm
46184V3IEJhc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFRZUEVEX0FSUkFZIGluIGRhdGEpIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICB9KTtcbiAgICAgIGFycmF5Rm9yRWFjaChUQUMgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSA/IGdPUE4oQmFzZSkuY29uY2F0KGdPUE4oVEFDKSkgOiBnT1BOKEJhc2UpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghKGtleSBpbiBUeXBlZEFycmF5KSkgaGlkZShUeXBlZEFycmF5LCBrZXksIEJhc2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IFR5cGVkQXJyYXlQcm90b3R5cGU7XG4gICAgICBpZiAoIUxJQlJBUlkpIFR5cGVkQXJyYXlQcm90b3R5cGUuY29uc3RydWN0b3IgPSBUeXBlZEFycmF5O1xuICAgIH1cbiAgICB2YXIgJG5hdGl2ZUl0ZXJhdG9yID0gVHlwZWRBcnJheVByb3RvdHlwZVtJVEVSQVRPUl07XG4gICAgdmFyIENPUlJFQ1RfSVRFUl9OQU1FID0gISEkbmF0aXZlSXRlcmF0b3JcbiAgICAgICYmICgkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSAndmFsdWVzJyB8fCAkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSB1bmRlZmluZWQpO1xuICAgIHZhciAkaXRlcmF0b3IgPSAkaXRlcmF0b3JzLnZhbHVlcztcbiAgICBoaWRlKFR5cGVkQXJyYXksIFRZUEVEX0NPTlNUUlVDVE9SLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRZUEVEX0FSUkFZLCBOQU1FKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgREVGX0NPTlNUUlVDVE9SLCBUeXBlZEFycmF5KTtcblxuICAgIGlmIChDTEFNUEVEID8gbmV3IFR5cGVkQXJyYXkoMSlbVEFHXSAhPSBOQU1FIDogIShUQUcgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpIHtcbiAgICAgIGRQKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRBRywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5BTUU7IH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIE9bTkFNRV0gPSBUeXBlZEFycmF5O1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoVHlwZWRBcnJheSAhPSBCYXNlKSwgTyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUywgTkFNRSwge1xuICAgICAgQllURVNfUEVSX0VMRU1FTlQ6IEJZVEVTXG4gICAgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgQmFzZS5vZi5jYWxsKFR5cGVkQXJyYXksIDEpOyB9KSwgTkFNRSwge1xuICAgICAgZnJvbTogJGZyb20sXG4gICAgICBvZjogJG9mXG4gICAgfSk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAsIE5BTUUsIHByb3RvKTtcblxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFRF9TRVQsIE5BTUUsIHsgc2V0OiAkc2V0IH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhQ09SUkVDVF9JVEVSX05BTUUsIE5BTUUsICRpdGVyYXRvcnMpO1xuXG4gICAgaWYgKCFMSUJSQVJZICYmIFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgIT0gYXJyYXlUb1N0cmluZykgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyA9IGFycmF5VG9TdHJpbmc7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEpLnNsaWNlKCk7XG4gICAgfSksIE5BTUUsIHsgc2xpY2U6ICRzbGljZSB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgVHlwZWRBcnJheShbMSwgMl0pLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xuICAgIH0pKSwgTkFNRSwgeyB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nIH0pO1xuXG4gICAgSXRlcmF0b3JzW05BTUVdID0gQ09SUkVDVF9JVEVSX05BTUUgPyAkbmF0aXZlSXRlcmF0b3IgOiAkaXRlcmF0b3I7XG4gICAgaWYgKCFMSUJSQVJZICYmICFDT1JSRUNUX0lURVJfTkFNRSkgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBJVEVSQVRPUiwgJGl0ZXJhdG9yKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgYXJyYXlGaWxsID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xudmFyIERBVEFfVklFVyA9ICdEYXRhVmlldyc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCEnO1xudmFyIFdST05HX0lOREVYID0gJ1dyb25nIGluZGV4ISc7XG52YXIgJEFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG52YXIgJERhdGFWaWV3ID0gZ2xvYmFsW0RBVEFfVklFV107XG52YXIgTWF0aCA9IGdsb2JhbC5NYXRoO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lc1xudmFyIEluZmluaXR5ID0gZ2xvYmFsLkluZmluaXR5O1xudmFyIEJhc2VCdWZmZXIgPSAkQXJyYXlCdWZmZXI7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xudmFyIEJVRkZFUiA9ICdidWZmZXInO1xudmFyIEJZVEVfTEVOR1RIID0gJ2J5dGVMZW5ndGgnO1xudmFyIEJZVEVfT0ZGU0VUID0gJ2J5dGVPZmZzZXQnO1xudmFyICRCVUZGRVIgPSBERVNDUklQVE9SUyA/ICdfYicgOiBCVUZGRVI7XG52YXIgJExFTkdUSCA9IERFU0NSSVBUT1JTID8gJ19sJ
46184yA6IEJZVEVfTEVOR1RIO1xudmFyICRPRkZTRVQgPSBERVNDUklQVE9SUyA/ICdfbycgOiBCWVRFX09GRlNFVDtcblxuLy8gSUVFRTc1NCBjb252ZXJzaW9ucyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2llZWU3NTRcbmZ1bmN0aW9uIHBhY2tJRUVFNzU0KHZhbHVlLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShuQnl0ZXMpO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gbUxlbiA9PT0gMjMgPyBwb3coMiwgLTI0KSAtIHBvdygyLCAtNzcpIDogMDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDA7XG4gIHZhciBlLCBtLCBjO1xuICB2YWx1ZSA9IGFicyh2YWx1ZSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHZhbHVlICE9IHZhbHVlIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBtID0gdmFsdWUgIT0gdmFsdWUgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gZmxvb3IobG9nKHZhbHVlKSAvIExOMik7XG4gICAgaWYgKHZhbHVlICogKGMgPSBwb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrO1xuICAgICAgYyAvPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIHBvdygyLCBlQmlhcyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltpKytdID0gbSAmIDI1NSwgbSAvPSAyNTYsIG1MZW4gLT0gOCk7XG4gIGUgPSBlIDw8IG1MZW4gfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW2krK10gPSBlICYgMjU1LCBlIC89IDI1NiwgZUxlbiAtPSA4KTtcbiAgYnVmZmVyWy0taV0gfD0gcyAqIDEyODtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIHVucGFja0lFRUU3NTQoYnVmZmVyLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGVMZW4gLSA3O1xuICB2YXIgaSA9IG5CeXRlcyAtIDE7XG4gIHZhciBzID0gYnVmZmVyW2ktLV07XG4gIHZhciBlID0gcyAmIDEyNztcbiAgdmFyIG07XG4gIHMgPj49IDc7XG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxO1xuICBlID4+PSAtbkJpdHM7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogcyA/IC1JbmZpbml0eSA6IEluZmluaXR5O1xuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgcG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH0gcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBwb3coMiwgZSAtIG1MZW4pO1xufVxuXG5mdW5jdGlvbiB1bnBhY2tJMzIoYnl0ZXMpIHtcbiAgcmV0dXJuIGJ5dGVzWzNdIDw8IDI0IHwgYnl0ZXNbMl0gPDwgMTYgfCBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG59XG5mdW5jdGlvbiBwYWNrSTgoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0kxNihpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0kzMihpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmYsIGl0ID4+IDE2ICYgMHhmZiwgaXQgPj4gMjQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tGNjQoaXQpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCA1MiwgOCk7XG59XG5mdW5jdGlvbiBwYWNrRjMyKGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgMjMsIDQpO1xufVxuXG5mdW5jdGlvbiBhZGRHZXR0ZXIoQywga2V5LCBpbnRlcm5hbCkge1xuICBkUChDW1BST1RPVFlQRV0sIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbaW50ZXJuYWxdOyB9IH0pO1xufVxuXG5mdW5jdGlvbiBnZXQodmlldywgYnl0ZXMsIGluZGV4LCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXg7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgobnVtSW5kZXgpO1xuICBpZiAoaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF07XG4gIHZhciBwYWNrID0gc3RvcmUuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpO1xuICByZXR1cm4gaXNMaXR0bGVFbmRpYW4gPyBwYWNrIDogcGFjay5yZXZlcnNlKCk7XG59XG5mdW5jdGlvbiBzZXQodmlldywgYnl0ZXMsIGluZGV4LCBjb252ZXJzaW9uLCB2YWx1ZSwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IGNvbnZlcnNpb24oK3ZhbHVlKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlczsgaSsrKSBzdG9yZVtzdGFydCArIGldID0gcGFja1tpc0xpdHRsZUVuZGlhbiA/IGkgOiBieXRlcyAtIGkgLSAxXTtcbn1cblxuaWYgKCEkdHlwZWQuQUJWKSB7XG4gICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuICAgIHZhciBieXRlTGVuZ3RoID0gdG9JbmRleChsZW5ndGgpO1xuICAgIHRoaXMuX2IgPSBhcnJheUZpbGwuY2FsbChuZXcgQXJyYXkoYnl0ZUxlbmd0aCksIDApO1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gICREYXRhVmlldyA9IGZ1bmN0aW9uIERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuICAgIGFuSW5zdGFuY2UoYnVmZmVyLCAkQXJyYXlCdWZmZXIsIERBVEFfVklFVyk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlclskTEVOR1RIXTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGJ5dG
46184VPZmZzZXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID09PSB1bmRlZmluZWQgPyBidWZmZXJMZW5ndGggLSBvZmZzZXQgOiB0b0xlbmd0aChieXRlTGVuZ3RoKTtcbiAgICBpZiAob2Zmc2V0ICsgYnl0ZUxlbmd0aCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHRoaXNbJEJVRkZFUl0gPSBidWZmZXI7XG4gICAgdGhpc1skT0ZGU0VUXSA9IG9mZnNldDtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBpZiAoREVTQ1JJUFRPUlMpIHtcbiAgICBhZGRHZXR0ZXIoJEFycmF5QnVmZmVyLCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQlVGRkVSLCAnX2InKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9PRkZTRVQsICdfbycpO1xuICB9XG5cbiAgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF0gPDwgMjQgPj4gMjQ7XG4gICAgfSxcbiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXTtcbiAgICB9LFxuICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2Y
46184XIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBnZXRJbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKTtcbiAgICB9LFxuICAgIGdldFVpbnQzMjogZnVuY3Rpb24gZ2V0VWludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpID4+PiAwO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQzMjogZnVuY3Rpb24gZ2V0RmxvYXQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgMjMsIDQpO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQ2NDogZnVuY3Rpb24gZ2V0RmxvYXQ2NChieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgNTIsIDgpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRJbnQxNjogZnVuY3Rpb24gc2V0SW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQxNjogZnVuY3Rpb24gc2V0VWludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRJbnQzMjogZnVuY3Rpb24gc2V0SW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQzMjogZnVuY3Rpb24gc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDMyOiBmdW5jdGlvbiBzZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0YzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Y2NCwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICRBcnJheUJ1ZmZlcigxKTtcbiAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgfSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBuZXcgJEFycmF5QnVmZmVyKDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcihOYU4pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIHJldHVybiAkQXJyYXlCdWZmZXIubmFtZSAhPSBBUlJBWV9CVUZGRVI7XG4gIH0pKSB7XG4gICAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlcik7XG4gICAgICByZXR1cm4gbmV3IEJhc2VCdWZmZXIodG9JbmRleChsZW5ndGgpKTtcbiAgICB9O1xuICAgIHZhciBBcnJheUJ1ZmZlclByb3RvID0gJEFycmF5QnVmZmVyW1BST1RPVFlQRV0gPSBCYXNlQnVmZmVyW1BST1RPVFlQRV07XG4gICAgZm9yICh2YXIga2V5cyA9IGdPUE4o
46184QmFzZUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIGhpZGUoJEFycmF5QnVmZmVyLCBrZXksIEJhc2VCdWZmZXJba2V5XSk7XG4gICAgfVxuICAgIGlmICghTElCUkFSWSkgQXJyYXlCdWZmZXJQcm90by5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfVxuICAvLyBpT1MgU2FmYXJpIDcueCBidWdcbiAgdmFyIHZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgJHNldEludDggPSAkRGF0YVZpZXdbUFJPVE9UWVBFXS5zZXRJbnQ4O1xuICB2aWV3LnNldEludDgoMCwgMjE0NzQ4MzY0OCk7XG4gIHZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYgKHZpZXcuZ2V0SW50OCgwKSB8fCAhdmlldy5nZXRJbnQ4KDEpKSByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9XG4gIH0sIHRydWUpO1xufVxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuaGlkZSgkRGF0YVZpZXdbUFJPVE9UWVBFXSwgJHR5cGVkLlZJRVcsIHRydWUpO1xuZXhwb3J0c1tBUlJBWV9CVUZGRVJdID0gJEFycmF5QnVmZmVyO1xuZXhwb3J0c1tEQVRBX1ZJRVddID0gJERhdGFWaWV3O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgVFlQRUQgPSB1aWQoJ3R5cGVkX2FycmF5Jyk7XG52YXIgVklFVyA9IHVpZCgndmlldycpO1xudmFyIEFCViA9ICEhKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBnbG9iYWwuRGF0YVZpZXcpO1xudmFyIENPTlNUUiA9IEFCVjtcbnZhciBpID0gMDtcbnZhciBsID0gOTtcbnZhciBUeXBlZDtcblxudmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMgPSAoXG4gICdJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF
461845LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheSdcbikuc3BsaXQoJywnKTtcblxud2hpbGUgKGkgPCBsKSB7XG4gIGlmIChUeXBlZCA9IGdsb2JhbFtUeXBlZEFycmF5Q29uc3RydWN0b3JzW2krK11dKSB7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFRZUEVELCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gIH0gZWxzZSBDT05TVFIgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFCVjogQUJWLFxuICBDT05TVFI6IENPTlNUUixcbiAgVFlQRUQ6IFRZUEVELFxuICBWSUVXOiBWSUVXXG59O1xuIiwidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKSBkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7IHZhbHVlOiB3a3NFeHQuZihuYW1lKSB9KTtcbn07XG4iLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmV4RXhwLmVzY2FwZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmUgPSByZXF1aXJlKCcuL19yZXBsYWNlcicpKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZ0V4cCcsIHsgZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpIHsgcmV0dXJuICRyZShpdCk7IH0gfSk7XG4iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHsgZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpIH0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmlsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZmlsdGVyLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNik7XG52YXIgS0VZID0gJ2ZpbmRJbmRleCc7XG52YXIgZm9yY2VkID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoS0VZIGluIFtdKSBBcnJheSgxKVtLRVldKGZ1bmN0aW9uICgpIHsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDUpO1xudmFyIEtFWSA9ICdmaW5kJztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciBTVFJJQ1QgPSByZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZm9yRWFjaCwgdHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIVNUUklDVCwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTAgLyAxNS4
461840LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgJG5hdGl2ZSA9IFtdLmluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHsgaXNBcnJheTogcmVxdWlyZSgnLi9faXMtYXJyYXknKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PS
46184BPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmpvaW4oc2VwYXJhdG9yKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlKb2luID0gW10uam9pbjtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIHN0cmluZ3NcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKHJlcXVpcmUoJy4vX2lvYmplY3QnKSAhPSBPYmplY3QgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShhcnJheUpvaW4pKSwgJ0FycmF5Jywge1xuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikge1xuICAgIHJldHVybiBhcnJheUpvaW4uY2FsbCh0b0lPYmplY3QodGhpcyksIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywnIDogc2VwYXJhdG9yKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciAkbmF0aXZlID0gW10ubGFzdEluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7XG4gICAgLy8gY29udmVydCAtMCB0byArMFxuICAgIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDA7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XG4gICAgZm9yICg7aW5kZXggPj0gMDsgaW5kZXgtLSkgaWYgKGluZGV4IGluIE8pIGlmIChPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJG1hcCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgxKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLm1hcCwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE1IC8gMTUuNC40LjE5IEFycmF5LnByb3RvdHlwZS5tYXAoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuLy8gV2ViS2l0IEFycmF5Lm9mIGlzbid0IGdlbmVyaWNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEoQXJyYXkub2YuY2FsbChGKSBpbnN0YW5jZW9mIEYpO1xufSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjMgQXJyYXkub2YoIC4uLml0ZW1zKVxuICBvZjogZnVuY3Rpb24gb2YoLyogLi4uYXJncyAqLykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXkpKGFMZW4pO1xuICAgIHdoaWxlIChhTGVuID4gaW5kZXgpIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGFMZW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheS1yZWR1Y2UnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZVJpZ2h0LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTkgLyAxNS40LjQuMjIgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIHRydWUpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlZ
46184HVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTggLyAxNS40LjQuMjEgQXJyYXkucHJvdG90eXBlLnJlZHVjZShjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIGZhbHNlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgaWYgKGh0bWwpIGFycmF5U2xpY2UuY2FsbChodG1sKTtcbn0pLCAnQXJyYXknLCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoaXMubGVuZ3RoKTtcbiAgICB2YXIga2xhc3MgPSBjb2YodGhpcyk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQ7XG4gICAgaWYgKGtsYXNzID09ICdBcnJheScpIHJldHVybiBhcnJheVNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdmFyIHN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW4pO1xuICAgIHZhciB1cFRvID0gdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKTtcbiAgICB2YXIgc2l6ZSA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydCk7XG4gICAgdmFyIGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBzaXplOyBpKyspIGNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXG4gICAgICA/IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSlcbiAgICAgIDogdGhpc1tzdGFydCArIGldO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkc29tZSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgzKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnNvbWUsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4yMyAvIDE1LjQuNC4xNyBBcnJheS5wcm90b3R5cGUuc29tZShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJHNvcnQgPSBbXS5zb3J0O1xudmFyIHRlc3QgPSBbMSwgMiwgM107XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU4LVxuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IGJ1Z1xuICB0ZXN0LnNvcnQobnVsbCk7XG4gIC8vIE9sZCBXZWJLaXRcbn0pIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJHNvcnQpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjUgQXJyYXkucHJvdG90eXBlLnNvcnQoY29tcGFyZWZuKVxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZFxuICAgICAgPyAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxuICAgICAgOiAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpLCBhRnVuY3Rpb24oY29tcGFyZWZuKSk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnQXJyYXknKTtcbiIsIi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdEYXRlJywgeyBub3c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9IH0pO1xuIiwiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KSwgJ0RhdGUnLCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwdiA9IHRvUHJpbWl0aXZlKE8pO1xuICAgIHJldHVybi
46184B0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7XG4gIH1cbn0pO1xuIiwidmFyIFRPX1BSSU1JVElWRSA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1ByaW1pdGl2ZScpO1xudmFyIHByb3RvID0gRGF0ZS5wcm90b3R5cGU7XG5cbmlmICghKFRPX1BSSU1JVElWRSBpbiBwcm90bykpIHJlcXVpcmUoJy4vX2hpZGUnKShwcm90bywgVE9fUFJJTUlUSVZFLCByZXF1aXJlKCcuL19kYXRlLXRvLXByaW1pdGl2ZScpKTtcbiIsInZhciBEYXRlUHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcbnZhciBJTlZBTElEX0RBVEUgPSAnSW52YWxpZCBEYXRlJztcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IERhdGVQcm90b1tUT19TVFJJTkddO1xudmFyIGdldFRpbWUgPSBEYXRlUHJvdG8uZ2V0VGltZTtcbmlmIChuZXcgRGF0ZShOYU4pICsgJycgIT0gSU5WQUxJRF9EQVRFKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoRGF0ZVByb3RvLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciB2YWx1ZSA9IGdldFRpbWUuY2FsbCh0aGlzKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/ICR0b1N0cmluZy5jYWxsKHRoaXMpIDogSU5WQUxJRF9EQVRFO1xuICB9KTtcbn1cbiIsIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIEhBU19JTlNUQU5DRSA9IHJlcXVpcmUoJy4vX3drcycpKCdoYXNJbnN0YW5jZScpO1xudmFyIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvKSkgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7XG4gIGlmICh0eXBlb2YgdGhpcyAhPSAnZnVuY3Rpb24nIHx8ICFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSkgcmV0dXJuIE8gaW5zdGFuY2VvZiB0aGlzO1xuICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOlxuICB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKSBpZiAodGhpcy5wcm90b3R5cGUgPT09IE8pIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59IH0pO1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2
46184XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuNSBNYXRoLmFzaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhc2luaCA9IE1hdGguYXNpbmg7XG5cbmZ1bmN0aW9uIGFzaW5oKHgpIHtcbiAgcmV0dXJuICFpc0Zpbml0ZSh4ID0gK3gpIHx8IHggPT0gMCA/IHggOiB4IDwgMCA/IC1hc2luaCgteCkgOiBNYXRoLmxvZyh4ICsgTWF0aC5zcXJ0KHggKiB4ICsgMSkpO1xufVxuXG4vLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXNpbmgoMCkgLT4gLTBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXNpbmggJiYgMSAvICRhc2luaCgwKSA+IDApLCAnTWF0aCcsIHsgYXNpbmg6IGFzaW5oIH0pO1xuIiwiLy8gMjAuMi4yLjcgTWF0aC5hdGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXRhbmggPSBNYXRoLmF0YW5oO1xuXG4vLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXRhbmgoLTApIC0+IDBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXRhbmggJiYgMSAvICRhdGFuaCgtMCkgPCAwKSwgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KSB7XG4gICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogTWF0aC5sb2coKDEgKyB4KSAvICgxIC0geCkpIC8gMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuOSBNYXRoLmNicnQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkge1xuICAgIHJldHVybiBzaWduKHggPSAreCkgKiBNYXRoLnBvdyhNYXRoLmFicyh4KSwgMSAvIDMpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xMSBNYXRoLmNsejMyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7XG4gICAgcmV0dXJuICh4ID4+Pj0gMCkgPyAzMSAtIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIDAuNSkgKiBNYXRoLkxPRzJFKSA6IDMyO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY29zaDogZnVuY3Rpb24gY29zaCh4KSB7XG4gICAgcmV0dXJuIChleHAoeCA9ICt4KSArIGV4cCgteCkpIC8gMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCRleHBtMSAhPSBNYXRoLmV4cG0xKSwgJ01hdGgnLCB7IGV4cG0xOiAkZXhwbTEgfSk7XG4iLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuIiwiLy8gMjAuMi4yLjE3IE1hdGguaHlwb3QoW3ZhbHVlMVssIHZhbHVlMlssIOKApiBdXV0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN1bSA9IDA7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbGFyZyA9IDA7XG4gICAgdmFyIGFyZywgZGl2O1xuICAgIHdoaWxlIChpIDwgYUxlbikge1xuICAgICAgYXJnID0gYWJzKGFyZ3VtZW50c1tpKytdKTtcbiAgICAgIGlmIChsYXJnIDwgYXJnKSB7XG4gICAgICAgIGRpdiA9IGxhcmcgLyBhcmc7XG4gICAgICAgIHN1bSA9IHN1bSAqIGRpdiAqIGRpdiArIDE7XG4gICAgICAgIGxhcmcgPSBhcmc7XG4gICAgICB9IGVsc2UgaWYgKGFyZyA+IDApIHtcbiAgICAgICAgZGl2ID0gYXJnIC8gbGFyZztcbiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjtcbiAgICAgIH0gZWxzZSBzdW0gKz0gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBNYXRoLnNxcnQoc3VtKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTggTWF0aC5pbXVsKHgsIHkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbXVsID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciB4biA9ICt4O1xuICAgIHZhciB5biA9ICt5O1xuICAgIHZhciB4bCA9IFVJTlQxNiAmIHhuO1xuICAgIHZhciB5bCA9IFVJTlQxNiAmIHluO1xuICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzEwRTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjAgTWF0aC5sb2cxcCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBsb2cxcDogcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpIH0pO1xuIiwiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ246IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpIH0pO1xuIiwiLy8gMjAuMi4yLjMwIE1hdGguc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gVjggbmVhciBDaHJvbWl1bSAzOCBoYXMgYSBwcm9ibGVtIHdpdGggdmVyeSBzbWFsbCBudW1iZXJzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggPSAreCkgPCAxXG4gICAgICA/IChleHBtMSh4KSAtIGV4cG0xKC14KSkgLyAyXG4gICAgICA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKE1hdGguRSAvIDIpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG
461840xJyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdGFuaDogZnVuY3Rpb24gdGFuaCh4KSB7XG4gICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpO1xuICAgIHZhciBiID0gZXhwbTEoLXgpO1xuICAgIHJldHVybiBhID09IEluZmluaXR5ID8gMSA6IGIgPT0gSW5maW5pdHkgPyAtMSA6IChhIC0gYikgLyAoZXhwKHgpICsgZXhwKC14KSk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjM0IE1hdGgudHJ1bmMoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KSB7XG4gICAgcmV0dXJuIChpdCA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsKShpdCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgTlVNQkVSID0gJ051bWJlcic7XG52YXIgJE51bWJlciA9IGdsb2JhbFtOVU1CRVJdO1xudmFyIEJhc2UgPSAkTnVtYmVyO1xudmFyIHByb3RvID0gJE51bWJlci5wcm90b3R5cGU7XG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ09GID0gY29mKHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKShwcm90bykpID09IE5VTUJFUjtcbnZhciBUUklNID0gJ3RyaW0nIGluIFN0cmluZy5wcm90b3R5cGU7XG5cbi8vIDcuMS4zIFRvTnVtYmVyKGFyZ3VtZW50KVxudmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikge1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2xcbiAgICAgICAgLy8gYnV0IFRvTnVtYmVyIHNob3VsZCByZXR1cm4gTmFOIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHVuYXZhaWxhYmxlIHN5bWJvbHNcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSkgcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYgKCEkTnVtYmVyKCcgMG8xJykgfHwgISROdW1iZXIoJzBiMScpIHx8ICROdW1iZXIoJysweDEnKSkge1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKSB7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgJE51bWJlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QTihCYXNlKSA6IChcbiAgICAvLyBFUzM6XG4gICAgJ01BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLCcgK1xuICAgIC8vIEVTNiAoaW4gY2FzZSwgaWYgbW9kdWxlcyB3aXRoIEVTNiBOdW1iZXIgc3RhdGljcyByZXF1aXJlZCBiZWZvcmUpOlxuICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArXG4gICAgJ01JTl9TQUZFX0lOVEVHRVIscGFyc2VGbG9hdCxwYXJzZUludCxpc0ludGVnZXInXG4gICkuc3BsaXQoJywnKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOyBqKyspIHtcbiAgICBpZiAoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSkge1xuICAgICAgZFAoJE51bWJlciwga2V5LCBnT1BEKEJhc2UsIGtleSkpO1xuICAgIH1cbiAgfVxuICAkTnVtYmVyLnByb3RvdHlwZSA9IHByb3RvO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICROdW1iZXI7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCBOVU1CRVIsICROdW1iZXIpO1xufVxuIiwiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBFUFNJTE9OOiBNYXRoLnBvdygyLCAtNTIpIH0pO1xuIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgX2lzRmluaXRlID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUo
46184aXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgaXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJykgfSk7XG4iLCIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcikge1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcbiIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgTUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZiB9KTtcbiIsIi8vIDIwLjEuMi4xMCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IE1JTl9TQUZFX0lOVEVHRVI6IC0weDFmZmZmZmZmZmZmZmZmIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFOdW1iZXJWYWx1ZSA9IHJlcXVpcmUoJy4vX2EtbnVtYmVyLXZhbHVlJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpO1xudmFyICR0b0ZpeGVkID0gMS4wLnRvRml4ZWQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG52YXIgRVJST1IgPSAnTnVtYmVyLnRvRml4ZWQ6IGluY29ycmVjdCBpbnZvY2F0aW9uISc7XG52YXIgWkVSTyA9ICcwJztcblxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKG4sIGMpIHtcbiAgdmFyIGkgPSAtMTtcbiAgdmFyIGMyID0gYztcbiAgd2hpbGUgKCsraSA8IDYpIHtcbiAgICBjMiArPSBuICogZGF0YVtpXTtcbiAgICBkYXRhW2ldID0gYzIgJSAxZTc7XG4gICAgYzIgPSBmbG9vcihjMiAvIDFlNyk7XG4gIH1cbn07XG52YXIgZGl2aWRlID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIGkgPSA2O1xuICB2YXIgYyA9IDA7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGMgKz0gZGF0YVtpXTtcbiAgICBkYXRhW2ldID0gZmxvb3IoYyAvIG4pO1xuICAgIGMgPSAoYyAlIG4pICogMWU3O1xuICB9XG59O1xudmFyIG51bVRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaSA9IDY7XG4gIHZhciBzID0gJyc7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGlmIChzICE9PSAnJyB8fCBpID09PSAwIHx8IGRhdGFbaV0gIT09IDApIHtcbiAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaV0pO1xuICAgICAgcyA9IHMgPT09ICcnID8gdCA6IHMgKyByZXBlYXQuY2FsbChaRVJPLCA3IC0gdC5sZW5ndGgpICsgdDtcbiAgICB9XG4gIH0gcmV0dXJuIHM7XG59O1xudmFyIHBvdyA9IGZ1bmN0aW9uICh4LCBuLCBhY2MpIHtcbiAgcmV0dXJuIG4gPT09IDAgPyBhY2MgOiBuICUgMiA9PT0gMSA/IHBvdyh4LCBuIC0gMSwgYWNjICogeCkgOiBwb3coeCAqIHgsIG4gLyAyLCBhY2MpO1xufTtcbnZhciBsb2cgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbiA9IDA7XG4gIHZhciB4MiA9IHg7XG4gIHdoaWxlICh4MiA+PSA0MDk2KSB7XG4gICAgbiArPSAxMjtcbiAgICB4MiAvPSA0MDk2O1xuICB9XG4gIHdoaWxlICh4MiA+PSAyKSB7XG4gICAgbiArPSAxO1xuICAgIHgyIC89IDI7XG4gIH0gcmV0dXJuIG47XG59O1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICghISR0b0ZpeGVkICYmIChcbiAgMC4wMDAwOC50b0ZpeGVkKDMpICE9PSAnMC4wMDAnIHx8XG4gIDAuOS50b0ZpeGVkKDApICE9PSAnMScgfHxcbiAgMS4yNTUudG9GaXhlZCgyKSAhPT0gJzEuMjUnIHx8XG4gIDEwMDAwMDAwMDAwMDAwMDAxMjguMC50b0ZpeGVkKDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCdcbikgfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICAkdG9GaXhlZC5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgIHZhciB4ID0gYU51bWJlclZhbHVlKHRoaXMsIEVSUk9SKTtcbiAgICB2YXIgZiA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIHMgPSAnJztcbiAgICB2YXIgbSA9IFpFUk87XG4gICAgdmFyIGUsIHosIGosIGs7XG4gICAgaWYgKGYgPCAwIHx8IGYgPiAyMCkgdGhyb3cgUmFuZ2VFcnJvcihFUlJPUik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmICh4ICE9IHgpIHJldHVybiAnTmFOJztcbiAgICBpZiAoeCA8PSAtMWUyMSB8fCB4ID49IDFlMjEpIHJldHVybi
46184BTdHJpbmcoeCk7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICBzID0gJy0nO1xuICAgICAgeCA9IC14O1xuICAgIH1cbiAgICBpZiAoeCA+IDFlLTIxKSB7XG4gICAgICBlID0gbG9nKHggKiBwb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgeiA9IGUgPCAwID8geCAqIHBvdygyLCAtZSwgMSkgOiB4IC8gcG93KDIsIGUsIDEpO1xuICAgICAgeiAqPSAweDEwMDAwMDAwMDAwMDAwO1xuICAgICAgZSA9IDUyIC0gZTtcbiAgICAgIGlmIChlID4gMCkge1xuICAgICAgICBtdWx0aXBseSgwLCB6KTtcbiAgICAgICAgaiA9IGY7XG4gICAgICAgIHdoaWxlIChqID49IDcpIHtcbiAgICAgICAgICBtdWx0aXBseSgxZTcsIDApO1xuICAgICAgICAgIGogLT0gNztcbiAgICAgICAgfVxuICAgICAgICBtdWx0aXBseShwb3coMTAsIGosIDEpLCAwKTtcbiAgICAgICAgaiA9IGUgLSAxO1xuICAgICAgICB3aGlsZSAoaiA+PSAyMykge1xuICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTtcbiAgICAgICAgICBqIC09IDIzO1xuICAgICAgICB9XG4gICAgICAgIGRpdmlkZSgxIDw8IGopO1xuICAgICAgICBtdWx0aXBseSgxLCAxKTtcbiAgICAgICAgZGl2aWRlKDIpO1xuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTtcbiAgICAgICAgbSA9IG51bVRvU3RyaW5nKCkgKyByZXBlYXQuY2FsbChaRVJPLCBmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGYgPiAwKSB7XG4gICAgICBrID0gbS5sZW5ndGg7XG4gICAgICBtID0gcyArIChrIDw9IGYgPyAnMC4nICsgcmVwZWF0LmNhbGwoWkVSTywgZiAtIGspICsgbSA6IG0uc2xpY2UoMCwgayAtIGYpICsgJy4nICsgbS5zbGljZShrIC0gZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gcyArIG07XG4gICAgfSByZXR1cm4gbTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKTtcbnZhciAkdG9QcmVjaXNpb24gPSAxLjAudG9QcmVjaXNpb247XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFNy1cbiAgcmV0dXJuICR0b1ByZWNpc2lvbi5jYWxsKDEsIHVuZGVmaW5lZCkgIT09ICcxJztcbn0pIHx8ICEkZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICAkdG9QcmVjaXNpb24uY2FsbCh7fSk7XG59KSksICdOdW1iZXInLCB7XG4gIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHtcbiAgICB2YXIgdGhhdCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCAnTnVtYmVyI3RvUHJlY2lzaW9uOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgICByZXR1cm4gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyAkdG9QcmVjaXNpb24uY2FsbCh0aGF0KSA6ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQsIHByZWNpc2lvbik7XG4gIH1cbn0pO1xuIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19vYmplY3QtZHBzJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiLy8gMTkuMS4yLjUgT2JqZWN0LmZyZWV6ZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdmcmVlemUnLCBmdW5jdGlvbiAoJGZyZWV6ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JT2JqZWN0KGl0KSwga2V5KTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpLmY7XG59KTtcbiIsIi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59
46184KTtcbiIsIi8vIDE5LjEuMi4xMSBPYmplY3QuaXNFeHRlbnNpYmxlKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0V4dGVuc2libGUnLCBmdW5jdGlvbiAoJGlzRXh0ZW5zaWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaXNFeHRlbnNpYmxlKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjEyIE9iamVjdC5pc0Zyb3plbihPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNGcm96ZW4nLCBmdW5jdGlvbiAoJGlzRnJvemVuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc0Zyb3plbihpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNGcm96ZW4gPyAkaXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTMgT2JqZWN0LmlzU2VhbGVkKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uICgkaXNTZWFsZWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xMCBPYmplY3QuaXModmFsdWUxLCB2YWx1ZTIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGlzOiByZXF1aXJlKCcuL19zYW1lLXZhbHVlJykgfSk7XG4iLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbn
46184RFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24gKCRwcmV2ZW50RXh0ZW5zaW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnMoaXQpIHtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjE3IE9iamVjdC5zZWFsKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3NlYWwnLCBmdW5jdGlvbiAoJHNlYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYWwoaXQpIHtcbiAgICByZXR1cm4gJHNlYWwgJiYgaXNPYmplY3QoaXQpID8gJHNlYWwobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQgfSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIHRlc3QgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYgKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAxOC4yLjQgcGFyc2VGbG9hdChzdHJpbmcpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAxOC4yLjUgcGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlSW50ICE9ICRwYXJzZUludCksIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2Y
46184XIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gI
46184H0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2Y
46184XIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2Y
46184XIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHJBcHBseSA9IChyZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5hcHBseTtcbnZhciBmQXBwbHkgPSBGdW5jdGlvbi5hcHBseTtcbi8vIE1TIEVkZ2UgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJBcHBseShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSksICdSZWZsZWN0Jywge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpIHtcbiAgICB2YXIgVCA9IGFGdW5jdGlvbih0YXJnZXQpO1xuICAgIHZhciBMID0gYW5PYmplY3QoYXJndW1lbnRzTGlzdCk7XG4gICAgcmV0dXJuIHJBcHBseSA/IHJBcHBseShULCB0aGlzQXJndW1lbnQsIEwpIDogZkFwcGx5LmNhbGwoVCwgdGhpc0FyZ3VtZW50LCBMKTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9fYmluZCcpO1xudmFyIHJDb25zdHJ1Y3QgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0O1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShyQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRyksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gckNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2Y
46184XIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZFAuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpO1xuICAgIGFuT2JqZWN0KGF0dHJpYnV0ZXMpO1xuICAgIHRyeSB7XG4gICAgICBkUC5mKHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjYuMS41IFJlZmxlY3QuZW51bWVyYXRlKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBFbnVtZXJhdGUgPSBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW107ICAgICAgLy8ga2V5c1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBpdGVyYXRlZCkga2V5cy5wdXNoKGtleSk7XG59O1xucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKShFbnVtZXJhdGUsICdPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gdGhpcztcbiAgdmFyIGtleXMgPSB0aGF0Ll9rO1xuICB2YXIga2V5O1xuICBkbyB7XG4gICAgaWYgKHRoYXQuX2kgPj0ga2V5cy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfSB3aGlsZSAoISgoa2V5ID0ga2V5c1t0aGF0Ll9pKytdKSBpbiB0aGF0Ll90KSk7XG4gIHJldHVybiB7IHZhbHVlOiBrZXksIGRvbmU6IGZhbHNlIH07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBlbnVtZXJhdGU6IGZ1bmN0aW9uIGVudW1lcmF0ZSh0YXJnZXQpIHtcbiAgICByZXR1cm4gbmV3IEVudW1lcmF0ZSh0YXJnZXQpO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuNyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjggUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdldFByb3RvID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybi
46184B0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuIiwiLy8gMjYuMS45IFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gcHJvcGVydHlLZXkgaW4gdGFyZ2V0O1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMTAgUmVmbGVjdC5pc0V4dGVuc2libGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGlzRXh0ZW5zaWJsZTogZnVuY3Rpb24gaXNFeHRlbnNpYmxlKHRhcmdldCkge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKHRhcmdldCkgOiB0cnVlO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMTEgUmVmbGVjdC5vd25LZXlzKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgb3duS2V5czogcmVxdWlyZSgnLi9fb3duLWtleXMnKSB9KTtcbiIsIi8vIDI2LjEuMTIgUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbn
46184RFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoJHByZXZlbnRFeHRlbnNpb25zKSAkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmIChzZXRQcm90bykgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsIi8vIDI2LjEuMTMgUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViBbLCByZWNlaXZlcl0pXG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM107XG4gIHZhciBvd25EZXNjID0gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgdmFyIGV4aXN0aW5nRGVzY3JpcHRvciwgcHJvdG87XG4gIGlmICghb3duRGVzYykge1xuICAgIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSB7XG4gICAgICByZXR1cm4gc2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgViwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgICBvd25EZXNjID0gY3JlYXRlRGVzYygwKTtcbiAgfVxuICBpZiAoaGFzKG93bkRlc2MsICd2YWx1ZScpKSB7XG4gICAgaWYgKG93bkRlc2Mud3JpdGFibGUgPT09IGZhbHNlIHx8ICFpc09iamVjdChyZWNlaXZlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZXhpc3RpbmdEZXNjcmlwdG9yID0gZ09QRC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgIGlmIChleGlzdGluZ0Rlc2NyaXB0b3IuZ2V0IHx8IGV4aXN0aW5nRGVzY3JpcHRvci
461845zZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLndyaXRhYmxlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZXhpc3RpbmdEZXNjcmlwdG9yLnZhbHVlID0gVjtcbiAgICAgIGRQLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpO1xuICAgIH0gZWxzZSBkUC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgY3JlYXRlRGVzYygwLCBWKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgc2V0OiBzZXQgfSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIEJhc2UgPSAkUmVnRXhwO1xudmFyIHByb3RvID0gJFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmUxID0gL2EvZztcbnZhciByZTIgPSAvYS9nO1xuLy8gXCJuZXdcIiBjcmVhdGVzIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdneSBoZXJlXG52YXIgQ09SUkVDVF9ORVcgPSBuZXcgJFJlZ0V4cChyZTEpICE9PSByZTE7XG5cbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJlMltyZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKV0gPSBmYWxzZTtcbiAgLy8gUmVnRXhwIGNvbnN0cnVjdG9yIGNhbiBhbHRlciBmbGFncyBhbmQgSXNSZWdFeHAgd29ya3MgY29ycmVjdCB3aXRoIEBAbWF0Y2hcbiAgcmV0dXJuICRSZWdFeHAocmUxKSAhPSByZTEgfHwgJFJlZ0V4cChyZTIpID09IHJlMiB8fCAkUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7XG59KSkpIHtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKSB7XG4gICAgdmFyIHRpUkUgPSB0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cDtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApO1xuICAgIHZhciBmaVUgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICF0aVJFICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IGluaGVyaXRJZlJlcXVpcmVkKENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKVxuICAgICAgLCB0aVJFID8gdGhpcyA6IHByb3RvLCAkUmVnRXhwKTtcbiAgfTtcbiAgdmFyIHByb3h5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGtleSBpbiAkUmVnRXhwIHx8IGRQKCRSZWdFeHAsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBCYXNlW2tleV0gPSBpdDsgfVxuICAgIH0pO1xuICB9O1xuICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTspIHByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5yZXF1aXJlKCcuL19leHBvcnQnKSh7XG4gIHRhcmdldDogJ1JlZ0V4cCcsXG4gIHByb3RvOiB0cnVlLFxuICBmb3JjZWQ6IHJlZ2V4cEV4ZWMgIT09IC8uLy5leGVjXG59LCB7XG4gIGV4ZWM6IHJlZ2V4cEV4ZWNcbn0pO1xuIiwiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBNQVRDSCwgJG1hdGNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5tYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2Y
46184XIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKCRtYXRjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmICghcnguZ2xvYmFsKSByZXR1cm4gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIEFbbl0gPSBtYXRjaFN0cjtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgICAgbisrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gPT09IDAgPyBudWxsIDogQTtcbiAgICB9XG4gIF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MUyA9IC9cXCQoWyQmYCddfFxcZFxcZD98PFtePl0qPikvZztcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRCA9IC9cXCQoWyQmYCddfFxcZFxcZD8pL2c7XG5cbnZhciBtYXliZVRvU3RyaW5nID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcblxuLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3JlcGxhY2UnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAcmVwbGFjZVxuICAgIGZ1bmN0aW9uIChyZWdleHAsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkcmVwbGFjZSwgcmVnZXhwLCB0aGlzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2Y
46184XIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG4gICAgICB2YXIgZ2xvYmFsID0gcnguZ2xvYmFsO1xuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICBpZiAoIWdsb2JhbCkgYnJlYWs7XG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuICAgICAgdmFyIGFjY3VtdWxhdGVkUmVzdWx0ID0gJyc7XG4gICAgICB2YXIgbmV4dFNvdXJjZVBvc2l0aW9uID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICB2Y
46184XIgbWF0Y2hlZCA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBtYXgobWluKHRvSW50ZWdlcihyZXN1bHQuaW5kZXgpLCBTLmxlbmd0aCksIDApO1xuICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIC8vICAgY2FwdHVyZXMgPSByZXN1bHQuc2xpY2UoMSkubWFwKG1heWJlVG9TdHJpbmcpXG4gICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpblxuICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgIC8vIGNhdXNlcyBhIGNyYXNoIChodHRwczovL3Bhc3RlYmluLmNvbS9OMjFRemVRQSkgd2hlbiB0cnlpbmcgdG8gZGVidWcgaXQuXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSBjYXB0dXJlcy5wdXNoKG1heWJlVG9TdHJpbmcocmVzdWx0W2pdKSk7XG4gICAgICAgIHZhciBuYW1lZENhcHR1cmVzID0gcmVzdWx0Lmdyb3VwcztcbiAgICAgICAgaWYgKGZ1bmN0aW9uYWxSZXBsYWNlKSB7XG4gICAgICAgICAgdmFyIHJlcGxhY2VyQXJncyA9IFttYXRjaGVkXS5jb25jYXQoY2FwdHVyZXMsIHBvc2l0aW9uLCBTKTtcbiAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSByZXBsYWNlckFyZ3MucHVzaChuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICB2Y
46184XIgcmVwbGFjZW1lbnQgPSBTdHJpbmcocmVwbGFjZVZhbHVlLmFwcGx5KHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgbmV4dFNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkUmVzdWx0ICsgUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24pO1xuICAgIH1cbiAgXTtcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldHN1YnN0aXR1dGlvblxuICBmdW5jdGlvbiBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgc3RyLCBwb3NpdGlvbiwgY2FwdHVyZXMsIG5hbWVkQ2FwdHVyZXMsIHJlcGxhY2VtZW50KSB7XG4gICAgdmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoO1xuICAgIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICAgIHZhciBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQ7XG4gICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgICAgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTO1xuICAgIH1cbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgICAgdmFyIGNhcHR1cmU7XG4gICAgICBzd2l0Y2ggKGNoLmNoYXJBdCgwKSkge1xuICAgICAgICBjYXNlICckJzogcmV0dXJuICckJztcbiAgICAgICAgY2FzZSAnJic6IHJldHVybiBtYXRjaGVkO1xuICAgICAgICBjYXNlICdgJzogcmV0dXJuIHN0ci5zbGljZSgwLCBwb3NpdGlvbik7XG4gICAgICAgIGNhc2UgXCInXCI6IHJldHVybiBzdHIuc2xpY2UodGFpbFBvcyk7XG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vIFxcZFxcZD9cbiAgICAgICAgICB2Y
46184XIgbiA9ICtjaDtcbiAgICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgIGlmIChuID4gbSkge1xuICAgICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgICAgaWYgKGYgPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICAgIGlmIChmIDw9IG0pIHJldHVybiBjYXB0dXJlc1tmIC0gMV0gPT09IHVuZGVmaW5lZCA/IGNoLmNoYXJBdCgxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoLmNoYXJBdCgxKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FwdHVyZSA9IGNhcHR1cmVzW24gLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzYW1lVmFsdWUgPSByZXF1aXJlKCcuL19zYW1lLXZhbHVlJyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAc2VhcmNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NlYXJjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBTRUFSQ0gsICRzZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNlYXJjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2hcbiAgICBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgICB2Y
46184XIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzZWFyY2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKCRzZWFyY2gsIHJlZ2V4cCwgdGhpcyk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShwcmV2aW91c0xhc3RJbmRleCwgMCkpIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gLTEgOiByZXN1bHQuaW5kZXg7XG4gICAgfVxuICBdO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4vX2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjYWxsUmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRtaW4gPSBNYXRoLm1pbjtcbnZhciAkcHVzaCA9IFtdLnB1c2g7XG52YXIgJFNQTElUID0gJ3NwbGl0JztcbnZhciBMRU5HVEggPSAnbGVuZ3RoJztcbnZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG52YXIgTUFYX1VJTlQzMiA9IDB4ZmZmZmZmZmY7XG5cbi8vIGJhYmVsLW1pbmlmeSB0cmFuc3BpbGVzIFJlZ0V4cCgneCcsICd5JykgLT4gL3gveSBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yXG52YXIgU1VQUE9SVFNfWSA9ICFmYWlscyhmdW5jdGlvbiAoKSB7IFJlZ0V4cChNQVhfVUlOVDMyLCAneScpOyB9KTtcblxuLy8gQEBzcGxpdCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBTUExJVCwgJHNwbGl0LCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgdmFyIGludGVybmFsU3BsaXQ7XG4gIGlmIChcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2Y
46184XIgc3RyaW5nID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwKSByZXR1cm4gW107XG4gICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgaWYgKCFpc1JlZ0V4cChzZXBhcmF0b3IpKSByZXR1cm4gJHNwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICB2YXIgbGFzdExhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgc3BsaXRMaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgIHZhciBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoO1xuICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXhwRXhlYy5jYWxsKHNlcGFyYXRvckNvcHksIHN0cmluZykpIHtcbiAgICAgICAgbGFzdEluZGV4ID0gc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXTtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICBpZiAobWF0Y2hbTEVOR1RIXSA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmdbTEVOR1RIXSkgJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0W0xFTkdUSF0gPj0gc3BsaXRMaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdKys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmdbTEVOR1RIXSkge1xuICAgICAgICBpZiAobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSkgb3V0cHV0LnB1c2goJycpO1xuICAgICAgfSBlbHNlIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0W0xFTkdUSF0gPiBzcGxpdExpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIHNwbGl0TGltaXQpIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogJHNwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gJHNwbGl0O1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgIGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBzcGxpdHRlciA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICAgIDogaW50ZXJuYWxTcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNwbGl0XG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0XG4gICAgLy8gdGhlICd5JyBmbGFnLlxuICAgIGZ1bmN0aW9uIChyZWdleHAsIGxpbWl0KSB7XG4gICAgICB2Y
46184XIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09ICRzcGxpdCk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApO1xuXG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFNVUFBPUlRTX1kgPyAneScgOiAnZycpO1xuXG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgUyBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoU1VQUE9SVFNfWSA/IHJ4IDogJ14oPzonICsgcnguc291cmNlICsgJyknLCBmbGFncyk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gU1VQUE9SVFNfWSA/IHEgOiAwO1xuICAgICAgICB2Y
46184XIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTVVBQT1JUU19ZID8gUyA6IFMuc2xpY2UocSkpO1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPT09IG51bGwgfHxcbiAgICAgICAgICAoZSA9ICRtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFNVUFBPUlRTX1kgPyAwIDogcSkpLCBTLmxlbmd0aCkpID09PSBwXG4gICAgICAgICkge1xuICAgICAgICAgIHEgPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgcSwgdW5pY29kZU1hdGNoaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBLnB1c2goUy5zbGljZShwLCBxKSk7XG4gICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHoubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBBLnB1c2goeltpXSk7XG4gICAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHEgPSBwID0gZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQS5wdXNoKFMuc2xpY2UocCkpO1xuICAgICAgcmV0dXJuIEE7XG4gICAgfVxuICBdO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRmbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgJHRvU3RyaW5nID0gLy4vW1RPX1NUUklOR107XG5cbnZhciBkZWZpbmUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZuLCB0cnVlKTtcbn07XG5cbi8vIDIxLjIuNS4xNCBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nKClcbmlmIChyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHsgcmV0dXJuICR0b1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KSkge1xuICBkZWZpbmUoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIFIgPSBhbk9iamVjdCh0aGlzKTtcbiAgICByZXR1cm4gJy8nLmNvbmNhdChSLnNvdXJjZSwgJy8nLFxuICAgICAgJ2ZsYWdzJyBpbiBSID8gUi5mbGFncyA6ICFERVNDUklQVE9SUyAmJiBSIGluc3RhbmNlb2YgUmVnRXhwID8gJGZsYWdzLmNhbGwoUikgOiB1bmRlZmluZWQpO1xuICB9KTtcbi8vIEZGNDQtIFJlZ0V4cCN0b1N0cmluZyBoYXMgYSB3cm9uZyBuYW1lXG59IGVsc2UgaWYgKCR0b1N0cmluZy5uYW1lICE9IFRPX1NUUklORykge1xuICBkZWZpbmUoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICR0b1N0cmluZy5jYWxsKHRoaXMpO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNFVCA9ICdTZXQnO1xuXG4vLyAyMy4yIFNldCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShTRVQsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIFNFVCksIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjIgU3RyaW5nLnByb3RvdHlwZS5hbmNob3IobmFtZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2FuY2hvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhbmNob3IobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ25hbWUnLCBuYW1lKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMyBTdHJpbmcucHJvdG90eXBlLmJpZygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdiaWcnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYmlnKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiaWcnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy40IFN0cmluZy5wcm90b3R5cGUuYmxpbmsoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmxpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYmxpbmsoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNSBTdHJpbmcucHJvdG90eXBlLmJvbGQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYm9sZCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBib2xkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKShmYWxzZSk7XG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjMgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdChwb3MpXG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIiwiLy8gMjEuMS4zLjYgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aChzZWFyY2hTdHJpbmcgWywgZW5kUG9zaXRpb25dKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIEVORFNfV0lUSCA9ICdlbmRzV2l0aCc7XG52YXIgJGVuZHNXaXRoID0gJydbRU5EU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShFTkRTX1dJVEgpLCAnU3RyaW5nJywge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgRU5EU19XSVRIKTtcbiAgICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpO1xuICAgIHZhciBlbmQgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogTWF0aC5taW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJGVuZHNXaXRoXG4gICAgICA/ICRlbmRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgZW5kKVxuICAgICAgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy42IFN0cmluZy5wcm90b3R5cGUuZml4ZWQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZml4ZWQnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZml4ZWQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNyBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcihjb2xvcilcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRjb2xvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybi
46184BmdW5jdGlvbiBmb250Y29sb3IoY29sb3IpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdjb2xvcicsIGNvbG9yKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOCBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplKHNpemUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250c2l6ZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnc2l6ZScsIHNpemUpO1xuICB9O1xufSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciAkZnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50O1xuXG4vLyBsZW5ndGggc2hvdWxkIGJlIDEsIG9sZCBGRiBwcm9ibGVtXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghISRmcm9tQ29kZVBvaW50ICYmICRmcm9tQ29kZVBvaW50Lmxlbmd0aCAhPSAxKSwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjIgU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cylcbiAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgY29kZTtcbiAgICB3aGlsZSAoYUxlbiA+IGkpIHtcbiAgICAgIGNvZGUgPSArYXJndW1lbnRzW2krK107XG4gICAgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBmZmZmKSAhPT0gY29kZSkgdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7XG4gICAgICByZXMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhkODAwLCBjb2RlICUgMHg0MDAgKyAweGRjMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG4iLCIvLyAyMS4xLjMuNyBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKHNlYXJjaFN0cmluZywgcG9zaXRpb24gPSAwKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBJTkNMVURFUyA9ICdpbmNsdWRlcyc7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoSU5DTFVERVMpLCAnU3RyaW5nJywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfmNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBJTkNMVURFUylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjkgU3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2l0YWxpY3MnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gaXRhbGljcygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnaScsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTAgU3RyaW5nLnByb3RvdHlwZS5saW5rKHVybClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2xpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gbGluayh1cmwpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTtcbiAgfTtcbn0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi40IFN0cmluZy5yYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpXG4gIHJhdzogZnVuY3Rpb24gcmF3KGNhbGxTaXRlKSB7XG4gICAgdmFyIHRwbCA9IHRvSU9iamVjdChjYWxsU2l0ZS5yYXcpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0cGwubGVuZ3RoKTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAobGVuID4gaSkge1xuICAgICAgcmVzLnB1c2goU3RyaW5nKHRwbFtpKytdKSk7XG4gICAgICBpZiAoaSA8IGFMZW4pIHJlcy5wdXNoKFN0cmluZyhhcmd1bWVudHNbaV0pKTtcbiAgICB9I
46184HJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMy4xMyBTdHJpbmcucHJvdG90eXBlLnJlcGVhdChjb3VudClcbiAgcmVwZWF0OiByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jylcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5zbWFsbCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzbWFsbCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzbWFsbCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc21hbGwnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIvLyAyMS4xLjMuMTggU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKHNlYXJjaFN0cmluZyBbLCBwb3NpdGlvbiBdKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIFNUQVJUU19XSVRIID0gJ3N0YXJ0c1dpdGgnO1xudmFyICRzdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKFNUQVJUU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSCk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkc3RhcnRzV2l0aFxuICAgICAgPyAkc3RhcnRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgaW5kZXgpXG4gICAgICA6IHRoYXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMiBTdHJpbmcucHJvdG90eXBlLnN0cmlrZSgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdHJpa2UnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3RyaWtlKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdHJpa2UnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMyBTdHJpbmcucHJvdG90eXBlLnN1YigpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdWInLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3ViKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdWInLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xNCBTdHJpbmcucHJvdG90eXBlLnN1cCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdXAnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3VwKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1
46184BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybi
46184ByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1
vendor: 60,180 bytes, line 46184
46184xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZCwgbGVuKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTtcbiAgICB2YXIgdmlld1MgPSBuZXcgJERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VCA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChmaXJzdCA8IGZpbikge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL190eXBlZCcpLkFCViwge1xuICBEYXRhVmlldzogcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJykuRGF0YVZpZXdcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQ2NCcsIDgsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MTYnLCAyLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OENsYW1wZWRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSwgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyk7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBXRUFLX01BUCA9ICdXZWFrTWFwJztcbnZhciBnZXRXZWFrID0gbWV0YS5nZXRXZWFrO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZTtcbnZhciBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCkpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19NQVApLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfTUFQLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYgKE5BVElWRV9XRUFLX01BUCAmJiBJU19JRTExKSB7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBXRUFLX01BUCk7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvdG8gPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gICAgdmFyIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYgKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mKSB0aGlzLl9mID0gbmV3IEludGVybmFsTWFwKCk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFdFQUtfU0VUID0gJ1dlYWtTZXQnO1xuXG4vLyAyMy40IFdlYWtTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfU0VULCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX1NFVCksIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXRNYXBcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiwgQTtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmxhdE1hcCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXR0ZW5cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdHRlbjogZnVuY3Rpb24gZmxhdHRlbigvKiBkZXB0aEFyZyA9IDEgKi8pIHtcbiAgICB2YXIgZGVwdGhBcmcgPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCBkZXB0aEFyZyA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aEFyZykpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2ZsYXR0ZW4nKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L0FycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2luY2x1ZGVzJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vcndhbGRyb24vdGMzOS1ub3Rlcy9ibG9iL21hc3Rlci9lczYvMjAxNC0wOS9zZXB0LTI1Lm1kIzUxMC1nbG9iYWxhc2FwLWZvci1lbnF1ZXVpbmctYS1taWNyb3Rhc2tcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBwcm9jZXNzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucHJvY2VzcztcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbiRleHBvcnQoJGV4cG9ydC5HLCB7XG4gIGFzYXA6IGZ1bmN0aW9uIGFzYXAoZm4pIHtcbiAgICB2YXIgZG9tYWluID0gaXNOb2RlICYmIHByb2Nlc3MuZG9tYWluO1xuICAgIG1pY3JvdGFzayhkb21haW4gPyBkb21haW4uYmluZChmbikgOiBmbik7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9wcm9wb3NhbC1pcy1lcnJvclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdFcnJvcicsIHtcbiAgaXNFcnJvcjogZnVuY3Rpb24gaXNFcnJvcihpdCkge1xuICAgIHJldHVybiBjb2YoaXQpID09PSAnRXJyb3InO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2xhbXA6IGZ1bmN0aW9uIGNsYW1wKHgsIGxvd2VyLCB1cHBlcikge1xuICAgIHJldHVybiBNYXRoLm1pbih1cHBlciwgTWF0aC5tYXgobG93ZXIsIHgpKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IERFR19QRVJfUkFEOiBNYXRoLlBJIC8gMTgwIH0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBSQURfUEVSX0RFRyA9IDE4MCAvIE1hdGguUEk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfUEVSX0RFRztcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNjYWxlID0gcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpO1xudmFyIGZyb3VuZCA9IHJlcXVpcmUoJy4vX21hdGgtZnJvdW5kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnNjYWxlOiBmdW5jdGlvbiBmc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSB7XG4gICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpYWRkaDogZnVuY3Rpb24gaWFkZGgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGltdWxoOiBmdW5jdGlvbiBpbXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBSQURfUEVSX0RFRzogMTgwIC8gTWF0aC5QSSB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgREVHX1BFUl9SQUQgPSBNYXRoLlBJIC8gMTgwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHJhZGlhbnM6IGZ1bmN0aW9uIHJhZGlhbnMoZGVncmVlcykge1xuICAgIHJldHVybiBkZWdyZWVzICogREVHX1BFUl9SQUQ7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzY2FsZTogcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpIH0pO1xuIiwiLy8gaHR0cDovL2pmYmFzdGllbi5naXRodWIuaW8vcGFwZXJzL01hdGguc2lnbmJpdC5odG1sXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ25iaXQ6IGZ1bmN0aW9uIHNpZ25iaXQoeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSAhPSB4ID8geCA6IHggPT0gMCA/IDEgLyB4ID09IEluZmluaXR5IDogeCA+IDA7XG59IH0pO1xuIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdW11bGg6IGZ1bmN0aW9uIHVtdWxoKHUsIHYpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciAkdSA9ICt1O1xuICAgIHZhciAkdiA9ICt2O1xuICAgIHZhciB1MCA9ICR1ICYgVUlOVDE2O1xuICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2O1xuICAgIHZhciB1MSA9ICR1ID4+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+Pj4gMTY7XG4gICAgdmFyIHQgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4+IDE2KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4yIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBnZXQ6IGFGdW5jdGlvbihnZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcblxuLy8gQi4yLjIuMyBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKVxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XG4gIF9fZGVmaW5lU2V0dGVyX186IGZ1bmN0aW9uIF9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKSB7XG4gICAgJGRlZmluZVByb3BlcnR5LmYodG9PYmplY3QodGhpcyksIFAsIHsgc2V0OiBhRnVuY3Rpb24oc2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCkge1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4vX293bi1rZXlzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gICAgdmFyIGdldERlc2MgPSBnT1BELmY7XG4gICAgdmFyIGtleXMgPSBvd25LZXlzKE8pO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleSwgZGVzYztcbiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpKSB7XG4gICAgICBkZXNjID0gZ2V0RGVzYyhPLCBrZXkgPSBrZXlzW2krK10pO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNCBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwR2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cEdldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cEdldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELmdldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cFNldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cFNldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELnNldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgT0JTRVJWQUJMRSA9IHJlcXVpcmUoJy4vX3drcycpKCdvYnNlcnZhYmxlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgUkVUVVJOID0gZm9yT2YuUkVUVVJOO1xuXG52YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmbiA9PSBudWxsID8gdW5kZWZpbmVkIDogYUZ1bmN0aW9uKGZuKTtcbn07XG5cbnZhciBjbGVhbnVwU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICB2YXIgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fYztcbiAgaWYgKGNsZWFudXApIHtcbiAgICBzdWJzY3JpcHRpb24uX2MgPSB1bmRlZmluZWQ7XG4gICAgY2xlYW51cCgpO1xuICB9XG59O1xuXG52YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gc3Vic2NyaXB0aW9uLl9vID09PSB1bmRlZmluZWQ7XG59O1xuXG52YXIgY2xvc2VTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICB9XG59O1xuXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gIGFuT2JqZWN0KG9ic2VydmVyKTtcbiAgdGhpcy5fYyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fbyA9IG9ic2VydmVyO1xuICBvYnNlcnZlciA9IG5ldyBTdWJzY3JpcHRpb25PYnNlcnZlcih0aGlzKTtcbiAgdHJ5IHtcbiAgICB2YXIgY2xlYW51cCA9IHN1YnNjcmliZXIob2JzZXJ2ZXIpO1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBjbGVhbnVwO1xuICAgIGlmIChjbGVhbnVwICE9IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XG4gICAgICBlbHNlIGFGdW5jdGlvbihjbGVhbnVwKTtcbiAgICAgIHRoaXMuX2MgPSBjbGVhbnVwO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgIHJldHVybjtcbiAgfSBpZiAoc3Vic2NyaXB0aW9uQ2xvc2VkKHRoaXMpKSBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xufTtcblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHsgY2xvc2VTdWJzY3JpcHRpb24odGhpcyk7IH1cbn0pO1xuXG52YXIgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHRoaXMuX3MgPSBzdWJzY3JpcHRpb247XG59O1xuXG5TdWJzY3JpcHRpb25PYnNlcnZlci5wcm90b3R5cGUgPSByZWRlZmluZUFsbCh7fSwge1xuICBuZXh0OiBmdW5jdGlvbiBuZXh0KHZhbHVlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3M7XG4gICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIubmV4dCk7XG4gICAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlcnJvcjogZnVuY3Rpb24gZXJyb3IodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHRocm93IHZhbHVlO1xuICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLmVycm9yKTtcbiAgICAgIGlmICghbSkgdGhyb3cgdmFsdWU7XG4gICAgICB2YWx1ZSA9IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5jb21wbGV0ZSk7XG4gICAgICAgIHZhbHVlID0gbSA/IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG52YXIgJE9ic2VydmFibGUgPSBmdW5jdGlvbiBPYnNlcnZhYmxlKHN1YnNjcmliZXIpIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCAkT2JzZXJ2YWJsZSwgJ09ic2VydmFibGUnLCAnX2YnKS5fZiA9IGFGdW5jdGlvbihzdWJzY3JpYmVyKTtcbn07XG5cbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLnByb3RvdHlwZSwge1xuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG9ic2VydmVyLCB0aGlzLl9mKTtcbiAgfSxcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gbmV3IChjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFGdW5jdGlvbihmbik7XG4gICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhhdC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLCB7XG4gIGZyb206IGZ1bmN0aW9uIGZyb20oeCkge1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7XG4gICAgdmFyIG1ldGhvZCA9IGdldE1ldGhvZChhbk9iamVjdCh4KVtPQlNFUlZBQkxFXSk7XG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgdmFyIG9ic2VydmFibGUgPSBhbk9iamVjdChtZXRob2QuY2FsbCh4KSk7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQyA/IG9ic2VydmFibGUgOiBuZXcgQyhmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUuc3Vic2NyaWJlKG9ic2VydmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmb3JPZih4LCBmYWxzZSwgZnVuY3Rpb24gKGl0KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXQpO1xuICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIFJFVFVSTjtcbiAgICAgICAgICAgIH0pID09PSBSRVRVUk4pIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkb25lID0gdHJ1ZTsgfTtcbiAgICB9KTtcbiAgfSxcbiAgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aCwgaXRlbXMgPSBuZXcgQXJyYXkobCk7IGkgPCBsOykgaXRlbXNbaV0gPSBhcmd1bWVudHNbaSsrXTtcbiAgICByZXR1cm4gbmV3ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiAkT2JzZXJ2YWJsZSkoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tqXSk7XG4gICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkb25lID0gdHJ1ZTsgfTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbmhpZGUoJE9ic2VydmFibGUucHJvdG90eXBlLCBPQlNFUlZBQkxFLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHsgT2JzZXJ2YWJsZTogJE9ic2VydmFibGUgfSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ09ic2VydmFibGUnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtdHJ5XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUHJvbWlzZScsIHsgJ3RyeSc6IGZ1bmN0aW9uIChjYWxsYmFja2ZuKSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYodGhpcyk7XG4gIHZhciByZXN1bHQgPSBwZXJmb3JtKGNhbGxiYWNrZm4pO1xuICAocmVzdWx0LmUgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudik7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHsgZGVmaW5lTWV0YWRhdGE6IGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHRhcmdldEtleSkge1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gbWV0YWRhdGEubWFwO1xudmFyIHN0b3JlID0gbWV0YWRhdGEuc3RvcmU7XG5cbm1ldGFkYXRhLmV4cCh7IGRlbGV0ZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pO1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSwgZmFsc2UpO1xuICBpZiAobWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCB8fCAhbWV0YWRhdGFNYXBbJ2RlbGV0ZSddKG1ldGFkYXRhS2V5KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobWV0YWRhdGFNYXAuc2l6ZSkgcmV0dXJuIHRydWU7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICB0YXJnZXRNZXRhZGF0YVsnZGVsZXRlJ10odGFyZ2V0S2V5KTtcbiAgcmV0dXJuICEhdGFyZ2V0TWV0YWRhdGEuc2l6ZSB8fCBzdG9yZVsnZGVsZXRlJ10odGFyZ2V0KTtcbn0gfSk7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9lczYuc2V0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbnZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAoTywgUCkge1xuICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gb0tleXM7XG4gIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGdldE1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmdldDtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbnZhciBvcmRpbmFyeUdldE1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYgKGhhc093bikgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogdW5kZWZpbmVkO1xufTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0T3duTWV0YWRhdGE6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5SGFzTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IGZhbHNlO1xufTtcblxubWV0YWRhdGEuZXhwKHsgaGFzTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgaGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciAkbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvTWV0YUtleSA9ICRtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9ICRtZXRhZGF0YS5zZXQ7XG5cbiRtZXRhZGF0YS5leHAoeyBtZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIHRhcmdldEtleSkge1xuICAgIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoXG4gICAgICBtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSxcbiAgICAgICh0YXJnZXRLZXkgIT09IHVuZGVmaW5lZCA/IGFuT2JqZWN0IDogYUZ1bmN0aW9uKSh0YXJnZXQpLFxuICAgICAgdG9NZXRhS2V5KHRhcmdldEtleSlcbiAgICApO1xuICB9O1xufSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1NldCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0Lm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdTZXQnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnU2V0JywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBhdDogZnVuY3Rpb24gYXQocG9zKSB7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vU3RyaW5nLnByb3RvdHlwZS5tYXRjaEFsbC9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgZ2V0RmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyIFJlZ0V4cFByb3RvID0gUmVnRXhwLnByb3RvdHlwZTtcblxudmFyICRSZWdFeHBTdHJpbmdJdGVyYXRvciA9IGZ1bmN0aW9uIChyZWdleHAsIHN0cmluZykge1xuICB0aGlzLl9yID0gcmVnZXhwO1xuICB0aGlzLl9zID0gc3RyaW5nO1xufTtcblxucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKSgkUmVnRXhwU3RyaW5nSXRlcmF0b3IsICdSZWdFeHAgU3RyaW5nJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIG1hdGNoID0gdGhpcy5fci5leGVjKHRoaXMuX3MpO1xuICByZXR1cm4geyB2YWx1ZTogbWF0Y2gsIGRvbmU6IG1hdGNoID09PSBudWxsIH07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIG1hdGNoQWxsOiBmdW5jdGlvbiBtYXRjaEFsbChyZWdleHApIHtcbiAgICBkZWZpbmVkKHRoaXMpO1xuICAgIGlmICghaXNSZWdFeHAocmVnZXhwKSkgdGhyb3cgVHlwZUVycm9yKHJlZ2V4cCArICcgaXMgbm90IGEgcmVnZXhwIScpO1xuICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgIHZhciBmbGFncyA9ICdmbGFncycgaW4gUmVnRXhwUHJvdG8gPyBTdHJpbmcocmVnZXhwLmZsYWdzKSA6IGdldEZsYWdzLmNhbGwocmVnZXhwKTtcbiAgICB2YXIgcnggPSBuZXcgUmVnRXhwKHJlZ2V4cC5zb3VyY2UsIH5mbGFncy5pbmRleE9mKCdnJykgPyBmbGFncyA6ICdnJyArIGZsYWdzKTtcbiAgICByeC5sYXN0SW5kZXggPSB0b0xlbmd0aChyZWdleHAubGFzdEluZGV4KTtcbiAgICByZXR1cm4gbmV3ICRSZWdFeHBTdHJpbmdJdGVyYXRvcihyeCwgUyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhZCA9IHJlcXVpcmUoJy4vX3N0cmluZy1wYWQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODBcbnZhciBXRUJLSVRfQlVHID0gL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/KCBNb2JpbGVcXC9cXHcrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogV0VCS0lUX0JVRywgJ1N0cmluZycsIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFkID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIFdFQktJVF9CVUcgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBXRUJLSVRfQlVHLCAnU3RyaW5nJywge1xuICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltTGVmdCgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59LCAndHJpbVN0YXJ0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltUmlnaHQnLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1SaWdodCgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMik7XG4gIH07XG59LCAndHJpbUVuZCcpO1xuIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTeXN0ZW0nLCB7IGdsb2JhbDogcmVxdWlyZSgnLi9fZ2xvYmFsJykgfSk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnV2Vha01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha21hcC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnV2Vha01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha3NldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1dlYWtTZXQnKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1dlYWtTZXQnKTtcbiIsInZhciAkaXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLkFycmF5O1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBDU1NSdWxlTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IGZhbHNlLFxuICBDU1NWYWx1ZUxpc3Q6IGZhbHNlLFxuICBDbGllbnRSZWN0TGlzdDogZmFsc2UsXG4gIERPTVJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NU3RyaW5nTGlzdDogZmFsc2UsXG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IGZhbHNlLFxuICBGaWxlTGlzdDogZmFsc2UsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MRm9ybUVsZW1lbnQ6IGZhbHNlLFxuICBIVE1MU2VsZWN0RWxlbWVudDogZmFsc2UsXG4gIE1lZGlhTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIE1pbWVUeXBlQXJyYXk6IGZhbHNlLFxuICBOYW1lZE5vZGVNYXA6IGZhbHNlLFxuICBOb2RlTGlzdDogdHJ1ZSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogZmFsc2UsXG4gIFBsdWdpbjogZmFsc2UsXG4gIFBsdWdpbkFycmF5OiBmYWxzZSxcbiAgU1ZHTGVuZ3RoTGlzdDogZmFsc2UsXG4gIFNWR051bWJlckxpc3Q6IGZhbHNlLFxuICBTVkdQYXRoU2VnTGlzdDogZmFsc2UsXG4gIFNWR1BvaW50TGlzdDogZmFsc2UsXG4gIFNWR1N0cmluZ0xpc3Q6IGZhbHNlLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiBmYWxzZSxcbiAgU291cmNlQnVmZmVyTGlzdDogZmFsc2UsXG4gIFN0eWxlU2hlZXRMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgVGV4dFRyYWNrQ3VlTGlzdDogZmFsc2UsXG4gIFRleHRUcmFja0xpc3Q6IGZhbHNlLFxuICBUb3VjaExpc3Q6IGZhbHNlXG59O1xuXG5mb3IgKHZhciBjb2xsZWN0aW9ucyA9IGdldEtleXMoRE9NSXRlcmFibGVzKSwgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IGNvbGxlY3Rpb25zW2ldO1xuICB2YXIgZXhwbGljaXQgPSBET01JdGVyYWJsZXNbTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICB2YXIga2V5O1xuICBpZiAocHJvdG8pIHtcbiAgICBpZiAoIXByb3RvW0lURVJBVE9SXSkgaGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZiAoIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBpZiAoZXhwbGljaXQpIGZvciAoa2V5IGluICRpdGVyYXRvcnMpIGlmICghcHJvdG9ba2V5XSkgcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufVxuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CLCB7XG4gIHNldEltbWVkaWF0ZTogJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pO1xuIiwiLy8gaWU5LSBzZXRUaW1lb3V0ICYgc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciBNU0lFID0gL01TSUUgLlxcLi8udGVzdCh1c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChmbiwgdGltZSAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3MgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBmYWxzZTtcbiAgICByZXR1cm4gc2V0KGJvdW5kQXJncyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gOiBmbiwgdGltZSk7XG4gIH07XG59O1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIgKyAkZXhwb3J0LkYgKiBNU0lFLCB7XG4gIHNldFRpbWVvdXQ6IHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcbiIsInJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYWNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hc2luaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2JydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNsejMyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5pbXVsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2luaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50cnVuYycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5yYXcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJpZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGFsaWNzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5saW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zbWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdWInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN1cCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLm5vdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuam9pbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zbGljZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zb3J0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29tZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmhhcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuZmxhdHRlbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcuYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1zZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0LnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLXNldC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXAuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLW1hcC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstc2V0LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZ2xvYmFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5jbGFtcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmRlZy1wZXItcmFkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguZGVncmVlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlhZGRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaXN1YmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pbXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnJhZC1wZXItZGVnJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGgucmFkaWFucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGgudW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5zaWduYml0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hc2FwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9ic2VydmFibGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmltbWVkaWF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9tb2R1bGVzL19jb3JlJyk7XG4iLCIvKi
46184EgSGFtbWVyLkpTIC0gdjIuMC43IC0gMjAxNi0wNC0yMlxuICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyO1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCwgZXhwb3J0TmFtZSwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxudmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xudmFyIFRFU1RfRUxFTUVOVCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG52YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7XG5cbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgbm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogc2V0IGEgdGltZW91dCB3aXRoIGEgZ2l2ZW4gc2NvcGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gdGltZW91dFxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHNldFRpbWVvdXRDb250ZXh0KGZuLCB0aW1lb3V0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoYmluZEZuKGZuLCBjb250ZXh0KSwgdGltZW91dCk7XG59XG5cbi8qKlxuICogaWYgdGhlIGFyZ3VtZW50IGlzIGFuIGFycmF5LCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIGZuIG9uIGVhY2ggZW50cnlcbiAqIGlmIGl0IGFpbnQgYW4gYXJyYXkgd2UgZG9uJ3Qgd2FudCB0byBkbyBhIHRoaW5nLlxuICogdGhpcyBpcyB1c2VkIGJ5IGFsbCB0aGUgbWV0aG9kcyB0aGF0IGFjY2VwdCBhIHNpbmdsZSBhbmQgYXJyYXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp8QXJyYXl9IGFyZ1xuICogQHBhcmFtIHtTdHJpbmd9IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaW52b2tlQXJyYXlBcmcoYXJnLCBmbiwgY29udGV4dCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgZWFjaChhcmcsIGNvbnRleHRbZm5dLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiB3YWxrIG9iamVjdHMgYW5kIGFycmF5c1xuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIHZhciBpO1xuXG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvYmouZm9yRWFjaCkge1xuICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgfSBlbHNlIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgb2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICBvYmouaGFzT3duUHJvcGVydHkoaSkgJiYgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogd3JhcCBhIG1ldGhvZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgc3RhY2sgdHJhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uIHdyYXBwaW5nIHRoZSBzdXBwbGllZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGRlcHJlY2F0ZShtZXRob2QsIG5hbWUsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZGVwcmVjYXRpb25NZXNzYWdlID0gJ0RFUFJFQ0FURUQgTUVUSE9EOiAnICsgbmFtZSArICdcXG4nICsgbWVzc2FnZSArICcgQVQgXFxuJztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICAgICAgdmFyIHN0YWNrID0gZSAmJiBlLnN0YWNrID8gZS5zdGFjay5yZXBsYWNlKC9eW15cXChdKz9bXFxuJF0vZ20sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSwgJ3thbm9ueW1vdXN9KClAJykgOiAnVW5rbm93biBTdGFjayBUcmFjZSc7XG5cbiAgICAgICAgdmFyIGxvZyA9IHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS53YXJuIHx8IHdpbmRvdy5jb25zb2xlLmxvZyk7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICAgIGxvZy5jYWxsKHdpbmRvdy5jb25zb2xlLCBkZXByZWNhdGlvbk1lc3NhZ2UsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBleHRlbmQgb2JqZWN0LlxuICogbWVhbnMgdGh
46184hdCBwcm9wZXJ0aWVzIGluIGRlc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgb25lcyBpbiBzcmMuXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0c190b19hc3NpZ25cbiAqIEByZXR1cm5zIHtPYmplY3R9IHRhcmdldFxuICovXG52YXIgYXNzaWduO1xuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG59IGVsc2Uge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW21lcmdlPWZhbHNlXVxuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICovXG52YXIgZXh0ZW5kID0gZGVwcmVjYXRlKGZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMsIG1lcmdlKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcmMpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghbWVyZ2UgfHwgKG1lcmdlICYmIGRlc3Rba2V5c1tpXV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGRlc3Rba2V5c1tpXV0gPSBzcmNba2V5c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn0sICdleHRlbmQnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgdGhhdCBleGlzdCBpbiBkZXN0IHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNyY1xuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIG1lcmdlID0gZGVwcmVjYXRlKGZ1bmN0aW9uIG1lcmdlKGRlc3QsIHNyYykge1xuICAgIHJldHVybiBleHRlbmQoZGVzdCwgc3JjLCB0cnVlKTtcbn0sICdtZXJnZScsICdVc2UgYGFzc2lnbmAuJyk7XG5cbi8qKlxuICogc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaGlsZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYmFzZVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXVxuICovXG5mdW5jdGlvbiBpbmhlcml0KGNoaWxkLCBiYXNlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGJhc2VQID0gYmFzZS5wcm90b3R5cGUsXG4gICAgICAgIGNoaWxkUDtcblxuICAgIGNoaWxkUCA9IGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYmFzZVApO1xuICAgIGNoaWxkUC5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIGNoaWxkUC5fc3VwZXIgPSBiYXNlUDtcblxuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGFzc2lnbihjaGlsZFAsIHByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBzaW1wbGUgZnVuY3Rpb24gYmluZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGJpbmRGbihmbiwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBib3VuZEZuKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIGxldCBhIGJvb2xlYW4gdmFsdWUgYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgbXVzdCByZXR1cm4gYSBib29sZWFuXG4gKiB0aGlzIGZpcnN0IGl0ZW0gaW4gYXJncyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Qm9vbGVhbnxGdW5jdGlvbn0gdmFsXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnc11cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBib29sT3JGbih2YWwsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PSBUWVBFX0ZVTkNUSU9OKSB7XG4gICAgICAgIHJldHVybiB2YWwuYXBwbHkoYXJncyA/IGFyZ3NbMF0gfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiB1c2UgdGhlIHZhbDIgd2hlbiB2YWwxIGlzIHVuZGVmaW5lZFxuICogQHBhcmFtIHsqfSB2YWwxXG4gKiBAcGFyYW0geyp9IHZhbDJcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBpZlVuZGVmaW5lZCh2YWwxLCB2YWwyKSB7XG4gICAgcmV0dXJuICh2YWwxID09PSB1bmRlZmluZWQpID8gdmFsMiA6IHZhbDE7XG59XG5cbi8qKlxuICogYWRkRXZlbnRMaXN0ZW5lciB3aXRoIG11bHRpcGxlIGV2ZW50cyBhdCBvbmNlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICovXG5mdW5jdGlvbiBhZGR
46184FdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gKiBAbWV0aG9kIGhhc1BhcmVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogc21hbGwgaW5kZXhPZiB3cmFwcGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gZmluZFxuICogQHJldHVybnMge0Jvb2xlYW59IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGluU3RyKHN0ciwgZmluZCkge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xufVxuXG4vKipcbiAqIHNwbGl0IHN0cmluZyBvbiB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7QXJyYXl9IHdvcmRzXG4gKi9cbmZ1bmN0aW9uIHNwbGl0U3RyKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpLnNwbGl0KC9cXHMrL2cpO1xufVxuXG4vKipcbiAqIGZpbmQgaWYgYSBhcnJheSBjb250YWlucyB0aGUgb2JqZWN0IHVzaW5nIGluZGV4T2Ygb3IgYSBzaW1wbGUgcG9seUZpbGxcbiAqIEBwYXJhbSB7QXJyYXl9IHNyY1xuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmluZEJ5S2V5XVxuICogQHJldHVybiB7Qm9vbGVhbnxOdW1iZXJ9IGZhbHNlIHdoZW4gbm90IGZvdW5kLCBvciB0aGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICAgIGlmIChzcmMuaW5kZXhPZiAmJiAhZmluZEJ5S2V5KSB7XG4gICAgICAgIHJldHVybiBzcmMuaW5kZXhPZihmaW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2Y
46184XIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgc3JjLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCkgfHwgKCFmaW5kQnlLZXkgJiYgc3JjW2ldID09PSBmaW5kKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG59XG5cbi8qKlxuICogY29udmVydCBhcnJheS1saWtlIG9iamVjdHMgdG8gcmVhbCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwob2JqLCAwKTtcbn1cblxuLyoqXG4gKiB1bmlxdWUgYXJyYXkgd2l0aCBvYmplY3RzIGJhc2VkIG9uIGEga2V5IChsaWtlICdpZCcpIG9yIGp1c3QgYnkgdGhlIGFycmF5J3MgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IHNyYyBbe2lkOjF9LHtpZDoyfSx7aWQ6MX1dXG4gKiBAcGFyYW0ge1N0cmluZ30gW2tleV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NvcnQ9RmFsc2VdXG4gKiBAcmV0dXJucyB7QXJyYXl9IFt7aWQ6MX0se2lkOjJ9XVxuICovXG5mdW5jdGlvbiB1bmlxdWVBcnJheShzcmMsIGtleSwgc29ydCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgc3JjLmxlbmd0aCkge1xuICAgICAgICB2Y
46184XIgdmFsID0ga2V5ID8gc3JjW2ldW2tleV0gOiBzcmNbaV07XG4gICAgICAgIGlmIChpbkFycmF5KHZhbHVlcywgdmFsKSA8IDApIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzcmNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbDtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KGZ1bmN0aW9uIHNvcnRVbmlxdWVBcnJheShhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFba2V5XSA+IGJba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBwcmVmaXhlZCBwcm9wZXJ0eVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gKiBAcmV0dXJucyB7U3RyaW5nfFVuZGVmaW5lZH0gcHJlZml4ZWRcbiAqL1xuZnVuY3Rpb24gcHJlZml4ZWQob2JqLCBwcm9wZXJ0eSkge1xuICAgIHZhciBwcmVmaXgsIHByb3A7XG4gICAgdmFyIGNhbWVsUHJvcCA9IHByb3BlcnR5WzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICAgICAgcHJlZml4ID0gVkVORE9SX1BSRUZJWEVTW2ldO1xuICAgICAgICBwcm9wID0gKHByZWZpeCkgPyBwcmVmaXggKyBjYW1lbFByb3AgOiBwcm9wZXJ0eTtcblxuICAgICAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBnZXQgYSB1bmlxdWUgaWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHVuaXF1ZUlkXG4gKi9cbnZhciBfdW5pcXVlSWQgPSAxO1xuZnVuY3Rpb24gdW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIF91bmlxdWVJZCsrO1xufVxuXG4vKipcbiAqIGdldCB0aGUgd2luZG93IG9iamVjdCBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RG9jdW1lbnRWaWV3fFdpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93Rm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBlbGVtZW50O1xuICAgIHJldHVybiAoZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3cgfHwgd2luZG93KTtcbn1cblxudmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcblxudmFyIFNVUFBPUlRfVE9VQ0ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcbnZhciBTVVBQT1JUX1BPSU5URVJfRVZFTlRTID0gcHJlZml4ZWQod2luZG93LCAnUG9pbnRlckV2ZW50JykgIT09IHVuZGVmaW5lZDtcbnZhciBTVVBQT1JUX09OTFlfVE9VQ0ggPSBTVVBQT1JUX1RPVUNIICYmIE1PQklMRV9SRUdFWC50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG52YXIgSU5QVVRfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG52YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbnZhciBJTlBVVF9UWVBFX01PVVNFID0gJ21vdXNlJztcbnZhciBJTlBVVF9UWVBFX0tJTkVDVCA9ICdraW5lY3QnO1xuXG52YXIgQ09NUFVURV9JTlRFUlZBTCA9IDI1O1xuXG52YXIgSU5QVVRfU1RBUlQgPSAxO1xudmFyIElOUFVUX01PVkUgPSAyO1xudmFyIElOUFVUX0VORCA9IDQ7XG52YXIgSU5QVVRfQ0FOQ0VMID0gODtcblxudmFyIERJUkVDVElPTl9OT05FID0gMTtcbnZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG52YXIgRElSRUNUSU9OX1JJR0hUID0gNDtcbnZhciBESVJFQ1RJT05fVVAgPSA4O1xudmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG5cbnZhciBESVJFQ1RJT05fSE9SSVpPTlRBTCA9IERJUkVDVElPTl9MRUZUIHwgRElSRUNUSU9OX1JJR0hUO1xudmFyIERJUkVDVElPTl9WRVJUSUNBTCA9IERJUkVDVElPTl9VUCB8IERJUkVDVElPTl9ET1dOO1xudmFyIERJUkVDVElPTl9BTEwgPSBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTDtcblxudmFyIFBST1BTX1hZID0gWyd4JywgJ3knXTtcbnZhciBQUk9QU19DTElFTlRfWFkgPSBbJ2NsaWVudFgnLCAnY2xpZW50WSddO1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW5wdXQobWFuYWdlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5lbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbWFuYWdlci5vcHRpb25zLmlucHV0VGFyZ2V0O1xuXG4gICAgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuICAgIHRoaXMuZG9tSGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIGlmIChib29sT3JGbihtYW5hZ2VyLm9wdGlvbnMuZW5hYmxlLCBbbWFuYWdlcl0pKSB7XG4gICAgICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG59XG5cbklucHV0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSBpbnB1dEV2ZW50IGRhdGEgYW5kIHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHsgfSxcblxuICAgIC8qKlxuICAgICAqIGJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmV2RWwgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgI
46184HRoaXMuZXZUYXJnZXQgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZXaW4gJiYgYWRkRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZUYXJnZXQgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZXaW4gJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAqIGNhbGxlZCBieSB0aGUgTWFuYWdlciBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAqIEByZXR1cm5zIHtJbnB1dH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gICAgdmFyIFR5cGU7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRDbGFzcztcblxuICAgIGlmIChpbnB1dENsYXNzKSB7XG4gICAgICAgIFR5cGUgPSBpbnB1dENsYXNzO1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9QT0lOVEVSX0VWRU5UUykge1xuICAgICAgICBUeXBlID0gUG9pbnRlckV2ZW50SW5wdXQ7XG4gICAgfSBlbHNlIGlmIChTVVBQT1JUX09OTFlfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoSW5wdXQ7XG4gICAgfSBlbHNlIGlmICghU1VQUE9SVF9UT1VDSCkge1xuICAgICAgICBUeXBlID0gTW91c2VJbnB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBUeXBlID0gVG91Y2hNb3VzZUlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IChUeXBlKShtYW5hZ2VyLCBpbnB1dEhhbmRsZXIpO1xufVxuXG4vKipcbiAqIGhhbmRsZSBpbnB1dCBldmVudHNcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlucHV0SGFuZGxlcihtYW5hZ2VyLCBldmVudFR5cGUsIGlucHV0KSB7XG4gICAgdmFyIHBvaW50ZXJzTGVuID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoO1xuICAgIHZhciBjaGFuZ2VkUG9pbnRlcnNMZW4gPSBpbnB1dC5jaGFuZ2VkUG9pbnRlcnMubGVuZ3RoO1xuICAgIHZhciBpc0ZpcnN0ID0gKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIChwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMCkpO1xuICAgIHZhciBpc0ZpbmFsID0gKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIChwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMCkpO1xuXG4gICAgaW5wdXQuaXNGaXJzdCA9ICEhaXNGaXJzdDtcbiAgICBpbnB1dC5pc0ZpbmFsID0gISFpc0ZpbmFsO1xuXG4gICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgbWFuYWdlci5zZXNzaW9uID0ge307XG4gICAgfVxuXG4gICAgLy8gc291cmNlIGV2ZW50IGlzIHRoZSBub3JtYWxpemVkIHZhbHVlIG9mIHRoZSBkb21FdmVudHNcbiAgICAvLyBsaWtlICd0b3VjaHN0YXJ0LCBtb3VzZXVwLCBwb2ludGVyZG93bidcbiAgICBpbnB1dC5ldmVudFR5cGUgPSBldmVudFR5cGU7XG5cbiAgICAvLyBjb21wdXRlIHNjYWxlLCByb3RhdGlvbiBldGNcbiAgICBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KTtcblxuICAgIC8vIGVtaXQgc2VjcmV0IGV2ZW50XG4gICAgbWFuYWdlci5lbWl0KCdoYW1tZXIuaW5wdXQnLCBpbnB1dCk7XG5cbiAgICBtYW5hZ2VyLnJlY29nbml6ZShpbnB1dCk7XG4gICAgbWFuYWdlci5zZXNzaW9uLnByZXZJbnB1dCA9IGlucHV0O1xufVxuXG4vKipcbiAqIGV4dGVuZCB0aGUgZGF0YSB3aXRoIHNvbWUgdXNhYmxlIHByb3BlcnRpZXMgbGlrZSBzY2FsZSwgcm90YXRlLCB2ZWxvY2l0eSBldGNcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYW5hZ2VyXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCkge1xuICAgIHZhciBzZXNzaW9uID0gbWFuYWdlci5zZXNzaW9uO1xuICAgIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDtcblxuICAgIC8vIHN0b3JlIHRoZSBmaXJzdCBpbnB1dCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGFuZCBkaXJlY3Rpb25cbiAgICBpZiAoIXNlc3Npb24uZmlyc3RJbnB1dCkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0SW5wdXQgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gdG8gY29tcHV0ZSBzY2FsZSBhbmQgcm90YXRpb24gd2UgbmVlZCB0byBzdG9yZSB0aGUgbXVsdGlwbGUgdG91Y2hlc1xuICAgIGlmIChwb2ludGVyc0xlbmd0aCA+IDEgJiYgIXNlc3Npb24uZmlyc3RNdWx0aXBsZSkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RJbnB1dCA9IHNlc3Npb24uZmlyc3RJbnB1dDtcbiAgICB2YXIgZmlyc3RNdWx0aXBsZSA9IHNlc3Npb24uZmlyc3RNdWx0aXBsZTtcbiAgICB2YXIgb2Zmc2V0Q2VudGVyID0gZmlyc3RNdWx0aXBsZSA/IGZpcnN0TXVsdGlwbGUuY2VudGVyIDogZmlyc3RJbnB1dC5jZW50ZXI7XG5cbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyID0gZ2V0Q2VudGVyKHBvaW50ZXJzKTtcbiAgICBpbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICBpbnB1dC5kZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBmaXJzdElucHV0LnRpbWVTdGFtcDtcblxuICAgIGlucHV0LmFuZ2xlID0gZ2V0QW5nbGUob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGlucHV0LmRpc3RhbmNlID0gZ2V0RGlzdGFuY2Uob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuXG4gICAgY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpO1xuICAgIGlucHV0Lm9mZnNldERpcmVjdGlvbiA9IGdldERpcmVjdGlvbihpbnB1dC5kZWx0YVgsIGlucHV0LmRlbHRhWSk7XG5cbiAgICB2YXIgb3ZlcmFsbFZlbG9jaXR5ID0gZ2V0VmVsb2NpdHkoaW5wdXQuZGVsdGFUaW1lLCBpbnB1dC5kZWx0YVgsIGlucHV0LmRlbHRhWSk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WCA9IG92ZXJhbGxWZWxvY2l0eS54O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVkgPSBvdmVyYWxsVmVsb2NpdHkueTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHkgPSAoYWJzKG92ZXJhbGxWZWxvY2l0eS54KSA+IGFicyhvdmVyYWxsVmVsb2NpdHkueSkpID8gb3ZlcmFsbFZlbG9jaXR5LnggOiBvdmVyYWxsVmVsb2NpdHkueTtcblxuICAgIGlucHV0LnNjYWxlID0gZmlyc3RNdWx0aXBsZSA/IGdldFNjYWxlKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDE7XG4gICAgaW5wdXQucm90YXRpb24gPSBmaXJzdE11bHRpcGxlID8gZ2V0Um90YXRpb24oZmlyc3RNdWx0aXBsZS5wb2ludGVycywgcG9pbnRlcnMpIDogMDtcblxuICAgIGlucHV0Lm1heFBvaW50ZXJzID0gIXNlc3Npb24ucHJldklucHV0ID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogKChpbnB1dC5wb2ludGVycy5sZW5ndGggPlxuICAgICAgICBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycykgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycyk7XG5cbiAgICBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpO1xuXG4gICAgLy8gZmluZCB0aGUgY29ycmVjdCB0YXJnZXRcbiAgICB2YXIgdGFyZ2V0ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmIChoYXNQYXJlbnQoaW5wdXQuc3JjRXZlbnQudGFyZ2V0LCB0YXJnZXQpKSB7XG4gICAgICAgI
46184HRhcmdldCA9IGlucHV0LnNyY0V2ZW50LnRhcmdldDtcbiAgICB9XG4gICAgaW5wdXQudGFyZ2V0ID0gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG4gICAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2SW5wdXQgPSBzZXNzaW9uLnByZXZJbnB1dCB8fCB7fTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgICAgICBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSA9IHtcbiAgICAgICAgICAgIHg6IHByZXZJbnB1dC5kZWx0YVggfHwgMCxcbiAgICAgICAgICAgIHk6IHByZXZJbnB1dC5kZWx0YVkgfHwgMFxuICAgICAgICB9O1xuXG4gICAgICAgIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBjZW50ZXIueCxcbiAgICAgICAgICAgIHk6IGNlbnRlci55XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaW5wdXQuZGVsdGFYID0gcHJldkRlbHRhLnggKyAoY2VudGVyLnggLSBvZmZzZXQueCk7XG4gICAgaW5wdXQuZGVsdGFZID0gcHJldkRlbHRhLnkgKyAoY2VudGVyLnkgLSBvZmZzZXQueSk7XG59XG5cbi8qKlxuICogdmVsb2NpdHkgaXMgY2FsY3VsYXRlZCBldmVyeSB4IG1zXG4gKiBAcGFyYW0ge09iamVjdH0gc2Vzc2lvblxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBsYXN0ID0gc2Vzc2lvbi5sYXN0SW50ZXJ2YWwgfHwgaW5wdXQsXG4gICAgICAgIGRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGxhc3QudGltZVN0YW1wLFxuICAgICAgICB2ZWxvY2l0eSwgdmVsb2NpdHlYLCB2ZWxvY2l0eVksIGRpcmVjdGlvbjtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfQ0FOQ0VMICYmIChkZWx0YVRpbWUgPiBDT01QVVRFX0lOVEVSVkFMIHx8IGxhc3QudmVsb2NpdHkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdmFyIGRlbHRhWCA9IGlucHV0LmRlbHRhWCAtIGxhc3QuZGVsdGFYO1xuICAgICAgICB2Y
46184XIgZGVsdGFZID0gaW5wdXQuZGVsdGFZIC0gbGFzdC5kZWx0YVk7XG5cbiAgICAgICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgdmVsb2NpdHlYID0gdi54O1xuICAgICAgICB2ZWxvY2l0eVkgPSB2Lnk7XG4gICAgICAgIHZlbG9jaXR5ID0gKGFicyh2LngpID4gYWJzKHYueSkpID8gdi54IDogdi55O1xuICAgICAgICBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAgIHNlc3Npb24ubGFzdEludGVydmFsID0gaW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGxhdGVzdCB2ZWxvY2l0eSBpbmZvIGlmIGl0IGRvZXNuJ3Qgb3ZlcnRha2UgYSBtaW5pbXVtIHBlcmlvZFxuICAgICAgICB2ZWxvY2l0eSA9IGxhc3QudmVsb2NpdHk7XG4gICAgICAgIHZlbG9jaXR5WCA9IGxhc3QudmVsb2NpdHlYO1xuICAgICAgICB2ZWxvY2l0eVkgPSBsYXN0LnZlbG9jaXR5WTtcbiAgICAgICAgZGlyZWN0aW9uID0gbGFzdC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaW5wdXQudmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICBpbnB1dC52ZWxvY2l0eVggPSB2ZWxvY2l0eVg7XG4gICAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBjcmVhdGUgYSBzaW1wbGUgY2xvbmUgZnJvbSB0aGUgaW5wdXQgdXNlZCBmb3Igc3RvcmFnZSBvZiBmaXJzdElucHV0IGFuZCBmaXJzdE11bHRpcGxlXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IGNsb25lZElucHV0RGF0YVxuICovXG5mdW5jdGlvbiBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCkge1xuICAgIC8vIG1ha2UgYSBzaW1wbGUgY29weSBvZiB0aGUgcG9pbnRlcnMgYmVjYXVzZSB3ZSB3aWxsIGdldCBhIHJlZmVyZW5jZSBpZiB3ZSBkb24ndFxuICAgIC8vIHdlIG9ubHkgbmVlZCBjbGllbnRYWSBmb3IgdGhlIGNhbGN1bGF0aW9uc1xuICAgIHZhciBwb2ludGVycyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgICBwb2ludGVyc1tpXSA9IHtcbiAgICAgICAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgICAgICAgY2xpZW50WTogcm91bmQoaW5wdXQucG9pbnRlcnNbaV0uY2xpZW50WSlcbiAgICAgICAgfTtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVTdGFtcDogbm93KCksXG4gICAgICAgIHBvaW50ZXJzOiBwb2ludGVycyxcbiAgICAgICAgY2VudGVyOiBnZXRDZW50ZXIocG9pbnRlcnMpLFxuICAgICAgICBkZWx0YVg6IGlucHV0LmRlbHRhWCxcbiAgICAgICAgZGVsdGFZOiBpbnB1dC5kZWx0YVlcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgY2VudGVyIG9mIGFsbCB0aGUgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtPYmplY3R9IGNlbnRlciBjb250YWlucyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldENlbnRlcihwb2ludGVycykge1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDtcblxuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRYKSxcbiAgICAgICAgICAgIHk6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHggPSAwLCB5ID0gMCwgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBwb2ludGVyc0xlbmd0aCkge1xuICAgICAgICB4ICs9IHBvaW50ZXJzW2ldLmNsaWVudFg7XG4gICAgICAgIHkgKz0gcG9pbnRlcnNbaV0uY2xpZW50WTtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJvdW5kKHggLyBwb2ludGVyc0xlbmd0aCksXG4gICAgICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgICB9O1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICovXG5mdW5jdGlvbiBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIHgsIHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgICAgIHk6IHkgLyBkZWx0YVRpbWUgfHwgMFxuICAgIH07XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkaXJlY3Rpb24gYmV0d2VlbiB0d28gcG9pbnRzXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge051bWJlcn0gZGlyZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdGlvbih4LCB5KSB7XG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgICAgcmV0dXJuIERJUkVDVElPTl9OT05FO1xuICAgIH1cblxuICAgIGlmIChhYnMoeCkgPj0gYWJzKHkpKSB7XG4gICAgICAgIHJldHVybiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4geSA8IDAgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtPYmplY3R9IHAxIHt4LCB5fVxuICogQHBhcmFtIHtPYmplY3R9IHAyIHt4LCB5fVxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBkaXN0YW5jZVxuICovXG5mdW5jdGlvbiBnZXREaXN0YW5jZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcblxuICAgI
46184HJldHVybiBNYXRoLnNxcnQoKHggKiB4KSArICh5ICogeSkpO1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgYW5nbGUgYmV0d2VlbiB0d28gY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMVxuICogQHBhcmFtIHtPYmplY3R9IHAyXG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHNdIGNvbnRhaW5pbmcgeCBhbmQgeSBrZXlzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gKi9cbmZ1bmN0aW9uIGdldEFuZ2xlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHJvdGF0aW9uIGRlZ3JlZXMgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEByZXR1cm4ge051bWJlcn0gcm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXRBbmdsZShlbmRbMV0sIGVuZFswXSwgUFJPUFNfQ0xJRU5UX1hZKSArIGdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHNjYWxlIGZhY3RvciBiZXR3ZWVuIHR3byBwb2ludGVyc2V0c1xuICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gKi9cbmZ1bmN0aW9uIGdldFNjYWxlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UoZW5kWzBdLCBlbmRbMV0sIFBST1BTX0NMSUVOVF9YWSkgLyBnZXREaXN0YW5jZShzdGFydFswXSwgc3RhcnRbMV0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbnZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gICAgbW91c2Vkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gICAgbW91c2V1cDogSU5QVVRfRU5EXG59O1xuXG52YXIgTU9VU0VfRUxFTUVOVF9FVkVOVFMgPSAnbW91c2Vkb3duJztcbnZhciBNT1VTRV9XSU5ET1dfRVZFTlRTID0gJ21vdXNlbW92ZSBtb3VzZXVwJztcblxuLyoqXG4gKiBNb3VzZSBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gTW91c2VJbnB1dCgpIHtcbiAgICB0aGlzLmV2RWwgPSBNT1VTRV9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gTU9VU0VfV0lORE9XX0VWRU5UUztcblxuICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlOyAvLyBtb3VzZWRvd24gc3RhdGVcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTUVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBNT1VTRV9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICAgICAgLy8gb24gc3RhcnQgd2Ugd2FudCB0byBoYXZlIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCAhPT0gMSkge1xuICAgICAgICAgICAgZXZlbnRUeXBlID0gSU5QVVRfRU5EO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbW91c2UgbXVzdCBiZSBkb3duXG4gICAgICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbnZhciBQT0lOVEVSX0lOUFVUX01BUCA9IHtcbiAgICBwb2ludGVyZG93bjogSU5QVVRfU1RBUlQsXG4gICAgcG9pbnRlcm1vdmU6IElOUFVUX01PVkUsXG4gICAgcG9pbnRlcnVwOiBJTlBVVF9FTkQsXG4gICAgcG9pbnRlcmNhbmNlbDogSU5QVVRfQ0FOQ0VMLFxuICAgIHBvaW50ZXJvdXQ6IElOUFVUX0NBTkNFTFxufTtcblxuLy8gaW4gSUUxMCB0aGUgcG9pbnRlciB0eXBlcyBpcyBkZWZpbmVkIGFzIGFuIGVudW1cbnZhciBJRTEwX1BPSU5URVJfVFlQRV9FTlVNID0ge1xuICAgIDI6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgMzogSU5QVVRfVFlQRV9QRU4sXG4gICAgNDogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICA1OiBJTlBVVF9UWVBFX0tJTkVDVCAvLyBzZWUgaHR0cHM6Ly90d2l0dGVyLmNvbS9qYWNvYnJvc3NpL3N0YXR1cy80ODA1OTY0Mzg0ODk4OTA4MTZcbn07XG5cbnZhciBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTID0gJ3BvaW50ZXJkb3duJztcbnZhciBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAncG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwnO1xuXG4vLyBJRTEwIGhhcyBwcmVmaXhlZCBzdXBwb3J0LCBhbmQgY2FzZS1zZW5zaXRpdmVcbmlmICh3aW5kb3cuTVNQb2ludGVyRXZlbnQgJiYgIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHtcbiAgICBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTID0gJ01TUG9pbnRlckRvd24nO1xuICAgIFBPSU5URVJfV0lORE9XX0VWRU5UUyA9ICdNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCc7XG59XG5cbi8qKlxuICogUG9pbnRlciBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gUE9JTlRFUl9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgI
46184HRoaXMuc3RvcmUgPSAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cyA9IFtdKTtcbn1cblxuaW5oZXJpdChQb2ludGVyRXZlbnRJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gUEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciBzdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgICAgIHZhciByZW1vdmVQb2ludGVyID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGV2ZW50VHlwZU5vcm1hbGl6ZWQgPSBldi50eXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnbXMnLCAnJyk7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICAgICAgdmFyIHBvaW50ZXJUeXBlID0gSUUxMF9QT0lOVEVSX1RZUEVfRU5VTVtldi5wb2ludGVyVHlwZV0gfHwgZXYucG9pbnRlclR5cGU7XG5cbiAgICAgICAgdmFyIGlzVG91Y2ggPSAocG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCk7XG5cbiAgICAgICAgLy8gZ2V0IGluZGV4IG9mIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgdmFyIHN0b3JlSW5kZXggPSBpbkFycmF5KHN0b3JlLCBldi5wb2ludGVySWQsICdwb2ludGVySWQnKTtcblxuICAgICAgICAvLyBzdGFydCBhbmQgbW91c2UgbXVzdCBiZSBkb3duXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAoZXYuYnV0dG9uID09PSAwIHx8IGlzVG91Y2gpKSB7XG4gICAgICAgICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXNoKGV2KTtcbiAgICAgICAgICAgICAgICBzdG9yZUluZGV4ID0gc3RvcmUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgcmVtb3ZlUG9pbnRlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcbiAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuICAgICAgICBzdG9yZVtzdG9yZUluZGV4XSA9IGV2O1xuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBwb2ludGVyVHlwZSxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVtb3ZlUG9pbnRlcikge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIHN0b3JlXG4gICAgICAgICAgICBzdG9yZS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxudmFyIFNJTkdMRV9UT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxufTtcblxudmFyIFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQnO1xudmFyIFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBUb3VjaCBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gU2luZ2xlVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTO1xuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChTaW5nbGVUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRFaGFuZGxlcihldikge1xuICAgICAgICB2Y
46184XIgdHlwZSA9IFNJTkdMRV9UT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICAgICAgLy8gc2hvdWxkIHdlIGhhbmRsZSB0aGUgdG91Y2ggZXZlbnRzP1xuICAgICAgICBpZiAodHlwZSA9PT0gSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdWNoZXMgPSBub3JtYWxpemVTaW5nbGVUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuXG4gICAgICAgIC8vIHdoZW4gZG9uZSwgcmVzZXQgdGhlIHN0YXJ0ZWQgc3RhdGVcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiB0b3VjaGVzWzBdLmxlbmd0aCAtIHRvdWNoZXNbMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaW5nbGVUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbCA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gICAgdmFyIGNoYW5nZWQgPSB0b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKTtcblxuICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgYWxsID0gdW5pcXVlQXJyYXkoYWxsLmNvbmNhdChjaGFuZ2VkKSwgJ2lkZW50aWZpZXInLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2FsbCwgY2hhbmdlZF07XG59XG5cbnZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxufTtcblxudmFyIFRPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwnO1xuXG4vKipcbiAqIE11bHRpLXVzZXIgdG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFRPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgdGhpcy50YXJnZXRJZHMgPSB7fTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBNVEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciB0eXBlID0gVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuICAgICAgICB2Y
46184XIgdG91Y2hlcyA9IGdldFRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG4gICAgICAgIGlmICghdG91Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIHR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiB0b3VjaGVzWzFdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQHRoaXMge1RvdWNoSW5wdXR9XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR8QXJyYXl9IFthbGwsIGNoYW5nZWRdXG4gKi9cbmZ1bmN0aW9uIGdldFRvdWNoZXMoZXYsIHR5cGUpIHtcbiAgICB2YXIgYWxsVG91Y2hlcyA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gICAgdmFyIHRhcmdldElkcyA9IHRoaXMudGFyZ2V0SWRzO1xuXG4gICAgLy8gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSB0b3VjaCwgdGhlIHByb2Nlc3MgY2FuIGJlIHNpbXBsaWZpZWRcbiAgICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRhcmdldElkc1thbGxUb3VjaGVzWzBdLmlkZW50aWZpZXJdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFthbGxUb3VjaGVzLCBhbGxUb3VjaGVzXTtcbiAgICB9XG5cbiAgICB2YXIgaSxcbiAgICAgICAgdGFyZ2V0VG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXMgPSB0b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKSxcbiAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMgPSBbXSxcbiAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG5cbiAgICAvLyBnZXQgdGFyZ2V0IHRvdWNoZXMgZnJvbSB0b3VjaGVzXG4gICAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIHJldHVybiBoYXNQYXJlbnQodG91Y2gudGFyZ2V0LCB0YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgLy8gY29sbGVjdCB0b3VjaGVzXG4gICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHRhcmdldFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgY2hhbmdlZCB0b3VjaGVzIHRvIG9ubHkgY29udGFpbiB0b3VjaGVzIHRoYXQgZXhpc3QgaW4gdGhlIGNvbGxlY3RlZCB0YXJnZXQgaWRzXG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBjaGFuZ2VkVG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMucHVzaChjaGFuZ2VkVG91Y2hlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhbnVwIHJlbW92ZWQgdG91Y2hlc1xuICAgICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0SWRzW2NoYW5nZWRUb3VjaGVzW2ldLmlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWRUYXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgLy8gbWVyZ2UgdGFyZ2V0VG91Y2hlcyB3aXRoIGNoYW5nZWRUYXJnZXRUb3VjaGVzIHNvIGl0IGNvbnRhaW5zIEFMTCB0b3VjaGVzLCBpbmNsdWRpbmcgJ2VuZCcgYW5kICdjYW5jZWwnXG4gICAgICAgIHVuaXF1ZUFycmF5KHRhcmdldFRvdWNoZXMuY29uY2F0KGNoYW5nZWRUYXJnZXRUb3VjaGVzKSwgJ2lkZW50aWZpZXInLCB0cnVlKSxcbiAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXNcbiAgICBdO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHRvdWNoIGFuZCBtb3VzZSBpbnB1dFxuICpcbiAqIFRvdWNoIGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGVuIG1vdXNlLCBhbmQgd2hpbGUgdG91Y2hpbmcgbm8gbW91c2UgZXZlbnRzIGFyZSBhbGxvd2VkLlxuICogVGhpcyBiZWNhdXNlIHRvdWNoIGRldmljZXMgYWxzbyBlbWl0IG1vdXNlIGV2ZW50cyB3aGlsZSBkb2luZyBhIHRvdWNoLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuXG52YXIgREVEVVBfVElNRU9VVCA9IDI1MDA7XG52YXIgREVEVVBfRElTVEFOQ0UgPSAyNTtcblxuZnVuY3Rpb24gVG91Y2hNb3VzZUlucHV0KCkge1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgaGFuZGxlciA9IGJpbmRGbih0aGlzLmhhbmRsZXIsIHRoaXMpO1xuICAgIHRoaXMudG91Y2ggPSBuZXcgVG91Y2hJbnB1dCh0aGlzLm1hbmFnZXIsIGhhbmRsZXIpO1xuICAgIHRoaXMubW91c2UgPSBuZXcgTW91c2VJbnB1dCh0aGlzLm1hbmFnZXIsIGhhbmRsZXIpO1xuXG4gICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgIHRoaXMubGFzdFRvdWNoZXMgPSBbXTtcbn1cblxuaW5oZXJpdChUb3VjaE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGFuZCB0b3VjaCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0hhbW1lcn0gbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dEV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRNRWhhbmRsZXIobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBpc1RvdWNoID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIKSxcbiAgICAgICAgICAgIGlzTW91c2UgPSAoaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfTU9VU0UpO1xuXG4gICAgICAgIGlmIChpc01vdXNlICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgI
46184H1cblxuICAgICAgICAvLyB3aGVuIHdlJ3JlIGluIGEgdG91Y2ggZXZlbnQsIHJlY29yZCB0b3VjaGVzIHRvICBkZS1kdXBlIHN5bnRoZXRpYyBtb3VzZSBldmVudFxuICAgICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgcmVjb3JkVG91Y2hlcy5jYWxsKHRoaXMsIGlucHV0RXZlbnQsIGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgaW5wdXREYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayhtYW5hZ2VyLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG91Y2guZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcbiAgICB9XG59KTtcblxuZnVuY3Rpb24gcmVjb3JkVG91Y2hlcyhldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkge1xuICAgICAgICB0aGlzLnByaW1hcnlUb3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRMYXN0VG91Y2goZXZlbnREYXRhKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXTtcblxuICAgIGlmICh0b3VjaC5pZGVudGlmaWVyID09PSB0aGlzLnByaW1hcnlUb3VjaCkge1xuICAgICAgICB2Y
46184XIgbGFzdFRvdWNoID0ge3g6IHRvdWNoLmNsaWVudFgsIHk6IHRvdWNoLmNsaWVudFl9O1xuICAgICAgICB0aGlzLmxhc3RUb3VjaGVzLnB1c2gobGFzdFRvdWNoKTtcbiAgICAgICAgdmFyIGx0cyA9IHRoaXMubGFzdFRvdWNoZXM7XG4gICAgICAgIHZhciByZW1vdmVMYXN0VG91Y2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBpID0gbHRzLmluZGV4T2YobGFzdFRvdWNoKTtcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KGV2ZW50RGF0YSkge1xuICAgIHZhciB4ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFgsIHkgPSBldmVudERhdGEuc3JjRXZlbnQuY2xpZW50WTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmxhc3RUb3VjaGVzW2ldO1xuICAgICAgICB2YXIgZHggPSBNYXRoLmFicyh4IC0gdC54KSwgZHkgPSBNYXRoLmFicyh5IC0gdC55KTtcbiAgICAgICAgaWYgKGR4IDw9IERFRFVQX0RJU1RBTkNFICYmIGR5IDw9IERFRFVQX0RJU1RBTkNFKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gPSBwcmVmaXhlZChURVNUX0VMRU1FTlQuc3R5bGUsICd0b3VjaEFjdGlvbicpO1xudmFyIE5BVElWRV9UT1VDSF9BQ1RJT04gPSBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gIT09IHVuZGVmaW5lZDtcblxuLy8gbWFnaWNhbCB0b3VjaEFjdGlvbiB2YWx1ZVxudmFyIFRPVUNIX0FDVElPTl9DT01QVVRFID0gJ2NvbXB1dGUnO1xudmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xudmFyIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT04gPSAnbWFuaXB1bGF0aW9uJzsgLy8gbm90IGltcGxlbWVudGVkXG52YXIgVE9VQ0hfQUNUSU9OX05PTkUgPSAnbm9uZSc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9YID0gJ3Bhbi14JztcbnZhciBUT1VDSF9BQ1RJT05fUEFOX1kgPSAncGFuLXknO1xudmFyIFRPVUNIX0FDVElPTl9NQVAgPSBnZXRUb3VjaEFjdGlvblByb3BzKCk7XG5cbi8qKlxuICogVG91Y2ggQWN0aW9uXG4gKiBzZXRzIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBvciB1c2VzIHRoZSBqcyBhbHRlcm5hdGl2ZVxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUb3VjaEFjdGlvbihtYW5hZ2VyLCB2YWx1ZSkge1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5zZXQodmFsdWUpO1xufVxuXG5Ub3VjaEFjdGlvbi5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IHRoZSB0b3VjaEFjdGlvbiB2YWx1ZSBvbiB0aGUgZWxlbWVudCBvciBlbmFibGUgdGhlIHBvbHlmaWxsXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBmaW5kIG91dCB0aGUgdG91Y2gtYWN0aW9uIGJ5IHRoZSBldmVudCBoYW5kbGVyc1xuICAgICAgICBpZiAodmFsdWUgPT0gVE9VQ0hfQUNUSU9OX0NPTVBVVEUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGVbUFJFRklYRURfVE9VQ0hfQUNUSU9OXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBqdXN0IHJlLXNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNldCh0aGlzLm1hbmFnZXIub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNvbXB1dGUgdGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgYmFzZWQgb24gdGhlIHJlY29nbml6ZXIncyBzZXR0aW5nc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgY29tcHV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhY3Rpb25zID0gW107XG4gICAgICAgIGVhY2godGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLCBmdW5jdGlvbihyZWNvZ25pemVyKSB7XG4gICAgICAgICAgICBpZiAoYm9vbE9yRm4ocmVjb2duaXplci5vcHRpb25zLmVuYWJsZSwgW3JlY29nbml6ZXJdKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMuam9pbignICcpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGVhY2ggaW5wdXQgY3ljbGUgYW5kIHByb3ZpZGVzIHRoZSBwcmV2ZW50aW5nIG9mIHRoZSBicm93c2VyIGJlaGF2aW9yXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHRzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2Y
46184XIgc3JjRXZlbnQgPSBpbnB1dC5zcmNFdmVudDtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGlucHV0Lm9mZnNldERpcmVjdGlvbjtcblxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggYWN0aW9uIGRpZCBwcmV2ZW50ZWQgb25jZSB0aGlzIHNlc3Npb25cbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZCkge1xuICAgICAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgICAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgICAgIHZhciBoYXNQYW5ZID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9ZKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1ldO1xuICAgICAgICB2YXIgaGFzUGFuWCA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWCkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9YXTtcblxuICAgICAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgICAgICAgLy9kbyBub3QgcHJldmVudCBkZWZhdWx0cyBpZiB0aGlzIGlzIGEgdGFwIGdlc3R1cmVcblxuICAgICAgICAgICAgdmFyIGlzVGFwUG9pbnRlciA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIHZhciBpc1RhcE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCAyO1xuICAgICAgICAgICAgdmFyIGlzVGFwVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgMjUwO1xuXG4gICAgICAgICAgICBpZiAoaXNUYXBQb2ludGVyICYmIGlzVGFwTW92ZW1lbnQgJiYgaXNUYXBUb3VjaFRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgICAgICAvLyBgcGFuLXggcGFuLXlgIG1lYW5zIGJyb3dzZXIgaGFuZGxlcyBhbGwgc2Nyb2xsaW5nL3Bhbm5pbmcsIGRvIG5vdCBwcmV2ZW50XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzTm9uZSB8fFxuICAgICAgICAgICAgKGhhc1BhblkgJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHx8XG4gICAgICAgICAgICAoaGFzUGFuWCAmJiBkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2ZW50U3JjKHNyY0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yIChzY3JvbGxpbmcgaW4gbW9zdCBjYXNlcylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICAgKi9cbiAgICBwcmV2ZW50U3JjOiBmdW5jdGlvbihzcmNFdmVudCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn07XG5cbi8qKlxuICogd2hlbiB0aGUgdG91Y2hBY3Rpb25zIGFyZSBjb2xsZWN0ZWQgdGhleSBhcmUgbm90IGEgdmFsaWQgdmFsdWUsIHNvIHdlIG5lZWQgdG8gY2xlYW4gdGhpbmdzIHVwLiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uc1xuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICAvLyBub25lXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgIHZhciBoYXNQYW5ZID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcblxuICAgIC8vIGlmIGJvdGggcGFuLXggYW5kIHBhbi15IGFyZSBzZXQgKGRpZmZlcmVudCByZWNvZ25pemVyc1xuICAgIC8vIGZvciBkaWZmZXJlbnQgZGlyZWN0aW9ucywgZS5nLiBob3Jpem9udGFsIHBhbiBidXQgdmVydGljYWwgc3dpcGU/KVxuICAgIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAgIC8vIHJlY29nbml6ZXJzIHdpbGwgd29yaywgc2luY2UgdGhlIGJyb3dzZXIgd291bGQgaGFuZGxlIGFsbCBwYW5uaW5nXG4gICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgLy8gcGFuLXggT1IgcGFuLXlcbiAgICBpZiAoaGFzUGFuWCB8fCBoYXNQYW5ZKSB7XG4gICAgICAgIHJldHVybiBoYXNQYW5YID8gVE9VQ0hfQUNUSU9OX1BBTl9YIDogVE9VQ0hfQUNUSU9OX1BBTl9ZO1xuICAgIH1cblxuICAgIC8vIG1hbmlwdWxhdGlvblxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OKSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTjtcbiAgICB9XG5cbiAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX0FVVE87XG59XG5cbmZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uUHJvcHMoKSB7XG4gICAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHRvdWNoTWFwID0ge307XG4gICAgdmFyIGNzc1N1cHBvcnRzID0gd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLnN1cHBvcnRzO1xuICAgIFsnYXV0bycsICdtYW5pcHVsYXRpb24nLCAncGFuLXknLCAncGFuLXgnLCAncGFuLXggcGFuLXknLCAnbm9uZSddLmZvckVhY2goZnVuY3Rpb24odmFsKSB7XG5cbiAgICAgICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgICAgIC8vIGFsbCB2YWx1ZXMuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIElFIDEwIGFuZCAxMS5cbiAgICAgICAgdG91Y2hNYXBbdmFsXSA9IGNzc1N1cHBvcnRzID8gd2luZG93LkNTUy5zdXBwb3J0cygndG91Y2gtYWN0aW9uJywgdmFsKSA6IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdWNoTWFwO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZXIgZmxvdyBleHBsYWluZWQ7ICpcbiAqIEFsbCByZWNvZ25pemVycyBoYXZlIHRoZSBpbml0aWFsIHN0YXRlIG9mI
46184FBPU1NJQkxFIHdoZW4gYSBpbnB1dCBzZXNzaW9uIHN0YXJ0cy5cbiAqIFRoZSBkZWZpbml0aW9uIG9mIGEgaW5wdXQgc2Vzc2lvbiBpcyBmcm9tIHRoZSBmaXJzdCBpbnB1dCB1bnRpbCB0aGUgbGFzdCBpbnB1dCwgd2l0aCBhbGwgaXQncyBtb3ZlbWVudCBpbiBpdC4gKlxuICogRXhhbXBsZSBzZXNzaW9uIGZvciBtb3VzZS1pbnB1dDogbW91c2Vkb3duIC0+IG1vdXNlbW92ZSAtPiBtb3VzZXVwXG4gKlxuICogT24gZWFjaCByZWNvZ25pemluZyBjeWNsZSAoc2VlIE1hbmFnZXIucmVjb2duaXplKSB0aGUgLnJlY29nbml6ZSgpIG1ldGhvZCBpcyBleGVjdXRlZFxuICogd2hpY2ggZGV0ZXJtaW5lcyB3aXRoIHN0YXRlIGl0IHNob3VsZCBiZS5cbiAqXG4gKiBJZiB0aGUgcmVjb2duaXplciBoYXMgdGhlIHN0YXRlIEZBSUxFRCwgQ0FOQ0VMTEVEIG9yIFJFQ09HTklaRUQgKGVxdWFscyBFTkRFRCksIGl0IGlzIHJlc2V0IHRvXG4gKiBQT1NTSUJMRSB0byBnaXZlIGl0IGFub3RoZXIgY2hhbmdlIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICpcbiAqICAgICAgICAgICAgICAgUG9zc2libGVcbiAqICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tK1xuICogICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICArLS0tLS0rLS0tLS0rICAgICAgICAgICAgICAgfFxuICogICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgfFxuICogICBGYWlsZWQgICAgICBDYW5jZWxsZWQgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLStcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pemVkICAgICAgIEJlZ2FuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRlZC9SZWNvZ25pemVkXG4gKi9cbnZhciBTVEFURV9QT1NTSUJMRSA9IDE7XG52YXIgU1RBVEVfQkVHQU4gPSAyO1xudmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xudmFyIFNUQVRFX0VOREVEID0gODtcbnZhciBTVEFURV9SRUNPR05JWkVEID0gU1RBVEVfRU5ERUQ7XG52YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG52YXIgU1RBVEVfRkFJTEVEID0gMzI7XG5cbi8qKlxuICogUmVjb2duaXplclxuICogRXZlcnkgcmVjb2duaXplciBuZWVkcyB0byBleHRlbmQgZnJvbSB0aGlzIGNsYXNzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBSZWNvZ25pemVyKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5pZCA9IHVuaXF1ZUlkKCk7XG5cbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xuXG4gICAgLy8gZGVmYXVsdCBpcyBlbmFibGUgdHJ1ZVxuICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBpZlVuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW5hYmxlLCB0cnVlKTtcblxuICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QT1NTSUJMRTtcblxuICAgIHRoaXMuc2ltdWx0YW5lb3VzID0ge307XG4gICAgdGhpcy5yZXF1aXJlRmFpbCA9IFtdO1xufVxuXG5SZWNvZ25pemVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgZGVmYXVsdHM6IHt9LFxuXG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge1JlY29nbml6ZXJ9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGFsc28gdXBkYXRlIHRoZSB0b3VjaEFjdGlvbiwgaW4gY2FzZSBzb21ldGhpbmcgY2hhbmdlZCBhYm91dCB0aGUgZGlyZWN0aW9ucy9lbmFibGVkIHN0YXRlXG4gICAgICAgIHRoaXMubWFuYWdlciAmJiB0aGlzLm1hbmFnZXIudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgcmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZWNvZ25pemVXaXRoJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpbXVsdGFuZW91cyA9IHRoaXMuc2ltdWx0YW5lb3VzO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGlmICghc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF0pIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdID0gb3RoZXJSZWNvZ25pemVyO1xuICAgICAgICAgICAgb3RoZXJSZWNvZ25pemVyLnJlY29nbml6ZVdpdGgodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHNpbXVsdGFuZW91cyBsaW5rLiBpdCBkb2VzbnQgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdkcm9wUmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgICAgI
46184HJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZWNvZ25pemVyIGNhbiBvbmx5IHJ1biB3aGVuIGFuIG90aGVyIGlzIGZhaWxpbmdcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgcmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVxdWlyZUZhaWx1cmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGlmIChpbkFycmF5KHJlcXVpcmVGYWlsLCBvdGhlclJlY29nbml6ZXIpID09PSAtMSkge1xuICAgICAgICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICAgICAgb3RoZXJSZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSByZXF1aXJlRmFpbHVyZSBsaW5rLiBpdCBkb2VzIG5vdCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdkcm9wUmVxdWlyZUZhaWx1cmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIHZhciBpbmRleCA9IGluQXJyYXkodGhpcy5yZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaGFzIHJlcXVpcmUgZmFpbHVyZXMgYm9vbGVhblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1JlcXVpcmVGYWlsdXJlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlmIHRoZSByZWNvZ25pemVyIGNhbiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFlvdSBzaG91bGQgdXNlIGB0cnlFbWl0YCBpbnN0ZWFkIG9mIGBlbWl0YCBkaXJlY3RseSB0byBjaGVja1xuICAgICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2Y
46184XIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYubWFuYWdlci5lbWl0KGV2ZW50LCBpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAncGFuc3RhcnQnIGFuZCAncGFubW92ZSdcbiAgICAgICAgaWYgKHN0YXRlIDwgU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgICAgIGlmIChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpIHsgLy8gYWRkaXRpb25hbCBldmVudChwYW5sZWZ0LCBwYW5yaWdodCwgcGluY2hpbiwgcGluY2hvdXQuLi4pXG4gICAgICAgICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYW5lbmQgYW5kIHBhbmNhbmNlbFxuICAgICAgICBpZiAoc3RhdGUgPj0gU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IGFsbCB0aGUgcmVxdWlyZSBmYWlsdXJlIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQsXG4gICAgICogaWYgdHJ1ZSwgaXQgZW1pdHMgYSBnZXN0dXJlIGV2ZW50LFxuICAgICAqIG90aGVyd2lzZSwgc2V0dXAgdGhlIHN0YXRlIHRvIEZBSUxFRC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKi9cbiAgICB0cnlFbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5jYW5FbWl0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGl0J3MgZmFpbGluZyBhbnl3YXlcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FuIHdlIGVtaXQ/XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuRW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5yZXF1aXJlRmFpbFtpXS5zdGF0ZSAmIChTVEFURV9GQUlMRUQgfCBTVEFURV9QT1NTSUJMRSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbihpbnB1dERhdGEpIHtcbiAgICAgICAgLy8gbWFrZSBhIG5ldyBjb3B5IG9mIHRoZSBpbnB1dERhdGFcbiAgICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgaW5wdXREYXRhIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgb3RoZXIgcmVjb2duaXplcnNcbiAgICAgICAgdmFyIGlucHV0RGF0YUNsb25lID0gYXNzaWduKHt9LCBpbnB1dERhdGEpO1xuXG4gICAgICAgIC8vIGlzIGlzIGVuYWJsZWQgYW5kIGFsbG93IHJlY29nbml6aW5nP1xuICAgICAgICBpZiAoIWJvb2xPckZuKHRoaXMub3B0aW9ucy5lbmFibGUsIFt0aGlzLCBpbnB1dERhdGFDbG9uZV0pKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfUkVDT0dOSVpFRCB8IFNUQVRFX0NBTkNFTExFRCB8IFNUQVRFX0ZBSUxFRCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QT1NTSUJMRTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnByb2Nlc3MoaW5wdXREYXRhQ2xvbmUpO1xuXG4gICAgICAgIC8vIHRoZSByZWNvZ25pemVyIGhhcyByZWNvZ25pemVkIGEgZ2VzdHVyZVxuICAgICAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEIHwgU1RBVEVfQ0FOQ0VMTEVEKSkge1xuICAgICAgICAgICAgdGhpcy50cnlFbWl0KGlucHV0RGF0YUNsb25lKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWNvZ25pemVyXG4gICAgICogdGhlIGFjdHVhbCByZWNvZ25pemluZyBoYXBwZW5zIGluIHRoaXMgbWV0aG9kXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICogQHJldHVybnMge0NvbnN0fSBTVEFURVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0RGF0YSkgeyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcHJlZmVycmVkIHRvdWNoLWFjdGlvblxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHsgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbGxlZCB3aGVuIHRoZSBnZXN0dXJlIGlzbid0IGFsbG93ZWQgdG8gcmVjb2duaXplXG4gICAgICogbGlrZSB3aGVuIGFub3RoZXIgaXMgYmVpbmcgcmVjb2duaXplZCBvciBpdCBpcyBkaXNhYmxlZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeyB9XG59O1xuXG4vKipcbiAqIGdldCBhIHVzYWJsZSBzdHJpbmcsIHVzZWQgYXMgZXZlbnQgcG9zdGZpeFxuICogQHBhcmFtIHtDb25zdH0gc3RhdGVcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlICYgU1RBVEVfQ0FOQ0VMTEVEKSB7XG4gICAgICAgI
46184HJldHVybiAnY2FuY2VsJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgcmV0dXJuICdlbmQnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9DSEFOR0VEKSB7XG4gICAgICAgIHJldHVybiAnbW92ZSc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0JFR0FOKSB7XG4gICAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogZGlyZWN0aW9uIGNvbnMgdG8gc3RyaW5nXG4gKiBAcGFyYW0ge0NvbnN0fSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGRpcmVjdGlvblN0cihkaXJlY3Rpb24pIHtcbiAgICBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9ET1dOKSB7XG4gICAgICAgIHJldHVybiAnZG93bic7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1VQKSB7XG4gICAgICAgIHJldHVybiAndXAnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1JJR0hUKSB7XG4gICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogZ2V0IGEgcmVjb2duaXplciBieSBuYW1lIGlmIGl0IGlzIGJvdW5kIHRvIGEgbWFuYWdlclxuICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gb3RoZXJSZWNvZ25pemVyXG4gKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAqIEByZXR1cm5zIHtSZWNvZ25pemVyfVxuICovXG5mdW5jdGlvbiBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgcmVjb2duaXplcikge1xuICAgIHZhciBtYW5hZ2VyID0gcmVjb2duaXplci5tYW5hZ2VyO1xuICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmdldChvdGhlclJlY29nbml6ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xufVxuXG4vKipcbiAqIFRoaXMgcmVjb2duaXplciBpcyBqdXN0IHVzZWQgYXMgYSBiYXNlIGZvciB0aGUgc2ltcGxlIGF0dHJpYnV0ZSByZWNvZ25pemVycy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBBdHRyUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoQXR0clJlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgaXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZXMgdmFsaWQgaW5wdXQsIGxpa2UgaW5wdXQuZGlzdGFuY2UgPiAxMC5cbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gcmVjb2duaXplZFxuICAgICAqL1xuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2Y
46184XIgb3B0aW9uUG9pbnRlcnMgPSB0aGlzLm9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHJldHVybiBvcHRpb25Qb2ludGVycyA9PT0gMCB8fCBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvblBvaW50ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gaW5wdXQuZXZlbnRUeXBlO1xuXG4gICAgICAgIHZhciBpc1JlY29nbml6ZWQgPSBzdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQpO1xuICAgICAgICB2YXIgaXNWYWxpZCA9IHRoaXMuYXR0clRlc3QoaW5wdXQpO1xuXG4gICAgICAgIC8vIG9uIGNhbmNlbCBpbnB1dCBhbmQgd2UndmUgcmVjb2duaXplZCBiZWZvcmUsIHJldHVybiBTVEFURV9DQU5DRUxMRURcbiAgICAgICAgaWYgKGlzUmVjb2duaXplZCAmJiAoZXZlbnRUeXBlICYgSU5QVVRfQ0FOQ0VMIHx8ICFpc1ZhbGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0FOQ0VMTEVEO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUmVjb2duaXplZCB8fCBpc1ZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfRU5ERUQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGFuXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG93biBhbmQgbW92ZWQgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQYW5SZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnBYID0gbnVsbDtcbiAgICB0aGlzLnBZID0gbnVsbDtcbn1cblxuaW5oZXJpdChQYW5SZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGFuUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncGFuJyxcbiAgICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0FMTFxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgICAgICB2Y
46184XIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1kpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25zO1xuICAgIH0sXG5cbiAgICBkaXJlY3Rpb25UZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdmFyIGhhc01vdmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gaW5wdXQuZGlzdGFuY2U7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5kaXJlY3Rpb247XG4gICAgICAgIHZhciB4ID0gaW5wdXQuZGVsdGFYO1xuICAgICAgICB2YXIgeSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICAvLyBsb2NrIHRvIGF4aXM/XG4gICAgICAgIGlmICghKGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeCA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh4IDwgMCkgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHggIT0gdGhpcy5wWDtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICh5ID09PSAwKSA/IERJUkVDVElPTl9OT05FIDogKHkgPCAwKSA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICAgICAgICAgICAgICAgIGhhc01vdmVkID0geSAhPSB0aGlzLnBZO1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQuZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgIHJldHVybiBoYXNNb3ZlZCAmJiBkaXN0YW5jZSA+IG9wdGlvbnMudGhyZXNob2xkICYmIGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIEF0dHJSZWNvZ25pemVyLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTiB8fCAoISh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pICYmIHRoaXMuZGlyZWN0aW9uVGVzdChpbnB1dCkpKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcblxuICAgICAgICB0aGlzLnBYID0gaW5wdXQuZGVsdGFYO1xuICAgICAgICB0aGlzLnBZID0gaW5wdXQuZGVsdGFZO1xuXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQuZGlyZWN0aW9uKTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQaW5jaFxuICogUmVjb2duaXplZCB3aGVuIHR3byBvciBtb3JlIHBvaW50ZXJzIGFyZSBtb3ZpbmcgdG93YXJkICh6b29tLWluKSBvciBhd2F5IGZyb20gZWFjaCBvdGhlciAoem9vbS1vdXQpLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQaW5jaFJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChQaW5jaFJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BpbmNoJyxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBwb2ludGVyczogMlxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAoTWF0aC5hYnMoaW5wdXQuc2NhbGUgLSAxKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0LnNjYWxlICE9PSAxKSB7XG4gICAgICAgICAgICB2Y
46184XIgaW5PdXQgPSBpbnB1dC5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCc7XG4gICAgICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFByZXNzXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG93biBmb3IgeCBtcyB3aXRob3V0IGFueSBtb3ZlbWVudC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQcmVzc1JlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbn1cblxuaW5oZXJpdChQcmVzc1JlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFByZXNzUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncHJlc3MnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGltZTogMjUxLCAvLyBtaW5pbWFsIHRpbWUgb2YgdGhlIHBvaW50ZXIgdG8gYmUgcHJlc3NlZFxuICAgICAgICB0aHJlc2hvbGQ6IDkgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9BVVRPXTtcbiAgICB9LFxuXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2Y
46184XIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPiBvcHRpb25zLnRpbWU7XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcblxuICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGxpdHRsZSBtb3ZlbWVudFxuICAgICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG4gICAgICAgIGlmICghdmFsaWRNb3ZlbWVudCB8fCAhdmFsaWRQb2ludGVycyB8fCAoaW5wdXQuZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgIXZhbGlkVGltZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgICAgIH0sIG9wdGlvbnMudGltZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXQgJiYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkpIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArICd1cCcsIGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLyoqXG4gKiBSb3RhdGVcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVyIGFyZSBtb3ZpbmcgaW4gYSBjaXJjdWxhciBtb3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFJvdGF0ZVJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChSb3RhdGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUm90YXRlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncm90YXRlJyxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBwb2ludGVyczogMlxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAoTWF0aC5hYnMoaW5wdXQucm90YXRpb24pID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFN3aXBlXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92aW5nIGZhc3QgKHZlbG9jaXR5KSwgd2l0aCBlbm91Z2ggZGlzdGFuY2UgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBTd2lwZVJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChTd2lwZVJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBTd2lwZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgICAgdmVsb2NpdHk6IDAuMyxcbiAgICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTC
46184xcbiAgICAgICAgcG9pbnRlcnM6IDFcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgdmVsb2NpdHk7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIChESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCkpIHtcbiAgICAgICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5O1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgIGRpcmVjdGlvbiAmIGlucHV0Lm9mZnNldERpcmVjdGlvbiAmJlxuICAgICAgICAgICAgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmXG4gICAgICAgICAgICBpbnB1dC5tYXhQb2ludGVycyA9PSB0aGlzLm9wdGlvbnMucG9pbnRlcnMgJiZcbiAgICAgICAgICAgIGFicyh2ZWxvY2l0eSkgPiB0aGlzLm9wdGlvbnMudmVsb2NpdHkgJiYgaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2Y
46184XIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0Lm9mZnNldERpcmVjdGlvbik7XG4gICAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArIGRpcmVjdGlvbiwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQSB0YXAgaXMgZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG9pbmcgYSBzbWFsbCB0YXAvY2xpY2suIE11bHRpcGxlIHRhcHMgYXJlIHJlY29nbml6ZWQgaWYgdGhleSBvY2N1clxuICogYmV0d2VlbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIHBvc2l0aW9uLiBUaGUgZGVsYXkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSBtdWx0aS10YXBzIHdpdGhvdXQgZmlyaW5nXG4gKiBhIHNpbmdsZSB0YXAuXG4gKlxuICogVGhlIGV2ZW50RGF0YSBmcm9tIHRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBgdGFwQ291bnRgLCB3aGljaCBjb250YWlucyB0aGUgYW1vdW50IG9mXG4gKiBtdWx0aS10YXBzIGJlaW5nIHJlY29nbml6ZWQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gVGFwUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBwcmV2aW91cyB0aW1lIGFuZCBjZW50ZXIsXG4gICAgLy8gdXNlZCBmb3IgdGFwIGNvdW50aW5nXG4gICAgdGhpcy5wVGltZSA9IGZhbHNlO1xuICAgIHRoaXMucENlbnRlciA9IGZhbHNlO1xuXG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgICB0aGlzLmNvdW50ID0gMDtcbn1cblxuaW5oZXJpdChUYXBSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3RhcCcsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICB0YXBzOiAxLFxuICAgICAgICBpbnRlcnZhbDogMzAwLCAvLyBtYXggdGltZSBiZXR3ZWVuIHRoZSBtdWx0aS10YXAgdGFwc1xuICAgICAgICB0aW1lOiAyNTAsIC8vIG1heCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIGRvd24gKGxpa2UgZmluZ2VyIG9uIHRoZSBzY3JlZW4pXG4gICAgICAgIHRocmVzaG9sZDogOSwgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICAgICAgcG9zVGhyZXNob2xkOiAxMCAvLyBhIG11bHRpLXRhcCBjYW4gYmUgYSBiaXQgb2ZmIHRoZSBpbml0aWFsIHBvc2l0aW9uXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OXTtcbiAgICB9LFxuXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgdmFyIHZhbGlkUG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgICAgdmFyIHZhbGlkVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgICBpZiAoKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUKSAmJiAodGhpcy5jb3VudCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGxpdHRsZSBtb3ZlbWVudFxuICAgICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG4gICAgICAgIGlmICh2YWxpZE1vdmVtZW50ICYmIHZhbGlkVG91Y2hUaW1lICYmIHZhbGlkUG9pbnRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbGlkSW50ZXJ2YWwgPSB0aGlzLnBUaW1lID8gKGlucHV0LnRpbWVTdGFtcCAtIHRoaXMucFRpbWUgPCBvcHRpb25zLmludGVydmFsKSA6IHRydWU7XG4gICAgICAgICAgICB2Y
46184XIgdmFsaWRNdWx0aVRhcCA9ICF0aGlzLnBDZW50ZXIgfHwgZ2V0RGlzdGFuY2UodGhpcy5wQ2VudGVyLCBpbnB1dC5jZW50ZXIpIDwgb3B0aW9ucy5wb3NUaHJlc2hvbGQ7XG5cbiAgICAgICAgICAgIHRoaXMucFRpbWUgPSBpbnB1dC50aW1lU3RhbXA7XG4gICAgICAgICAgICB0aGlzLnBDZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG5cbiAgICAgICAgICAgIGlmICghdmFsaWRNdWx0aVRhcCB8fCAhdmFsaWRJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgICAgIC8vIGlmIHRhcCBjb3VudCBtYXRjaGVzIHdlIGhhdmUgcmVjb2duaXplZCBpdCxcbiAgICAgICAgICAgIC8vIGVsc2UgaXQgaGFzIGJlZ2FuIHJlY29nbml6aW5nLi4uXG4gICAgICAgICAgICB2YXIgdGFwQ291bnQgPSB0aGlzLmNvdW50ICUgb3B0aW9ucy50YXBzO1xuICAgICAgICAgICAgaWYgKHRhcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZmFpbGluZyByZXF1aXJlbWVudHMsIGltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIHRhcCBldmVudFxuICAgICAgICAgICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgb3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgZmFpbFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgfSwgdGhpcy5vcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXQudGFwQ291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLyoqXG4gKiBTaW1wbGUgd2F5IHRvIGNyZWF0ZSBhIG1hbmFnZXIgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHJlY29nbml6ZXJzLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEhhbW1lcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZWNvZ25pemVycyA9IGlmVW5kZWZpbmVkKG9wdGlvbnMucmVjb2duaXplcnMsIEhhbW1lci5kZWZhdWx0cy5wcmVzZXQpO1xuICAgIHJldHVybiBuZXcgTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAY29uc3Qge3N0cmluZ31cbiAqL1xuSGFtbWVyLlZFUlNJT04gPSAnMi4wLjcnO1xuXG4vKipcbiAqIGRlZmF1bHQgc2V0dGluZ3NcbiAqIEBuYW1lc3BhY2VcbiAqL1xuSGFtbWVyLmRlZmF1bHRzID0ge1xuICAgIC8qKlxuICAgICAqIHNldCBpZiBET00gZXZlbnRzIGFyZSBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQnV0IHRoaXMgaXMgc2xvd2VyIGFuZCB1bnVzZWQgYnkgc2ltcGxlIGltcGxlbWVudGF0aW9ucywgc28gZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIGRvbUV2ZW50czogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eS9mYWxsYmFjay5cbiAgICAgKiBXaGVuIHNldCB0byBgY29tcHV0ZWAgaXQgd2lsbCBtYWdpY2FsbHkgc2V0IHRoZSBjb3JyZWN0IHZhbHVlIGJhc2VkIG9uIHRoZSBhZGRlZCByZWNvZ25pemVycy5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqIEBkZWZhdWx0IGNvbXB1dGVcbiAgICAgKi9cbiAgICB0b3VjaEFjdGlvbjogVE9VQ0hfQUNUSU9OX0NPTVBVVEUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogRVhQRVJJTUVOVEFMIEZFQVRVUkUgLS0gY2FuIGJlIHJlbW92ZWQvY2hhbmdlZFxuICAgICAqIENoYW5nZSB0aGUgcGFyZW50IGlucHV0IHRhcmdldCBlbGVtZW50LlxuICAgICAqIElmIE51bGwsIHRoZW4gaXQgaXMgYmVpbmcgc2V0IHRoZSB0byBtYWluIGVsZW1lbnQuXG4gICAgICogQHR5cGUge051bGx8RXZlbnRUYXJnZXR9XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0VGFyZ2V0OiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogZm9yY2UgYW4gaW5wdXQgY2xhc3NcbiAgICAgKiBAdHlwZSB7TnVsbHxGdW5jdGlvbn1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRDbGFzczogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcmVjb2duaXplciBzZXR1cCB3aGVuIGNhbGxpbmcgYEhhbW1lcigpYFxuICAgICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlciB0aGVzZSB3aWxsIGJlIHNraXBwZWQuXG4gICAgICogQHR5cGUge0FycmF5fVxuICAgICAqL1xuICAgIHByZXNldDogW1xuICAgICAgICAvLyBSZWNvZ25pemVyQ2xhc3MsIG9wdGlvbnMsIFtyZWNvZ25pemVXaXRoLCAuLi5dLCBbcmVxdWlyZUZhaWx1cmUsIC4uLl1cbiAgICAgICAgW1JvdGF0ZVJlY29nbml6ZXIsIHtlbmFibGU6IGZhbHNlfV0sXG4gICAgICAgIFtQaW5jaFJlY29nbml6ZXIsIHtlbmFibGU6IGZhbHNlfSwgWydyb3RhdGUnXV0sXG4gICAgICAgIFtTd2lwZVJlY29nbml6ZXIsIHtkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMfV0sXG4gICAgICAgIFtQYW5SZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH0sIFsnc3dpcGUnXV0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyXSxcbiAgICAgICAgW1RhcFJlY29nbml6ZXIsIHtldmVudDogJ2RvdWJsZXRhcCcsIHRhcHM6IDJ9LCBbJ3RhcCddXSxcbiAgICAgICAgW1ByZXNzUmVjb2duaXplcl1cbiAgICBdLFxuXG4gICAgLyoqXG4gICAgICogU29tZSBDU1MgcHJv
46184cGVydGllcyBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSB3b3JraW5nIG9mIEhhbW1lci5cbiAgICAgKiBBZGQgdGhlbSB0byB0aGlzIG1ldGhvZCBhbmQgdGhleSB3aWxsIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIuXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqL1xuICAgIGNzc1Byb3BzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyB0ZXh0IHNlbGVjdGlvbiB0byBpbXByb3ZlIHRoZSBkcmFnZ2luZyBnZXN0dXJlLiBNYWlubHkgZm9yIGRlc2t0b3AgYnJvd3NlcnMuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlIHRoZSBXaW5kb3dzIFBob25lIGdyaXBwZXJzIHdoZW4gcHJlc3NpbmcgYW4gZWxlbWVudC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB0b3VjaFNlbGVjdDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyB0aGUgZGVmYXVsdCBjYWxsb3V0IHNob3duIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0LlxuICAgICAgICAgKiBPbiBpT1MsIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0IHN1Y2ggYXMgYSBsaW5rLCBTYWZhcmkgZGlzcGxheXNcbiAgICAgICAgICogYSBjYWxsb3V0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmsuIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHRoYXQgY2FsbG91dC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB0b3VjaENhbGxvdXQ6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLiBVc2VkIGJ5IElFMTA+XG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgY29udGVudFpvb21pbmc6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJEcmFnOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE92ZXJyaWRlcyB0aGUgaGlnaGxpZ2h0IGNvbG9yIHNob3duIHdoZW4gdGhlIHVzZXIgdGFwcyBhIGxpbmsgb3IgYSBKYXZhU2NyaXB0XG4gICAgICAgICAqIGNsaWNrYWJsZSBlbGVtZW50IGluIGlPUy4gVGhpcyBwcm9wZXJ0eSBvYmV5cyB0aGUgYWxwaGEgdmFsdWUsIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ3JnYmEoMCwwLDAsMCknXG4gICAgICAgICAqL1xuICAgICAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwwLDAsMCknXG4gICAgfVxufTtcblxudmFyIFNUT1AgPSAxO1xudmFyIEZPUkNFRF9TVE9QID0gMjtcblxuLyoqXG4gKiBNYW5hZ2VyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBIYW1tZXIuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgdGhpcy5yZWNvZ25pemVycyA9IFtdO1xuICAgIHRoaXMub2xkQ3NzUHJvcHMgPSB7fTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5pbnB1dCA9IGNyZWF0ZUlucHV0SW5zdGFuY2UodGhpcyk7XG4gICAgdGhpcy50b3VjaEFjdGlvbiA9IG5ldyBUb3VjaEFjdGlvbih0aGlzLCB0aGlzLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuXG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG5cbiAgICBlYWNoKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2Y
46184XIgcmVjb2duaXplciA9IHRoaXMuYWRkKG5ldyAoaXRlbVswXSkoaXRlbVsxXSkpO1xuICAgICAgICBpdGVtWzJdICYmIHJlY29nbml6ZXIucmVjb2duaXplV2l0aChpdGVtWzJdKTtcbiAgICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xufVxuXG5NYW5hZ2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIE9wdGlvbnMgdGhhdCBuZWVkIGEgbGl0dGxlIG1vcmUgc2V0dXBcbiAgICAgICAgaWYgKG9wdGlvbnMudG91Y2hBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5wdXRUYXJnZXQpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQudGFyZ2V0ID0gb3B0aW9ucy5pbnB1dFRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBzdG9wIHJlY29nbml6aW5nIGZvciB0aGlzIHNlc3Npb24uXG4gICAgICogVGhpcyBzZXNzaW9uIHdpbGwgYmUgZGlzY2FyZGVkLCB3aGVuIGEgbmV3IFtpbnB1dF1zdGFydCBldmVudCBpcyBmaXJlZC5cbiAgICAgKiBXaGVuIGZvcmNlZCwgdGhlIHJlY29nbml6ZXIgY3ljbGUgaXMgc3RvcHBlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtmb3JjZV1cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbihmb3JjZSkge1xuICAgICAgICB0aGlzLnNlc3Npb24uc3RvcHBlZCA9IGZvcmNlID8gRk9SQ0VEX1NUT1AgOiBTVE9QO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBydW4gdGhlIHJlY29nbml6ZXJzIVxuICAgICAqIGNhbGxlZCBieSB0aGUgaW5wdXRIYW5kbGVyIGZ1bmN0aW9uIG9uIGV2ZXJ5IG1vdmVtZW50IG9mIHRoZSBwb2ludGVycyAodG91Y2hlcylcbiAgICAgKiBpdCB3YWxrcyB0aHJvdWdoIGFsbCB0aGUgcmVjb2duaXplcnMgYW5kIHRyaWVzIHRvIGRldGVjdCB0aGUgZ2VzdHVyZSB0aGF0IGlzIGJlaW5nIG1hZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbihpbnB1dERhdGEpIHtcbiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247XG4gICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJ1biB0aGUgdG91Y2gtYWN0aW9uIHBvbHlmaWxsXG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGlucHV0RGF0YSk7XG5cbiAgICAgICAgdmFyIHJlY29nbml6ZXI7XG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG5cbiAgICAgICAgLy8gdGhpcyBob2xkcyB0aGUgcmVjb2duaXplciB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgIC8vIHNvIHRoZSByZWNvZ25pemVyJ3Mgc3RhdGUgbmVlZHMgdG8gYmUgQkVHQU4sIENIQU5HRUQsIEVOREVEIG9yIFJFQ09HTklaRURcbiAgICAgICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuICAgICAgICB2Y
46184XIgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplcjtcblxuICAgICAgICAvLyByZXNldCB3aGVuIHRoZSBsYXN0IHJlY29nbml6ZXIgaXMgcmVjb2duaXplZFxuICAgICAgICAvLyBvciB3aGVuIHdlJ3JlIGluIGEgbmV3IHNlc3Npb25cbiAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyIHx8IChjdXJSZWNvZ25pemVyICYmIGN1clJlY29nbml6ZXIuc3RhdGUgJiBTVEFURV9SRUNPR05JWkVEKSkge1xuICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgcmVjb2duaXplcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07XG5cbiAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgICAgICAgIC8vIDEuICAgYWxsb3cgaWYgdGhlIHNlc3Npb24gaXMgTk9UIGZvcmNlZCBzdG9wcGVkIChzZWUgdGhlIC5zdG9wKCkgbWV0aG9kKVxuICAgICAgICAgICAgLy8gMi4gICBhbGxvdyBpZiB3ZSBzdGlsbCBoYXZlbid0IHJlY29nbml6ZWQgYSBnZXN0dXJlIGluIHRoaXMgc2Vzc2lvbiwgb3IgdGhlIHRoaXMgcmVjb2duaXplciBpcyB0aGUgb25lXG4gICAgICAgICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgICAgIC8vIDMuICAgYWxsb3cgaWYgdGhlIHJlY29nbml6ZXIgaXMgYWxsb3dlZCB0byBydW4gc2ltdWx0YW5lb3VzIHdpdGggdGhlIGN1cnJlbnQgcmVjb2duaXplZCByZWNvZ25pemVyLlxuICAgICAgICAgICAgLy8gICAgICB0aGlzIGNhbiBiZSBzZXR1cCB3aXRoIHRoZSBgcmVjb2duaXplV2l0aCgpYCBtZXRob2Qgb24gdGhlIHJlY29nbml6ZXIuXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkICE9PSBGT1JDRURfU1RPUCAmJiAoIC8vIDFcbiAgICAgICAgICAgICAgICAgICAgIWN1clJlY29nbml6ZXIgfHwgcmVjb2duaXplciA9PSBjdXJSZWNvZ25pemVyIHx8IC8vIDJcbiAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplci5jYW5SZWNvZ25pemVXaXRoKGN1clJlY29nbml6ZXIpKSkgeyAvLyAzXG4gICAgICAgICAgICAgICAgcmVjb2duaXplci5yZWNvZ25pemUoaW5wdXREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVjb2duaXplci5yZXNldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUgcmVjb2duaXplciBoYXMgYmVlbiByZWNvZ25pemluZyB0aGUgaW5wdXQgYXMgYSB2YWxpZCBnZXN0dXJlLCB3ZSB3YW50IHRvIHN0b3JlIHRoaXMgb25lIGFzIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgcmVjb2duaXplci4gYnV0IG9ubHkgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFuIGFjdGl2ZSByZWNvZ25pemVyXG4gICAgICAgICAgICBpZiAoIWN1clJlY29nbml6ZXIgJiYgcmVjb2duaXplci5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCkpIHtcbiAgICAgICAgICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gcmVjb2duaXplcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgYSByZWNvZ25pemVyIGJ5IGl0cyBldmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcnxOdWxsfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAocmVjb2duaXplciBpbnN0YW5jZW9mIFJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvZ25pemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJlY29nbml6ZXJzW2ldLm9wdGlvbnMuZXZlbnQgPT0gcmVjb2duaXplcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNvZ25pemVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogYWRkIGEgcmVjb2duaXplciB0byB0aGUgbWFuYWdlclxuICAgICAqIGV4aXN0aW5nIHJlY29nbml6ZXJzIHdpdGggdGhlIHNhbWUgZXZlbnQgbmFtZSB3aWxsIGJlIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcnxNYW5hZ2VyfVxuICAgICAqL1xuICAgIGFkZDogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ2FkZCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBleGlzdGluZ1xuICAgICAgICB2Y
46184XIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKGV4aXN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVjb2duaXplcnMucHVzaChyZWNvZ25pemVyKTtcbiAgICAgICAgcmVjb2duaXplci5tYW5hZ2VyID0gdGhpcztcblxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIGEgcmVjb2duaXplciBieSBuYW1lIG9yIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ3JlbW92ZScsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29nbml6ZXIgPSB0aGlzLmdldChyZWNvZ25pemVyKTtcblxuICAgICAgICAvLyBsZXQncyBtYWtlIHN1cmUgdGhpcyByZWNvZ25pemVyIGV4aXN0c1xuICAgICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGluQXJyYXkocmVjb2duaXplcnMsIHJlY29nbml6ZXIpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGJpbmQgZXZlbnRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24oZXZlbnRzLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XSA9IGhhbmRsZXJzW2V2ZW50XSB8fCBbXTtcbiAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHVuYmluZCBldmVudCwgbGVhdmUgZW1pdCBibGFuayB0byByZW1vdmUgYWxsIGhhbmRsZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtoYW5kbGVyXVxuICAgICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XSAmJiBoYW5kbGVyc1tldmVudF0uc3BsaWNlKGluQXJyYXkoaGFuZGxlcnNbZXZlbnRdLCBoYW5kbGVyKSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICAgICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gdHJpZ2dlciBkb20gZXZlbnRzXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9tRXZlbnRzKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gaGFuZGxlcnMsIHNvIHNraXAgaXQgYWxsXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbZXZlbnRdICYmIHRoaXMuaGFuZGxlcnNbZXZlbnRdLnNsaWNlKCk7XG4gICAgICAgIGlmICghaGFuZGxlcnMgfHwgIWhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS50eXBlID0gZXZlbnQ7XG4gICAgICAgIGRhdGEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRhdGEuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2Y
46184XIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tpXShkYXRhKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXN0cm95IHRoZSBtYW5hZ2VyIGFuZCB1bmJpbmRzIGFsbCBldmVudHNcbiAgICAgKiBpdCBkb2Vzbid0IHVuYmluZCBkb20gZXZlbnRzLCB0aGF0IGlzIHRoZSB1c2VyIG93biByZXNwb25zaWJpbGl0eVxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgJiYgdG9nZ2xlQ3NzUHJvcHModGhpcywgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogYWRkL3JlbW92ZSB0aGUgY3NzIHByb3BlcnRpZXMgYXMgZGVmaW5lZCBpbiBtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHNcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtCb29sZWFufSBhZGRcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQ3NzUHJvcHMobWFuYWdlciwgYWRkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBtYW5hZ2VyLmVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByb3A7XG4gICAgZWFjaChtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHByb3AgPSBwcmVmaXhlZChlbGVtZW50LnN0eWxlLCBuYW1lKTtcbiAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSA9IGVsZW1lbnQuc3R5bGVbcHJvcF07XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSB8fCAnJztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghYWRkKSB7XG4gICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHMgPSB7fTtcbiAgICB9XG59XG5cbi8qKlxuICogdHJpZ2dlciBkb20gZXZlbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKSB7XG4gICAgdmFyIGdlc3R1cmVFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGdlc3R1cmVFdmVudC5pbml0RXZlbnQoZXZlbnQsIHRydWUsIHRydWUpO1xuICAgIGdlc3R1cmVFdmVudC5nZXN0dXJlID0gZGF0YTtcbiAgICBkYXRhLnRhcmdldC5kaXNwYXRjaEV2ZW50KGdlc3R1cmVFdmVudCk7XG59XG5cbmFzc2lnbihIYW1tZXIsIHtcbiAgICBJTlBVVF9TVEFSVDogSU5QVVRfU1RBUlQsXG4gICAgSU5QVVRfTU9WRTogSU5QVVRfTU9WRSxcbiAgICBJTlBVVF9FTkQ6IElOUFVUX0VORCxcbiAgICBJTlBVVF9DQU5DRUw6IElOUFVUX0NBTkNFTCxcblxuICAgIFNUQVRFX1BPU1NJQkxFOiBTVEFURV9QT1NTSUJMRSxcbiAgICBTVEFURV9CRUdBTjogU1RBVEVfQkVHQU4sXG4gICAgU1RBVEVfQ0hBTkdFRDogU1RBVEVfQ0hBTkdFRCxcbiAgICBTVEFURV9FTkRFRDogU1RBVEVfRU5ERUQsXG4gICAgU1RBVEVfUkVDT0dOSVpFRDogU1RBVEVfUkVDT0dOSVpFRCxcbiAgICBTVEFURV9DQU5DRUxMRUQ6IFNUQVRFX0NBTkNFTExFRCxcbiAgICBTVEFURV9GQUlMRUQ6IFNUQVRFX0ZBSUxFRCxcblxuICAgIERJUkVDVElPTl9OT05FOiBESVJFQ1RJT05fTk9ORSxcbiAgICBESVJFQ1RJT05fTEVGVDogRElSRUNUSU9OX0xFRlQsXG4gICAgRElSRUNUSU9OX1JJR0hUOiBESVJFQ1RJT05fUklHSFQsXG4gICAgRElSRUNUSU9OX1VQOiBESVJFQ1RJT05fVVAsXG4gICAgRElSRUNUSU9OX0RPV046IERJUkVDVElPTl9ET1dOLFxuICAgIERJUkVDVElPTl9IT1JJWk9OVEFMOiBESVJFQ1RJT05fSE9SSVpPTlRBTCxcbiAgICBESVJFQ1RJT05fVkVSVElDQUw6IERJUkVDVElPTl9WRVJUSUNBTC
46184xcbiAgICBESVJFQ1RJT05fQUxMOiBESVJFQ1RJT05fQUxMLFxuXG4gICAgTWFuYWdlcjogTWFuYWdlcixcbiAgICBJbnB1dDogSW5wdXQsXG4gICAgVG91Y2hBY3Rpb246IFRvdWNoQWN0aW9uLFxuXG4gICAgVG91Y2hJbnB1dDogVG91Y2hJbnB1dCxcbiAgICBNb3VzZUlucHV0OiBNb3VzZUlucHV0LFxuICAgIFBvaW50ZXJFdmVudElucHV0OiBQb2ludGVyRXZlbnRJbnB1dCxcbiAgICBUb3VjaE1vdXNlSW5wdXQ6IFRvdWNoTW91c2VJbnB1dCxcbiAgICBTaW5nbGVUb3VjaElucHV0OiBTaW5nbGVUb3VjaElucHV0LFxuXG4gICAgUmVjb2duaXplcjogUmVjb2duaXplcixcbiAgICBBdHRyUmVjb2duaXplcjogQXR0clJlY29nbml6ZXIsXG4gICAgVGFwOiBUYXBSZWNvZ25pemVyLFxuICAgIFBhbjogUGFuUmVjb2duaXplcixcbiAgICBTd2lwZTogU3dpcGVSZWNvZ25pemVyLFxuICAgIFBpbmNoOiBQaW5jaFJlY29nbml6ZXIsXG4gICAgUm90YXRlOiBSb3RhdGVSZWNvZ25pemVyLFxuICAgIFByZXNzOiBQcmVzc1JlY29nbml6ZXIsXG5cbiAgICBvbjogYWRkRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2ZmOiByZW1vdmVFdmVudExpc3RlbmVycyxcbiAgICBlYWNoOiBlYWNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBpbmhlcml0OiBpbmhlcml0LFxuICAgIGJpbmRGbjogYmluZEZuLFxuICAgIHByZWZpeGVkOiBwcmVmaXhlZFxufSk7XG5cbi8vIHRoaXMgcHJldmVudHMgZXJyb3JzIHdoZW4gSGFtbWVyIGlzIGxvYWRlZCBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EXG4vLyAgc3R5bGUgbG9hZGVyIGJ1dCBieSBzY3JpcHQgdGFnLCBub3QgYnkgdGhlIGxvYWRlci5cbnZhciBmcmVlR2xvYmFsID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmZyZWVHbG9iYWwuSGFtbWVyID0gSGFtbWVyO1xuXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSGFtbWVyO1xuICAgIH0pO1xufSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBIYW1tZXI7XG59IGVsc2Uge1xuICAgIHdpbmRvd1tleHBvcnROYW1lXSA9IEhhbW1lcjtcbn1cblxufSkod2luZG93LCBkb2N1bWVudCwgJ0hhbW1lcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogaW50ZXJuYWwgc3RvcmFnZSBmb3IgY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKi9cbmNvbnN0IHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcblxuXG4vKipcbiAqIHJlZ2lzdGVyIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBwZXIgZWxlbWVudFxuICovXG5jb25zdCBjdXN0b21fbWVzc2FnZXMgPSB7XG5cbiAgc2V0KGVsZW1lbnQsIHZhbGlkYXRvciwgbWVzc2FnZSkge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gc3RvcmUuZ2V0KGVsZW1lbnQpIHx8IHt9O1xuICAgIG1lc3NhZ2VzW3ZhbGlkYXRvcl0gPSBtZXNzYWdlO1xuICAgIHN0b3JlLnNldChlbGVtZW50LCBtZXNzYWdlcyk7XG4gICAgcmV0dXJuIGN1c3RvbV9tZXNzYWdlcztcbiAgfSxcblxuICBnZXQoZWxlbWVudCwgdmFsaWRhdG9yLCBfZGVmYXVsdD11bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHN0b3JlLmdldChlbGVtZW50KTtcbiAgICBpZiAobWVzc2FnZXMgPT09IHVuZGVmaW5lZCB8fCAhICh2YWxpZGF0b3IgaW4gbWVzc2FnZXMpKSB7XG4gICAgICBjb25zdCBkYXRhX2lkID0gJ2RhdGEtJyArIHZhbGlkYXRvci5yZXBsYWNlKC9bQS1aXS9nLCAnLSQmJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShkYXRhX2lkKSkge1xuICAgICAgICAvKiBpZiB0aGUgZWxlbWVudCBoYXMgYSBkYXRhLXZhbGlkYXRvciBhdHRyaWJ1dGUsIHVzZSB0aGlzIGFzIGZhbGxiYWNrLlxuICAgICAgICAgKiBFLmcuLCBpZiB2YWxpZGF0b3IgPT0gJ3ZhbHVlTWlzc2luZycsIHRoZSBlbGVtZW50IGNhbiBzcGVjaWZ5IGFcbiAgICAgICAgICogY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZSBsaWtlIHRoaXM6XG4gICAgICAgICAqICAgICA8aW5wdXQgZGF0YS12YWx1ZS1taXNzaW5nPVwiT2ggbm9lcyFcIj5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShkYXRhX2lkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VzW3ZhbGlkYXRvcl07XG4gIH0sXG5cbiAgZGVsZXRlKGVsZW1lbnQsIHZhbGlkYXRvcj1udWxsKSB7XG4gICAgaWYgKCEgdmFsaWRhdG9yKSB7XG4gICAgICByZXR1cm4gc3RvcmUuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlcyA9IHN0b3JlLmdldChlbGVtZW50KSB8fCB7fTtcbiAgICBpZiAodmFsaWRhdG9yIGluIG1lc3NhZ2VzKSB7XG4gICAgICBkZWxldGUobWVzc2FnZXNbdmFsaWRhdG9yXSk7XG4gICAgICBzdG9yZS5zZXQoZWxlbWVudCwgbWVzc2FnZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tX21lc3NhZ2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmNvbnN0IHJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXG4vKipcbiAqIHJ1biBhbGwgYWN0aW9ucyByZWdpc3RlcmVkIGZvciBhIGhvb2tcbiAqXG4gKiBFdmVyeSBhY3Rpb24gZ2V0cyBjYWxsZWQgd2l0aCBhIHN0YXRlIG9iamVjdCBhcyBgdGhpc2AgYXJndW1lbnQgYW5kIHdpdGggdGhlXG4gKiBob29rJ3MgY2FsbCBhcmd1bWVudHMgYXMgY2FsbCBhcmd1bWVudHMuXG4gKlxuICogQHJldHVybiBtaXhlZCB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhlIGFjdGlvbiBjYWxscyBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxfaG9vayhob29rKSB7XG4gIHZhciByZXN1bHQ7XG4gIGNvbnN0IGNhbGxfYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgaWYgKGhvb2sgaW4gcmVnaXN0cnkpIHtcbiAgICByZXN1bHQgPSByZWdpc3RyeVtob29rXS5yZWR1Y2UoKGZ1bmN0aW9uKGFyZ3MpIHtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByZXZpb3VzUmVzdWx0LCBjdXJyZW50QWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGludGVyaW1SZXN1bHQgPSBjdXJyZW50QWN0aW9uLmFwcGx5KHtcbiAgICAgICAgICBzdGF0ZTogcHJldmlvdXNSZXN1bHQsXG4gICAgICAgICAgaG9vazogaG9vayxcbiAgICAgICAgfSwgYXJncyk7XG4gICAgICAgI
46184HJldHVybiAoaW50ZXJpbVJlc3VsdCAhPT0gdW5kZWZpbmVkKT8gaW50ZXJpbVJlc3VsdCA6IHByZXZpb3VzUmVzdWx0O1xuICAgICAgfTtcblxuICAgIH0pKGNhbGxfYXJncyksIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpbHRlciBhIHZhbHVlIHRocm91Z2ggaG9va2VkIGZ1bmN0aW9uc1xuICpcbiAqIEFsbG93cyBmb3IgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOlxuICoganM+IGRvX2ZpbHRlcignZm9vJywgbnVsbCwgY3VycmVudF9lbGVtZW50KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9fZmlsdGVyKGhvb2ssIGluaXRpYWxfdmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IGluaXRpYWxfdmFsdWU7XG4gIHZhciBjYWxsX2FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGlmIChob29rIGluIHJlZ2lzdHJ5KSB7XG4gICAgcmVzdWx0ID0gcmVnaXN0cnlbaG9va10ucmVkdWNlKGZ1bmN0aW9uKHByZXZpb3VzUmVzdWx0LCBjdXJyZW50QWN0aW9uKSB7XG4gICAgICBjYWxsX2FyZ3NbMF0gPSBwcmV2aW91c1Jlc3VsdDtcbiAgICAgIGNvbnN0IGludGVyaW1SZXN1bHQgPSBjdXJyZW50QWN0aW9uLmFwcGx5KHtcbiAgICAgICAgc3RhdGU6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICBob29rOiBob29rLFxuICAgICAgfSwgY2FsbF9hcmdzKTtcbiAgICAgIHJldHVybiAoaW50ZXJpbVJlc3VsdCAhPT0gdW5kZWZpbmVkKT8gaW50ZXJpbVJlc3VsdCA6IHByZXZpb3VzUmVzdWx0O1xuICAgIH0sIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIHJlbW92ZSBhbiBhY3Rpb24gYWdhaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZV9ob29rKGhvb2ssIGFjdGlvbikge1xuICBpZiAoaG9vayBpbiByZWdpc3RyeSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cnlbaG9va10ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWdpc3RyeVtob29rXVtpXSA9PT0gYWN0aW9uKSB7XG4gICAgICAgIHJlZ2lzdHJ5W2hvb2tdLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5leHBvcnQgeyByZW1vdmVfaG9vayBhcyByZW1vdmVfZmlsdGVyIH07XG5cbi8qKlxuICogYWRkIGFuIGFjdGlvbiB0byBhIGhvb2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF9ob29rKGhvb2ssIGFjdGlvbiwgcG9zaXRpb24pIHtcbiAgaWYgKCEgKGhvb2sgaW4gcmVnaXN0cnkpKSB7XG4gICAgcmVnaXN0cnlbaG9va10gPSBbXTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHBvc2l0aW9uID0gcmVnaXN0cnlbaG9va10ubGVuZ3RoO1xuICB9XG4gIHJlZ2lzdHJ5W2hvb2tdLnNwbGljZShwb3NpdGlvbiwgMCwgYWN0aW9uKTtcbn1cbmV4cG9ydCB7IGFkZF9ob29rIGFzIGFkZF9maWx0ZXIgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBtZXNzYWdlcyBhcmUgZnJvbSBGaXJlZm94IHNvdXJjZSxcbiAqIGh0dHA6Ly9teHIubW96aWxsYS5vcmcvbW96aWxsYS1jZW50cmFsL3NvdXJjZS9kb20vbG9jYWxlcy9lbi1VUy9jaHJvbWUvZG9tL2RvbS5wcm9wZXJ0aWVzXG4gKiByZWxlYXNlZCB1bmRlciBNUEwgbGljZW5zZSwgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5jb25zdCBjYXRhbG9nID0ge1xuICBlbjoge1xuICAgIFRleHRUb29Mb25nOiAnUGxlYXNlIHNob3J0ZW4gdGhpcyB0ZXh0IHRvICVsIGNoYXJhY3RlcnMgb3IgbGVzcyAoeW91IGFyZSBjdXJyZW50bHkgdXNpbmcgJWwgY2hhcmFjdGVycykuJyxcbiAgICBWYWx1ZU1pc3Npbmc6ICdQbGVhc2UgZmlsbCBvdXQgdGhpcyBmaWVsZC4nLFxuICAgIENoZWNrYm94TWlzc2luZzogJ1BsZWFzZSBjaGVjayB0aGlzIGJveCBpZiB5b3Ugd2FudCB0byBwcm9jZWVkLicsXG4gICAgUmFkaW9NaXNzaW5nOiAnUGxlYXNlIHNlbGVjdCBvbmUgb2YgdGhlc2Ugb3B0aW9ucy4nLFxuICAgIEZpbGVNaXNzaW5nOiAnUGxlYXNlIHNlbGVjdCBhIGZpbGUuJyxcbiAgICBTZWxlY3RNaXNzaW5nOiAnUGxlYXNlIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0LicsXG4gICAgSW52YWxpZEVtYWlsOiAnUGxlYXNlIGVudGVyIGFuIGVtYWlsIGFkZHJlc3MuJyxcbiAgICBJbnZhbGlkVVJMOiAnUGxlYXNlIGVudGVyIGEgVVJMLicsXG4gICAgUGF0dGVybk1pc21hdGNoOiAnUGxlYXNlIG1hdGNoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LicsXG4gICAgUGF0dGVybk1pc21hdGNoV2l0aFRpdGxlOiAnUGxlYXNlIG1hdGNoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0OiAlbC4nLFxuICAgIE51bWJlclJhbmdlT3ZlcmZsb3c6ICdQbGVhc2Ugc2VsZWN0IGEgdmFsdWUgdGhhdCBpcyBubyBtb3JlIHRoYW4gJWwuJyxcbiAgICBEYXRlUmFuZ2VPdmVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGxhdGVyIHRoYW4gJWwuJyxcbiAgICBUaW1lUmFuZ2VPdmVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGxhdGVyIHRoYW4gJWwuJyxcbiAgICBOdW1iZXJSYW5nZVVuZGVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGxlc3MgdGhhbiAlbC4nLFxuICAgIERhdGVSYW5nZVVuZGVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGVhcmxpZXIgdGhhbiAlbC4nLFxuICAgIFRpbWVSYW5nZVVuZGVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGVhcmxpZXIgdGhhbiAlbC4nLFxuICAgIFN0ZXBNaXNtYXRjaDogJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCB2YWx1ZS4gVGhlIHR3byBuZWFyZXN0IHZhbGlkIHZhbHVlcyBhcmUgJWwgYW5kICVsLicsXG4gICAgU3RlcE1pc21hdGNoT25lVmFsdWU6ICdQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgdmFsdWUuIFRoZSBuZWFyZXN0IHZhbGlkIHZhbHVlIGlzICVsLicsXG4gICAgQmFkSW5wdXROdW1iZXI6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXIuJyxcbiAgfSxcbn07XG5cblxuLyoqXG4gKiB0aGUgZ2xvYmFsIGxhbmd1YWdlIEh5cGVyZm9ybSB3aWxsIHVzZVxuICovXG52YXIgbGFuZ3VhZ2UgPSAnZW4nO1xuXG5cbi8qKlxuICogdGhlIGJhc2UgbGFuZ3VhZ2UgYWNjb3JkaW5nIHRvIEJDUDQ3LCBpLmUuLCBvbmx5IHRoZSBwaWVjZSBiZWZvcmUgdGhlIGZpcnN0IGh5cGhlblxuICovXG52YXIgYmFzZV9sYW5nID0gJ2VuJztcblxuXG4vKipcbiAqIHNldCB0aGUgbGFuZ3VhZ2UgZm9yIEh5cGVyZm9ybeKAmXMgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9sYW5ndWFnZShuZXdsYW5nKSB7XG4gIGxhbmd1YWdlID0gbmV3bGFuZztcbiAgYmFzZV9sYW5nID0gbmV3bGFuZy5yZXBsYWNlKC9bLV9dLiovLCAnJyk7XG59XG5cblxuLyoqXG4gKiBhZGQgYSBsb29rdXAgY2F0YWxvZyBcInN0cmluZzogdHJhbnNsYXRpb25cIiBmb3IgYSBsYW5ndWFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkX3RyYW5zbGF0aW9uKGxhbmcsIG5ld19jYXRhbG9nKSB7XG4gIGlmICghIC
46184hsYW5nIGluIGNhdGFsb2cpKSB7XG4gICAgY2F0YWxvZ1tsYW5nXSA9IHt9O1xuICB9XG4gIGZvciAobGV0IGtleSBpbiBuZXdfY2F0YWxvZykge1xuICAgIGlmIChuZXdfY2F0YWxvZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjYXRhbG9nW2xhbmddW2tleV0gPSBuZXdfY2F0YWxvZ1trZXldO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qKlxuICogcmV0dXJuIGBzYCB0cmFuc2xhdGVkIGludG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAqXG4gKiBEZWZhdWx0cyB0byB0aGUgYmFzZSBsYW5ndWFnZSBhbmQgdGhlbiBFbmdsaXNoIGlmIHRoZSBmb3JtZXIgaGFzIG5vXG4gKiB0cmFuc2xhdGlvbiBmb3IgYHNgLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIGlmICgobGFuZ3VhZ2UgaW4gY2F0YWxvZykgJiYgKHMgaW4gY2F0YWxvZ1tsYW5ndWFnZV0pKSB7XG4gICAgcmV0dXJuIGNhdGFsb2dbbGFuZ3VhZ2VdW3NdO1xuICB9IGVsc2UgaWYgKChiYXNlX2xhbmcgaW4gY2F0YWxvZykgJiYgKHMgaW4gY2F0YWxvZ1tiYXNlX2xhbmddKSkge1xuICAgIHJldHVybiBjYXRhbG9nW2Jhc2VfbGFuZ11bc107XG4gIH0gZWxzZSBpZiAocyBpbiBjYXRhbG9nLmVuKSB7XG4gICAgcmV0dXJuIGNhdGFsb2cuZW5bc107XG4gIH1cbiAgcmV0dXJuIHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IHsgZ2V0X3dyYXBwZXIgfSBmcm9tICcuL3dyYXBwZXInO1xuaW1wb3J0IG1hcmsgZnJvbSAnLi4vdG9vbHMvbWFyayc7XG5cblxuLyoqXG4gKiB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3IgbWVzc2FnZXNcbiAqL1xuY29uc3Qgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuXG5cbi8qIGpzaGludCAtVzA1MyAqLy8qIGFsbG93IG5ldyBTdHJpbmcoKSAqL1xuLyoqXG4gKiBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlc1xuICpcbiAqIEZhbGxzIGJhY2sgdG8gYnJvd3Nlci1uYXRpdmUgZXJyb3JzLCBpZiBhbnkgYXJlIGF2YWlsYWJsZS4gVGhlIG1lc3NhZ2VzXG4gKiBhcmUgU3RyaW5nIG9iamVjdHMgc28gdGhhdCB3ZSBjYW4gbWFyaygpIHRoZW0uXG4gKi9cbmNvbnN0IG1lc3NhZ2Vfc3RvcmUgPSB7XG5cbiAgc2V0KGVsZW1lbnQsIG1lc3NhZ2UsIGlzX2N1c3RvbT1mYWxzZSkge1xuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGaWVsZFNldEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHdyYXBwZWRfZm9ybSA9IGdldF93cmFwcGVyKGVsZW1lbnQpO1xuICAgICAgaWYgKHdyYXBwZWRfZm9ybSAmJiAhIHdyYXBwZWRfZm9ybS5zZXR0aW5ncy5leHRlbmRGaWVsZHNldCkge1xuICAgICAgICAvKiBtYWtlIHRoaXMgYSBuby1vcCBmb3IgPGZpZWxkc2V0PiBpbiBzdHJpY3QgbW9kZSAqL1xuICAgICAgICByZXR1cm4gbWVzc2FnZV9zdG9yZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gbmV3IFN0cmluZyhtZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzX2N1c3RvbSkge1xuICAgICAgbWVzc2FnZS5pc19jdXN0b20gPSB0cnVlO1xuICAgIH1cbiAgICBtYXJrKG1lc3NhZ2UpO1xuICAgIHN0b3JlLnNldChlbGVtZW50LCBtZXNzYWdlKTtcblxuICAgIC8qIGFsbG93IHRoZSA6aW52YWxpZCBzZWxlY3RvciB0byBtYXRjaCAqL1xuICAgIGlmICgnX29yaWdpbmFsX3NldEN1c3RvbVZhbGlkaXR5JyBpbiBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50Ll9vcmlnaW5hbF9zZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlX3N0b3JlO1xuICB9LFxuXG4gIGdldChlbGVtZW50KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBzdG9yZS5nZXQoZWxlbWVudCk7XG4gICAgaWYgKG1lc3NhZ2UgPT09IHVuZGVmaW5lZCAmJiAoJ19vcmlnaW5hbF92YWxpZGF0aW9uTWVzc2FnZScgaW4gZWxlbWVudCkpIHtcbiAgICAgIC8qIGdldCB0aGUgYnJvd3NlcidzIHZhbGlkYXRpb24gbWVzc2FnZSwgaWYgd2UgaGF2ZSBub25lLiBNYXliZSBpdFxuICAgICAgICoga25vd3MgbW9yZSB0aGFuIHdlLiAqL1xuICAgICAgbWVzc2FnZSA9IG5ldyBTdHJpbmcoZWxlbWVudC5fb3JpZ2luYWxfdmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZT8gbWVzc2FnZSA6IG5ldyBTdHJpbmcoJycpO1xuICB9LFxuXG4gIGRlbGV0ZShlbGVtZW50LCBpc19jdXN0b209ZmFsc2UpIHtcbiAgICBpZiAoJ19vcmlnaW5hbF9zZXRDdXN0b21WYWxpZGl0eScgaW4gZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5fb3JpZ2luYWxfc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgIH1cbiAgICB2YXIgbWVzc2FnZSA9IHN0b3JlLmdldChlbGVtZW50KTtcbiAgICBpZiAobWVzc2FnZSAmJiBpc19jdXN0b20gJiYgISBtZXNzYWdlLmlzX2N1c3RvbSkge1xuICAgICAgLyogZG8gbm90IGRlbGV0ZSBcIm5hdGl2ZVwiIG1lc3NhZ2VzLCBpZiBhc2tlZCAqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmUuZGVsZXRlKGVsZW1lbnQpO1xuICB9LFxuXG59O1xuLyoganNoaW50ICtXMDUzICovXG5cbmV4cG9ydCB7IG1lc3NhZ2Vfc3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5jb25zdCBpbnRlcm5hbF9yZWdpc3RyeSA9IG5ldyBXZWFrTWFwKCk7XG5cblxuLyoqXG4gKiBBIHJlZ2lzdHJ5IGZvciBjdXN0b20gdmFsaWRhdG9yc1xuICpcbiAqIHNsaW0gd3JhcHBlciBhcm91bmQgYSBXZWFrTWFwIHRvIGVuc3VyZSB0aGUgdmFsdWVzIGFyZSBhcnJheXNcbiAqIChoZW5jZSBhbGxvd2luZyA+IDEgdmFsaWRhdG9ycyBwZXIgZWxlbWVudClcbiAqL1xuY29uc3QgY3VzdG9tX3ZhbGlkYXRvcl9yZWdpc3RyeSA9IHtcblxuICBzZXQoZWxlbWVudCwgdmFsaWRhdG9yKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGludGVybmFsX3JlZ2lzdHJ5LmdldChlbGVtZW50KSB8fCBbXTtcbiAgICBjdXJyZW50LnB1c2godmFsaWRhdG9yKTtcbiAgICBpbnRlcm5hbF9yZWdpc3RyeS5zZXQoZWxlbWVudCwgY3VycmVudCk7XG4gICAgcmV0dXJuIGN1c3RvbV92YWxpZGF0b3JfcmVnaXN0cnk7XG4gIH0sXG5cbiAgZ2V0KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxfcmVnaXN0cnkuZ2V0KGVsZW1lbnQpIHx8IFtdO1xuICB9LFxuXG4gIGRlbGV0ZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIGludGVybmFsX3JlZ2lzdHJ5LmRlbGV0ZShlbGVtZW50KTtcbiAgfSxcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tX3ZhbGlkYXRvcl9yZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBtZXNzYWdlX3N0b3JlIH0gZnJvbSAnLi9tZXNzYWdlX3N0b3JlJztcbmltcG9ydCB7
46184IGdldF93cmFwcGVyIH0gZnJvbSAnLi93cmFwcGVyJztcbmltcG9ydCBnZW5lcmF0ZV9pZCBmcm9tICcuLi90b29scy9nZW5lcmF0ZV9pZCc7XG5pbXBvcnQgeyBnZXRfcmFkaW9ncm91cCB9IGZyb20gJy4uL3Rvb2xzL2dldF9yYWRpb2dyb3VwJztcblxuXG5jb25zdCB3YXJuaW5nc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuXG5jb25zdCBEZWZhdWx0UmVuZGVyZXIgPSB7XG5cbiAgLyoqXG4gICAqIGNhbGxlZCB3aGVuIGEgd2FybmluZyBzaG91bGQgYmVjb21lIHZpc2libGVcbiAgICovXG4gIGF0dGFjaFdhcm5pbmc6IGZ1bmN0aW9uKHdhcm5pbmcsIGVsZW1lbnQpIHtcbiAgICAvKiBzaG91bGQgYWxzbyB3b3JrLCBpZiBlbGVtZW50IGlzIGxhc3QsXG4gICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDc5MzYzMC8xMTMxOTUgKi9cbiAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdhcm5pbmcsIGVsZW1lbnQubmV4dFNpYmxpbmcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiBhIHdhcm5pbmcgc2hvdWxkIHZhbmlzaFxuICAgKi9cbiAgZGV0YWNoV2FybmluZzogZnVuY3Rpb24od2FybmluZywgZWxlbWVudCkge1xuICAgIC8qIGJlIGNvbnNlcnZhdGl2ZSBoZXJlLCBzaW5jZSBhbiBvdmVyd3JpdHRlbiBhdHRhY2hXYXJuaW5nKCkgbWlnaHQgbm90XG4gICAgICogYWN0dWFsbHkgaGF2ZSBhdHRhY2hlZCB0aGUgd2FybmluZy4gKi9cbiAgICBpZiAod2FybmluZy5wYXJlbnROb2RlKSB7XG4gICAgICB3YXJuaW5nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQod2FybmluZyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiBmZWVkYmFjayB0byBhbiBlbGVtZW50J3Mgc3RhdGUgc2hvdWxkIGJlIGhhbmRsZWRcbiAgICpcbiAgICogaS5lLiwgc2hvd2luZyBhbmQgaGlkaW5nIHdhcm5pbmdzXG4gICAqL1xuICBzaG93V2FybmluZzogZnVuY3Rpb24oZWxlbWVudCwgd2hvbGVfZm9ybV92YWxpZGF0ZWQ9ZmFsc2UpIHtcbiAgICAvKiBkb24ndCByZW5kZXIgZXJyb3IgbWVzc2FnZXMgb24gc3Vic2VxdWVudCByYWRpbyBidXR0b25zIG9mIHRoZVxuICAgICAqIHNhbWUgZ3JvdXAuIFRoaXMgYXNzdW1lcywgdGhhdCBlbGVtZW50LnZhbGlkaXR5LnZhbHVlTWlzc2luZyBpcyB0aGUgb25seVxuICAgICAqIHBvc3NpYmxlIHZhbGlkYXRpb24gZmFpbHVyZSBmb3IgcmFkaW8gYnV0dG9ucy4gKi9cbiAgICBpZiAod2hvbGVfZm9ybV92YWxpZGF0ZWQgJiYgZWxlbWVudC50eXBlID09PSAncmFkaW8nICYmXG4gICAgICAgIGdldF9yYWRpb2dyb3VwKGVsZW1lbnQpWzBdICE9PSBlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbXNnID0gbWVzc2FnZV9zdG9yZS5nZXQoZWxlbWVudCkudG9TdHJpbmcoKTtcbiAgICB2YXIgd2FybmluZyA9IHdhcm5pbmdzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xuXG4gICAgaWYgKG1zZykge1xuICAgICAgaWYgKCEgd2FybmluZykge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gICAgICAgIHdhcm5pbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgd2FybmluZy5jbGFzc05hbWUgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy53YXJuaW5nIHx8ICdoZi13YXJuaW5nJztcbiAgICAgICAgd2FybmluZy5pZCA9IGdlbmVyYXRlX2lkKCk7XG4gICAgICAgIHdhcm5pbmcuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7XG4gICAgICAgIHdhcm5pbmdzQ2FjaGUuc2V0KGVsZW1lbnQsIHdhcm5pbmcpO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1lcnJvcm1lc3NhZ2UnLCB3YXJuaW5nLmlkKTtcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHdhcm5pbmcuaWQpO1xuICAgICAgfVxuICAgICAgUmVuZGVyZXIuc2V0TWVzc2FnZSh3YXJuaW5nLCBtc2csIGVsZW1lbnQpO1xuICAgICAgUmVuZGVyZXIuYXR0YWNoV2FybmluZyh3YXJuaW5nLCBlbGVtZW50KTtcblxuICAgIH0gZWxzZSBpZiAod2FybmluZyAmJiB3YXJuaW5nLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpID09PSB3YXJuaW5nLmlkKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1lcnJvcm1lc3NhZ2UnKTtcbiAgICAgIFJlbmRlcmVyLmRldGFjaFdhcm5pbmcod2FybmluZywgZWxlbWVudCk7XG5cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNldCB0aGUgd2FybmluZydzIGNvbnRlbnRcbiAgICpcbiAgICogT3ZlcndyaXRlIHRoaXMgbWV0aG9kLCBpZiB5b3Ugd2FudCwgZS5nLiwgdG8gYWxsb3cgSFRNTCBpbiB3YXJuaW5nc1xuICAgKiBvciBwcmVwcm9jZXNzIHRoZSBjb250ZW50LlxuICAgKi9cbiAgc2V0TWVzc2FnZTogZnVuY3Rpb24od2FybmluZywgbWVzc2FnZSwgZWxlbWVudCkge1xuICAgIHdhcm5pbmcudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICB9XG5cbn07XG5cblxuY29uc3QgUmVuZGVyZXIgPSB7XG5cbiAgYXR0YWNoV2FybmluZzogRGVmYXVsdFJlbmRlcmVyLmF0dGFjaFdhcm5pbmcsXG4gIGRldGFjaFdhcm5pbmc6IERlZmF1bHRSZW5kZXJlci5kZXRhY2hXYXJuaW5nLFxuICBzaG93V2FybmluZzogRGVmYXVsdFJlbmRlcmVyLnNob3dXYXJuaW5nLFxuICBzZXRNZXNzYWdlOiBEZWZhdWx0UmVuZGVyZXIuc2V0TWVzc2FnZSxcblxuICBzZXQ6IGZ1bmN0aW9uKHJlbmRlcmVyLCBhY3Rpb24pIHtcbiAgICBpZiAocmVuZGVyZXIuaW5kZXhPZignXycpID4gLTEpIHtcbiAgICAgIC8qIGdsb2JhbCBjb25zb2xlICovXG4gICAgICAvLyBUT0RPIGRlbGV0ZSBiZWZvcmUgbmV4dCBub24tcGF0Y2ggdmVyc2lvblxuICAgICAgY29uc29sZS5sb2coJ1JlbmRlcmVyLnNldDogcGxlYXNlIHVzZSBjYW1lbENhc2UgbmFtZXMuICcrcmVuZGVyZXIrJyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbm9uLXBhdGNoIHJlbGVhc2UuJyk7XG4gICAgICByZW5kZXJlciA9IHJlbmRlcmVyLnJlcGxhY2UoL18oW2Etel0pL2csIGcgPT4gZ1sxXS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG4gICAgaWYgKCEgYWN0aW9uKSB7XG4gICAgICBhY3Rpb24gPSBEZWZhdWx0UmVuZGVyZXJbcmVuZGVyZXJdO1xuICAgIH1cbiAgICBSZW5kZXJlcltyZW5kZXJlcl0gPSBhY3Rpb247XG4gIH0sXG5cbiAgZ2V0V2FybmluZzogZWxlbWVudCA9PiB3YXJuaW5nc0NhY2hlLmdldChlbGVtZW50KSxcblxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5leHBvcnQgY29uc3QgZGVmYXVsdF9zdGVwID0ge1xuICAnZGF0ZXRpbWUtbG9jYWwnOiA2MCxcbiAgZGF0ZXRpbWU6IDYwLFxuICB0aW1lOiA2MCxcbn07XG5cbmV4cG9ydCBjb25zdCBzdGVwX3NjYWxlX2ZhY3RvciA9IHtcbiAgJ2RhdGV0aW1lLWxvY2FsJzogMTAwMCxcbiAgZGF0ZXRpbWU6IDEwM
46184DAsXG4gIGRhdGU6IDg2NDAwMDAwLFxuICB3ZWVrOiA2MDQ4MDAwMDAsXG4gIHRpbWU6IDEwMDAsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdF9zdGVwX2Jhc2UgPSB7XG4gIHdlZWs6IC0yNTkyMDAwMDAsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdF9taW4gPSB7XG4gIHJhbmdlOiAwLFxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRfbWF4ID0ge1xuICByYW5nZTogMTAwLFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogYW5kIGRhdGV0aW1lLWxvY2FsPyBTcGVjIHNheXMg4oCcTmFoIeKAnSAqL1xuZXhwb3J0IGNvbnN0IGRhdGVzID0gWyAnZGF0ZXRpbWUnLCAnZGF0ZScsICdtb250aCcsICd3ZWVrJywgJ3RpbWUnLCBdO1xuXG5leHBvcnQgY29uc3QgcGxhaW5fbnVtYmVycyA9IFsgJ251bWJlcicsICdyYW5nZScsIF07XG5cbi8qIGV2ZXJ5dGhpbmcgdGhhdCByZXR1cm5zIHNvbWV0aGluZyBtZWFuaW5nZnVsIGZvciB2YWx1ZUFzTnVtYmVyIGFuZFxuICogY2FuIGhhdmUgdGhlIHN0ZXAgYXR0cmlidXRlICovXG5leHBvcnQgY29uc3QgbnVtYmVycyA9IGRhdGVzLmNvbmNhdChwbGFpbl9udW1iZXJzLCAnZGF0ZXRpbWUtbG9jYWwnKTtcblxuLyogdGhlIHNwZWMgc2F5cyB0byBvbmx5IGNoZWNrIHRob3NlIGZvciBzeW50YXggaW4gdmFsaWRpdHkudHlwZU1pc21hdGNoLlxuICogwq9cXF8o44OEKV8vwq8gKi9cbmV4cG9ydCBjb25zdCB0eXBlX2NoZWNrZWQgPSBbICdlbWFpbCcsICd1cmwnLCBdO1xuXG4vKiBjaGVjayB0aGVzZSBmb3IgdmFsaWRpdHkuYmFkSW5wdXQgKi9cbmV4cG9ydCBjb25zdCBpbnB1dF9jaGVja2VkID0gWyAnZW1haWwnLCAnZGF0ZScsICdtb250aCcsICd3ZWVrJywgJ3RpbWUnLFxuICAnZGF0ZXRpbWUnLCAnZGF0ZXRpbWUtbG9jYWwnLCAnbnVtYmVyJywgJ3JhbmdlJywgJ2NvbG9yJywgXTtcblxuZXhwb3J0IGNvbnN0IHRleHQgPSBbICd0ZXh0JywgJ3NlYXJjaCcsICd0ZWwnLCAncGFzc3dvcmQnLCBdLmNvbmNhdCh0eXBlX2NoZWNrZWQpO1xuXG4vKiBpbnB1dCBlbGVtZW50IHR5cGVzLCB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciB0aGUgdmFsaWRhdGlvbiBBUEkuXG4gKiBNaXNzaW5nIGZyb20gdGhpcyBzZXQgYXJlOiBidXR0b24sIGhpZGRlbiwgbWVudSAoZnJvbSA8YnV0dG9uPiksIHJlc2V0IGFuZFxuICogdGhlIHR5cGVzIGZvciBub24tPGlucHV0PiBlbGVtZW50cy4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0aW9uX2NhbmRpZGF0ZXMgPSBbICdjaGVja2JveCcsICdjb2xvcicsICdmaWxlJywgJ2ltYWdlJyxcbiAgJ3JhZGlvJywgJ3N1Ym1pdCcsIF0uY29uY2F0KG51bWJlcnMsIHRleHQpO1xuXG4vKiBhbGwga25vd24gdHlwZXMgb2YgPGlucHV0PiAqL1xuZXhwb3J0IGNvbnN0IGlucHV0cyA9IFsnYnV0dG9uJywgJ2hpZGRlbicsICdyZXNldCddLmNvbmNhdCh2YWxpZGF0aW9uX2NhbmRpZGF0ZXMpO1xuXG4vKiBhcHBhcmVudGx5IDxzZWxlY3Q+IGFuZCA8dGV4dGFyZWE+IGhhdmUgdHlwZXMgb2YgdGhlaXIgb3duICovXG5leHBvcnQgY29uc3Qgbm9uX2lucHV0cyA9IFsnc2VsZWN0LW9uZScsICdzZWxlY3QtbXVsdGlwbGUnLCAndGV4dGFyZWEnXTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBjYXRjaF9zdWJtaXQsIHVuY2F0Y2hfc3VibWl0IH0gZnJvbSAnLi4vdG9vbHMvY2F0Y2hfc3VibWl0JztcbmltcG9ydCBWYWxpZGl0eVN0YXRlIGZyb20gJy4uL3BvbHlmaWxscy92YWxpZGl0eVN0YXRlJztcbmltcG9ydCByZXBvcnRWYWxpZGl0eSBmcm9tICcuLi9wb2x5ZmlsbHMvcmVwb3J0VmFsaWRpdHknO1xuaW1wb3J0IHVuaW5zdGFsbCBmcm9tICcuLi90b29scy9wcm9wZXJ0eV91bmluc3RhbGxlcic7XG5pbXBvcnQgcG9seWZpbGwgZnJvbSAnLi4vdG9vbHMvcG9seWZpbGwnO1xuaW1wb3J0IHBvbHl1bmZpbGwgZnJvbSAnLi4vdG9vbHMvcG9seXVuZmlsbCc7XG5cblxuY29uc3QgaW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTtcblxuXG4vKipcbiAqIHdyYXAgPGZvcm0+cywgd2luZG93IG9yIGRvY3VtZW50LCB0aGF0IGdldCB0cmVhdGVkIHdpdGggdGhlIGdsb2JhbFxuICogaHlwZXJmb3JtKClcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV3JhcHBlcihmb3JtLCBzZXR0aW5ncykge1xuXG4gIC8qIGRvIG5vdCBhbGxvdyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHBlciBmb3JtLiBPdGhlcndpc2Ugd2UnZCBlbmRcbiAgICogdXAgd2l0aCBkb3VibGUgZXZlbnQgaGFuZGxlcnMsIHBvbHlmaWxscyByZS1hcHBsaWVkLCAuLi4gKi9cbiAgdmFyIGV4aXN0aW5nID0gaW5zdGFuY2VzLmdldChmb3JtKTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgZXhpc3Rpbmcuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICB0aGlzLmZvcm0gPSBmb3JtO1xuICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gIHRoaXMucmV2YWxpZGF0b3IgPSB0aGlzLnJldmFsaWRhdGUuYmluZCh0aGlzKTtcblxuICBpbnN0YW5jZXMuc2V0KGZvcm0sIHRoaXMpO1xuXG4gIGNhdGNoX3N1Ym1pdChmb3JtLCBzZXR0aW5ncy5yZXZhbGlkYXRlID09PSAnbmV2ZXInKTtcblxuICBpZiAoZm9ybSA9PT0gd2luZG93IHx8IGZvcm0ubm9kZVR5cGUgPT09IDkpIHtcbiAgICAvKiBpbnN0YWxsIG9uIHRoZSBwcm90b3R5cGVzLCB3aGVuIGNhbGxlZCBmb3IgdGhlIHdob2xlIGRvY3VtZW50ICovXG4gICAgdGhpcy5pbnN0YWxsKFtcbiAgICAgIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudC5wcm90b3R5cGUsXG4gICAgICB3aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsXG4gICAgICB3aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQucHJvdG90eXBlLFxuICAgICAgd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlLFxuICAgICAgd2luZG93LkhUTUxGaWVsZFNldEVsZW1lbnQucHJvdG90eXBlLFxuICAgIF0pO1xuICAgIHBvbHlmaWxsKHdpbmRvdy5IVE1MRm9ybUVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50IHx8XG4gICAgICAgICAgICAgZm9ybSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRmllbGRTZXRFbGVtZW50KSB7XG4gICAgdGhpcy5pbnN0YWxsKGZvcm0uZWxlbWVudHMpO1xuICAgIGlmIChmb3JtIGluc3RhbmNlb2Ygd2luZG93LkhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgcG9seWZpbGwoZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNldHRpbmdzLnJldmFsaWRhdGUgPT09ICdvbmlucHV0JyB8fCBzZXR0aW5ncy5yZXZhbGlkYXRlID09PSAnaHlicmlkJykge1xuICAgIC8qIGluIGEgcGVyZmVjdCB3b3JsZCB3ZSdkIGp1c3QgYmluZCB0byBcImlucHV0XCIsIGJ1dCBzdXBwb3J0IGhlcmUgaXNcbiAgICAgKiBhYnlzbWFsOiBodHRwOi8vY2FuaXVzZS5jb20vI2ZlYXQ9aW5wdXQtZXZlbnQgKi9cbiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXZhbGlkYXRvcik7XG4gICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnJldmFsaWRhdG9yKTtcbiAgfVxuICBpZiAoc2V0dGluZ3MucmV2YWxpZGF0ZSA9PT0gJ29uYmx1cicgfHwgc2V0dGluZ3MucmV2YWxpZGF0ZSA9PT0gJ2h5YnJpZCcpIHtcbiAgICAvKiB1c2VDYXB0dXJlPXRydWUsIGJlY2F1c2UgYGJsdXJgIGRvZXNuJ3QgYnViYmxlLiBTZWVcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvYmx1ciNFdmVudF9kZWxlZ2F0aW9uXG4gICAgICogZm9yIGEgZGlzY3Vzc2lvbiAqL1xuICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMucmV2YWxpZGF0b3IsIHRydWUpO1xuICB9XG59XG5cblxuV3JhcHBlci5wcm90b3R5cGUgPSB7XG5cbiAgZGVzdHJveSgpIHtcbiAgICB1bmNhdGNoX3N1Ym1pdCh0aGlzLmZvcm0pO1xuICAgIGluc3RhbmNlcy5kZWxldGUodGhpcy5mb3JtKTtcbiAgICB0aGlzLmZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJldmFsaWRhdG9yKTtcbiAgICB0aGlzLmZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5yZXZhbGlkYXRvcik7XG4gICAgdGhpcy5mb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnJldmFsaWRhdG9yLCB0cnVlKTtcbiAgICBpZiAodGhpcy5mb3JtID09PSB3aW5kb3cgfHwgdGhpcy5mb3JtLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICB0aGlzLnVuaW5zdGFsbChbXG4gICAgICAgI
46184HdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudC5wcm90b3R5cGUsXG4gICAgICAgIHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgd2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlLFxuICAgICAgICB3aW5kb3cuSFRNTEZpZWxkU2V0RWxlbWVudC5wcm90b3R5cGUsXG4gICAgICBdKTtcbiAgICAgIHBvbHl1bmZpbGwod2luZG93LkhUTUxGb3JtRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50IHx8XG4gICAgICAgICAgICAgICB0aGlzLmZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZpZWxkU2V0RWxlbWVudCkge1xuICAgICAgdGhpcy51bmluc3RhbGwodGhpcy5mb3JtLmVsZW1lbnRzKTtcbiAgICAgIGlmICh0aGlzLmZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgIHBvbHl1bmZpbGwodGhpcy5mb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJldmFsaWRhdGUgYW4gaW5wdXQgZWxlbWVudFxuICAgKi9cbiAgcmV2YWxpZGF0ZShldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEJ1dHRvbkVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50KSB7XG5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJldmFsaWRhdGUgPT09ICdoeWJyaWQnKSB7XG4gICAgICAgIC8qIFwiaHlicmlkXCIgc29tZXdoYXQgc2ltdWxhdGVzIHdoYXQgYnJvd3NlcnMgZG8uIFNlZSBmb3IgZXhhbXBsZVxuICAgICAgICAgKiBGaXJlZm94J3MgOi1tb3otdWktaW52YWxpZCBwc2V1ZG8tY2xhc3M6XG4gICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy86LW1vei11aS1pbnZhbGlkICovXG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnYmx1cicgJiZcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSAhPT0gZXZlbnQudGFyZ2V0LmRlZmF1bHRWYWx1ZSB8fFxuICAgICAgICAgICAgVmFsaWRpdHlTdGF0ZShldmVudC50YXJnZXQpLnZhbGlkKSB7XG4gICAgICAgICAgLyogb24gYmx1ciwgdXBkYXRlIHRoZSByZXBvcnQgd2hlbiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgZnJvbSB0aGVcbiAgICAgICAgICAgKiBkZWZhdWx0IG9yIHdoZW4gdGhlIGVsZW1lbnQgaXMgdmFsaWQgKHBvc3NpYmx5IHJlbW92aW5nIGEgc3RpbGxcbiAgICAgICAgICAgKiBzdGFuZGluZyBpbnZhbGlkaXR5IHJlcG9ydCkuICovXG4gICAgICAgICAgcmVwb3J0VmFsaWRpdHkoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXlDb2RlICE9PSA5KSB8fFxuICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID09PSAnY2hhbmdlJykge1xuICAgICAgICAgIGlmIChWYWxpZGl0eVN0YXRlKGV2ZW50LnRhcmdldCkudmFsaWQpIHtcbiAgICAgICAgICAgIC8vIHJlcG9ydCBpbnN0YW50bHksIHdoZW4gYW4gZWxlbWVudCBiZWNvbWVzIHZhbGlkLFxuICAgICAgICAgICAgLy8gcG9zdHBvbmUgcmVwb3J0IHRvIGJsdXIgZXZlbnQsIHdoZW4gYW4gZWxlbWVudCBpcyBpbnZhbGlkXG4gICAgICAgICAgICByZXBvcnRWYWxpZGl0eShldmVudC50YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgIT09ICdrZXl1cCcgfHwgZXZlbnQua2V5Q29kZSAhPT0gOSkge1xuICAgICAgICAvKiBkbyBfbm90XyB2YWxpZGF0ZSwgd2hlbiB0aGUgdXNlciBcInRhYmJlZFwiIGludG8gdGhlIGZpZWxkIGluaXRpYWxseSxcbiAgICAgICAgICogaS5lLiwgYSBrZXl1cCBldmVudCB3aXRoIGtleUNvZGUgOSAqL1xuICAgICAgICByZXBvcnRWYWxpZGl0eShldmVudC50YXJnZXQpO1xuICAgICAgfVxuXG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBpbnN0YWxsIHRoZSBwb2x5ZmlsbHMgb24gZWFjaCBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIElmIHlvdSBhZGQgZWxlbWVudHMgZHluYW1pY2FsbHksIHlvdSBoYXZlIHRvIGNhbGwgaW5zdGFsbCgpIG9uIHRoZW1cbiAgICogeW91cnNlbGY6XG4gICAqXG4gICAqIGpzPiB2YXIgZm9ybSA9IGh5cGVyZm9ybShkb2N1bWVudC5mb3Jtc1swXSk7XG4gICAqIGpzPiBkb2N1bWVudC5mb3Jtc1swXS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAqIGpzPiBmb3JtLmluc3RhbGwoaW5wdXQpO1xuICAgKlxuICAgKiBZb3UgY2FuIHNraXAgdGhpcywgaWYgeW91IGNhbGxlZCBoeXBlcmZvcm0gb24gd2luZG93IG9yIGRvY3VtZW50LlxuICAgKi9cbiAgaW5zdGFsbChlbHMpIHtcbiAgICBpZiAoZWxzIGluc3RhbmNlb2Ygd2luZG93LkVsZW1lbnQpIHtcbiAgICAgIGVscyA9IFsgZWxzIF07XG4gICAgfVxuXG4gICAgY29uc3QgZWxzX2xlbmd0aCA9IGVscy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsc19sZW5ndGg7IGkrKykge1xuICAgICAgcG9seWZpbGwoZWxzW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgdW5pbnN0YWxsKGVscykge1xuICAgIGlmIChlbHMgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkge1xuICAgICAgZWxzID0gWyBlbHMgXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbHNfbGVuZ3RoID0gZWxzLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxzX2xlbmd0aDsgaSsrKSB7XG4gICAgICBwb2x5dW5maWxsKGVsc1tpXSk7XG4gICAgfVxuICB9LFxuXG59O1xuXG5cbi8qKlxuICogdHJ5IHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGJ5IGxvb2tpbmcgdXBcbiAqIGl0cyBwYXJlbnQgY2hhaW5cbiAqXG4gKiBAcmV0dXJuIFdyYXBwZXIgfCB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF93cmFwcGVyKGVsZW1lbnQpIHtcbiAgdmFyIHdyYXBwZWQ7XG5cbiAgaWYgKGVsZW1lbnQuZm9ybSkge1xuICAgIC8qIHRyeSBhIHNob3J0Y3V0IHdpdGggdGhlIGVsZW1lbnQncyA8Zm9ybT4gKi9cbiAgICB3cmFwcGVkI
46184D0gaW5zdGFuY2VzLmdldChlbGVtZW50LmZvcm0pO1xuICB9XG5cbiAgLyogd2FsayB1cCB0aGUgcGFyZW50IG5vZGVzIHVudGlsIGRvY3VtZW50IChpbmNsdWRpbmcpICovXG4gIHdoaWxlICghIHdyYXBwZWQgJiYgZWxlbWVudCkge1xuICAgIHdyYXBwZWQgPSBpbnN0YW5jZXMuZ2V0KGVsZW1lbnQpO1xuICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICBpZiAoISB3cmFwcGVkKSB7XG4gICAgLyogdHJ5IHRoZSBnbG9iYWwgaW5zdGFuY2UsIGlmIGV4aXN0cy4gVGhpcyBtYXkgYWxzbyBiZSB1bmRlZmluZWQuICovXG4gICAgd3JhcHBlZCA9IGluc3RhbmNlcy5nZXQod2luZG93KTtcbiAgfVxuXG4gIHJldHVybiB3cmFwcGVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBjaGVja1ZhbGlkaXR5IGZyb20gJy4vcG9seWZpbGxzL2NoZWNrVmFsaWRpdHknO1xuaW1wb3J0IHJlcG9ydFZhbGlkaXR5IGZyb20gJy4vcG9seWZpbGxzL3JlcG9ydFZhbGlkaXR5JztcbmltcG9ydCBzZXRDdXN0b21WYWxpZGl0eSBmcm9tICcuL3BvbHlmaWxscy9zZXRDdXN0b21WYWxpZGl0eSc7XG5pbXBvcnQgc3RlcERvd24gZnJvbSAnLi9wb2x5ZmlsbHMvc3RlcERvd24nO1xuaW1wb3J0IHN0ZXBVcCBmcm9tICcuL3BvbHlmaWxscy9zdGVwVXAnO1xuaW1wb3J0IHZhbGlkYXRpb25NZXNzYWdlIGZyb20gJy4vcG9seWZpbGxzL3ZhbGlkYXRpb25NZXNzYWdlJztcbmltcG9ydCBWYWxpZGl0eVN0YXRlIGZyb20gJy4vcG9seWZpbGxzL3ZhbGlkaXR5U3RhdGUnO1xuaW1wb3J0IHZhbHVlQXNEYXRlIGZyb20gJy4vcG9seWZpbGxzL3ZhbHVlQXNEYXRlJztcbmltcG9ydCB2YWx1ZUFzTnVtYmVyIGZyb20gJy4vcG9seWZpbGxzL3ZhbHVlQXNOdW1iZXInO1xuaW1wb3J0IHdpbGxWYWxpZGF0ZSBmcm9tICcuL3BvbHlmaWxscy93aWxsVmFsaWRhdGUnO1xuaW1wb3J0IGN1c3RvbV9tZXNzYWdlcyBmcm9tICcuL2NvbXBvbmVudHMvY3VzdG9tX21lc3NhZ2VzJztcbmltcG9ydCB7IGFkZF9ob29rLCByZW1vdmVfaG9vayB9IGZyb20gJy4vY29tcG9uZW50cy9ob29rcyc7XG5pbXBvcnQgeyBzZXRfbGFuZ3VhZ2UsIGFkZF90cmFuc2xhdGlvbiB9IGZyb20gJy4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IEN1c3RvbVZhbGlkYXRvclJlZ2lzdHJ5IGZyb20gJy4vY29tcG9uZW50cy9yZWdpc3RyeSc7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9jb21wb25lbnRzL3JlbmRlcmVyJztcbmltcG9ydCBXcmFwcGVyIGZyb20gJy4vY29tcG9uZW50cy93cmFwcGVyJztcbmltcG9ydCBzcHJpbnRmIGZyb20gJy4vdG9vbHMvc3ByaW50Zic7XG5pbXBvcnQgdmVyc2lvbiBmcm9tICcuL3ZlcnNpb24nO1xuXG5cbi8qIGRlcHJlY2F0ZSB0aGUgb2xkIHNuYWtlX2Nhc2UgbmFtZXNcbiAqIFRPRE86IGRlbG1lIGJlZm9yZSBuZXh0IG5vbi1wYXRjaCByZWxlYXNlXG4gKi9cbmZ1bmN0aW9uIHcobmFtZSkge1xuICBjb25zdCBkZXByZWNhdGVkX21lc3NhZ2UgPSAnUGxlYXNlIHVzZSBjYW1lbENhc2UgbWV0aG9kIG5hbWVzISBUaGUgbmFtZSBcIiVzXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG5vbi1wYXRjaCByZWxlYXNlLic7XG4gIC8qIGdsb2JhbCBjb25zb2xlICovXG4gIGNvbnNvbGUubG9nKHNwcmludGYoZGVwcmVjYXRlZF9tZXNzYWdlLCBuYW1lKSk7XG59XG5cblxuLyoqXG4gKiBwdWJsaWMgaHlwZXJmb3JtIGludGVyZmFjZTpcbiAqL1xuZnVuY3Rpb24gaHlwZXJmb3JtKGZvcm0sIHtcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMsXG4gICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1mYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgIGV4dGVuZF9maWVsZHNldCxcbiAgICAgICAgICAgICAgICAgICAgIGV4dGVuZEZpZWxkc2V0LFxuICAgICAgICAgICAgICAgICAgICAgbm92YWxpZGF0ZV9vbl9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgIG5vdmFsaWRhdGVPbkVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgcHJldmVudF9pbXBsaWNpdF9zdWJtaXQsXG4gICAgICAgICAgICAgICAgICAgICBwcmV2ZW50SW1wbGljaXRTdWJtaXQvKiBUT0RPOiB1bmNvbW1lbnQgPWZhbHNlICovLFxuICAgICAgICAgICAgICAgICAgICAgcmV2YWxpZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1mYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgIHZhbGlkX2V2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgdmFsaWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlTmFtZWxlc3M9ZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgfT17fSkge1xuXG4gIGlmICghIGNsYXNzZXMpIHtcbiAgICBjbGFzc2VzID0ge307XG4gIH1cbiAgLy8gVE9ETzogY2xlYW4gdXAgYmVmb3JlIG5leHQgbm9uLXBhdGNoIHJlbGVhc2VcbiAgaWYgKGV4dGVuZEZpZWxkc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZXh0ZW5kX2ZpZWxkc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuZEZpZWxkc2V0ID0gISBzdHJpY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcoJ2V4dGVuZF9maWVsZHNldCcpO1xuICAgICAgZXh0ZW5kRmllbGRzZXQgPSBleHRlbmRfZmllbGRzZXQ7XG4gICAgfVxuICB9XG4gIGlmIChub3ZhbGlkYXRlT25FbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdmFsaWRhdGVfb25fZWxlbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbm92YWxpZGF0ZU9uRWxlbWVudHMgPSAhIHN0cmljdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdygnbm92YWxpZGF0ZV9vbl9lbGVtZW50cycpO1xuICAgICAgbm92YWxpZGF0ZU9uRWxlbWVudHMgPSBub3ZhbGlkYXRlX29uX2VsZW1lbnRzO1xuICAgIH1cbiAgfVxuICBpZiAocHJldmVudEltcGxpY2l0U3VibWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJldmVudF9pbXBsaWNpdF9zdWJtaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJldmVudEltcGxpY2l0U3VibWl0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcoJ3ByZXZlbnRfaW1wbGljaXRfc3VibWl0Jyk7XG4gICAgICBwcmV2ZW50SW1wbGljaXRTdWJtaXQgP
46184SBwcmV2ZW50X2ltcGxpY2l0X3N1Ym1pdDtcbiAgICB9XG4gIH1cbiAgaWYgKHJldmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIG90aGVyIHJlY29nbml6ZWQgdmFsdWVzOiAnb25pbnB1dCcsICdvbmJsdXInLCAnb25zdWJtaXQnIGFuZCAnbmV2ZXInICovXG4gICAgcmV2YWxpZGF0ZSA9IHN0cmljdD8gJ29uc3VibWl0JyA6ICdoeWJyaWQnO1xuICB9XG4gIGlmICh2YWxpZEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsaWRfZXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRFdmVudCA9ICEgc3RyaWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB3KCd2YWxpZF9ldmVudCcpO1xuICAgICAgdmFsaWRFdmVudCA9IHZhbGlkX2V2ZW50O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0geyBkZWJ1Zywgc3RyaWN0LCBwcmV2ZW50SW1wbGljaXRTdWJtaXQsIHJldmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgICAgICB2YWxpZEV2ZW50LCBleHRlbmRGaWVsZHNldCwgY2xhc3Nlcywgbm92YWxpZGF0ZU9uRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWVsZXNzLFxuICAgICAgICAgICAgICAgICAgIH07XG5cbiAgaWYgKGZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QgfHxcbiAgICAgIGZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENvbGxlY3Rpb24gfHxcbiAgICAgIGZvcm0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gaHlwZXJmb3JtKGVsZW1lbnQsIHNldHRpbmdzKSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFdyYXBwZXIoZm9ybSwgc2V0dGluZ3MpO1xufVxuXG5oeXBlcmZvcm0udmVyc2lvbiA9IHZlcnNpb247XG5cbmh5cGVyZm9ybS5jaGVja1ZhbGlkaXR5ID0gY2hlY2tWYWxpZGl0eTtcbmh5cGVyZm9ybS5yZXBvcnRWYWxpZGl0eSA9IHJlcG9ydFZhbGlkaXR5O1xuaHlwZXJmb3JtLnNldEN1c3RvbVZhbGlkaXR5ID0gc2V0Q3VzdG9tVmFsaWRpdHk7XG5oeXBlcmZvcm0uc3RlcERvd24gPSBzdGVwRG93bjtcbmh5cGVyZm9ybS5zdGVwVXAgPSBzdGVwVXA7XG5oeXBlcmZvcm0udmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbmh5cGVyZm9ybS5WYWxpZGl0eVN0YXRlID0gVmFsaWRpdHlTdGF0ZTtcbmh5cGVyZm9ybS52YWx1ZUFzRGF0ZSA9IHZhbHVlQXNEYXRlO1xuaHlwZXJmb3JtLnZhbHVlQXNOdW1iZXIgPSB2YWx1ZUFzTnVtYmVyO1xuaHlwZXJmb3JtLndpbGxWYWxpZGF0ZSA9IHdpbGxWYWxpZGF0ZTtcblxuaHlwZXJmb3JtLnNldExhbmd1YWdlID0gbGFuZyA9PiB7IHNldF9sYW5ndWFnZShsYW5nKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRUcmFuc2xhdGlvbiA9IChsYW5nLCBjYXRhbG9nKSA9PiB7IGFkZF90cmFuc2xhdGlvbihsYW5nLCBjYXRhbG9nKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5zZXRSZW5kZXJlciA9IChyZW5kZXJlciwgYWN0aW9uKSA9PiB7IFJlbmRlcmVyLnNldChyZW5kZXJlciwgYWN0aW9uKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRWYWxpZGF0b3IgPSAoZWxlbWVudCwgdmFsaWRhdG9yKSA9PiB7IEN1c3RvbVZhbGlkYXRvclJlZ2lzdHJ5LnNldChlbGVtZW50LCB2YWxpZGF0b3IpOyByZXR1cm4gaHlwZXJmb3JtOyB9O1xuaHlwZXJmb3JtLnNldE1lc3NhZ2UgPSAoZWxlbWVudCwgdmFsaWRhdG9yLCBtZXNzYWdlKSA9PiB7IGN1c3RvbV9tZXNzYWdlcy5zZXQoZWxlbWVudCwgdmFsaWRhdG9yLCBtZXNzYWdlKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRIb29rID0gKGhvb2ssIGFjdGlvbiwgcG9zaXRpb24pID0+IHsgYWRkX2hvb2soaG9vaywgYWN0aW9uLCBwb3NpdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5oeXBlcmZvcm0ucmVtb3ZlSG9vayA9IChob29rLCBhY3Rpb24pID0+IHsgcmVtb3ZlX2hvb2soaG9vaywgYWN0aW9uKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcblxuLy8gVE9ETzogUmVtb3ZlIGluIG5leHQgbm9uLXBhdGNoIHZlcnNpb25cbmh5cGVyZm9ybS5zZXRfbGFuZ3VhZ2UgPSBsYW5nID0+IHsgdygnc2V0X2xhbmd1YWdlJyk7IHNldF9sYW5ndWFnZShsYW5nKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRfdHJhbnNsYXRpb24gPSAobGFuZywgY2F0YWxvZykgPT4geyB3KCdhZGRfdHJhbnNsYXRpb24nKTsgYWRkX3RyYW5zbGF0aW9uKGxhbmcsIGNhdGFsb2cpOyByZXR1cm4gaHlwZXJmb3JtOyB9O1xuaHlwZXJmb3JtLnNldF9yZW5kZXJlciA9IChyZW5kZXJlciwgYWN0aW9uKSA9PiB7IHcoJ3NldF9yZW5kZXJlcicpOyBSZW5kZXJlci5zZXQocmVuZGVyZXIsIGFjdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5oeXBlcmZvcm0uYWRkX3ZhbGlkYXRvciA9IChlbGVtZW50LCB2YWxpZGF0b3IpID0+IHsgdygnYWRkX3ZhbGlkYXRvcicpOyBDdXN0b21WYWxpZGF0b3JSZWdpc3RyeS5zZXQoZWxlbWVudCwgdmFsaWRhdG9yKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5zZXRfbWVzc2FnZSA9IChlbGVtZW50LCB2YWxpZGF0b3IsIG1lc3NhZ2UpID0+IHsgdygnc2V0X21lc3NhZ2UnKTsgY3VzdG9tX21lc3NhZ2VzLnNldChlbGVtZW50LCB2YWxpZGF0b3IsIG1lc3NhZ2UpOyByZXR1cm4gaHlwZXJmb3JtOyB9O1xuaHlwZXJmb3JtLmFkZF9ob29rID0gKGhvb2ssIGFjdGlvbiwgcG9zaXRpb24pID0+IHsgdygnYWRkX2hvb2snKTsgYWRkX2hvb2soaG9vaywgYWN0aW9uLCBwb3NpdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5oeXBlcmZvcm0ucmVtb3ZlX2hvb2sgPSAoaG9vaywgYWN0aW9uKSA9PiB7IHcoJ3JlbW92ZV9ob29rJyk7IHJlbW92ZV9ob29rKGhvb2ssIGFjdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5cbmlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuaGFzQXR0cmlidXRlKCdkYXRhLWhmLWF1dG9sb2FkJykpIHtcbiAgaHlwZXJmb3JtKHdpbmRvdyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGh5cGVyZm9ybTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBnZXRfdmFsaWRhdGVkX2VsZW1lbnRzIH0gZnJvbSAnLi4vdG9vbHMvZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyc7XG5pbXBvcnQgcmV0dXJuX2hvb2tfb3IgZnJvbSAnLi4vdG9vbHMvcmV0dXJuX2hvb2tfb3InO1xuaW1wb3J0IHRyaWdnZXJfZXZlbnQgZnJvbSAnLi4vdG9vbHMvdHJpZ2dlcl9ldmVudCc7XG5pbXBvcnQgVmFsaWRpdHlTdGF0ZSBmcm9tICcuL3ZhbGlkaXR5U3RhdGUnO1xuaW1wb3J0IHsgZ2V0X3dyYXBwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3dyYXBwZXInO1xuXG5cbi8qKlxuICogY2hlY2sgYW4gZWxlbWVudCdzIHZhbGlkaXR5IHdpdGggcmVzcGVjdCB0byBpdCdzIGZvcm1cbiAqL1xuY29uc3QgY2hlY2tWYWxpZGl0eSA9IHJldHVybl9ob29rX29yKCdjaGVja1ZhbGlkaXR5JywgZnVuY3Rpb24oZWxlbWVudCkge1xuICAvKiBpZiB0aGlzIGlzIGEgPGZvcm0+LCBjaGVjayB2YWxpZGl0eSBvZiBhbGwgY2hpbGQgaW5wdXRzICovXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGb3JtRWxlbWVudCkge1xuICAgIHJldHVybi
46184BnZXRfdmFsaWRhdGVkX2VsZW1lbnRzKGVsZW1lbnQpLm1hcChjaGVja1ZhbGlkaXR5KS5ldmVyeShiPT5iKTtcbiAgfVxuXG4gIC8qIGRlZmF1bHQgaXMgdHJ1ZSwgYWxzbyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgbm8gdmFsaWRhdGlvbiBjYW5kaWRhdGVzICovXG4gIGNvbnN0IHZhbGlkID0gVmFsaWRpdHlTdGF0ZShlbGVtZW50KS52YWxpZDtcbiAgaWYgKHZhbGlkKSB7XG4gICAgY29uc3Qgd3JhcHBlZF9mb3JtID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gICAgaWYgKHdyYXBwZWRfZm9ybSAmJiB3cmFwcGVkX2Zvcm0uc2V0dGluZ3MudmFsaWRFdmVudCkge1xuICAgICAgdHJpZ2dlcl9ldmVudChlbGVtZW50LCAndmFsaWQnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHJpZ2dlcl9ldmVudChlbGVtZW50LCAnaW52YWxpZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZDtcbn0pO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNoZWNrVmFsaWRpdHk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGluc3RhbGxfcHJvcGVydHkgZnJvbSAnLi4vdG9vbHMvcHJvcGVydHlfaW5zdGFsbGVyJztcbmltcG9ydCB1bmluc3RhbGxfcHJvcGVydHkgZnJvbSAnLi4vdG9vbHMvcHJvcGVydHlfdW5pbnN0YWxsZXInO1xuaW1wb3J0IHsgY2FsbF9ob29rLCBkb19maWx0ZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL2hvb2tzJztcblxuXG5jb25zdCBnQSA9IHByb3AgPT4gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBkb19maWx0ZXIoJ2F0dHJfZ2V0XycrcHJvcCwgdGhpcy5nZXRBdHRyaWJ1dGUocHJvcCksIHRoaXMpO1xufTtcblxuY29uc3Qgc0EgPSBwcm9wID0+IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHRoaXMuc2V0QXR0cmlidXRlKHByb3AsIGRvX2ZpbHRlcignYXR0cl9zZXRfJytwcm9wLCB2YWx1ZSwgdGhpcykpO1xufTtcblxuY29uc3QgZ0FiID0gcHJvcCA9PiBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGRvX2ZpbHRlcignYXR0cl9nZXRfJytwcm9wLCB0aGlzLmhhc0F0dHJpYnV0ZShwcm9wKSwgdGhpcyk7XG59O1xuXG5jb25zdCBzQWIgPSBwcm9wID0+IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmIChkb19maWx0ZXIoJ2F0dHJfc2V0XycrcHJvcCwgdmFsdWUsIHRoaXMpKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUocHJvcCwgcHJvcCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gIH1cbn07XG5cbmNvbnN0IGdBbiA9IHByb3AgPT4gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBkb19maWx0ZXIoJ2F0dHJfZ2V0XycrcHJvcCwgTWF0aC5tYXgoMCwgTnVtYmVyKHRoaXMuZ2V0QXR0cmlidXRlKHByb3ApKSksIHRoaXMpO1xufTtcblxuY29uc3Qgc0FuID0gcHJvcCA9PiBmdW5jdGlvbih2YWx1ZSkge1xuICB2YWx1ZSA9IGRvX2ZpbHRlcignYXR0cl9zZXRfJytwcm9wLCB2YWx1ZSwgdGhpcyk7XG4gIGlmICgvXlswLTldKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBpbnN0YWxsX3Byb3BlcnRpZXMoZWxlbWVudCkge1xuICBmb3IgKGxldCBwcm9wIG9mIFsgJ2FjY2VwdCcsICdtYXgnLCAnbWluJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAnc3RlcCcsIF0pIHtcbiAgICBpbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsIHByb3AsIHtcbiAgICAgIGdldDogZ0EocHJvcCksXG4gICAgICBzZXQ6IHNBKHByb3ApLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChsZXQgcHJvcCBvZiBbICdtdWx0aXBsZScsICdyZXF1aXJlZCcsICdyZWFkT25seScsIF0pIHtcbiAgICBpbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsIHByb3AsIHtcbiAgICAgIGdldDogZ0FiKHByb3AudG9Mb3dlckNhc2UoKSksXG4gICAgICBzZXQ6IHNBYihwcm9wLnRvTG93ZXJDYXNlKCkpLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChsZXQgcHJvcCBvZiBbICdtaW5MZW5ndGgnLCAnbWF4TGVuZ3RoJywgXSkge1xuICAgIGluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgcHJvcCwge1xuICAgICAgZ2V0OiBnQW4ocHJvcC50b0xvd2VyQ2FzZSgpKSxcbiAgICAgIHNldDogc0FuKHByb3AudG9Mb3dlckNhc2UoKSksXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5pbnN0YWxsX3Byb3BlcnRpZXMoZWxlbWVudCkge1xuICBmb3IgKGxldCBwcm9wIG9mIFsgJ2FjY2VwdCcsICdtYXgnLCAnbWluJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAnc3RlcCcsXG4gICAgICAgJ211bHRpcGxlJywgJ3JlcXVpcmVkJywgJ3JlYWRPbmx5JywgJ21pbkxlbmd0aCcsICdtYXhMZW5ndGgnLCBdKSB7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsIHByb3ApO1xuICB9XG59XG5cbmV4cG9ydCB7IGluc3RhbGxfcHJvcGVydGllcywgdW5pbnN0YWxsX3Byb3BlcnRpZXMgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBnZXRfdmFsaWRhdGVkX2VsZW1lbnRzIH0gZnJvbSAnLi4vdG9vbHMvZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyc7XG5pbXBvcnQgdHJpZ2dlcl9ldmVudCBmcm9tICcuLi90b29scy90cmlnZ2VyX2V2ZW50JztcbmltcG9ydCBSZW5kZXJlciBmcm9tICcuLi9jb21wb25lbnRzL3JlbmRlcmVyJztcbmltcG9ydCBWYWxpZGl0eVN0YXRlIGZyb20gJy4vdmFsaWRpdHlTdGF0ZSc7XG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5cblxuLyoqXG4gKiBjaGVjayBlbGVtZW50J3MgdmFsaWRpdHkgYW5kIHJlcG9ydCBhbiBlcnJvciBiYWNrIHRvIHRoZSB1c2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcG9ydFZhbGlkaXR5KGVsZW1lbnQpIHtcbiAgLyogaWYgdGhpcyBpcyBhIDxmb3JtPiwgcmVwb3J0IHZhbGlkaXR5IG9mIGFsbCBjaGlsZCBpbnB1dHMgKi9cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgZWxlbWVudC5fX2hmX2Zvcm1fdmFsaWRhdGlvbiA9IHRydWU7XG4gICAgY29uc3QgZm9ybV92YWxpZCA9IGdldF92YWxpZGF0ZWRfZWxlbWVudHMoZWxlbWVudCkubWFwKHJlcG9ydFZhbGlkaXR5KS5ldmVyeShiPT5iKTtcbiAgICBkZWxldGUoZWxlbWVudC5fX2hmX2Zvcm1fdmFsaWRhdGlvbik7XG4gICAgcmV0dXJuIGZvcm1fdmFsaWQ7XG4gIH1cblxuICAvKiB3ZSBjb3B5IGNoZWNrVmFsaWRpdHkoKSBoZXJlLCBiL2Mgd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgXCJpbnZhbGlkXCJcbiAgICogZXZlbnQgd2FzIGNhbmNlbGVkLiAqL1xuICBjb25zdCB2YWxpZCA9IFZhbGlkaXR5U3RhdGUoZWxlbWVudCkudmFsaWQ7XG4gIHZhciBldmVudDtcbiAgaWYgKHZhbGlkKSB7XG4gICAgY29uc3Qgd3JhcHBlZF9mb3JtID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gICAgaWYgKHdyYXBwZWRfZm9ybSAmJiB3cmFwcGVkX2Zvcm0uc2V0dGluZ3MudmFsaWRFdmVudCkge1xuICAgICAgZXZlbnQgPSB0cmlnZ2VyX2V2ZW50KGVsZW1lbnQsICd2YWxpZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gI
46184H0gZWxzZSB7XG4gICAgZXZlbnQgPSB0cmlnZ2VyX2V2ZW50KGVsZW1lbnQsICdpbnZhbGlkJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICB9XG5cbiAgaWYgKCEgZXZlbnQgfHwgISBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgUmVuZGVyZXIuc2hvd1dhcm5pbmcoZWxlbWVudCwgISFlbGVtZW50LmZvcm0uX19oZl9mb3JtX3ZhbGlkYXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IG1lc3NhZ2Vfc3RvcmUgfSBmcm9tICcuLi9jb21wb25lbnRzL21lc3NhZ2Vfc3RvcmUnO1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4uL2NvbXBvbmVudHMvcmVuZGVyZXInO1xuaW1wb3J0IHZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzIGZyb20gJy4uL3Rvb2xzL3ZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzJztcblxuXG4vKipcbiAqIHNldCBhIGN1c3RvbSB2YWxpZGl0eSBtZXNzYWdlIG9yIGRlbGV0ZSBpdCB3aXRoIGFuIGVtcHR5IHN0cmluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXRDdXN0b21WYWxpZGl0eShlbGVtZW50LCBtc2cpIHtcbiAgaWYgKCEgbXNnKSB7XG4gICAgbWVzc2FnZV9zdG9yZS5kZWxldGUoZWxlbWVudCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZV9zdG9yZS5zZXQoZWxlbWVudCwgbXNnLCB0cnVlKTtcbiAgfVxuICAvKiBsaXZlLXVwZGF0ZSB0aGUgd2FybmluZyAqL1xuICBjb25zdCB3YXJuaW5nID0gUmVuZGVyZXIuZ2V0V2FybmluZyhlbGVtZW50KTtcbiAgaWYgKHdhcm5pbmcpIHtcbiAgICBSZW5kZXJlci5zZXRNZXNzYWdlKHdhcm5pbmcsIG1zZywgZWxlbWVudCk7XG4gIH1cbiAgLyogdXBkYXRlIGFueSBjbGFzc2VzIGlmIHRoZSB2YWxpZGl0eSBzdGF0ZSBjaGFuZ2VzICovXG4gIHZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzLnZhbGlkKGVsZW1lbnQpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfbmV4dF92YWxpZCBmcm9tICcuLi90b29scy9nZXRfbmV4dF92YWxpZCc7XG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHsgbnVtYmVycyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHZhbHVlQXNOdW1iZXIgZnJvbSAnLi92YWx1ZUFzTnVtYmVyJztcblxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0ZXBEb3duKGVsZW1lbnQsIG49MSkge1xuICBpZiAobnVtYmVycy5pbmRleE9mKGdldF90eXBlKGVsZW1lbnQpKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbignc3RlcERvd24gZW5jb3VudGVyZWQgaW52YWxpZCB0eXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZFN0YXRlRXJyb3InKTtcbiAgfVxuICBpZiAoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGVwJykgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdhbnknKSB7XG4gICAgdGhyb3cgbmV3IHdpbmRvdy5ET01FeGNlcHRpb24oJ3N0ZXBEb3duIGVuY291bnRlcmVkIHN0ZXAgXCJhbnlcIicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRTdGF0ZUVycm9yJyk7XG4gIH1cblxuICBjb25zdCBwcmV2ID0gZ2V0X25leHRfdmFsaWQoZWxlbWVudCwgbilbMF07XG5cbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICB2YWx1ZUFzTnVtYmVyKGVsZW1lbnQsIHByZXYpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGdldF9uZXh0X3ZhbGlkIGZyb20gJy4uL3Rvb2xzL2dldF9uZXh0X3ZhbGlkJztcbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgeyBudW1iZXJzIH0gZnJvbSAnLi4vY29tcG9uZW50cy90eXBlcyc7XG5pbXBvcnQgdmFsdWVBc051bWJlciBmcm9tICcuL3ZhbHVlQXNOdW1iZXInO1xuXG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RlcFVwKGVsZW1lbnQsIG49MSkge1xuICBpZiAobnVtYmVycy5pbmRleE9mKGdldF90eXBlKGVsZW1lbnQpKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbignc3RlcFVwIGVuY291bnRlcmVkIGludmFsaWQgdHlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRTdGF0ZUVycm9yJyk7XG4gIH1cbiAgaWYgKChlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3RlcCcpIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnYW55Jykge1xuICAgIHRocm93IG5ldyB3aW5kb3cuRE9NRXhjZXB0aW9uKCdzdGVwVXAgZW5jb3VudGVyZWQgc3RlcCBcImFueVwiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZFN0YXRlRXJyb3InKTtcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSBnZXRfbmV4dF92YWxpZChlbGVtZW50LCBuKVsxXTtcblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIHZhbHVlQXNOdW1iZXIoZWxlbWVudCwgbmV4dCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBtZXNzYWdlX3N0b3JlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9tZXNzYWdlX3N0b3JlJztcblxuXG4vKipcbiAqIGdldCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGZvciBhbiBlbGVtZW50LCBlbXB0eSBzdHJpbmcsIGlmIHRoZSBlbGVtZW50XG4gKiBzYXRpc2ZpZXMgYWxsIGNvbnN0cmFpbnRzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0aW9uTWVzc2FnZShlbGVtZW50KSB7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2Vfc3RvcmUuZ2V0KGVsZW1lbnQpO1xuICBpZiAoISBtc2cpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKiBtYWtlIGl0IGEgcHJpbWl0aXZlIGFnYWluLCBzaW5jZSBtZXNzYWdlX3N0b3JlIHJldHVybnMgU3RyaW5nKCkuICovXG4gIHJldHVybiBtc2cudG9TdHJpbmcoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgaXNfdmFsaWRhdGlvbl9jYW5kaWRhdGUgZnJvbSAnLi4vdG9vbHMvaXNfdmFsaWRhdGlvbl9jYW5kaWRhdGUnO1xuaW1wb3J0IG1hcmsgZnJvbSAnLi4vdG9vbHMvbWFyayc7XG5pbXBvcnQgdmFsaWRpdHlfc3RhdGVfY2hlY2tlcnMgZnJvbSAnLi4vdG9vbHMvdmFsaWRpdHlfc3RhdGVfY2hlY2tlcnMnO1xuXG5cbi8qKlxuICogdGhlIHZhbGlkaXR5IHN0YXRlIGNvbnN0cnVjdG9yXG4gKi9cbmNvbnN0IFZhbGlkaXR5U3RhdGUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmICghIC
46184hlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGNyZWF0ZSBhIFZhbGlkaXR5U3RhdGUgZm9yIGEgbm9uLWVsZW1lbnQnKTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlZCA9IFZhbGlkaXR5U3RhdGUuY2FjaGUuZ2V0KGVsZW1lbnQpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGlmICghICh0aGlzIGluc3RhbmNlb2YgVmFsaWRpdHlTdGF0ZSkpIHtcbiAgICAvKiB3b3JraW5nIGFyb3VuZCBhIGZvcmdvdHRlbiBgbmV3YCAqL1xuICAgIHJldHVybiBuZXcgVmFsaWRpdHlTdGF0ZShlbGVtZW50KTtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIFZhbGlkaXR5U3RhdGUuY2FjaGUuc2V0KGVsZW1lbnQsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIHRoZSBwcm90b3R5cGUgZm9yIG5ldyB2YWxpZGl0eVN0YXRlIGluc3RhbmNlc1xuICovXG5jb25zdCBWYWxpZGl0eVN0YXRlUHJvdG90eXBlID0ge307XG5WYWxpZGl0eVN0YXRlLnByb3RvdHlwZSA9IFZhbGlkaXR5U3RhdGVQcm90b3R5cGU7XG5cblZhbGlkaXR5U3RhdGUuY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4vKiBzbWFsbCB3cmFwcGVyIGFyb3VuZCB0aGUgYWN0dWFsIHZhbGlkYXRvciB0byBjaGVjayBpZiB0aGUgdmFsaWRhdG9yXG4gKiBzaG91bGQgYWN0dWFsbHkgYmUgY2FsbGVkLiBgdGhpc2AgcmVmZXJzIHRvIHRoZSBWYWxpZGl0eVN0YXRlIG9iamVjdC4gKi9cbmNvbnN0IGNoZWNrZXJfZ2V0dGVyID0gZnVuYyA9PiB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoISBpc192YWxpZGF0aW9uX2NhbmRpZGF0ZSh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAvKiBub3QgYmVpbmcgdmFsaWRhdGVkID09IHZhbGlkIGJ5IGRlZmF1bHQgKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYyh0aGlzLmVsZW1lbnQpO1xuICB9O1xufTtcblxuLyoqXG4gKiBjb3B5IGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgdmFsaWRpdHkgY2hlY2tlcnMgdG8gdGhlIFZhbGlkaXR5U3RhdGVcbiAqIHByb3RvdHlwZVxuICovXG5mb3IgKGxldCBwcm9wIGluIHZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWYWxpZGl0eVN0YXRlUHJvdG90eXBlLCBwcm9wLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBjaGVja2VyX2dldHRlcih2YWxpZGl0eV9zdGF0ZV9jaGVja2Vyc1twcm9wXSksXG4gICAgc2V0OiB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIG1hcmsgdGhlIHZhbGlkaXR5IHByb3RvdHlwZSwgYmVjYXVzZSB0aGF0IGlzIHdoYXQgdGhlIGNsaWVudC1mYWNpbmdcbiAqIGNvZGUgZGVhbHMgd2l0aCBtb3N0bHksIG5vdCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciB0aGluZyAqL1xubWFyayhWYWxpZGl0eVN0YXRlUHJvdG90eXBlKTtcblxuZXhwb3J0IGRlZmF1bHQgVmFsaWRpdHlTdGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcbmltcG9ydCBkYXRlX3RvX3N0cmluZyBmcm9tICcuLi90b29scy9kYXRlX3RvX3N0cmluZyc7XG5pbXBvcnQgeyBkYXRlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuXG5cbi8qKlxuICogaW1wbGVtZW50IHRoZSB2YWx1ZUFzRGF0ZSBmdW5jdGlvbmFsaXR5XG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2RvbS1pbnB1dC12YWx1ZWFzZGF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWx1ZUFzRGF0ZShlbGVtZW50LCB2YWx1ZT11bmRlZmluZWQpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIHNldHRlcjogdmFsdWUgbXVzdCBiZSBudWxsIG9yIGEgRGF0ZSgpICovXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICBlbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC52YWx1ZSA9IGRhdGVfdG9fc3RyaW5nKHZhbHVlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IHdpbmRvdy5ET01FeGNlcHRpb24oXG4gICAgICAgICAgJ3ZhbHVlQXNEYXRlIHNldHRlciBlbmNvdW50ZXJlZCBpbnZhbGlkIHZhbHVlJywgJ1R5cGVFcnJvcicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlX2RhdGUgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gdmFsdWVfZGF0ZSBpbnN0YW5jZW9mIERhdGU/IHZhbHVlX2RhdGUgOiBudWxsO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIC8qIHRyeWluZyB0byBzZXQgYSBkYXRlIG9uIGEgbm90LWRhdGUgaW5wdXQgZmFpbHMgKi9cbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbihcbiAgICAgICd2YWx1ZUFzRGF0ZSBzZXR0ZXIgY2Fubm90IHNldCBkYXRlIG9uIHRoaXMgZWxlbWVudCcsXG4gICAgICAnSW52YWxpZFN0YXRlRXJyb3InKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgc3RyaW5nX3RvX251bWJlciBmcm9tICcuLi90b29scy9zdHJpbmdfdG9fbnVtYmVyJztcbmltcG9ydCB7IG51bWJlcnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcbmltcG9ydCB2YWx1ZUFzRGF0ZSBmcm9tICcuL3ZhbHVlQXNEYXRlJztcblxuXG4vKipcbiAqIGltcGxlbWVudCB0aGUgdmFsdWVBc051bWJlciBmdW5jdGlvbmFsaXR5XG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2RvbS1pbnB1dC12YWx1ZWFzbnVtYmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbHVlQXNOdW1iZXIoZWxlbWVudCwgdmFsdWU9dW5kZWZpbmVkKSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRfdHlwZShlbGVtZW50KTtcbiAgaWYgKG51bWJlcnMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgaWYgKHR5cGUgPT09ICdyYW5nZScgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgIC8qIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNkby1ub3QtYXBwbHkgKi9cbiAgICAgIHJldHVybi
46184BOYU47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIHNldHRlcjogdmFsdWUgbXVzdCBiZSBOYU4gb3IgYSBmaW5pdGUgbnVtYmVyICovXG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB3aW5kb3cuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLyogdHJ5IHNldHRpbmcgYXMgYSBkYXRlLCBidXQuLi4gKi9cbiAgICAgICAgICB2YWx1ZUFzRGF0ZShlbGVtZW50LCBuZXcgRGF0ZSh2YWx1ZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogLi4uIHdoZW4gdmFsdWVBc0RhdGUgaXMgbm90IHJlc3BvbnNpYmxlLCAuLi4gKi9cbiAgICAgICAgICBpZiAoISAoZSBpbnN0YW5jZW9mIHdpbmRvdy5ET01FeGNlcHRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiAuLi4gc2V0IGl0IHZpYSBOdW1iZXIudG9TdHJpbmcoKS4gKi9cbiAgICAgICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IHdpbmRvdy5ET01FeGNlcHRpb24oXG4gICAgICAgICAgJ3ZhbHVlQXNOdW1iZXIgc2V0dGVyIGVuY291bnRlcmVkIGludmFsaWQgdmFsdWUnLCAnVHlwZUVycm9yJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ190b19udW1iZXIoZWxlbWVudC52YWx1ZSwgdHlwZSk7XG5cbiAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLyogdHJ5aW5nIHRvIHNldCBhIG51bWJlciBvbiBhIG5vdC1udW1iZXIgaW5wdXQgZmFpbHMgKi9cbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbihcbiAgICAgICd2YWx1ZUFzTnVtYmVyIHNldHRlciBjYW5ub3Qgc2V0IG51bWJlciBvbiB0aGlzIGVsZW1lbnQnLFxuICAgICAgJ0ludmFsaWRTdGF0ZUVycm9yJyk7XG4gIH1cblxuICByZXR1cm4gTmFOO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBpc192YWxpZGF0aW9uX2NhbmRpZGF0ZSBmcm9tICcuLi90b29scy9pc192YWxpZGF0aW9uX2NhbmRpZGF0ZSc7XG5cblxuLyoqXG4gKiBjaGVjaywgaWYgYW4gZWxlbWVudCB3aWxsIGJlIHN1YmplY3QgdG8gSFRNTDUgdmFsaWRhdGlvbiBhdCBhbGxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2lsbFZhbGlkYXRlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGlzX3ZhbGlkYXRpb25fY2FuZGlkYXRlKGVsZW1lbnQpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB0cmlnZ2VyX2V2ZW50LCB7IGNyZWF0ZV9ldmVudCB9IGZyb20gJy4vdHJpZ2dlcl9ldmVudCc7XG5pbXBvcnQgbWF0Y2hlcyBmcm9tICcuL21hdGNoZXMnO1xuaW1wb3J0IHsgZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyB9IGZyb20gJy4vZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyc7XG5pbXBvcnQgcmVwb3J0VmFsaWRpdHkgZnJvbSAnLi4vcG9seWZpbGxzL3JlcG9ydFZhbGlkaXR5JztcbmltcG9ydCB7IHRleHQgYXMgdGV4dF90eXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0X3dyYXBwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3dyYXBwZXInO1xuXG5cbi8qKlxuICogc3VibWl0IGEgZm9ybSwgYmVjYXVzZSBgZWxlbWVudGAgdHJpZ2dlcmVkIGl0XG4gKlxuICogVGhpcyBtZXRob2QgYWxzbyBkaXNwYXRjaGVzIGEgc3VibWl0IGV2ZW50IG9uIHRoZSBmb3JtIHByaW9yIHRvIHRoZVxuICogc3VibWlzc2lvbi4gVGhlIGV2ZW50IGNvbnRhaW5zIHRoZSB0cmlnZ2VyIGVsZW1lbnQgYXMgYHN1Ym1pdHRlZFZpYWAuXG4gKlxuICogSWYgdGhlIGVsZW1lbnQgaXMgYSBidXR0b24gd2l0aCBhIG5hbWUsIHRoZSBuYW1lPXZhbHVlIHBhaXIgd2lsbCBiZSBhZGRlZFxuICogdG8gdGhlIHN1Ym1pdHRlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBzdWJtaXRfZm9ybV92aWEoZWxlbWVudCkge1xuICAvKiBhcHBhcmVudGx5LCB0aGUgc3VibWl0IGV2ZW50IGlzIG5vdCB0cmlnZ2VyZWQgaW4gbW9zdCBicm93c2VycyBvblxuICAgKiB0aGUgc3VibWl0KCkgbWV0aG9kLCBzbyB3ZSBkbyBpdCBtYW51YWxseSBoZXJlIHRvIG1vZGVsIGEgbmF0dXJhbFxuICAgKiBzdWJtaXQgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS5cbiAgICogTm93IHRvIHRoZSBmdW4gZmFjdDogSWYgeW91IHRyaWdnZXIgYSBzdWJtaXQgZXZlbnQgZnJvbSBhIGZvcm0sIHdoYXRcbiAgICogZG8geW91IHRoaW5rIHNob3VsZCBoYXBwZW4/XG4gICAqIDEpIHRoZSBmb3JtIHdpbGwgYmUgYXV0b21hZ2ljYWxseSBzdWJtaXR0ZWQgYnkgdGhlIGJyb3dzZXIsIG9yXG4gICAqIDIpIG5vdGhpbmcuXG4gICAqIEFuZCBhcyB5b3UgYWxyZWFkeSBzdXNwZWN0ZWQsIHRoZSBjb3JyZWN0IGFuc3dlciBpczogYm90aCEgRmlyZWZveFxuICAgKiBvcHRzIGZvciAxKSwgQ2hyb21lIGZvciAyKS4gWWF5ISAqL1xuICB2YXIgZXZlbnRfZ290X2NhbmNlbGxlZDtcblxuICB2YXIgc3VibWl0X2V2ZW50ID0gY3JlYXRlX2V2ZW50KCdzdWJtaXQnLCB7IGNhbmNlbGFibG
46184U6IHRydWUgfSk7XG4gIC8qIGZvcmNlIEZpcmVmb3ggdG8gbm90IHN1Ym1pdCB0aGUgZm9ybSwgdGhlbiBmYWtlIHByZXZlbnREZWZhdWx0KCkgKi9cbiAgc3VibWl0X2V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJtaXRfZXZlbnQsICdkZWZhdWx0UHJldmVudGVkJywge1xuICAgIHZhbHVlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJtaXRfZXZlbnQsICdwcmV2ZW50RGVmYXVsdCcsIHtcbiAgICB2YWx1ZTogKCkgPT4gc3VibWl0X2V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSBldmVudF9nb3RfY2FuY2VsbGVkID0gdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgfSk7XG4gIHRyaWdnZXJfZXZlbnQoZWxlbWVudC5mb3JtLCBzdWJtaXRfZXZlbnQsIHt9LCB7IHN1Ym1pdHRlZFZpYTogZWxlbWVudCB9KTtcblxuICBpZiAoISBldmVudF9nb3RfY2FuY2VsbGVkKSB7XG4gICAgYWRkX3N1Ym1pdF9maWVsZChlbGVtZW50KTtcbiAgICB3aW5kb3cuSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQuY2FsbChlbGVtZW50LmZvcm0pO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHJlbW92ZV9zdWJtaXRfZmllbGQoZWxlbWVudCkpO1xuICB9XG59XG5cblxuLyoqXG4gKiBpZiBhIHN1Ym1pdCBidXR0b24gd2FzIGNsaWNrZWQsIGFkZCBpdHMgbmFtZT12YWx1ZSBieSBtZWFucyBvZiBhIHR5cGU9aGlkZGVuXG4gKiBpbnB1dCBmaWVsZFxuICovXG5mdW5jdGlvbiBhZGRfc3VibWl0X2ZpZWxkKGJ1dHRvbikge1xuICBpZiAoWydpbWFnZScsICdzdWJtaXQnXS5pbmRleE9mKGJ1dHRvbi50eXBlKSA+IC0xICYmIGJ1dHRvbi5uYW1lKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldF93cmFwcGVyKGJ1dHRvbi5mb3JtKSB8fCB7fTtcbiAgICB2YXIgc3VibWl0X2hlbHBlciA9IHdyYXBwZXIuc3VibWl0X2hlbHBlcjtcbiAgICBpZiAoc3VibWl0X2hlbHBlcikge1xuICAgICAgaWYgKHN1Ym1pdF9oZWxwZXIucGFyZW50Tm9kZSkge1xuICAgICAgICBzdWJtaXRfaGVscGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3VibWl0X2hlbHBlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Ym1pdF9oZWxwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgc3VibWl0X2hlbHBlci50eXBlID0gJ2hpZGRlbic7XG4gICAgICB3cmFwcGVyLnN1Ym1pdF9oZWxwZXIgPSBzdWJtaXRfaGVscGVyO1xuICAgIH1cbiAgICBzdWJtaXRfaGVscGVyLm5hbWUgPSBidXR0b24ubmFtZTtcbiAgICBzdWJtaXRfaGVscGVyLnZhbHVlID0gYnV0dG9uLnZhbHVlO1xuICAgIGJ1dHRvbi5mb3JtLmFwcGVuZENoaWxkKHN1Ym1pdF9oZWxwZXIpO1xuICB9XG59XG5cblxuLyoqXG4gKiByZW1vdmUgYSBwb3NzaWJsZSBoZWxwZXIgaW5wdXQsIHRoYXQgd2FzIGFkZGVkIGJ5IGBhZGRfc3VibWl0X2ZpZWxkYFxuICovXG5mdW5jdGlvbiByZW1vdmVfc3VibWl0X2ZpZWxkKGJ1dHRvbikge1xuICBpZiAoWydpbWFnZScsICdzdWJtaXQnXS5pbmRleE9mKGJ1dHRvbi50eXBlKSA+IC0xICYmIGJ1dHRvbi5uYW1lKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldF93cmFwcGVyKGJ1dHRvbi5mb3JtKSB8fCB7fTtcbiAgICBjb25zdCBzdWJtaXRfaGVscGVyID0gd3JhcHBlci5zdWJtaXRfaGVscGVyO1xuICAgIGlmIChzdWJtaXRfaGVscGVyICYmIHN1Ym1pdF9oZWxwZXIucGFyZW50Tm9kZSkge1xuICAgICAgc3VibWl0X2hlbHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN1Ym1pdF9oZWxwZXIpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qKlxuICogY2hlY2sgYSBmb3JtJ3MgdmFsaWRpdHkgYW5kIHN1Ym1pdCBpdFxuICpcbiAqIFRoZSBtZXRob2QgdHJpZ2dlcnMgYSBjYW5jZWxsYWJsZSBgdmFsaWRhdGVgIGV2ZW50IG9uIHRoZSBmb3JtLiBJZiB0aGVcbiAqIGV2ZW50IGlzIGNhbmNlbGxlZCwgZm9ybSBzdWJtaXNzaW9uIHdpbGwgYmUgYWJvcnRlZCwgdG9vLlxuICpcbiAqIElmIHRoZSBmb3JtIGlzIGZvdW5kIHRvIGNvbnRhaW4gaW52YWxpZCBmaWVsZHMsIGZvY3VzIHRoZSBmaXJzdCBmaWVsZC5cbiAqL1xuZnVuY3Rpb24gY2hlY2soYnV0dG9uKSB7XG4gIC8qIHRyaWdnZXIgYSBcInZhbGlkYXRlXCIgZXZlbnQgb24gdGhlIGZvcm0gdG8gYmUgc3VibWl0dGVkICovXG4gIGNvbnN0IHZhbF9ldmVudCA9IHRyaWdnZXJfZXZlbnQoYnV0dG9uLmZvcm0sICd2YWxpZGF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICBpZiAodmFsX2V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAvKiBza2lwIHRoZSB3aG9sZSBzdWJtaXQgdGhpbmcsIGlmIHRoZSB2YWxpZGF0aW9uIGlzIGNhbmNlbGVkLiBBIHVzZXJcbiAgICAgKiBjYW4gc3RpbGwgY2FsbCBmb3JtLnN1Ym1pdCgpIGFmdGVyd2FyZHMuICovXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGZpcnN0X2ludmFsaWQ7XG4gIGJ1dHRvbi5mb3JtLl9faGZfZm9ybV92YWxpZGF0aW9uID0gdHJ1ZTtcbiAgZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyhidXR0b24uZm9ybSkubWFwKGVsZW1lbnQgPT4ge1xuICAgIGlmICghIHJlcG9ydFZhbGlkaXR5KGVsZW1lbnQpKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgaWYgKCEgZmlyc3RfaW52YWxpZCAmJiAoJ2ZvY3VzJyBpbiBlbGVtZW50KSkge1xuICAgICAgICBmaXJzdF9pbnZhbGlkID0gZWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBkZWxldGUoYnV0dG9uLmZvcm0uX19oZl9mb3JtX3ZhbGlkYXRpb24pO1xuXG4gIGlmICh2YWxpZCkge1xuICAgIHN1Ym1pdF9mb3JtX3ZpYShidXR0b24pO1xuICB9IGVsc2UgaWYgKGZpcnN0X2ludmFsaWQpIHtcbiAgICAvKiBmb2N1cyB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBpZiB2YWxpZGF0aW9uIHdlbnQgc291dGggKi9cbiAgICBmaXJzdF9pbnZhbGlkLmZvY3VzKCk7XG4gICAgLyogdGVsbCB0aGUgdGFsZSwgaWYgYW55b25lIHdhbnRzIHRvIHJlYWN0IHRvIGl0ICovXG4gICAgdHJpZ2dlcl9ldmVudChidXR0b24uZm9ybSwgJ2Zvcm1pbnZhbGlkJyk7XG4gIH1cbn1cblxuXG4vKipcbiAqIHRlc3QgaWYgbm9kZSBpcyBhIHN1Ym1pdCBidXR0b25cbiAqL1xuZnVuY3Rpb24gaXNfc3VibWl0X2J1dHRvbihub2RlKSB7XG4gIHJldHVybiAoXG4gICAgLyogbXVzdCBiZSBhbiBpbnB1dCBvciBidXR0b24gZWxlbWVudC4uLiAqL1xuICAgIChub2RlLm5vZGVOYW1lID09PSAnSU5QVVQnIHx8XG4gICAgIG5vZGUubm9kZU5hbWUgPT09ICdCVVRUT04nKSAmJlxuXG4gICAgLyogLi4uYW5kIGhh
46184dmUgYSBzdWJtaXR0aW5nIHR5cGUgKi9cbiAgICAobm9kZS50eXBlID09PSAnaW1hZ2UnIHx8IG5vZGUudHlwZSA9PT0gJ3N1Ym1pdCcpXG4gICk7XG59XG5cblxuLyoqXG4gKiB0ZXN0LCBpZiB0aGUgY2xpY2sgZXZlbnQgd291bGQgdHJpZ2dlciBhIHN1Ym1pdFxuICovXG5mdW5jdGlvbiBpc19zdWJtaXR0aW5nX2NsaWNrKGV2ZW50LCBidXR0b24pIHtcbiAgcmV0dXJuIChcbiAgICAvKiBwcmV2ZW50ZWQgZGVmYXVsdDogd29uJ3QgdHJpZ2dlciBhIHN1Ym1pdCAqL1xuICAgICEgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJlxuXG4gICAgLyogbGVmdCBidXR0b24gb3IgbWlkZGxlIGJ1dHRvbiAoc3VibWl0cyBpbiBDaHJvbWUpICovXG4gICAgKCEgKCdidXR0b24nIGluIGV2ZW50KSB8fFxuICAgICBldmVudC5idXR0b24gPCAyKSAmJlxuXG4gICAgLyogbXVzdCBiZSBhIHN1Ym1pdCBidXR0b24uLi4gKi9cbiAgICBpc19zdWJtaXRfYnV0dG9uKGJ1dHRvbikgJiZcblxuICAgIC8qIHRoZSBidXR0b24gbmVlZHMgYSBmb3JtLCB0aGF0J3MgZ29pbmcgdG8gYmUgc3VibWl0dGVkICovXG4gICAgYnV0dG9uLmZvcm0gJiZcblxuICAgIC8qIGFnYWluLCBpZiB0aGUgZm9ybSBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgd2UncmUgb3V0IG9mIHRoZSBnYW1lICovXG4gICAgISBidXR0b24uZm9ybS5oYXNBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnKVxuICApO1xufVxuXG5cbi8qKlxuICogdGVzdCwgaWYgdGhlIGtleXByZXNzIGV2ZW50IHdvdWxkIHRyaWdnZXIgYSBzdWJtaXRcbiAqL1xuZnVuY3Rpb24gaXNfc3VibWl0dGluZ19rZXlwcmVzcyhldmVudCkge1xuICByZXR1cm4gKFxuICAgIC8qIHByZXZlbnRlZCBkZWZhdWx0OiB3b24ndCB0cmlnZ2VyIGEgc3VibWl0ICovXG4gICAgISBldmVudC5kZWZhdWx0UHJldmVudGVkICYmXG5cbiAgICAoXG4gICAgICAoXG4gICAgICAgIC8qIC4uLmFuZCA8RW50ZXI+IHdhcyBwcmVzc2VkLi4uICovXG4gICAgICAgIGV2ZW50LmtleUNvZGUgPT09IDEzICYmXG5cbiAgICAgICAgLyogLi4ub24gYW4gPGlucHV0PiB0aGF0IGlzLi4uICovXG4gICAgICAgIGV2ZW50LnRhcmdldC5ub2RlTmFtZSA9PT0gJ0lOUFVUJyAmJlxuXG4gICAgICAgIC8qIC4uLmEgc3RhbmRhcmQgdGV4dCBpbnB1dCBmaWVsZCAobm90IGNoZWNrYm94LCAuLi4pICovXG4gICAgICAgIHRleHRfdHlwZXMuaW5kZXhPZihldmVudC50YXJnZXQudHlwZSkgPiAtMVxuICAgICAgKSB8fCAoXG4gICAgICAgIC8qIG9yIDxFbnRlcj4gb3IgPFNwYWNlPiB3YXMgcHJlc3NlZC4uLiAqL1xuICAgICAgICAoZXZlbnQua2V5Q29kZSA9PT0gMTMgfHxcbiAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IDMyKSAmJlxuXG4gICAgICAgIC8qIC4uLm9uIGEgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICBpc19zdWJtaXRfYnV0dG9uKGV2ZW50LnRhcmdldClcbiAgICAgIClcbiAgICApICYmXG5cbiAgICAvKiB0aGVyZSdzIGEgZm9ybS4uLiAqL1xuICAgIGV2ZW50LnRhcmdldC5mb3JtICYmXG5cbiAgICAvKiAuLi5hbmQgdGhlIGZvcm0gYWxsb3dzIHZhbGlkYXRpb24gKi9cbiAgICAhIGV2ZW50LnRhcmdldC5mb3JtLmhhc0F0dHJpYnV0ZSgnbm92YWxpZGF0ZScpXG4gICk7XG59XG5cblxuLyoqXG4gKiBjYXRjaCBjbGlja3MgdG8gY2hpbGRyZW4gb2YgPGJ1dHRvbj5zXG4gKi9cbmZ1bmN0aW9uIGdldF9jbGlja2VkX2J1dHRvbihlbGVtZW50KSB7XG4gIGlmIChpc19zdWJtaXRfYnV0dG9uKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gZWxzZSBpZiAobWF0Y2hlcyhlbGVtZW50LCAnYnV0dG9uOm5vdChbdHlwZV0pICosIGJ1dHRvblt0eXBlPVwic3VibWl0XCJdIConKSkge1xuICAgIHJldHVybiBnZXRfY2xpY2tlZF9idXR0b24oZWxlbWVudC5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5cbi8qKlxuICogcmV0dXJuIGV2ZW50IGhhbmRsZXIgdG8gY2F0Y2ggZXhwbGljaXQgc3VibWlzc2lvbiBieSBjbGljayBvbiBhIGJ1dHRvblxuICovXG5mdW5jdGlvbiBnZXRfY2xpY2tfaGFuZGxlcihpZ25vcmU9ZmFsc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgY29uc3QgYnV0dG9uID0gZ2V0X2NsaWNrZWRfYnV0dG9uKGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKGJ1dHRvbiAmJiBpc19zdWJtaXR0aW5nX2NsaWNrKGV2ZW50LCBidXR0b24pKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGlnbm9yZSB8fCBidXR0b24uaGFzQXR0cmlidXRlKCdmb3Jtbm92YWxpZGF0ZScpKSB7XG4gICAgICAgIC8qIGlmIHZhbGlkYXRpb24gc2hvdWxkIGJlIGlnbm9yZWQsIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIGFueSBjaGVja3MgKi9cbiAgICAgICAgc3VibWl0X2Zvcm1fdmlhKGJ1dHRvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayhidXR0b24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmNvbnN0IGNsaWNrX2hhbmRsZXIgPSBnZXRfY2xpY2tfaGFuZGxlcigpO1xuY29uc3QgaWdub3JlZF9jbGlja19oYW5kbGVyID0gZ2V0X2NsaWNrX2hhbmRsZXIodHJ1ZSk7XG5cblxuLyoqXG4gKiBjYXRjaCBpbXBsaWNpdCBzdWJtaXNzaW9uIGJ5IHByZXNzaW5nIDxFbnRlcj4gaW4gc29tZSBzaXR1YXRpb25zXG4gKi9cbmZ1bmN0aW9uIGdldF9rZXlwcmVzc19oYW5kbGVyKGlnbm9yZSkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cHJlc3NfaGFuZGxlcihldmVudCkge1xuICAgIGlmIChpc19zdWJtaXR0aW5nX2tleXByZXNzKGV2ZW50KSkgIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihldmVudC50YXJnZXQuZm9ybSkgfHwgeyBzZXR0aW5nczoge30gfTtcbiAgICAgIGlmICh3cmFwcGVyLnNldHRpbmdzLnByZXZlbnRJbXBsaWNpdFN1Ym1pdCkge1xuICAgICAgICAvKiB1c2VyIGRvZXNuJ3Qgd2FudCBhbiBpbXBsaWNpdCBzdWJtaXQuIENhbmNlbCBoZXJlLiAqL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrLCB0aGF0IHR
46184oZXJlIGlzIG5vIHN1Ym1pdCBidXR0b24gaW4gdGhlIGZvcm0uIE90aGVyd2lzZVxuICAgICAgKiB0aGF0IHNob3VsZCBiZSBjbGlja2VkLiAqL1xuICAgICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQuZm9ybS5lbGVtZW50cy5sZW5ndGg7XG4gICAgICB2YXIgc3VibWl0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbDsgaSsrKSB7XG4gICAgICAgIGlmIChbJ2ltYWdlJywgJ3N1Ym1pdCddLmluZGV4T2YoZXZlbnQudGFyZ2V0LmZvcm0uZWxlbWVudHNbaV0udHlwZSkgPiAtMSkge1xuICAgICAgICAgIHN1Ym1pdCA9IGV2ZW50LnRhcmdldC5mb3JtLmVsZW1lbnRzW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJtaXQpIHtcbiAgICAgICAgc3VibWl0LmNsaWNrKCk7XG4gICAgICB9IGVsc2UgaWYgKGlnbm9yZSkge1xuICAgICAgICBzdWJtaXRfZm9ybV92aWEoZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrKGV2ZW50LnRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuY29uc3Qga2V5cHJlc3NfaGFuZGxlciA9IGdldF9rZXlwcmVzc19oYW5kbGVyKCk7XG5jb25zdCBpZ25vcmVkX2tleXByZXNzX2hhbmRsZXIgPSBnZXRfa2V5cHJlc3NfaGFuZGxlcih0cnVlKTtcblxuXG4vKipcbiAqIGNhdGNoIGFsbCByZWxldmFudCBldmVudHMgX3ByaW9yXyB0byBhIGZvcm0gYmVpbmcgc3VibWl0dGVkXG4gKlxuICogQHBhcmFtIGJvb2wgaWdub3JlIGJ5cGFzcyB2YWxpZGF0aW9uLCB3aGVuIGFuIGF0dGVtcHQgdG8gc3VibWl0IHRoZVxuICogICAgICAgICAgICAgICAgICAgIGZvcm0gaXMgZGV0ZWN0ZWQuIFRydWUsIHdoZW4gdGhlIHdyYXBwZXIncyByZXZhbGlkYXRlXG4gKiAgICAgICAgICAgICAgICAgICAgc2V0dGluZyBpcyAnbmV2ZXInLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0Y2hfc3VibWl0KGxpc3RlbmluZ19ub2RlLCBpZ25vcmU9ZmFsc2UpIHtcbiAgaWYgKGlnbm9yZSkge1xuICAgIGxpc3RlbmluZ19ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaWdub3JlZF9jbGlja19oYW5kbGVyKTtcbiAgICBsaXN0ZW5pbmdfbm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGlnbm9yZWRfa2V5cHJlc3NfaGFuZGxlcik7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuaW5nX25vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja19oYW5kbGVyKTtcbiAgICBsaXN0ZW5pbmdfbm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGtleXByZXNzX2hhbmRsZXIpO1xuICB9XG59XG5cblxuLyoqXG4gKiBkZWNvbW1pc3Npb24gdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGNhdGNoX3N1Ym1pdCgpIGFnYWluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmNhdGNoX3N1Ym1pdChsaXN0ZW5pbmdfbm9kZSkge1xuICBsaXN0ZW5pbmdfbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGlnbm9yZWRfY2xpY2tfaGFuZGxlcik7XG4gIGxpc3RlbmluZ19ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgaWdub3JlZF9rZXlwcmVzc19oYW5kbGVyKTtcbiAgbGlzdGVuaW5nX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja19oYW5kbGVyKTtcbiAgbGlzdGVuaW5nX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBrZXlwcmVzc19oYW5kbGVyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgdHJpbSBmcm9tICcuL3RyaW0nO1xuXG5cbi8qKlxuICogc3BsaXQgYSBzdHJpbmcgb24gY29tbWEgYW5kIHRyaW0gdGhlIGNvbXBvbmVudHNcbiAqXG4gKiBBcyBzcGVjaWZpZWQgYXRcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjc3BsaXQtYS1zdHJpbmctb24tY29tbWFzXG4gKiBwbHVzIHJlbW92aW5nIGVtcHR5IGVudHJpZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB0cmltKGl0ZW0pKVxuICAgICAgICAgICAgLmZpbHRlcihiPT5iKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgc3ByaW50ZiBmcm9tICcuL3NwcmludGYnO1xuaW1wb3J0IGdldF93ZWVrX29mX3llYXIgZnJvbSAnLi9nZXRfd2Vla19vZl95ZWFyJztcblxuXG5mdW5jdGlvbiBwYWQobnVtLCBzaXplPTIpIHtcbiAgdmFyIHMgPSBudW0gKyAnJztcbiAgd2hpbGUgKHMubGVuZ3RoIDwgc2l6ZSkge1xuICAgIHMgPSAnMCcgKyBzO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5cbi8qKlxuICogY2FsY3VsYXRlIGEgc3RyaW5nIGZyb20gYSBkYXRlIGFjY29yZGluZyB0byBIVE1MNVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkYXRlX3RvX3N0cmluZyhkYXRlLCBlbGVtZW50X3R5cGUpIHtcbiAgaWYgKCEgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50X3R5cGUpIHtcbiAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICByZXR1cm4gZGF0ZV90b19zdHJpbmcoZGF0ZSwgJ2RhdGUnKSArICdUJyArXG4gICAgICAgICAgICAgZGF0ZV90b19zdHJpbmcoZGF0ZSwgJ3RpbWUnKTtcblxuICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIHJldHVybiBzcHJpbnRmKCclcy0lcy0lc1Qlczolczolcy4lcycsXG4gICAgICAgICAgICAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXREYXRlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0U2Vjb25kcygpKSxcbiAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldE1pbGxpc2Vjb25kcygpLCAzKVxuICAgICAgICAgICAgICAgICAgICkucmVwbGFjZSgvKDowMCk/XFwuMDAwJC8sICcnKTtcblxuICAgIGNhc2UgJ2Rh
46184dGUnOlxuICAgICAgcmV0dXJuIHNwcmludGYoJyVzLSVzLSVzJyxcbiAgICAgICAgICAgICAgICAgICAgIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ0RhdGUoKSkpO1xuXG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIHNwcmludGYoJyVzLSVzJywgZGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpKTtcblxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgY29uc3QgcGFyYW1zID0gZ2V0X3dlZWtfb2ZfeWVhcihkYXRlKTtcbiAgICAgIHJldHVybiBzcHJpbnRmLmNhbGwobnVsbCwgJyVzLVclcycsIHBhcmFtc1swXSwgcGFkKHBhcmFtc1sxXSkpO1xuXG4gICAgY2FzZSAndGltZSc6XG4gICAgICByZXR1cm4gc3ByaW50ZignJXM6JXM6JXMuJXMnLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSwgMylcbiAgICAgICAgICAgICAgICAgICAgKS5yZXBsYWNlKC8oOjAwKT9cXC4wMDAkLywgJycpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGF0ZSwgcGFydD11bmRlZmluZWQpIHtcbiAgc3dpdGNoIChwYXJ0KSB7XG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICByZXR1cm4gKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nIHx8IGRhdGUudG9EYXRlU3RyaW5nKS5jYWxsKGRhdGUpO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgcmV0dXJuIChkYXRlLnRvTG9jYWxlVGltZVN0cmluZyB8fCBkYXRlLnRvVGltZVN0cmluZykuY2FsbChkYXRlKTtcbiAgICBjYXNlICdtb250aCc6XG4gICAgICByZXR1cm4gKCd0b0xvY2FsZURhdGVTdHJpbmcnIGluIGRhdGUpP1xuICAgICAgICBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgfSlcbiAgICAgICAgOlxuICAgICAgICBkYXRlLnRvRGF0ZVN0cmluZygpO1xuICAgIC8vIGNhc2UgJ3dlZWsnOlxuICAgIC8vIFRPRE9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChkYXRlLnRvTG9jYWxlU3RyaW5nIHx8IGRhdGUudG9TdHJpbmcpLmNhbGwoZGF0ZSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIGNvdW50ZXIgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdpdGggZXZlcnkgY2FsbFxuICpcbiAqIFdpbGwgZW5mb3JjZSB1bmlxdWVuZXNzLCBhcyBsb25nIGFzIG5vIG1vcmUgdGhhbiAxIGh5cGVyZm9ybSBzY3JpcHRzXG4gKiBhcmUgbG9hZGVkLiAoSW4gdGhhdCBjYXNlIHdlIHN0aWxsIGhhdmUgdGhlIFwicmFuZG9tXCIgcGFydCBiZWxvdy4pXG4gKi9cbnZhciB1aWQgPSAwO1xuXG5cbi8qKlxuICogZ2VuZXJhdGUgYSByYW5kb20gSURcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dvcmRvbmJyYW5kZXIvMjIzMDMxN1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcmVmaXg9J2hmXycpIHtcbiAgcmV0dXJuIHByZWZpeCArICggdWlkKysgKSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIHJldHVybiBhIG5ldyBEYXRlKCkgcmVwcmVzZW50aW5nIHRoZSBJU08gZGF0ZSBmb3IgYSB3ZWVrIG51bWJlclxuICpcbiAqIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY1OTExNzUvMTEzMTk1XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdlZWssIHllYXIpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIDAsIDEgKyAod2VlayAtIDEpICogNykpO1xuXG4gIGlmIChkYXRlLmdldFVUQ0RheSgpIDw9IDQvKiB0aHVyc2RheSAqLykge1xuICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRhdGUuZ2V0VVRDRGF5KCkgKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyA4IC0gZGF0ZS5nZXRVVENEYXkoKSk7XG4gIH1cblxuICByZXR1cm4gZGF0ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgZGF0ZV90b19zdHJpbmcgZnJvbSAnLi9kYXRlX3RvX3N0cmluZyc7XG5pbXBvcnQgc3RyaW5nX3RvX251bWJlciBmcm9tICcuL3N0cmluZ190b19udW1iZXInO1xuaW1wb3J0IGdldF90eXBlIGZyb20gJy4vZ2V0X3R5cGUnO1xuaW1wb3J0IF8gZnJvbSAnLi4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHsgZGVmYXVsdF9zdGVwLCBzdGVwX3NjYWxlX2ZhY3RvciwgZGVmYXVsdF9zdGVwX2Jhc2UsIGRlZmF1bHRfbWluLFxuICAgICAgICAgZGVmYXVsdF9tYXgsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zdGVwX2RlZmF1bHRzJztcbmltcG9ydCB7IGRhdGVzIH0gZnJvbSAnLi4vY29tcG9uZW50cy90eXBlcyc7XG5cblxuLyoqXG4gKiBnZXQgcHJldmlvdXMgYW5kIG5leHQgdmFsaWQgdmFsdWVzIGZvciBhIHN0ZXBwZWQgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50LCBuPTEpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGNvbnN0IGFNaW4gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWluJyk7XG4gIGxldCBtaW4gPSBkZWZh
46184dWx0X21pblt0eXBlXSB8fCBOYU47XG4gIGlmIChhTWluKSB7XG4gICAgY29uc3QgcE1pbiA9IHN0cmluZ190b19udW1iZXIoYU1pbiwgdHlwZSk7XG4gICAgaWYgKCEgaXNOYU4ocE1pbikpIHtcbiAgICAgIG1pbiA9IHBNaW47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYU1heCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtYXgnKTtcbiAgbGV0IG1heCA9IGRlZmF1bHRfbWF4W3R5cGVdIHx8IE5hTjtcbiAgaWYgKGFNYXgpIHtcbiAgICBjb25zdCBwTWF4ID0gc3RyaW5nX3RvX251bWJlcihhTWF4LCB0eXBlKTtcbiAgICBpZiAoISBpc05hTihwTWF4KSkge1xuICAgICAgbWF4ID0gcE1heDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhU3RlcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGVwJyk7XG4gIGxldCBzdGVwID0gZGVmYXVsdF9zdGVwW3R5cGVdIHx8IDE7XG4gIGlmIChhU3RlcCAmJiBhU3RlcC50b0xvd2VyQ2FzZSgpID09PSAnYW55Jykge1xuICAgIC8qIHF1aWNrIHJldHVybjogd2UgY2Fubm90IGNhbGN1bGF0ZSBwcmV2IGFuZCBuZXh0ICovXG4gICAgcmV0dXJuIFtfKCdhbnkgdmFsdWUnKSwgXygnYW55IHZhbHVlJyldO1xuICB9IGVsc2UgaWYgKGFTdGVwKSB7XG4gICAgY29uc3QgcFN0ZXAgPSBzdHJpbmdfdG9fbnVtYmVyKGFTdGVwLCB0eXBlKTtcbiAgICBpZiAoISBpc05hTihwU3RlcCkpIHtcbiAgICAgIHN0ZXAgPSBwU3RlcDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0X3ZhbHVlID0gc3RyaW5nX3RvX251bWJlcihlbGVtZW50LmdldEF0dHJpYnV0ZSgndmFsdWUnKSwgdHlwZSk7XG5cbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdfdG9fbnVtYmVyKGVsZW1lbnQudmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpLCB0eXBlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgLyogcXVpY2sgcmV0dXJuOiB3ZSBjYW5ub3QgY2FsY3VsYXRlIHdpdGhvdXQgYSBzb2xpZCBiYXNlICovXG4gICAgcmV0dXJuIFtfKCdhbnkgdmFsaWQgdmFsdWUnKSwgXygnYW55IHZhbGlkIHZhbHVlJyldO1xuICB9XG5cbiAgY29uc3Qgc3RlcF9iYXNlID0gKFxuICAgICEgaXNOYU4obWluKT8gbWluIDogKFxuICAgICAgISBpc05hTihkZWZhdWx0X3ZhbHVlKT8gZGVmYXVsdF92YWx1ZSA6IChcbiAgICAgICAgZGVmYXVsdF9zdGVwX2Jhc2VbdHlwZV0gfHwgMFxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBjb25zdCBzY2FsZSA9IHN0ZXBfc2NhbGVfZmFjdG9yW3R5cGVdIHx8IDE7XG5cbiAgdmFyIHByZXYgPSBzdGVwX2Jhc2UgK1xuICAgIE1hdGguZmxvb3IoKHZhbHVlIC0gc3RlcF9iYXNlKSAvIChzdGVwICogc2NhbGUpKSAqIChzdGVwICogc2NhbGUpICogbjtcbiAgdmFyIG5leHQgPSBzdGVwX2Jhc2UgK1xuICAgIChNYXRoLmZsb29yKCh2YWx1ZSAtIHN0ZXBfYmFzZSkgLyAoc3RlcCAqIHNjYWxlKSkgKyAxKSAqIChzdGVwICogc2NhbGUpICogbjtcblxuICBpZiAocHJldiA8IG1pbikge1xuICAgIHByZXYgPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXYgPiBtYXgpIHtcbiAgICBwcmV2ID0gbWF4O1xuICB9XG5cbiAgaWYgKG5leHQgPiBtYXgpIHtcbiAgICBuZXh0ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChuZXh0IDwgbWluKSB7XG4gICAgbmV4dCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNvbnZlcnQgdG8gZGF0ZSBvYmplY3RzLCBpZiBhcHByb3ByaWF0ZSAqL1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgcHJldiA9IGRhdGVfdG9fc3RyaW5nKG5ldyBEYXRlKHByZXYpLCB0eXBlKTtcbiAgICBuZXh0ID0gZGF0ZV90b19zdHJpbmcobmV3IERhdGUobmV4dCksIHR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIFtwcmV2LCBuZXh0XTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIGdldCBhbGwgcmFkaW8gYnV0dG9ucyAoaW5jbHVkaW5nIGBlbGVtZW50YCkgdGhhdCBiZWxvbmcgdG8gZWxlbWVudCdzXG4gKiByYWRpbyBncm91cFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0X3JhZGlvZ3JvdXAoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC5mb3JtKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChcbiAgICAgIGVsZW1lbnQuZm9ybS5lbGVtZW50cyxcbiAgICAgIHJhZGlvID0+IHJhZGlvLnR5cGUgPT09ICdyYWRpbycgJiYgcmFkaW8ubmFtZSA9PT0gZWxlbWVudC5uYW1lXG4gICAgKTtcbiAgfVxuICByZXR1cm4gW2VsZW1lbnRdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGlucHV0cyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuXG5cbi8qKlxuICogZ2V0IHRoZSBlbGVtZW50J3MgdHlwZSBpbiBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdheVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQpIHtcbiAgICByZXR1cm4gJ3RleHRhcmVhJztcblxuICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJyk/ICdzZWxlY3QtbXVsdGlwbGUnIDogJ3NlbGVjdC1vbmUnO1xuXG4gIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudCkge1xuICAgIHJldHVybiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnc3VibWl0JykudG9Mb3dlckNhc2UoKTtcblxuICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCkge1xuICAgIGNvbnN0IGF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoYXR0ciAmJiBpbnB1dHMuaW5kZXhPZihhdHRyKSA+IC0xKSB7XG4gICAgICByZXR1cm4gYXR0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogcGVyaGFwcyB0aGUgRE9NIGhhcyBpbi1kZXB0aCBrbm93bGVkZ2UuIFRha2UgdGhhdCBiZWZvcmUgcmV0dXJuaW5nXG4gICAgICAgKiAndGV4dCcuICovXG4gICAgICByZXR1cm4gZWxlbWVudC50eXBlIHx8ICd0ZXh0JztcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5cblxuLyoqXG4gKiBmaWx0ZXIgYSBmb3JtJ3MgZWxlbWVudHMgZm9yIHRoZSBvbmVzIG5lZWRpbmcgdmFsaWRhdGlvbiBwcmlvciB0b1xuICogYSBzdWJtaXRcbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRfdmFsaWRhdGVkX2VsZW1lbnRzKGZvcm0pIHtcbiAgY29uc3Qgd3JhcHBlZF9mb3JtID0gZ2V0X3dyYXBwZXIoZm9ybSk7XG5cbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChmb3JtLmVsZW1lbnRzLCBlbGVtZW50ID0+IHtcbiAgICAvKiBpdCBtdXN0IGhh
46184dmUgYSBuYW1lIChvciB2YWxpZGF0aW5nIG5hbWVsZXNzIGlucHV0cyBpcyBhbGxvd2VkKSAqL1xuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpIHx8XG4gICAgICAgICh3cmFwcGVkX2Zvcm0gJiYgd3JhcHBlZF9mb3JtLnNldHRpbmdzLnZhbGlkYXRlTmFtZWxlc3MpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKiBGb3IgYSBnaXZlbiBkYXRlLCBnZXQgdGhlIElTTyB3ZWVrIG51bWJlclxuICpcbiAqIFNvdXJjZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjExNzg4OS8xMTMxOTVcbiAqXG4gKiBCYXNlZCBvbiBpbmZvcm1hdGlvbiBhdDpcbiAqXG4gKiAgICBodHRwOi8vd3d3Lm1lcmx5bi5kZW1vbi5jby51ay93ZWVrY2FsYy5odG0jV05SXG4gKlxuICogQWxnb3JpdGhtIGlzIHRvIGZpbmQgbmVhcmVzdCB0aHVyc2RheSwgaXQncyB5ZWFyXG4gKiBpcyB0aGUgeWVhciBvZiB0aGUgd2VlayBudW1iZXIuIFRoZW4gZ2V0IHdlZWtzXG4gKiBiZXR3ZWVuIHRoYXQgZGF0ZSBhbmQgdGhlIGZpcnN0IGRheSBvZiB0aGF0IHllYXIuXG4gKlxuICogTm90ZSB0aGF0IGRhdGVzIGluIG9uZSB5ZWFyIGNhbiBiZSB3ZWVrcyBvZiBwcmV2aW91c1xuICogb3IgbmV4dCB5ZWFyLCBvdmVybGFwIGlzIHVwIHRvIDMgZGF5cy5cbiAqXG4gKiBlLmcuIDIwMTQvMTIvMjkgaXMgTW9uZGF5IGluIHdlZWsgIDEgb2YgMjAxNVxuICogICAgICAyMDEyLzEvMSAgIGlzIFN1bmRheSBpbiB3ZWVrIDUyIG9mIDIwMTFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICAvKiBDb3B5IGRhdGUgc28gZG9uJ3QgbW9kaWZ5IG9yaWdpbmFsICovXG4gIGQgPSBuZXcgRGF0ZSgrZCk7XG4gIGQuc2V0VVRDSG91cnMoMCwgMCwgMCk7XG4gIC8qIFNldCB0byBuZWFyZXN0IFRodXJzZGF5OiBjdXJyZW50IGRhdGUgKyA0IC0gY3VycmVudCBkYXkgbnVtYmVyXG4gICAqIE1ha2UgU3VuZGF5J3MgZGF5IG51bWJlciA3ICovXG4gIGQuc2V0VVRDRGF0ZShkLmdldFVUQ0RhdGUoKSArIDQgLSAoZC5nZXRVVENEYXkoKXx8NykpO1xuICAvKiBHZXQgZmlyc3QgZGF5IG9mIHllYXIgKi9cbiAgY29uc3QgeWVhclN0YXJ0ID0gbmV3IERhdGUoZC5nZXRVVENGdWxsWWVhcigpLDAsMSk7XG4gIC8qIENhbGN1bGF0ZSBmdWxsIHdlZWtzIHRvIG5lYXJlc3QgVGh1cnNkYXkgKi9cbiAgY29uc3Qgd2Vla05vID0gTWF0aC5jZWlsKCggKCAoZCAtIHllYXJTdGFydCkgLyA4NjQwMDAwMCkgKyAxKS83KTtcbiAgLyogUmV0dXJuIGFycmF5IG9mIHllYXIgYW5kIHdlZWsgbnVtYmVyICovXG4gIHJldHVybiBbZC5nZXRVVENGdWxsWWVhcigpLCB3ZWVrTm9dO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIHJldHVybiAoXG4gICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudCB8fFxuICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCB8fFxuICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQgfHxcbiAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGaWVsZFNldEVsZW1lbnQgfHxcbiAgICAgICAgICBlbGVtZW50ID09PSB3aW5kb3cuSFRNTEJ1dHRvbkVsZW1lbnQucHJvdG90eXBlIHx8XG4gICAgICAgICAgZWxlbWVudCA9PT0gd2luZG93LkhUTUxJbnB1dEVsZW1lbnQucHJvdG90eXBlIHx8XG4gICAgICAgICAgZWxlbWVudCA9PT0gd2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSB8fFxuICAgICAgICAgIGVsZW1lbnQgPT09IHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50LnByb3RvdHlwZSB8fFxuICAgICAgICAgIGVsZW1lbnQgPT09IHdpbmRvdy5IVE1MRmllbGRTZXRFbGVtZW50LnByb3RvdHlwZVxuICAgICAgICAgKTtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGRvX2ZpbHRlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvaG9va3MnO1xuaW1wb3J0IHsgdmFsaWRhdGlvbl9jYW5kaWRhdGVzLCBub25faW5wdXRzIH0gZnJvbSAnLi4vY29tcG9uZW50cy90eXBlcyc7XG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuXG5cbi8qKlxuICogY2hlY2sgaWYgYW4gZWxlbWVudCBzaG91bGQgYmUgaWdub3JlZCBkdWUgdG8gYW55IG9mIGl0cyBwYXJlbnRzXG4gKlxuICogQ2hlY2tzIDxmaWVsZHNldCBkaXNhYmxlZD4gYW5kIDxkYXRhbGlzdD4uXG4gKi9cbmZ1bmN0aW9uIGlzX2luX2Rpc2FsbG93ZWRfcGFyZW50KGVsZW1lbnQpIHtcbiAgbGV0IHAgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gIHdoaWxlIChwICYmIHAubm9kZVR5cGUgPT09IDEpIHtcbiAgICBpZiAocCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRmllbGRTZXRFbGVtZW50ICYmXG4gICAgICAgIHAuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAvKiBxdWljayByZXR1cm4sIGlmIGl0J3MgYSBjaGlsZCBvZiBhIGRpc2FibGVkIGZpZWxkc2V0ICovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHAubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0RBVEFMSVNUJykge1xuICAgICAgLyogcXVpY2sgcmV0dXJuLCBpZiBpdCdzIGEgY2hpbGQgb2YgYSBkYXRhbGlzdFxuICAgICAgICogRG8gbm90IHVzZSBIVE1MRGF0YUxpc3RFbGVtZW50IHRvIHN1cHBvcnQgb2xkZXIgYnJvd3NlcnMsXG4gICAgICAgKiB0b28uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjdGhlLWRhdGFsaXN0LWVsZW1lbnQ6YmFycmVkLWZyb20tY29uc3RyYWludC12YWxpZGF0aW9uXG4gICAgICAgKi9cbiAgICAgIHJldHVybi
46184B0cnVlO1xuICAgIH0gZWxzZSBpZiAocCA9PT0gZWxlbWVudC5mb3JtKSB7XG4gICAgICAvKiB0aGUgb3V0ZXIgYm91bmRhcnkuIFdlIGNhbiBzdG9wIGxvb2tpbmcgZm9yIHJlbGV2YW50IGVsZW1lbnRzLiAqL1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHAgPSBwLnBhcmVudE5vZGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbi8qKlxuICogY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBhIGNhbmRpZGF0ZSBmb3IgY29uc3RyYWludCB2YWxpZGF0aW9uXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2JhcnJlZC1mcm9tLWNvbnN0cmFpbnQtdmFsaWRhdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG5cbiAgLyogYWxsb3cgYSBzaG9ydGN1dCB2aWEgZmlsdGVycywgZS5nLiB0byB2YWxpZGF0ZSB0eXBlPWhpZGRlbiBmaWVsZHMgKi9cbiAgY29uc3QgZmlsdGVyZWQgPSBkb19maWx0ZXIoJ2lzX3ZhbGlkYXRpb25fY2FuZGlkYXRlJywgbnVsbCwgZWxlbWVudCk7XG4gIGlmIChmaWx0ZXJlZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiAhISBmaWx0ZXJlZDtcbiAgfVxuXG4gIC8qIGl0IG11c3QgYmUgYW55IG9mIHRob3NlIGVsZW1lbnRzICovXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxTZWxlY3RFbGVtZW50XG4gICAgICB8fFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50XG4gICAgICB8fFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudFxuICAgICAgfHxcbiAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCkge1xuXG4gICAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuICAgIC8qIGl0cyB0eXBlIG11c3QgYmUgaW4gdGhlIHdoaXRlbGlzdCAqL1xuICAgIGlmIChub25faW5wdXRzLmluZGV4T2YodHlwZSkgPiAtMSB8fFxuICAgICAgICB2YWxpZGF0aW9uX2NhbmRpZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG5cbiAgICAgIC8qIGl0IG11c3RuJ3QgYmUgZGlzYWJsZWQgb3IgcmVhZG9ubHkgKi9cbiAgICAgIGlmICghIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmXG4gICAgICAgICAgISBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSkge1xuXG4gICAgICAgIGNvbnN0IHdyYXBwZWRfZm9ybSA9IGdldF93cmFwcGVyKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8qIHRoZSBwYXJlbnQgZm9ybSBkb2Vzbid0IGFsbG93IG5vbi1zdGFuZGFyZCBcIm5vdmFsaWRhdGVcIiBhdHRyaWJ1dGVzLi4uICovXG4gICAgICAgICAgICAod3JhcHBlZF9mb3JtICYmICEgd3JhcHBlZF9mb3JtLnNldHRpbmdzLm5vdmFsaWRhdGVPbkVsZW1lbnRzKSB8fFxuICAgICAgICAgICAgLyogLi4ub3IgaXQgZG9lc24ndCBoYXZlIHN1Y2ggYW4gYXR0cmlidXRlL3Byb3BlcnR5ICovXG4gICAgICAgICAgICAoISBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbm92YWxpZGF0ZScpICYmICEgZWxlbWVudC5ub1ZhbGlkYXRlKVxuICAgICAgICAgICAgKSB7XG5cbiAgICAgICAgICAvKiBpdCBpc24ndCBwYXJ0IG9mIGEgPGZpZWxkc2V0IGRpc2FibGVkPiAqL1xuICAgICAgICAgIGlmICghIGlzX2luX2Rpc2FsbG93ZWRfcGFyZW50KGVsZW1lbnQpKSB7XG5cbiAgICAgICAgICAgIC8qIHRoZW4gaXQncyBhIGNhbmRpZGF0ZSAqL1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogdGhpcyBpcyBubyBIVE1MNSB2YWxpZGF0aW9uIGNhbmRpZGF0ZS4uLiAqL1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogbWFyayBhbiBvYmplY3Qgd2l0aCBhICdfX2h5cGVyZm9ybT10cnVlJyBwcm9wZXJ0eVxuICpcbiAqIFdlIHVzZSB0aGlzIHRvIGRpc3Rpbmd1aXNoIG91ciBwcm9wZXJ0aWVzIGZyb20gdGhlIG5hdGl2ZSBvbmVzLiBVc2FnZTpcbiAqIGpzPiBtYXJrKG9iaik7XG4gKiBqcz4gYXNzZXJ0KG9iai5fX2h5cGVyZm9ybSA9PT0gdHJ1ZSlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob2JqKSB7XG4gIGlmIChbJ29iamVjdCcsICdmdW5jdGlvbiddLmluZGV4T2YodHlwZW9mIG9iaikgPiAtMSkge1xuICAgIGRlbGV0ZSBvYmouX19oeXBlcmZvcm07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19faHlwZXJmb3JtJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIHNoaW0gbGF5ZXIgZm9yIHRoZSBFbGVtZW50Lm1hdGNoZXMgbWV0aG9kICovXG5cbmNvbnN0IGVwID0gd2luZG93LkVsZW1lbnQucHJvdG90eXBlO1xuY29uc3QgbmF0aXZlX21hdGNoZXMgPSBlcC5tYXRjaGVzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgIGVwLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICBlcC5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICBlcC53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBuYXRpdmVfbWF0Y2hlcy5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgaW5zdGFsbF9wcm9wZXJ0eSBmcm9tICcuL3Byb3BlcnR5X2luc3RhbGxlcic7XG5pbXBvcnQgaXNfZmllbGQgZnJvbSAnLi9pc19maWVsZCc7XG5pbXBvcnQgbWFyayBmcm9tICcuL21hcmsnO1xuXG5pbXBvcnQgY2hlY2tWYWxpZGl0eSBmcm9tICcuLi9wb2x5ZmlsbHMvY2hlY2tWYWxpZGl0eSc7XG5pbXBvcnQgcmVwb3J0VmFsaWRpdHkgZnJvbSAnLi4vcG9seWZpbGxzL3JlcG9ydFZhbGlkaXR5JztcbmltcG9ydCBzZXRDdXN0b21WYWxpZGl0eSBmcm9tICcuLi9wb2x5ZmlsbHMvc2V0Q3VzdG9tVmFsaWRpdHknO1xuaW1wb3J0IHN0ZXBEb3duIGZyb20gJy4uL3BvbHlmaWxscy9zdGVwRG93bic7XG5pbXBvcnQgc3RlcFVwIGZyb20gJy4uL3BvbHlmaWxscy9zdGVwVXAnO1xuaW1wb3J0IHZhbGlkYXRpb25NZXNzYWdlIGZyb20gJy4uL3BvbHlmaWxscy92YWxpZGF0aW9uTWVzc2FnZSc7XG5pbXBvcnQgVmFsaWRpdHlTdGF0ZSBmcm9tICcuLi9wb2x5ZmlsbHMvdmFsaWRpdHlTdGF0ZSc7XG5pbXBvcnQgdmFsdWVBc0RhdGUgZnJvbSAnLi4vcG9seWZpbGxzL3ZhbHVlQXNEYXRlJztcbmltcG9ydCB2YWx1ZUFzTnVtYmVyIGZyb20gJy4uL3BvbHlmaWxscy92YWx1ZUFzTnVtYmVyJztcbmltcG9ydCB3aWxsVmFsaWRhdGUgZnJvbSAnLi4vcG9seWZpbGxzL3dpbGxWYWxpZGF0ZSc7XG5pbXBvcnQgeyBpbnN0YWxsX3Byb3BlcnRpZXMgfSBmcm9tICcuLi9wb2x5ZmlsbHMvcHJvcGVydGllcyc7XG5cblxuY29uc3QgcG9seWZpbGxzID0ge1xuICAgIGNoZWNrVmFsaWRpdHk6IHtcbiAgICAgIHZhbHVlOiBtYXJrKGZ1bmN0aW9uKCkgeyByZXR1cm4gY2hlY2tWYWxpZGl0eSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICByZXBvcnRWYWxpZGl0eToge1xuICAgICAgdmFsdWU6IG1hcmsoZnVuY3Rpb24oKSB7IHJldHVybi
46184ByZXBvcnRWYWxpZGl0eSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICBzZXRDdXN0b21WYWxpZGl0eToge1xuICAgICAgdmFsdWU6IG1hcmsoZnVuY3Rpb24gKG1zZykgeyByZXR1cm4gc2V0Q3VzdG9tVmFsaWRpdHkodGhpcywgbXNnKTsgfSksXG4gICAgfSxcbiAgICBzdGVwRG93bjoge1xuICAgICAgdmFsdWU6IG1hcmsoZnVuY3Rpb24obj0xKSB7IHJldHVybiBzdGVwRG93bih0aGlzLCBuKTsgfSksXG4gICAgfSxcbiAgICBzdGVwVXA6IHtcbiAgICAgIHZhbHVlOiBtYXJrKGZ1bmN0aW9uKG49MSkgeyByZXR1cm4gc3RlcFVwKHRoaXMsIG4pOyB9KSxcbiAgICB9LFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiB7XG4gICAgICBnZXQ6IG1hcmsoZnVuY3Rpb24oKSB7IHJldHVybiB2YWxpZGF0aW9uTWVzc2FnZSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICB2YWxpZGl0eToge1xuICAgICAgZ2V0OiBtYXJrKGZ1bmN0aW9uKCkgeyByZXR1cm4gVmFsaWRpdHlTdGF0ZSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICB2YWx1ZUFzRGF0ZToge1xuICAgICAgZ2V0OiBtYXJrKGZ1bmN0aW9uKCkgeyByZXR1cm4gdmFsdWVBc0RhdGUodGhpcyk7IH0pLFxuICAgICAgc2V0OiBtYXJrKGZ1bmN0aW9uKHZhbHVlKSB7IHZhbHVlQXNEYXRlKHRoaXMsIHZhbHVlKTsgfSksXG4gICAgfSxcbiAgICB2YWx1ZUFzTnVtYmVyOiB7XG4gICAgICBnZXQ6IG1hcmsoZnVuY3Rpb24oKSB7IHJldHVybiB2YWx1ZUFzTnVtYmVyKHRoaXMpOyB9KSxcbiAgICAgIHNldDogbWFyayhmdW5jdGlvbih2YWx1ZSkgeyB2YWx1ZUFzTnVtYmVyKHRoaXMsIHZhbHVlKTsgfSksXG4gICAgfSxcbiAgICB3aWxsVmFsaWRhdGU6IHtcbiAgICAgIGdldDogbWFyayhmdW5jdGlvbigpIHsgcmV0dXJuIHdpbGxWYWxpZGF0ZSh0aGlzKTsgfSksXG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgaWYgKGlzX2ZpZWxkKGVsZW1lbnQpKSB7XG5cbiAgICBmb3IgKGxldCBwcm9wIGluIHBvbHlmaWxscykge1xuICAgICAgaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCBwcm9wLCBwb2x5ZmlsbHNbcHJvcF0pO1xuICAgIH1cblxuICAgIGluc3RhbGxfcHJvcGVydGllcyhlbGVtZW50KTtcblxuICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50IHx8XG4gICAgICAgICAgICAgZWxlbWVudCA9PT0gd2luZG93LkhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUpIHtcbiAgICBpbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdjaGVja1ZhbGlkaXR5JywgcG9seWZpbGxzLmNoZWNrVmFsaWRpdHkpO1xuICAgIGluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3JlcG9ydFZhbGlkaXR5JywgcG9seWZpbGxzLnJlcG9ydFZhbGlkaXR5KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBpc19maWVsZCBmcm9tICcuL2lzX2ZpZWxkJztcbmltcG9ydCB1bmluc3RhbGxfcHJvcGVydHkgZnJvbSAnLi9wcm9wZXJ0eV91bmluc3RhbGxlcic7XG5pbXBvcnQgeyB1bmluc3RhbGxfcHJvcGVydGllcyB9IGZyb20gJy4uL3BvbHlmaWxscy9wcm9wZXJ0aWVzJztcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmIChpc19maWVsZChlbGVtZW50KSkge1xuXG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdjaGVja1ZhbGlkaXR5Jyk7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdyZXBvcnRWYWxpZGl0eScpO1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAnc2V0Q3VzdG9tVmFsaWRpdHknKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3N0ZXBEb3duJyk7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdzdGVwVXAnKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3ZhbGlkYXRpb25NZXNzYWdlJyk7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICd2YWxpZGl0eScpO1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAndmFsdWVBc0RhdGUnKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3ZhbHVlQXNOdW1iZXInKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3dpbGxWYWxpZGF0ZScpO1xuXG4gICAgdW5pbnN0YWxsX3Byb3BlcnRpZXMoZWxlbWVudCk7XG5cbiAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGb3JtRWxlbWVudCkge1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAnY2hlY2tWYWxpZGl0eScpO1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAncmVwb3J0VmFsaWRpdHknKTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGdldF93cmFwcGVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy93cmFwcGVyJztcblxuXG4vKipcbiAqIGFkZCBgcHJvcGVydHlgIHRvIGFuIGVsZW1lbnRcbiAqXG4gKiBBVFRFTlRJT04hIFRoaXMgZnVuY3Rpb24gd2lsbCBzZWFyY2ggZm9yIGFuIGVxdWFsbHkgbmFtZWQgcHJvcGVydHkgb24gdGhlXG4gKiAqcHJvdG90eXBlKiBvZiBhbiBlbGVtZW50LCBpZiBlbGVtZW50IGlzIGEgY29uY3JldGUgRE9NIG5vZGUuIERvIG5vdCB1c2VcbiAqIGl0IGFzIGdlbmVyYWwtcHVycG9zZSBwcm9wZXJ0eSBpbnN0YWxsZXIuXG4gKlxuICoganM+IGluc3RhbGxlcihlbGVtZW50LCAnZm9vJywgeyB2YWx1ZTogJ2JhcicgfSk7XG4gKiBqcz4gYXNzZXJ0KGVsZW1lbnQuZm9vID09PSAnYmFyJyk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCBkZXNjcmlwdG9yKSB7XG4gIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgZGVzY3JpcHRvci
461845lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICB9XG5cbiAgLyogb24gY29uY3JldGUgaW5zdGFuY2VzLCBpLmUuLCA8aW5wdXQ+IGVsZW1lbnRzLCB0aGUgbmFpdmUgbG9va3VwXG4gICAqIHlpZWxkcyB1bmRlZmluZWQuIFdlIGhhdmUgdG8gbG9vayBvbiBpdHMgcHJvdG90eXBlIHRoZW4uIE9uIGVsZW1lbnRzXG4gICAqIGxpa2UgdGhlIGFjdHVhbCBIVE1MSW5wdXRFbGVtZW50IG9iamVjdCB0aGUgZmlyc3QgbGluZSB3b3Jrcy4gKi9cbiAgbGV0IG9yaWdpbmFsX2Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQsIHByb3BlcnR5KTtcbiAgaWYgKG9yaWdpbmFsX2Rlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5nZXRQcm90b3R5cGVPZihlbGVtZW50KSwgcHJvcGVydHkpO1xuICB9XG5cbiAgaWYgKG9yaWdpbmFsX2Rlc2NyaXB0b3IpIHtcblxuICAgIGlmIChvcmlnaW5hbF9kZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8qIFNhZmFyaSA8PSA5IGFuZCBQaGFudG9tSlMgd2lsbCBlbmQgdXAgaGVyZSA6LSggTm90aGluZyB0byBkbyBleGNlcHRcbiAgICAgICAqIHdhcm5pbmcgKi9cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihlbGVtZW50KTtcbiAgICAgIGlmICh3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuZGVidWcpIHtcbiAgICAgICAgLyogZ2xvYmFsIGNvbnNvbGUgKi9cbiAgICAgICAgY29uc29sZS5sb2coJ1toeXBlcmZvcm1dIGNhbm5vdCBpbnN0YWxsIGN1c3RvbSBwcm9wZXJ0eSAnK3Byb3BlcnR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiB3ZSBhbHJlYWR5IGluc3RhbGxlZCB0aGF0IHByb3BlcnR5Li4uICovXG4gICAgaWYgKChvcmlnaW5hbF9kZXNjcmlwdG9yLmdldCAmJiBvcmlnaW5hbF9kZXNjcmlwdG9yLmdldC5fX2h5cGVyZm9ybSkgfHxcbiAgICAgICAgKG9yaWdpbmFsX2Rlc2NyaXB0b3IudmFsdWUgJiYgb3JpZ2luYWxfZGVzY3JpcHRvci
4618452YWx1ZS5fX2h5cGVyZm9ybSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBwdWJsaXNoIGV4aXN0aW5nIHByb3BlcnR5IHVuZGVyIG5ldyBuYW1lLCBpZiBpdCdzIG5vdCBmcm9tIHVzICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgZWxlbWVudCxcbiAgICAgICdfb3JpZ2luYWxfJytwcm9wZXJ0eSxcbiAgICAgIG9yaWdpbmFsX2Rlc2NyaXB0b3JcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlIGVsZW1lbnRbcHJvcGVydHldO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHksIGRlc2NyaXB0b3IpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGdldF93cmFwcGVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy93cmFwcGVyJztcblxuXG4vKipcbiAqIHJlbW92ZSBgcHJvcGVydHlgIGZyb20gZWxlbWVudCBhbmQgcmVzdG9yZSBfb3JpZ2luYWxfcHJvcGVydHksIGlmIHByZXNlbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgdHJ5IHtcbiAgICBkZWxldGUgZWxlbWVudFtwcm9wZXJ0eV07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBTYWZhcmkgPD0gOSBhbmQgUGhhbnRvbUpTIHdpbGwgZW5kIHVwIGhlcmUgOi0oIE5vdGhpbmcgdG8gZG8gZXhjZXB0XG4gICAgICogd2FybmluZyAqL1xuICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihlbGVtZW50KTtcbiAgICBpZiAod3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmRlYnVnKSB7XG4gICAgICAvKiBnbG9iYWwgY29uc29sZSAqL1xuICAgICAgY29uc29sZS5sb2coJ1toeXBlcmZvcm1dIGNhbm5vdCB1bmluc3RhbGwgY3VzdG9tIHByb3BlcnR5ICcrcHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbF9kZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX29yaWdpbmFsXycrcHJvcGVydHkpO1xuXG4gIGlmIChvcmlnaW5hbF9kZXNjcmlwdG9yKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5LCBvcmlnaW5hbF9kZXNjcmlwdG9yKTtcbiAgfVxuXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IHsgY2FsbF9ob29rIH0gZnJvbSAnLi4vY29tcG9uZW50cy9ob29rcy5qcyc7XG5cblxuLyoqXG4gKiByZXR1cm4gZWl0aGVyIHRoZSBkYXRhIG9mIGEgaG9vayBjYWxsIG9yIHRoZSByZXN1bHQgb2YgYWN0aW9uLCBpZiB0aGVcbiAqIGZvcm1lciBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcmV0dXJuIGZ1bmN0aW9uIGEgZnVuY3Rpb24gd3JhcHBlciBhcm91bmQgYWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGhvb2ssIGFjdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZGF0YSA9IGNhbGxfaG9vayhob29rLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcblxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHIsIC4uLmFyZ3MpIHtcbiAgY29uc3QgYXJnc19sZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgdmFyIGdsb2JhbF9pbmRleCA9IDA7XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lKFswLTldK1xcJCk/KFtzbF0pL2csIChtYXRjaCwgcG9zaXRpb24sIHR5cGUpID0+IHtcbiAgICB2YXIgbG9jYWxfaW5kZXggPSBnbG9iYWxfaW5kZXg7XG4gICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICBsb2NhbF9pbmRleCA9IE51bWJlcihwb3NpdGlvbi5yZXBsYWNlKC9cXCQkLywgJycpKSAtIDE7XG4gICAgfVxuICAgIGdsb2JhbF9pbmRleCArPSAxO1xuXG4gICAgdmFyIGFyZyA9ICcnO1xuICAgIGlmIChhcmdzX2xlbmd0aCA+IGxvY2FsX2luZGV4KSB7XG4gICAgICBhcmcgPSBhcmdzW2xvY2FsX2luZGV4XTtcbiAgICB9XG5cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBhcmcgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICAgIC8qIHRyeSBnZXR0aW5nIGEgbG9jYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCBudW1iZXJzLCBpZiB0aGVcbiAgICAgICAqIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyAqL1xuICAgICAgaWYgKHR5cGUgPT09ICdsJykge1xuICAgICAgICBhcmcgPSAoYXJnLnRvTG9jYWxlU3RyaW5nIHx8IGFyZy50b1N0cmluZykuY2FsbChhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJnID0gYXJnLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGdldF9kYXRlX2Zyb21fd2VlayBmcm9tICcuL2dldF9kYXRlX2Zyb21fd2Vlayc7XG5cblxuLyoqXG4gKiBjYWxjdWxhdGUgYSBkYXRlIGZyb20gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIEhUTUw1XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0cmluZywgZWxlbWVudF90eXBlKSB7XG4gIGxldCBkYXRlO1xuICBzd2l0Y2ggKGVsZW1lbnRfdHlwZSkge1xuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgIGlmICghIC9eKFswLTldezR9KS0oMFsxLTldfDFbMDEyXSktKDBbMS05XXxbMTJdWzAtOV18M1swMV0pVChbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSkoPzo6KFswLTVdWzAtOV0pKD86XFwuKFswLTldezEsM30pKT8pPyQvLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcrJ3onKTtcbiAgICAgIHJldHVybiBpc05hTihkYXRlLnZhbHVlT2YoKSk/IG51bGwgOiBkYXRlO1xuXG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICBpZiAoISAvXihbMC05XXs0fSktKDBbMS05XXwxWzAxMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKSQvLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpO1xuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUudmFsdWVPZigpKT8gbnVsbCA6IGRhdGU7XG5cbiAgICBjYXNlICdtb250aCc6XG4gICAgICBpZiAoISAvXihbMC05XXs0fSktKDBbMS05XXwxWzAxMl0pJC8udGVzdChzdHJpbmcpKSB7XG4gICAgICAgI
46184HJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7XG4gICAgICByZXR1cm4gaXNOYU4oZGF0ZS52YWx1ZU9mKCkpPyBudWxsIDogZGF0ZTtcblxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgaWYgKCEgL14oWzAtOV17NH0pLVcoMFsxLTldfFsxMjM0XVswLTldfDVbMC0zXSkkLy50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0X2RhdGVfZnJvbV93ZWVrKE51bWJlcihSZWdFeHAuJDIpLCBOdW1iZXIoUmVnRXhwLiQxKSk7XG5cbiAgICBjYXNlICd0aW1lJzpcbiAgICAgIGlmICghIC9eKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSg/OjooWzAtNV1bMC05XSkoPzpcXC4oWzAtOV17MSwzfSkpPyk/JC8udGVzdChzdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZGF0ZSA9IG5ldyBEYXRlKCcxOTcwLTAxLTAxVCcrc3RyaW5nKyd6Jyk7XG4gICAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBzdHJpbmdfdG9fZGF0ZSBmcm9tICcuL3N0cmluZ190b19kYXRlJztcblxuXG4vKipcbiAqIGNhbGN1bGF0ZSBhIG51bWJlciBmcm9tIGEgc3RyaW5nIGFjY29yZGluZyB0byBIVE1MNVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHJpbmcsIGVsZW1lbnRfdHlwZSkge1xuICAgIGNvbnN0IHJ2YWwgPSBzdHJpbmdfdG9fZGF0ZShzdHJpbmcsIGVsZW1lbnRfdHlwZSk7XG4gICAgaWYgKHJ2YWwgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiArcnZhbDtcbiAgICB9XG4gICAgLyogbm90IHBhcnNlRmxvYXQsIGJlY2F1c2Ugd2Ugd2FudCBOYU4gZm9yIGludmFsaWQgdmFsdWVzIGxpa2UgXCIxLjJ4eHlcIiAqL1xuICAgIHJldHVybiBOdW1iZXIoc3RyaW5nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogdGhlIGZvbGxvd2luZyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gdGhlIFdlYkNvbXBvbmVudHMgcHJvamVjdCwgbGljZW5zZWRcbiAqIHVuZGVyIHRoZSBCU0QgbGljZW5zZS4gU291cmNlOlxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy9ibG9iLzUyODNkYjE0NTlmYTIzMjNlNWJmYzhiOWI1Y2MxNzUzZWQ4NWUzZDAvc3JjL1dlYkNvbXBvbmVudHMvZG9tLmpzI0w1My1MNzg+XG4gKi9cbi8vIGRlZmF1bHRQcmV2ZW50ZWQgaXMgYnJva2VuIGluIElFLlxuLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy83OTAzODkvZXZlbnQtZGVmYXVsdHByZXZlbnRlZC1yZXR1cm5zLWZhbHNlLWFmdGVyLXByZXZlbnRkZWZhdWx0LXdhcy1jYWxsZWRcbmNvbnN0IHdvcmtpbmdEZWZhdWx0UHJldmVudGVkID0gKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGUuaW5pdEV2ZW50KCdmb28nLCB0cnVlLCB0cnVlKTtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICByZXR1cm4gZS5kZWZhdWx0UHJldmVudGVkO1xufSkoKTtcblxuaWYgKCF3b3JraW5nRGVmYXVsdFByZXZlbnRlZCkge1xuICBjb25zdCBvcmlnUHJldmVudERlZmF1bHQgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0O1xuICB3aW5kb3cuRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmNhbmNlbGFibG
46184UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcmlnUHJldmVudERlZmF1bHQuY2FsbCh0aGlzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGVmYXVsdFByZXZlbnRlZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9O1xufVxuLyogZW5kIG9mIGJvcnJvd2VkIGNvZGUgKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlX2V2ZW50KG5hbWUsIHsgYnViYmxlcz10cnVlLCBjYW5jZWxhYmxlPWZhbHNlLCB9PXt9KSB7XG4gIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGV2ZW50LmluaXRFdmVudChuYW1lLCBidWJibGVzLCBjYW5jZWxhYmxlKTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM9dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZT1mYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH09e30sIHBheWxvYWQ9e30pIHtcbiAgaWYgKCEgKGV2ZW50IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50KSkge1xuICAgIGV2ZW50ID0gY3JlYXRlX2V2ZW50KGV2ZW50LCB7IGJ1YmJsZXMsIGNhbmNlbGFibGUgfSk7XG4gIH1cblxuICBmb3IgKGxldCBrZXkgaW4gcGF5bG9hZCkge1xuICAgIGlmIChwYXlsb2FkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGV2ZW50W2tleV0gPSBwYXlsb2FkW2tleV07XG4gICAgfVxuICB9XG5cbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuY29uc3Qgd3Nfb25fc3RhcnRfb3JfZW5kID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5cbi8qKlxuICogdHJpbSBhIHN0cmluZyBvZiB3aGl0ZXNwYWNlXG4gKlxuICogV2UgZG9uJ3QgdXNlIFN0cmluZy50cmltKCkgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvIHBvbHlmaWxsIGl0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKHdzX29uX3N0YXJ0X29yX2VuZCwgJycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogcGF0Y2ggU3RyaW5nLmxlbmd0aCB0byBhY2NvdW50IGZvciBub24tQk1QIGNoYXJhY3RlcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGVcbiAqIFdlIGRvIG5vdCB1c2UgdGhlIHNpbXBsZSBbLi4uc3RyXS5sZW5ndGgsIGJlY2F1c2UgaXQgbmVlZHMgYSB0b24gb2ZcbiAqIHBvbHlmaWxscyBpbiBvbGRlciBicm93c2Vycy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiBzdHIubWF0Y2goL1tcXDAtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS9nKS5sZW5ndGg7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogSW1wbGVtZW50IGNvbnN0cmFpbnQgY2hlY2tpbmcgZnVuY3Rpb25hbGl0eSBkZWZpbmVkIGluIHRoZSBIVE1MNSBzdGFuZGFyZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNkb20tY3ZhLXZhbGlkaXR5XG4gKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgdGVzdCBmYWlscyBbIV0sIGZhbHNlIG90aGVyd2lzZVxuICovXG5cblxuaW1wb3J0IGZvcm1hdF9kYXRlIGZyb20gJy4vZm9ybWF0X2RhdGUnO1xuaW1wb3J0IGdldF9uZXh0X3ZhbGlkIGZyb20gJy4vZ2V0X25leHRfdmFsaWQnO1xuaW1wb3J0IGdldF90eXBlIGZyb20gJy4vZ2V0X3R5cGUnO1xuaW1wb3J0IHNwcmludGYgZnJvbSAnLi9zcHJpbnRmJztcbmltcG9ydCBzdHJpbmdfdG9fbnVtYmVyIGZyb20gJy4vc3RyaW5nX3RvX251bWJlcic7XG5pbXBvcnQgc3RyaW5nX3RvX2RhdGUgZnJvbSAnLi9zdHJpbmdfdG9fZGF0ZSc7XG5pbXBvcnQgdW5pY29kZV9zdHJpbmdfbGVuZ3RoIGZyb20gJy4vdW5pY29kZV9zdHJpbmdfbGVuZ3RoJztcbmltcG9ydCBjdXN0b21fbWVzc2FnZXMgZnJvbSAnLi4vY29tcG9uZW50cy9jdXN0b21fbWVzc2FnZXMnO1xuaW1wb3J0IF8gZnJvbSAnLi4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHsgbWVzc2FnZV9zdG9yZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWVzc2FnZV9zdG9yZSc7XG5pbXBvcnQgQ3VzdG9tVmFsaWRhdG9yUmVnaXN0cnkgZnJvbSAnLi4vY29tcG9uZW50cy9yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5pbXBvcnQgdGVzdF9iYWRfaW5wdXQgZnJvbSAnLi4vdmFsaWRhdG9ycy9iYWRfaW5wdXQnO1xuaW1wb3J0IHRlc3RfbWF4IGZyb20gJy4uL3ZhbGlkYXRvcnMvbWF4JztcbmltcG9ydCB0ZXN0X21heGxlbmd0aCBmcm9tICcuLi92YWxpZGF0b3JzL21heGxlbmd0aCc7XG5pbXBvcnQgdGVzdF9taW4gZnJvbSAnLi4vdmFsaWRhdG9ycy9taW4nO1xuaW1wb3J0IHRlc3RfbWlubGVuZ3RoIGZyb20gJy4uL3ZhbGlkYXRvcnMvbWlubGVuZ3RoJztcbmltcG9ydCB0ZXN0X3BhdHRlcm4gZnJvbSAnLi4vdmFsaWRhdG9ycy9wYXR0ZXJuJztcbmltcG9ydCB0ZXN0X3JlcXVpcmVkIGZyb20gJy4uL3ZhbGlkYXRvcnMvcmVxdWlyZWQnO1xuaW1wb3J0IHRlc3Rfc3RlcCBmcm9tICcuLi92YWxpZGF0b3JzL3N0ZXAnO1xuaW1wb3J0IHRlc3RfdHlwZSBmcm9tICcuLi92YWxpZGF0b3JzL3R5cGUnO1xuXG5cbi8qKlxuICogYm9pbGVycGxhdGUgZnVuY3Rpb24gZm9yIGFsbCB0ZXN0cyBidXQgY3VzdG9tRXJyb3JcbiAqL1xuZnVuY3Rpb24gY2hlY2sodGVzdCwgcmVhY3QpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGludmFsaWQgPSAhIHRlc3QoZWxlbWVudCk7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJlYWN0KGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gaW52YWxpZDtcbiAgfTtcbn1cblxuXG4vKipcbiAqIGNyZWF0ZSBhIGNvbW1vbiBmdW5jdGlvbiB0byBzZXQgZXJyb3IgbWVzc2FnZXNcbiAqL1xuZnVuY3Rpb24gc2V0X21zZyhlbGVtZW50LCBtc2d0eXBlLCBfZGVmYXVsdCkge1xuICBtZXNzYWdlX3N0b3JlLnNldChlbGVtZW50LCBjdXN0b21fbWVzc2FnZXMuZ2V0KGVsZW1lbnQsIG1zZ3R5cGUsIF9kZWZhdWx0KSk7XG59XG5cblxuY29uc3QgYmFkSW5wdXQgPSBjaGVjayh0ZXN0X2JhZF9pbnB1dCwgZWxlbWVudCA9PiBzZXRfbXNnKGVsZW1lbnQsICdiYWRJbnB1dCcsXG4gICAgICAgICAgICAgICAgICAgICAgIF8oJ1BsZWFzZSBtYXRjaCB0aGUgcmVxdWVzdGVkIHR5cGUuJykpKTtcblxuXG5mdW5jdGlvbiBjdXN0b21FcnJvcihlbGVtZW50KSB7XG4gIC8qIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB0aGUgY3VzdG9tIHZhbGlkYXRvcnMgY2FsbCBzZXRDdXN0b21WYWxpZGl0eSgpLFxuICAgKiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoaXMgY29kZSBhZ2Fpbi4gV2UgY2hlY2ssIGlmIHRoZXJlIGlzIGFuIGFscmVhZHkgc2V0XG4gICAqIGN1c3RvbSB2YWxpZGl0eSBtZXNzYWdlIHRoZXJlLiAqL1xuICBpZiAoZWxlbWVudC5fX2hmX2N1c3RvbV92YWxpZGF0aW9uX3J1bm5pbmcpIHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlX3N0b3JlLmdldChlbGVtZW50KTtcbiAgICByZXR1cm4gKG1zZyAmJiBtc2cuaXNfY3VzdG9tKTtcbiAgfVxuXG4gIC8qIGNoZWNrLCBpZiB0aGVyZSBhcmUgY3VzdG9tIHZhbGlkYXRvcnMgaW4gdGhlIHJlZ2lzdHJ5LCBhbmQgY2FsbFxuICAgKiB0aGVtLiAqL1xuICBjb25zdCBjdXN0b21fdmFsaWRhdG9ycyA9IEN1c3RvbVZhbGlkYXRvclJlZ2lzdHJ5LmdldChlbGVtZW50KTtcbiAgY29uc3QgY3ZsID0gY3VzdG9tX3ZhbGlkYXRvcnMubGVuZ3RoO1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuXG4gIGlmIChjdmwpIHtcbiAgICBlbGVtZW50Ll9faGZfY3VzdG9tX3ZhbGlkYXRpb25fcnVubmluZyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdmw7IGkrKykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY3VzdG9tX3ZhbGlkYXRvcnNbaV0oZWxlbWVudCk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgISByZXN1bHQpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgLyogYnJlYWsgb24gZmlyc3QgaW52YWxpZCByZXNwb25zZSAqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKGVsZW1lbnQuX19oZl9jdXN0b21fdmFsaWRhdGlvbl9ydW5uaW5nKTtcbiAgfVxuXG4gIC8qIGNoZWNrLCBpZiB0aGVyZSBhcmUgb3RoZXIgdmFsaWRpdHkgbWVzc2FnZXMgYWxyZWFkeSAqL1xuICBpZiAodmFsaWQpIHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlX3N0b3JlLmdldChlbGVtZW50KTtcbiAgICB2YWxpZCA9ICEgKG1zZy50b1N0cmluZygpICYmICgnaXNfY3VzdG9tJyBpbiBtc2cpKTtcbiAgfVxuXG4gIHJldHVybiAhIHZhbGlkO1xufVxuXG5cbmNvbnN0IHBhdHRlcm5NaXNtYXRjaCA9IGNoZWNrKHRlc3RfcGF0dGVybiwgZWxlbWVudCA9PiB7XG4gIHNldF9tc2coZWxlbWVudCwgJ3BhdHRlcm5NaXNtYXRjaCcsXG4gICAgZWxlbWVudC50aXRsZT9cbiAgICAgIHNwcmludGYoXygnUGF0dGVybk1pc21hdGNoV2l0aFRpdGxlJyksIGVsZW1lbnQudGl0bGUpXG4gICAgICA6XG4gICAgICBfKCdQYXR0ZXJuTWlzbWF0Y2gnKVxuICApO1xufSk7XG5cblxuLyoqXG4gKiBUT0RPOiB3aGVuIHJhbmdlT3ZlcmZsb3cgYW5kIHJhbmdlVW5kZXJmbG93IGFyZSBib3RoIGNhbGxlZCBkaXJlY3RseSBhbmRcbiAqIHN1Y2Nlc3NmdWwsIHRoZSBpblJhbmdlIGFuZCBvdXRPZlJhbmdlIGNsYXNzZXMgd29uJ3QgZ2V0IHJlbW92ZWQsIHVubGVzc1xuICogZWxlbWVudC52YWxpZGl0eVN0YXRlLnZhbGlkIGlzIHF1ZXJpZWQsIHRvby5cbiAqL1xuY29uc3QgcmFuZ2VPdmVyZmxvdyA9IGNoZWNrKHRlc3RfbWF4LCBlbGVtZW50ID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuICBjb25zdCB3cmFwcGVyID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gIGNvbnN0IG91dE9mUmFuZ2VDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLm91dE9mUmFuZ2UgfHwgJ2hmLW91dC1vZi1yYW5nZSc7XG4gIGNvbnN0IGluUmFuZ2VDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLmluUmFuZ2UgfHwgJ2hmLWluLXJhbmdlJztcblxuICBsZXQgbXNnO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Rh
46184dGUnOlxuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICBjYXNlICdkYXRldGltZS1sb2NhbCc6XG4gICAgICBtc2cgPSBzcHJpbnRmKF8oJ0RhdGVSYW5nZU92ZXJmbG93JyksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdF9kYXRlKHN0cmluZ190b19kYXRlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtYXgnKSwgdHlwZSksIHR5cGUpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgbXNnID0gc3ByaW50ZihfKCdUaW1lUmFuZ2VPdmVyZmxvdycpLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZGF0ZShzdHJpbmdfdG9fZGF0ZShlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4JyksIHR5cGUpLCB0eXBlKSk7XG4gICAgICBicmVhaztcbiAgICAvLyBjYXNlICdudW1iZXInOlxuICAgIGRlZmF1bHQ6XG4gICAgICBtc2cgPSBzcHJpbnRmKF8oJ051bWJlclJhbmdlT3ZlcmZsb3cnKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RvX251bWJlcihlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4JyksIHR5cGUpKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgc2V0X21zZyhlbGVtZW50LCAncmFuZ2VPdmVyZmxvdycsIG1zZyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChvdXRPZlJhbmdlQ2xhc3MpO1xuICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoaW5SYW5nZUNsYXNzKTtcbn0pO1xuXG5cbmNvbnN0IHJhbmdlVW5kZXJmbG93ID0gY2hlY2sodGVzdF9taW4sIGVsZW1lbnQgPT4ge1xuICBjb25zdCB0eXBlID0gZ2V0X3R5cGUoZWxlbWVudCk7XG4gIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihlbGVtZW50KTtcbiAgY29uc3Qgb3V0T2ZSYW5nZUNsYXNzID0gd3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmNsYXNzZXMub3V0T2ZSYW5nZSB8fCAnaGYtb3V0LW9mLXJhbmdlJztcbiAgY29uc3QgaW5SYW5nZUNsYXNzID0gd3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmNsYXNzZXMuaW5SYW5nZSB8fCAnaGYtaW4tcmFuZ2UnO1xuXG4gIGxldCBtc2c7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIG1zZyA9IHNwcmludGYoXygnRGF0ZVJhbmdlVW5kZXJmbG93JyksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdF9kYXRlKHN0cmluZ190b19kYXRlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSwgdHlwZSksIHR5cGUpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgbXNnID0gc3ByaW50ZihfKCdUaW1lUmFuZ2VVbmRlcmZsb3cnKSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2RhdGUoc3RyaW5nX3RvX2RhdGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbicpLCB0eXBlKSwgdHlwZSkpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gY2FzZSAnbnVtYmVyJzpcbiAgICBkZWZhdWx0OlxuICAgICAgbXNnID0gc3ByaW50ZihfKCdOdW1iZXJSYW5nZVVuZGVyZmxvdycpLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fbnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSwgdHlwZSkpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBzZXRfbXNnKGVsZW1lbnQsICdyYW5nZVVuZGVyZmxvdycsIG1zZyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChvdXRPZlJhbmdlQ2xhc3MpO1xuICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoaW5SYW5nZUNsYXNzKTtcbn0pO1xuXG5cbmNvbnN0IHN0ZXBNaXNtYXRjaCA9IGNoZWNrKHRlc3Rfc3RlcCwgZWxlbWVudCA9PiB7XG4gIGNvbnN0IGxpc3QgPSBnZXRfbmV4dF92YWxpZChlbGVtZW50KTtcbiAgY29uc3QgbWluID0gbGlzdFswXTtcbiAgY29uc3QgbWF4ID0gbGlzdFsxXTtcbiAgbGV0IHNvbGUgPSBmYWxzZTtcbiAgbGV0IG1zZztcblxuICBpZiAobWluID09PSBudWxsKSB7XG4gICAgc29sZSA9IG1heDtcbiAgfSBlbHNlIGlmIChtYXggPT09IG51bGwpIHtcbiAgICBzb2xlID0gbWluO1xuICB9XG5cbiAgaWYgKHNvbGUgIT09IGZhbHNlKSB7XG4gICAgbXNnID0gc3ByaW50ZihfKCdTdGVwTWlzbWF0Y2hPbmVWYWx1ZScpLCBzb2xlKTtcbiAgfSBlbHNlIHtcbiAgICBtc2cgPSBzcHJpbnRmKF8oJ1N0ZXBNaXNtYXRjaCcpLCBtaW4sIG1heCk7XG4gIH1cbiAgc2V0X21zZyhlbGVtZW50LCAnc3RlcE1pc21hdGNoJywgbXNnKTtcbn0pO1xuXG5cbmNvbnN0IHRvb0xvbmcgPSBjaGVjayh0ZXN0X21heGxlbmd0aCwgZWxlbWVudCA9PiB7XG4gIHNldF9tc2coZWxlbWVudCwgJ3Rvb0xvbmcnLFxuICAgICAgICAgIHNwcmludGYoXygnVGV4dFRvb0xvbmcnKSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21heGxlbmd0aCcpLFxuICAgICAgICAgICAgICAgICAgdW5pY29kZV9zdHJpbmdfbGVuZ3RoKGVsZW1lbnQudmFsdWUpKSk7XG59KTtcblxuXG5jb25zdCB0b29TaG9ydCA9IGNoZWNrKHRlc3RfbWlubGVuZ3RoLCBlbGVtZW50ID0+IHtcbiAgc2V0X21zZyhlbGVtZW50LCAndG9vU2hvcnQnLFxuICAgICAgICAgIHNwcmludGYoXygnUGxlYXNlIGxlbmd0aGVuIHRoaXMgdGV4dCB0byAlbCBjaGFyYWN0ZXJzIG9yIG1vcmUgKHlvdSBhcmUgY3VycmVudGx5IHVzaW5nICVsIGNoYXJhY3RlcnMpLicpLFxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbmxlbmd0aCcpLFxuICAgICAgICAgICAgICAgICAgdW5pY29kZV9zdHJpbmdfbGVuZ3RoKGVsZW1lbnQudmFsdWUpKSk7XG59KTtcblxuXG5jb25zdCB0eXBlTWlzbWF0Y2ggPSBjaGVjayh0ZXN0X3R5cGUsIGVsZW1lbnQgPT4ge1xuICBsZXQgbXNnID0gXygnUGxlYXNlIHVzZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LicpO1xuICBjb25zdCB0eXBlID0gZ2V0X3R5cGUoZWxlbWVudCk7XG5cbiAgaWYgKHR5cGUgPT09ICdlbWFpbCcpIHtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgIG1zZyA9IF8oJ1BsZWFzZSBlbnRlciBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVtYWlsIGFkZHJlc3Nlcy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnID0gXygnSW52YWxpZEVtYWlsJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1cmwnKSB7XG4gICAgbXNnID0gXygnSW52YWxpZFVSTCcpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmaWxlJykge1xuICAgIG1zZyA9IF8oJ1BsZWFzZSBzZWxlY3QgYS
46184BmaWxlIG9mIHRoZSBjb3JyZWN0IHR5cGUuJyk7XG4gIH1cblxuICBzZXRfbXNnKGVsZW1lbnQsICd0eXBlTWlzbWF0Y2gnLCBtc2cpO1xufSk7XG5cblxuY29uc3QgdmFsdWVNaXNzaW5nID0gY2hlY2sodGVzdF9yZXF1aXJlZCwgZWxlbWVudCA9PiB7XG4gIGxldCBtc2cgPSBfKCdWYWx1ZU1pc3NpbmcnKTtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGlmICh0eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgbXNnID0gXygnQ2hlY2tib3hNaXNzaW5nJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgIG1zZyA9IF8oJ1JhZGlvTWlzc2luZycpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmaWxlJykge1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgbXNnID0gXygnUGxlYXNlIHNlbGVjdCBvbmUgb3IgbW9yZSBmaWxlcy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnID0gXygnRmlsZU1pc3NpbmcnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudCkge1xuICAgIG1zZyA9IF8oJ1NlbGVjdE1pc3NpbmcnKTtcbiAgfVxuXG4gIHNldF9tc2coZWxlbWVudCwgJ3ZhbHVlTWlzc2luZycsIG1zZyk7XG59KTtcblxuXG4vKipcbiAqIHRoZSBcInZhbGlkXCIgcHJvcGVydHkgY2FsbHMgYWxsIG90aGVyIHZhbGlkaXR5IGNoZWNrZXJzIGFuZCByZXR1cm5zIHRydWUsXG4gKiBpZiBhbGwgdGhvc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1ham9yIGFjY2VzcyBwb2ludCBmb3IgX2FsbF8gb3RoZXIgQVBJIG1ldGhvZHMsIG5hbWVseVxuICogKGNoZWNrfHJlcG9ydClWYWxpZGl0eSgpLlxuICovXG5jb25zdCB2YWxpZCA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCB3cmFwcGVyID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gIGNvbnN0IHZhbGlkQ2xhc3MgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy52YWxpZCB8fCAnaGYtdmFsaWQnO1xuICBjb25zdCBpbnZhbGlkQ2xhc3MgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy5pbnZhbGlkIHx8ICdoZi1pbnZhbGlkJztcbiAgY29uc3QgdXNlckludmFsaWRDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLnVzZXJJbnZhbGlkIHx8ICdoZi11c2VyLWludmFsaWQnO1xuICBjb25zdCB1c2VyVmFsaWRDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLnVzZXJWYWxpZCB8fCAnaGYtdXNlci12YWxpZCc7XG4gIGNvbnN0IGluUmFuZ2VDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLmluUmFuZ2UgfHwgJ2hmLWluLXJhbmdlJztcbiAgY29uc3Qgb3V0T2ZSYW5nZUNsYXNzID0gd3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmNsYXNzZXMub3V0T2ZSYW5nZSB8fCAnaGYtb3V0LW9mLXJhbmdlJztcbiAgY29uc3QgdmFsaWRhdGVkQ2xhc3MgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy52YWxpZGF0ZWQgfHwgJ2hmLXZhbGlkYXRlZCc7XG5cbiAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHZhbGlkYXRlZENsYXNzKTtcblxuICBmb3IgKGxldCBjaGVja2VyIG9mIFtiYWRJbnB1dCwgY3VzdG9tRXJyb3IsIHBhdHRlcm5NaXNtYXRjaCwgcmFuZ2VPdmVyZmxvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VVbmRlcmZsb3csIHN0ZXBNaXNtYXRjaCwgdG9vTG9uZywgdG9vU2hvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgIHR5cGVNaXNtYXRjaCwgdmFsdWVNaXNzaW5nXSkge1xuICAgIGlmIChjaGVja2VyKGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoaW52YWxpZENsYXNzKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh2YWxpZENsYXNzKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh1c2VyVmFsaWRDbGFzcyk7XG4gICAgICBpZiAoKFxuICAgICAgICAgICAgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpICYmXG4gICAgICAgICAgICBlbGVtZW50LmNoZWNrZWQgIT09IGVsZW1lbnQuZGVmYXVsdENoZWNrZWRcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgLyogdGhlIGZvbGxvd2luZyB0ZXN0IGlzIHRyaXZpYWxseSBmYWxzZSBmb3IgY2hlY2tib3hlcy9yYWRpb3MgKi9cbiAgICAgICAgICBlbGVtZW50LnZhbHVlICE9PSBlbGVtZW50LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodXNlckludmFsaWRDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodXNlckludmFsaWRDbGFzcyk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ3RydWUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBtZXNzYWdlX3N0b3JlLmRlbGV0ZShlbGVtZW50KTtcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGludmFsaWRDbGFzcyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh1c2VySW52YWxpZENsYXNzKTtcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKG91dE9mUmFuZ2VDbGFzcyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh2YWxpZENsYXNzKTtcbiAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGluUmFuZ2VDbGFzcyk7XG4gIGlmIChlbGVtZW50LnZhbHVlICE9PSBlbGVtZW50LmRlZmF1bHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh1c2VyVmFsaWRDbGFzcyk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHVzZXJWYWxpZENsYXNzKTtcbiAgfVxuICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ2ZhbHNlJyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGJhZElucHV0LFxuICBjdXN0b21FcnJvcixcbiAgcGF0dGVybk1pc21hdGNoLFxuICByYW5nZU92ZXJmbG93LFxuICByYW5nZVVuZGVyZmxvdyxcbiAgc3RlcE1pc21hdGNoLFxuICB0b29Mb25nLFxuICB0b29TaG9ydCxcbiAgdHlwZU1pc21hdGNoLFxuICB2YWx1ZU1pc3NpbmcsXG4gIHZhbGlkLFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcbmltcG9ydCB7
46184IGlucHV0X2NoZWNrZWQgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKipcbiAqIHRlc3Qgd2hldGhlciB0aGUgZWxlbWVudCBzdWZmZXJzIGZyb20gYmFkIGlucHV0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGlmIChpbnB1dF9jaGVja2VkLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgLyogd2UncmUgbm90IGludGVyZXN0ZWQsIHRoYW5rcyEgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIHRoZSBicm93c2VyIGhpZGVzIHNvbWUgYmFkIGlucHV0IGZyb20gdGhlIERPTSwgZS5nLiBtYWxmb3JtZWQgbnVtYmVycyxcbiAgICogZW1haWwgYWRkcmVzc2VzIHdpdGggaW52YWxpZCBwdW55Y29kZSByZXByZXNlbnRhdGlvbiwgLi4uIFdlIHRyeSB0byByZXNvcnRcbiAgICogdG8gdGhlIG9yaWdpbmFsIG1ldGhvZCBoZXJlLiBUaGUgYXNzdW1wdGlvbiBpcywgdGhhdCBhIGJyb3dzZXIgaGlkaW5nXG4gICAqIGJhZCBpbnB1dCB3aWxsIGhvcGVmdWxseSBhbHNvIGFsd2F5cyBzdXBwb3J0IGEgcHJvcGVyXG4gICAqIFZhbGlkaXR5U3RhdGUuYmFkSW5wdXQgKi9cbiAgaWYgKCEgZWxlbWVudC52YWx1ZSkge1xuICAgIGlmICgnX29yaWdpbmFsX3ZhbGlkaXR5JyBpbiBlbGVtZW50ICYmXG4gICAgICAgICEgZWxlbWVudC5fb3JpZ2luYWxfdmFsaWRpdHkuX19oeXBlcmZvcm0pIHtcbiAgICAgIHJldHVybiAhIGVsZW1lbnQuX29yaWdpbmFsX3ZhbGlkaXR5LmJhZElucHV0O1xuICAgIH1cbiAgICAvKiBubyB2YWx1ZSBhbmQgbm8gb3JpZ2luYWwgYmFkSW5wdXQ6IEFzc3VtZSBhbGwncyByaWdodC4gKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB0cnVlO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdjb2xvcic6XG4gICAgICByZXN1bHQgPSAvXiNbYS1mMC05XXs2fSQvLnRlc3QoZWxlbWVudC52YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgIHJlc3VsdCA9ICEgaXNOYU4oTnVtYmVyKGVsZW1lbnQudmFsdWUpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICBjYXNlICdkYXRlJzpcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndGltZSc6XG4gICAgICByZXN1bHQgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKSAhPT0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIHJlc3VsdCA9IC9eKFswLTldezQsfSktKDBbMS05XXwxWzAxMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVQoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pKD86OihbMC01XVswLTldKSg/OlxcLihbMC05XXsxLDN9KSk/KT8kLy50ZXN0KGVsZW1lbnQudmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGVsJzpcbiAgICAgIC8qIHNwZWMgc2F5cyBObyEgUGhvbmUgbnVtYmVycyBjYW4gaGF2ZSBhbGwga2luZHMgb2YgZm9ybWF0cywgc28gdGhpc1xuICAgICAgICogaXMgZXhwZWN0ZWQgdG8gYmUgYSBmcmVlLXRleHQgZmllbGQuICovXG4gICAgICAvLyBUT0RPIHdlIGNvdWxkIGFsbG93IGEgc2V0dGluZyAncGhvbmVfcmVnZXgnIHRvIGJlIGV2YWx1YXRlZCBoZXJlLlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW1haWwnOlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgeyBkYXRlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1heCBhdHRyaWJ1dGVcbiAqXG4gKiB3ZSB1c2UgTnVtYmVyKCkgaW5zdGVhZCBvZiBwYXJzZUZsb2F0KCksIGJlY2F1c2UgYW4gaW52YWxpZCBhdHRyaWJ1dGVcbiAqIHZhbHVlIGxpa2UgXCIxMjNhYmNcIiBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRfdHlwZShlbGVtZW50KTtcblxuICBpZiAoISBlbGVtZW50LnZhbHVlIHx8ICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21heCcpKSB7XG4gICAgLyogd2UncmUgbm90IHJlc3BvbnNpYmxlIGhlcmUgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB2YWx1ZSwgbWF4O1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgdmFsdWUgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKTtcbiAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsPyBOYU4gOiArdmFsdWU7XG4gICAgbWF4ID0gc3RyaW5nX3RvX2RhdGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21heCcpLCB0eXBlKTtcbiAgICBtYXggPSBtYXggPT09IG51bGw/IE5hTiA6ICttYXg7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgbWF4ID0gTnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtYXgnKSk7XG4gIH1cblxuICAvKiB3ZSBjYW5ub3QgdmFsaWRhdGUgaW52YWxpZCB2YWx1ZXMgYW5kIHRydXN0IG9uIGJhZElucHV0LCBpZiBpc05hTih2YWx1ZSkgKi9cbiAgcmV0dXJuIChpc05hTihtYXgpIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8PSBtYXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgdW5pY29kZV9zdHJpbmdfbGVuZ3RoIGZyb20gJy4uL3Rvb2xzL3VuaWNvZGVfc3RyaW5nX2xlbmd0aCc7XG5pbXBvcnQgeyB0ZXh0IGFzIHRleHRfdHlwZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1heGxlbmd0aCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCkge1xuICBpZiAoXG4gICAgICAhIGVsZW1lbnQudmFsdWVcbiAgICAgIHx8XG4gICAgICB0ZXh0X3R5cGVzLmluZGV4T2YoZ2V0X3R5cGUoZWxlbWVudCkpID09PSAtMVxuICAgICAgfHxcbiAgICAgICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21heGxlbmd0aCcpXG4gICAgICB8fFxuICAgICAgISBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJykgLy8gY2F0Y2ggbWF4bGVuZ3RoPVwiXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBtYXhsZW5ndGggPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJyksIDEwKTtcblxuICAvKiBjaGVjaywgaWYgdGhlIG1heGxlbmd0aCB2YWx1ZSBpcyB1c2FibGUgYXQgYWxsLlxuICAgKiBXZSBhbGxvdyBtYXhsZW5ndGggPT09IDAgdG8gYmFzaWNhbGx5IGRpc2FibGUgaW5wdXQgKEZpcmVmb3ggZG9lcywgdG9vKS5cbiAgICovXG4gIGlmIChpc05hTihtYXhsZW5ndGgpIHx8IG1heGxlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybi
46184B1bmljb2RlX3N0cmluZ19sZW5ndGgoZWxlbWVudC52YWx1ZSkgPD0gbWF4bGVuZ3RoO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgeyBkYXRlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1pbiBhdHRyaWJ1dGVcbiAqXG4gKiB3ZSB1c2UgTnVtYmVyKCkgaW5zdGVhZCBvZiBwYXJzZUZsb2F0KCksIGJlY2F1c2UgYW4gaW52YWxpZCBhdHRyaWJ1dGVcbiAqIHZhbHVlIGxpa2UgXCIxMjNhYmNcIiBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRfdHlwZShlbGVtZW50KTtcblxuICBpZiAoISBlbGVtZW50LnZhbHVlIHx8ICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21pbicpKSB7XG4gICAgLyogd2UncmUgbm90IHJlc3BvbnNpYmxlIGhlcmUgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB2YWx1ZSwgbWluO1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgdmFsdWUgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKTtcbiAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsPyBOYU4gOiArdmFsdWU7XG4gICAgbWluID0gc3RyaW5nX3RvX2RhdGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbicpLCB0eXBlKTtcbiAgICBtaW4gPSBtaW4gPT09IG51bGw/IE5hTiA6ICttaW47XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgbWluID0gTnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSk7XG4gIH1cblxuICAvKiB3ZSBjYW5ub3QgdmFsaWRhdGUgaW52YWxpZCB2YWx1ZXMgYW5kIHRydXN0IG9uIGJhZElucHV0LCBpZiBpc05hTih2YWx1ZSkgKi9cbiAgcmV0dXJuIChpc05hTihtaW4pIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA+PSBtaW4pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgdW5pY29kZV9zdHJpbmdfbGVuZ3RoIGZyb20gJy4uL3Rvb2xzL3VuaWNvZGVfc3RyaW5nX2xlbmd0aCc7XG5pbXBvcnQgeyB0ZXh0IGFzIHRleHRfdHlwZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1pbmxlbmd0aCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCkge1xuICBpZiAoXG4gICAgICAhIGVsZW1lbnQudmFsdWVcbiAgICAgIHx8XG4gICAgICB0ZXh0X3R5cGVzLmluZGV4T2YoZ2V0X3R5cGUoZWxlbWVudCkpID09PSAtMVxuICAgICAgfHxcbiAgICAgICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21pbmxlbmd0aCcpXG4gICAgICB8fFxuICAgICAgISBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWlubGVuZ3RoJykgLy8gY2F0Y2ggbWlubGVuZ3RoPVwiXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBtaW5sZW5ndGggPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWlubGVuZ3RoJyksIDEwKTtcblxuICAvKiBjaGVjaywgaWYgdGhlIG1pbmxlbmd0aCB2YWx1ZSBpcyB1c2FibGUgYXQgYWxsLiAqL1xuICBpZiAoaXNOYU4obWlubGVuZ3RoKSB8fCBtaW5sZW5ndGggPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdW5pY29kZV9zdHJpbmdfbGVuZ3RoKGVsZW1lbnQudmFsdWUpID49IG1pbmxlbmd0aDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIHRlc3QgdGhlIHBhdHRlcm4gYXR0cmlidXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgcmV0dXJuIChcbiAgICAgICEgZWxlbWVudC52YWx1ZVxuICAgICAgfHxcbiAgICAgICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3BhdHRlcm4nKVxuICAgICAgfHxcbiAgICAgIChuZXcgUmVnRXhwKCdeKD86JysgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3BhdHRlcm4nKSArJykkJykpLnRlc3QoZWxlbWVudC52YWx1ZSlcbiAgICApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGdldF9yYWRpb2dyb3VwIH0gZnJvbSAnLi4vdG9vbHMvZ2V0X3JhZGlvZ3JvdXAnO1xuXG5cbmZ1bmN0aW9uIGhhc19zdWJtaXR0YWJsZV9vcHRpb24oc2VsZWN0KSB7XG4gIC8qIERlZmluaXRpb24gb2YgdGhlIHBsYWNlaG9sZGVyIGxhYmVsIG9wdGlvbjpcbiAgICogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NlYy1mb3Jtcy5odG1sI2VsZW1lbnQtYXR0cmRlZi1zZWxlY3QtcmVxdWlyZWRcbiAgICogQmVpbmcgcmVxdWlyZWQgKHRoZSBmaXJzdCBjb25zdHJhaW50IGluIHRoZSBzcGVjKSBpcyB0cml2aWFsbHkgdHJ1ZSwgc2luY2VcbiAgICogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmb3Igc3VjaCBzZWxlY3RzLlxuICAgKi9cbiAgY29uc3QgaGFzX3BsYWNlaG9sZG
46184VyX29wdGlvbiA9IChcbiAgICAhIHNlbGVjdC5tdWx0aXBsZSAmJlxuICAgIHNlbGVjdC5zaXplIDw9IDEgJiZcbiAgICBzZWxlY3Qub3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgc2VsZWN0Lm9wdGlvbnNbMF0ucGFyZW50Tm9kZSA9PSBzZWxlY3QgJiZcbiAgICBzZWxlY3Qub3B0aW9uc1swXS52YWx1ZSA9PT0gJydcbiAgKTtcbiAgcmV0dXJuIChcbiAgICAvKiBhbnl0aGluZyBzZWxlY3RlZCBhdCBhbGw/IFRoYXQncyByZWR1bmRhbnQgd2l0aCB0aGUgLnNvbWUoKSBjYWxsIGJlbG93LFxuICAgICAqIGJ1dCBtb3JlIHBlcmZvcm1hbnQgaW4gdGhlIG1vc3QgcHJvYmFibGUgZXJyb3IgY2FzZS4gKi9cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA+IC0xICYmXG4gICAgQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChcbiAgICAgIHNlbGVjdC5vcHRpb25zLFxuICAgICAgb3B0aW9uID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiBpdCBpc24ndCB0aGUgcGxhY2Vob2xkZXIgb3B0aW9uICovXG4gICAgICAgICAgKCEgaGFzX3BsYWNlaG9sZGVyX29wdGlvbiB8fCBvcHRpb24uaW5kZXggIT09IDApICYmXG4gICAgICAgICAgLyogaXQgaXNuJ3QgZGlzYWJsZWQgKi9cbiAgICAgICAgICAhIG9wdGlvbi5kaXNhYmxlZCAmJlxuICAgICAgICAgIC8qIGFuZCBpdCBpcywgaW4gZmFjdCwgc2VsZWN0ZWQgKi9cbiAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIClcbiAgKTtcbn1cblxuXG4vKipcbiAqIHRlc3QgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAvKiB0aGUgaGFwcHkgKGFuZCBxdWljaykgcGF0aCBmb3IgcmFkaW9zOiAqL1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKSAmJiBlbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJhZGlvZ3JvdXAgPSBnZXRfcmFkaW9ncm91cChlbGVtZW50KTtcblxuICAgIC8qIGlmIGFueSByYWRpbyBpbiB0aGUgZ3JvdXAgaXMgcmVxdWlyZWQsIHdlIG5lZWQgYW55IChub3QgbmVjZXNzYXJpbHkgdGhlXG4gICAgICogc2FtZSkgcmFkaW8gdG8gYmUgY2hlY2tlZCAqL1xuICAgIGlmIChyYWRpb2dyb3VwLnNvbWUocmFkaW8gPT4gcmFkaW8uaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpKSkge1xuICAgICAgcmV0dXJuIHJhZGlvZ3JvdXAuc29tZShyYWRpbyA9PiByYWRpby5jaGVja2VkKTtcbiAgICB9XG4gICAgLyogbm90IHJlcXVpcmVkLCB2YWxpZGF0aW9uIHBhc3NlcyAqL1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3JlcXVpcmVkJykpIHtcbiAgICAvKiBub3RoaW5nIHRvIGRvICovXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudCkge1xuICAgIHJldHVybiBoYXNfc3VibWl0dGFibGVfb3B0aW9uKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcpPyBlbGVtZW50LmNoZWNrZWQgOiAoISEgZWxlbWVudC52YWx1ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGdldF90eXBlIGZyb20gJy4uL3Rvb2xzL2dldF90eXBlJztcbmltcG9ydCB7IG51bWJlcnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRfc3RlcCwgc3RlcF9zY2FsZV9mYWN0b3IsIGRlZmF1bHRfc3RlcF9iYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zdGVwX2RlZmF1bHRzJztcbmltcG9ydCBzdHJpbmdfdG9fbnVtYmVyIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19udW1iZXInO1xuXG5cbi8qKlxuICogdGVzdCB0aGUgc3RlcCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCkge1xuICBjb25zdCB0eXBlID0gZ2V0X3R5cGUoZWxlbWVudCk7XG5cbiAgaWYgKCEgZWxlbWVudC52YWx1ZSB8fFxuICAgICAgbnVtYmVycy5pbmRleE9mKHR5cGUpID09PSAtMSB8fFxuICAgICAgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGVwJykgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdhbnknKSB7XG4gICAgLyogd2UncmUgbm90IHJlc3BvbnNpYmxlIGhlcmUuIE5vdGU6IElmIG5vIHN0ZXAgYXR0cmlidXRlIGlzIGdpdmVuLCB3ZVxuICAgICAqIG5lZWQgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgZGVmYXVsdCBzdGVwIGFzIHBlciBzcGVjLiAqL1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IHN0ZXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3RlcCcpO1xuICBpZiAoc3RlcCkge1xuICAgIHN0ZXAgPSBzdHJpbmdfdG9fbnVtYmVyKHN0ZXAsIHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHN0ZXAgPSBkZWZh
46184dWx0X3N0ZXBbdHlwZV0gfHwgMTtcbiAgfVxuXG4gIGlmIChzdGVwIDw9IDAgfHwgaXNOYU4oc3RlcCkpIHtcbiAgICAvKiBlcnJvciBpbiBzcGVjaWZpZWQgXCJzdGVwXCIuIFdlIGNhbm5vdCB2YWxpZGF0ZSBhZ2FpbnN0IGl0LCBzbyB0aGUgdmFsdWVcbiAgICAgKiBpcyB0cnVlLiAqL1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qgc2NhbGUgPSBzdGVwX3NjYWxlX2ZhY3Rvclt0eXBlXSB8fCAxO1xuXG4gIGxldCB2YWx1ZSA9IHN0cmluZ190b19udW1iZXIoZWxlbWVudC52YWx1ZSwgdHlwZSk7XG4gIGxldCBtaW4gPSBzdHJpbmdfdG9fbnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8ICcnLCB0eXBlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgLyogd2UgY2Fubm90IGNvbXBhcmUgYW4gaW52YWxpZCB2YWx1ZSBhbmQgdHJ1c3QgdGhhdCB0aGUgYmFkSW5wdXQgdmFsaWRhdG9yXG4gICAgICogdGFrZXMgb3ZlciBmcm9tIGhlcmUgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc05hTihtaW4pKSB7XG4gICAgbWluID0gZGVmYXVsdF9zdGVwX2Jhc2VbdHlwZV0gfHwgMDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnbW9udGgnKSB7XG4gICAgLyogdHlwZT1tb250aCBoYXMgbW9udGgtd2lkZSBzdGVwcy4gU2VlXG4gICAgICogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNtb250aC1zdGF0ZS0lMjh0eXBlPW1vbnRoJTI5XG4gICAgICovXG4gICAgbWluID0gKG5ldyBEYXRlKG1pbikpLmdldFVUQ0Z1bGxZZWFyKCkgKiAxMiArIChuZXcgRGF0ZShtaW4pKS5nZXRVVENNb250aCgpO1xuICAgIHZhbHVlID0gKG5ldyBEYXRlKHZhbHVlKSkuZ2V0VVRDRnVsbFllYXIoKSAqIDEyICsgKG5ldyBEYXRlKHZhbHVlKSkuZ2V0VVRDTW9udGgoKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IE1hdGguYWJzKG1pbiAtIHZhbHVlKSAlIChzdGVwICogc2NhbGUpO1xuXG4gIHJldHVybiAocmVzdWx0IDwgMC4wMDAwMDAwMSB8fFxuICAgICAgICAgIC8qIGNyYXBweSBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljcyEgKi9cbiAgICAgICAgICByZXN1bHQgPiAoc3RlcCAqIHNjYWxlKSAtIDAuMDAwMDAwMDEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBjb21tYV9zcGxpdCBmcm9tICcuLi90b29scy9jb21tYV9zcGxpdCc7XG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHRyaW0gZnJvbSAnLi4vdG9vbHMvdHJpbSc7XG5pbXBvcnQgeyB0eXBlX2NoZWNrZWQgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKiB3ZSB1c2UgYSBkdW1teSA8YT4gd2hlcmUgd2Ugc2V0IHRoZSBocmVmIHRvIHRlc3QgVVJMIHZhbGlkaXR5XG4gKiBUaGUgZGVmaW5pdGlvbiBpcyBvdXQgb2YgdGhlIFwiZ2xvYmFsXCIgc2NvcGUgc28gdGhhdCBKU0RPTSBjYW4gYmUgaW5zdGFudGlhdGVkXG4gKiBhZnRlciBsb2FkaW5nIEh5cGVyZm9ybSBmb3IgdGVzdHMuXG4gKi9cbnZhciB1cmxfY2FuYXJ5O1xuXG4vKiBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCN2YWxpZC1lLW1haWwtYWRkcmVzcyAqL1xuY29uc3QgZW1haWxfcGF0dGVybiA9IC9eW2EtekEtWjAtOS4hIyQlJicqK1xcLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuXG4vKipcbiAqIHRlc3QgdGhlIHR5cGUtaW5oZXJlbnQgc3ludGF4XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGlmICgodHlwZSAhPT0gJ2ZpbGUnICYmICEgZWxlbWVudC52YWx1ZSkgfHxcbiAgICAgICh0eXBlICE9PSAnZmlsZScgJiYgdHlwZV9jaGVja2VkLmluZGV4T2YodHlwZSkgPT09IC0xKSkge1xuICAgIC8qIHdlJ3JlIG5vdCByZXNwb25zaWJsZSBmb3IgdGhpcyBlbGVtZW50ICovXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgaXNfdmFsaWQgPSB0cnVlO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3VybCc6XG4gICAgICAgIGlmICghIHVybF9jYW5hcnkpIHtcbiAgICAgICAgICB1cmxfY2FuYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHJpbShlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgdXJsX2NhbmFyeS5ocmVmID0gdmFsdWU7XG4gICAgICAgIGlzX3ZhbGlkID0gKHVybF9jYW5hcnkuaHJlZiA9PT0gdmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdXJsX2NhbmFyeS5ocmVmID09PSB2YWx1ZSsnLycpO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgIGlzX3ZhbGlkID0gY29tbWFfc3BsaXQoZWxlbWVudC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgLmV2ZXJ5KHZhbHVlID0+IGVtYWlsX3BhdHRlcm4udGVzdCh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzX3ZhbGlkID0gZW1haWxfcGF0dGVybi50ZXN0KHRyaW0oZWxlbWVudC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICBpZiAoJ2ZpbGVzJyBpbiBlbGVtZW50ICYmIGVsZW1lbnQuZmlsZXMubGVuZ3RoICYmXG4gICAgICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnYWNjZXB0JykpIHtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGNvbW1hX3NwbGl0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhY2NlcHQnKSlcbiAgICAgICAgICAgIC5tYXAocGF0dGVybiA9PiB7XG4gICAgICAgICAgICAgIGlmICgvXihhdWRpb3x2aWRlb3xpbWFnZSlcXC9cXCokLy50ZXN0KHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBSZWdFeHAoJ14nK1JlZ0V4cC4kMSsnLy4rJCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgI
46184HJldHVybiBwYXR0ZXJuO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoISBwYXR0ZXJucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVsb29wOlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLyogd2UgbmVlZCB0byBtYXRjaCBhIHdoaXRlbGlzdCwgc28gcHJlLXNldCB3aXRoIGZhbHNlICovXG4gICAgICAgICAgICBsZXQgZmlsZV92YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBwYXR0ZXJubG9vcDpcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGF0dGVybnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGVsZW1lbnQuZmlsZXNbaV07XG4gICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBwYXR0ZXJuc1tqXTtcblxuICAgICAgICAgICAgICBsZXQgZmlsZXByb3AgPSBmaWxlLnR5cGU7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJyAmJiBwYXR0ZXJuLnN1YnN0cigwLCAxKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUubmFtZS5zZWFyY2goJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIC8qIG5vIG1hdGNoIHdpdGggYW55IGZpbGUgZW5kaW5nICovXG4gICAgICAgICAgICAgICAgICBjb250aW51ZSBwYXR0ZXJubG9vcDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWxlcHJvcCA9IGZpbGUubmFtZS5zdWJzdHIoZmlsZS5uYW1lLmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGVwcm9wLnNlYXJjaChwYXR0ZXJuKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8qIHdlIGZvdW5kIG9uZSBtYXRjaCBhbmQgY2FuIHF1aXQgbG9va2luZyAqL1xuICAgICAgICAgICAgICAgIGZpbGVfdmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrIHBhdHRlcm5sb29wO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEgZmlsZV92YWxpZCkge1xuICAgICAgICAgICAgICBpc192YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhayBmaWxlbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc192YWxpZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydCBkZWZhdWx0ICcwLjkuMjMnO1xuIiwiLyohXG4qIGRlcGVuZGVuY3lMaWJzL2lucHV0bWFzay5kZXBlbmRlbmN5TGliLmpzXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9Sb2JpbkhlcmJvdHMvSW5wdXRtYXNrXG4qIENvcHlyaWdodCAoYykgMjAxMCAtIDIwMTkgUm9iaW4gSGVyYm90c1xuKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKVxuKiBWZXJzaW9uOiA0LjAuNlxuKi9cblxuKGZ1bmN0aW9uKGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFsgXCIuLi9nbG9iYWwvd2luZG93XCIgXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4uL2dsb2JhbC93aW5kb3dcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kZXBlbmRlbmN5TGliID0gZmFjdG9yeSh3aW5kb3cpO1xuICAgIH1cbn0pKGZ1bmN0aW9uKHdpbmRvdykge1xuICAgIHZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICBmdW5jdGlvbiBpbmRleE9mKGxpc3QsIGVsZW0pIHtcbiAgICAgICAgdmFyIGkgPSAwLCBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgICAgICAgZm9yICg7aSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gZWxlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNXaW5kb3cob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzQXJyYXlsaWtlKG9iaikge1xuICAgICAgICB2Y
46184XIgbGVuZ3RoID0gXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCwgbHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgICAgICBpZiAobHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1dpbmRvdyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgbGVuZ3RoIC0gMSBpbiBvYmo7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIGVsZW0gaW5zdGFuY2VvZiBFbGVtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBEZXBlbmRlbmN5TGliKGVsZW0pIHtcbiAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBEZXBlbmRlbmN5TGliKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVwZW5kZW5jeUxpYikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVwZW5kZW5jeUxpYihlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbSAhPT0gdW5kZWZpbmVkICYmIGVsZW0gIT09IG51bGwgJiYgZWxlbSAhPT0gd2luZG93KSB7XG4gICAgICAgICAgICB0aGlzWzBdID0gZWxlbS5ub2RlTmFtZSA/IGVsZW0gOiBlbGVtWzBdICE9PSB1bmRlZmluZWQgJiYgZWxlbVswXS5ub2RlTmFtZSA/IGVsZW1bMF0gOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHRoaXNbMF0gIT09IHVuZGVmaW5lZCAmJiB0aGlzWzBdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpc1swXS5ldmVudFJlZ2lzdHJ5ID0gdGhpc1swXS5ldmVudFJlZ2lzdHJ5IHx8IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtKSB7XG4gICAgICAgIHJldHVybiBpc1dpbmRvdyhlbGVtKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBlID09PSA5ID8gZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVtLnBhcmVudFdpbmRvdyA6IGZhbHNlO1xuICAgIH1cbiAgICBEZXBlbmRlbmN5TGliLnByb3RvdHlwZSA9IHtcbiAgICAgICAgb246IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHRoaXNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50UmVnaXN0cnkgPSB0aGlzWzBdLmV2ZW50UmVnaXN0cnksIGVsZW0gPSB0aGlzWzBdO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFkZEV2ZW50KGV2LCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2LCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hdHRhY2hFdmVudChcIm9uXCIgKyBldiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl0gPSBldmVudFJlZ2lzdHJ5W2V2XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl1bbmFtZXNwYWNlXSA9IGV2ZW50UmVnaXN0cnlbZXZdW25hbWVzcGFjZV0gfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50UmVnaXN0cnlbZXZdW25hbWVzcGFjZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIF9ldmVudHMgPSBldmVudHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGVuZHggPSAwOyBlbmR4IDwgX2V2ZW50cy5sZW5ndGg7IGVuZHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbnNFdmVudCA9IF9ldmVudHNbZW5keF0uc3BsaXQoXCIuXCIpLCBldiA9IG5zRXZlbnRbMF0sIG5hbWVzcGFjZSA9IG5zRXZlbnRbMV0gfHwgXCJnbG9iYWxcIjtcbiAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoZXYsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIG9mZjogZnVuY3Rpb24oZXZlbnRzLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQodGhpc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRSZWdpc3RyeSA9IHRoaXNbMF0uZXZlbnRSZWdpc3RyeSwgZWxlbSA9IHRoaXNbMF07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVtb3ZlRXZlbnQoZXYsIG5hbWVzcGFjZSwgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXYgaW4gZXZlbnRSZWdpc3RyeSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLmRldGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5kZXRhY2hFdmVudChcIm9uXCIgKyBldiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlID09PSBcImdsb2JhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbm1zcCBpbiBldmVudFJlZ2lzdHJ5W2V2XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFJlZ2lzdHJ5W2V2XVtubXNwXS5zcGxpY2UoZXZlbnRSZWdpc3RyeVtldl1bbm1zcF0uaW5kZXhPZihoYW5kbGVyKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFJlZ2lzdHJ5W2V2XVtuYW1lc3BhY2VdLnNwbGljZShldmVudFJlZ2lzdHJ5W2V2XVtuYW1lc3BhY2VdLmluZGV4T2YoaGFuZGxlciksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVOYW1lc3BhY2UoZXYsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZXZ0cyA9IFtdLCBobmR4LCBobmRMO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaG5keCA9IDAsIGhuZEwgPSBldmVudFJlZ2lzdHJ5W2V2XVtuYW1lc3BhY2VdLmxlbmd0aDsgaG5keCA8IGhuZEw7IGhuZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXY6IGV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UgJiYgbmFtZXNwYWNlLmxlbmd0aCA+IDAgPyBuYW1lc3BhY2UgOiBcImdsb2JhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZXZlbnRSZWdpc3RyeVtldl1bbmFtZXNwYWNlXVtobmR4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2OiBldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UgJiYgbmFtZXNwYWNlLmxlbmd0aCA+IDAgPyBuYW1lc3BhY2UgOiBcImdsb2JhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGV2TmR4IGluIGV2ZW50UmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBubXNwIGluIGV2ZW50UmVnaXN0cnlbZXZOZHhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChubXNwID09PSBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGhuZHggPSAwLCBobmRMID0gZXZlbnRSZWdpc3RyeVtldk5keF1bbm1zcF0ubGVuZ3RoOyBobmR4IDwgaG5kTDsgaG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldjogZXZOZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IG5tc3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBldmVudFJlZ2lzdHJ5W2V2TmR4XVtubXNwXVtobmR4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2OiBldk5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBubXNwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2dHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBfZXZlbnRzID0gZXZlbnRzLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlbmR4ID0gMDsgZW5keCA8IF9ldmVudHMubGVuZ3RoOyBlbmR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5zRXZlbnQgPSBfZXZlbnRzW2VuZHhdLnNwbGl0KFwiLlwiKSwgb2ZmRXZlbnRzID0gcmVzb2x2ZU5hbWVzcGFjZShuc0V2ZW50WzBdLCBuc0V2ZW50WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9mZkV2ZW50c0wgPSBvZmZFdmVudHMubGVuZ3RoOyBpIDwgb2ZmRXZlbnRzTDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChvZmZFdmVudHNbaV0uZXYsIG9mZkV2ZW50c1tpXS5uYW1lc3BhY2UsIG9mZkV2ZW50c1tpXS5oYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihldmVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudCh0aGlzWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudFJlZ2lzdHJ5ID0gdGhpc1swXS5ldmVudFJlZ2lzdHJ5LCBlbGVtID0gdGhpc1swXTtcbiAgICAgICAgICAgICAgICB2Y
46184XIgX2V2ZW50cyA9IHR5cGVvZiBldmVudHMgPT09IFwic3RyaW5nXCIgPyBldmVudHMuc3BsaXQoXCIgXCIpIDogWyBldmVudHMudHlwZSBdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGVuZHggPSAwOyBlbmR4IDwgX2V2ZW50cy5sZW5ndGg7IGVuZHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnNFdmVudCA9IF9ldmVudHNbZW5keF0uc3BsaXQoXCIuXCIpLCBldiA9IG5zRXZlbnRbMF0sIG5hbWVzcGFjZSA9IG5zRXZlbnRbMV0gfHwgXCJnbG9iYWxcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50ICE9PSB1bmRlZmluZWQgJiYgbmFtZXNwYWNlID09PSBcImdsb2JhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZudCwgaSwgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3VtZW50c1sxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2bnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXYsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldm50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZudC5pbml0Q3VzdG9tRXZlbnQoZXYsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudHMudHlwZSkgRGVwZW5kZW5jeUxpYi5leHRlbmQoZXZudCwgZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmRpc3BhdGNoRXZlbnQoZXZudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2bnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2bnQuZXZlbnRUeXBlID0gZXY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZudC5kZXRhaWwgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50cy50eXBlKSBEZXBlbmRlbmN5TGliLmV4dGVuZChldm50LCBldmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uZmlyZUV2ZW50KFwib25cIiArIGV2bnQuZXZlbnRUeXBlLCBldm50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFJlZ2lzdHJ5W2V2XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF0udHlwZSA/IGFyZ3VtZW50c1swXSA6IERlcGVuZGVuY3lMaWIuRXZlbnQoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IFwiZ2xvYmFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBubXNwIGluIGV2ZW50UmVnaXN0cnlbZXZdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBldmVudFJlZ2lzdHJ5W2V2XVtubXNwXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl1bbm1zcF1baV0uYXBwbHkoZWxlbSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50UmVnaXN0cnlbZXZdW25hbWVzcGFjZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl1bbmFtZXNwYWNlXVtpXS5hcHBseShlbGVtLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZXBlbmRlbmN5TGliLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9O1xuICAgIERlcGVuZGVuY3lMaWIubm9vcCA9IGZ1bmN0aW9uKCkge307XG4gICAgRGVwZW5kZW5jeUxpYi5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgICBEZXBlbmRlbmN5TGliLmluQXJyYXkgPSBmdW5jdGlvbihlbGVtLCBhcnIsIGkpIHtcbiAgICAgICAgcmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mKGFyciwgZWxlbSwgaSk7XG4gICAgfTtcbiAgICBEZXBlbmRlbmN5TGliLnZhbEhvb2tzID0gdW5kZWZpbmVkO1xuICAgIERlcGVuZGVuY3lMaWIuaXNQbGFpbk9iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgaXNXaW5kb3cob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmouY29uc3RydWN0b3IgJiYgIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiaXNQcm90b3R5cGVPZlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgI
46184HJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRGVwZW5kZW5jeUxpYi5leHRlbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLCB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGVlcCA9IHRhcmdldDtcbiAgICAgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1tpXSB8fCB7fTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhRGVwZW5kZW5jeUxpYi5pc0Z1bmN0aW9uKHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXM7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7aSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgPSBhcmd1bWVudHNbaV0pICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBzcmMgPSB0YXJnZXRbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBvcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBjb3B5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcCAmJi
46184Bjb3B5ICYmIChEZXBlbmRlbmN5TGliLmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gRGVwZW5kZW5jeUxpYi5pc0FycmF5KGNvcHkpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5SXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlJc0FycmF5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBzcmMgJiYgRGVwZW5kZW5jeUxpYi5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBzcmMgJiYgRGVwZW5kZW5jeUxpYi5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IERlcGVuZGVuY3lMaWIuZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3B5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IGNvcHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIERlcGVuZGVuY3lMaWIuZWFjaCA9IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHZhbHVlLCBpID0gMDtcbiAgICAgICAgaWYgKGlzQXJyYXlsaWtlKG9iaikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2suY2FsbChvYmpbaV0sIGksIG9ialtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxsKG9ialtpXSwgaSwgb2JqW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgRGVwZW5kZW5jeUxpYi5kYXRhID0gZnVuY3Rpb24ob3duZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvd25lci5fX2RhdGEgPyBvd25lci5fX2RhdGFba2V5XSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvd25lci5fX2RhdGEgPSBvd25lci5fX2RhdGEgfHwge307XG4gICAgICAgICAgICBvd25lci5fX2RhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIERlcGVuZGVuY3lMaWIuRXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgRGVwZW5kZW5jeUxpYi5FdmVudCA9IGZ1bmN0aW9uKGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7XG4gICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2Y
46184XIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICAgICAgICByZXR1cm4gZXZ0O1xuICAgICAgICB9O1xuICAgICAgICBEZXBlbmRlbmN5TGliLkV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgfVxuICAgIHJldHVybiBEZXBlbmRlbmN5TGliO1xufSk7IiwiLyohXG4qIGdsb2JhbC93aW5kb3cuanNcbiogaHR0cHM6Ly9naXRodWIuY29tL1JvYmluSGVyYm90cy9JbnB1dG1hc2tcbiogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxOSBSb2JpbiBIZXJib3RzXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4qIFZlcnNpb246IDQuMC42XG4qL1xuXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG5ldyAoZXZhbChcInJlcXVpcmUoJ2pzZG9tJykuSlNET01cIikpKFwiXCIpLndpbmRvdztcbn0pOyBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikgbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogbmV3IChldmFsKFwicmVxdWlyZSgnanNkb20nKS5KU0RPTVwiKSkoXCJcIikud2luZG93OyIsIi8qIVxuKiBpbnB1dG1hc2suZGF0ZS5leHRlbnNpb25zLmpzXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9Sb2JpbkhlcmJvdHMvSW5wdXRtYXNrXG4qIENvcHlyaWdodCAoYykgMjAxMCAtIDIwMTkgUm9iaW4gSGVyYm90c1xuKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKVxuKiBWZXJzaW9uOiA0LjAuNlxuKi9cblxuKGZ1bmN0aW9uKGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFsgXCIuL2lucHV0bWFza1wiIF0sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2lucHV0bWFza1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cuSW5wdXRtYXNrKTtcbiAgICB9XG59KShmdW5jdGlvbihJbnB1dG1hc2spIHtcbiAgICB2YXIgJCA9IElucHV0bWFzay5kZXBlbmRlbmN5TGliO1xuICAgIHZhciBmb3JtYXRDb2RlID0ge1xuICAgICAgICBkOiBbIFwiWzEtOV18WzEyXVswLTldfDNbMDFdXCIsIERhdGUucHJvdG90eXBlLnNldERhdGUsIFwiZGF5XCIsIERhdGUucHJvdG90eXBlLmdldERhdGUg
46184XSxcbiAgICAgICAgZGQ6IFsgXCIwWzEtOV18WzEyXVswLTldfDNbMDFdXCIsIERhdGUucHJvdG90eXBlLnNldERhdGUsIFwiZGF5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXREYXRlLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIGRkZDogWyBcIlwiIF0sXG4gICAgICAgIGRkZGQ6IFsgXCJcIiBdLFxuICAgICAgICBtOiBbIFwiWzEtOV18MVswMTJdXCIsIERhdGUucHJvdG90eXBlLnNldE1vbnRoLCBcIm1vbnRoXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGUucHJvdG90eXBlLmdldE1vbnRoLmNhbGwodGhpcykgKyAxO1xuICAgICAgICB9IF0sXG4gICAgICAgIG1tOiBbIFwiMFsxLTldfDFbMDEyXVwiLCBEYXRlLnByb3RvdHlwZS5zZXRNb250aCwgXCJtb250aFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWQoRGF0ZS5wcm90b3R5cGUuZ2V0TW9udGguY2FsbCh0aGlzKSArIDEsIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIG1tbTogWyBcIlwiIF0sXG4gICAgICAgIG1tbW06IFsgXCJcIiBdLFxuICAgICAgICB5eTogWyBcIlswLTldezJ9XCIsIERhdGUucHJvdG90eXBlLnNldEZ1bGxZZWFyLCBcInllYXJcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkKERhdGUucHJvdG90eXBlLmdldEZ1bGxZZWFyLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIHl5eXk6IFsgXCJbMC05XXs0fVwiLCBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciwgXCJ5ZWFyXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXRGdWxsWWVhci5jYWxsKHRoaXMpLCA0KTtcbiAgICAgICAgfSBdLFxuICAgICAgICBoOiBbIFwiWzEtOV18MVswLTJdXCIsIERhdGUucHJvdG90eXBlLnNldEhvdXJzLCBcImhvdXJzXCIsIERhdGUucHJvdG90eXBlLmdldEhvdXJzIF0sXG4gICAgICAgIGhoOiBbIFwiMFsxLTldfDFbMC0yXVwiLCBEYXRlLnByb3RvdHlwZS5zZXRIb3VycywgXCJob3Vyc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWQoRGF0ZS5wcm90b3R5cGUuZ2V0SG91cnMuY2FsbCh0aGlzKSwgMik7XG4gICAgICAgIH0gXSxcbiAgICAgICAgaGhoOiBbIFwiWzAtOV0rXCIsIERhdGUucHJvdG90eXBlLnNldEhvdXJzLCBcImhvdXJzXCIsIERhdGUucHJvdG90eXBlLmdldEhvdXJzIF0sXG4gICAgICAgIEg6IFsgXCIxP1swLTldfDJbMC0zXVwiLCBEYXRlLnByb3RvdHlwZS5zZXRIb3VycywgXCJob3Vyc1wiLCBEYXRlLnByb3RvdHlwZS5nZXRIb3VycyBdLFxuICAgICAgICBISDogWyBcIjBbMC05XXwxWzAtOV18MlswLTNdXCIsIERhdGUucHJvdG90eXBlLnNldEhvdXJzLCBcImhvdXJzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXRIb3Vycy5jYWxsKHRoaXMpLCAyKTtcbiAgICAgICAgfSBdLFxuICAgICAgICBISEg6IFsgXCJbMC05XStcIiwgRGF0ZS5wcm90b3R5cGUuc2V0SG91cnMsIFwiaG91cnNcIiwgRGF0ZS5wcm90b3R5cGUuZ2V0SG91cnMgXSxcbiAgICAgICAgTTogWyBcIlsxLTVdP1swLTldXCIsIERhdGUucHJvdG90eXBlLnNldE1pbnV0ZXMsIFwibWludXRlc1wiLCBEYXRlLnByb3RvdHlwZS5nZXRNaW51dGVzIF0sXG4gICAgICAgIE1NOiBbIFwiMFswLTldfDFbMC05XXwyWzAtOV18M1swLTldfDRbMC05XXw1WzAtOV1cIiwgRGF0ZS5wcm90b3R5cGUuc2V0TWludXRlcywgXCJtaW51dGVzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXRNaW51dGVzLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIHNzOiBbIFwiWzAtNV1bMC05XVwiLCBEYXRlLnByb3RvdHlwZS5zZXRTZWNvbmRzLCBcInNlY29uZHNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkKERhdGUucHJvdG90eXBlLmdldFNlY29uZHMuY2FsbCh0aGlzKSwgMik7XG4gICAgICAgIH0gXSxcbiAgICAgICAgbDogWyBcIlswLTldezN9XCIsIERhdGUucHJvdG90eXBlLnNldE1pbGxpc2Vjb25kcywgXCJtaWxsaXNlY29uZHNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkKERhdGUucHJvdG90eXBlLmdldE1pbGxpc2Vjb25kcy5jYWxsKHRoaXMpLCAzKTtcbiAgICAgICAgfSBdLFxuICAgICAgICBMOiBbIFwiWzAtOV17Mn1cIiwgRGF0ZS5wcm90b3R5cGUuc2V0TWlsbGlzZWNvbmRzLCBcIm1pbGxpc2Vjb25kc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWQoRGF0ZS5wcm90b3R5cGUuZ2V0TWlsbGlzZWNvbmRzLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIHQ6IFsgXCJbYXBdXCIgXSxcbiAgICAgICAgdHQ6IFsgXCJbYXBdbVwiIF0sXG4gICAgICAgIFQ6IFsgXCJbQVBdXCIgXSxcbiAgICAgICAgVFQ6IFsgXCJbQVBdTVwiIF0sXG4gICAgICAgIFo6IFsgXCJcIiBdLFxuICAgICAgICBvOiBbIFwiXCIgXSxcbiAgICAgICAgUzogWyBcIlwiIF1cbiAgICB9LCBmb3JtYXRBbGlhcyA9IHtcbiAgICAgICAgaXNvRGF0ZTogXCJ5eXl5LW1tLWRkXCIsXG4gICAgICAgIGlzb1RpbWU6IFwiSEg6TU06c3NcIixcbiAgICAgICAgaXNvRGF0ZVRpbWU6IFwieXl5eS1tbS1kZCdUJ0hIOk1NOnNzXCIsXG4gICAgICAgIGlzb1V0Y0RhdGVUaW1lOiBcIlVUQzp5eXl5LW1tLWRkJ1QnSEg6TU06c3MnWidcIlxuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0VG9rZW5pemVyKG9wdHMpIHtcbiAgICAgICAgaWYgKCFvcHRzLnRva2VuaXplcikge1xuICAgICAgICAgICAgdmFyIHRva2VucyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgbmR4IGluIGZvcm1hdENvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmluZGV4T2YobmR4WzBdKSA9PT0gLTEpIHRva2Vucy5wdXNoKG5keFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRzLnRva2VuaXplciA9IFwiKFwiICsgdG9rZW5zLmpvaW4oXCIrfFwiKSArIFwiKSs/fC5cIjtcbiAgICAgICAgICAgIG9wdHMudG9rZW5pemVyID0gbmV3IFJlZ0V4cChvcHRzLnRva2VuaXplciwgXCJnXCIpO1xuICAgICAgICB9XG4gICAgICAgI
46184HJldHVybiBvcHRzLnRva2VuaXplcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZVBhcnRzLCBjdXJyZW50UmVzdWx0KSB7XG4gICAgICAgIHJldHVybiAhaXNGaW5pdGUoZGF0ZVBhcnRzLnJhd2RheSkgfHwgZGF0ZVBhcnRzLmRheSA9PSBcIjI5XCIgJiYgIWlzRmluaXRlKGRhdGVQYXJ0cy5yYXd5ZWFyKSB8fCBuZXcgRGF0ZShkYXRlUGFydHMuZGF0ZS5nZXRGdWxsWWVhcigpLCBpc0Zpbml0ZShkYXRlUGFydHMucmF3bW9udGgpID8gZGF0ZVBhcnRzLm1vbnRoIDogZGF0ZVBhcnRzLmRhdGUuZ2V0TW9udGgoKSArIDEsIDApLmdldERhdGUoKSA+PSBkYXRlUGFydHMuZGF5ID8gY3VycmVudFJlc3VsdCA6IGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0RhdGVJblJhbmdlKGRhdGVQYXJ0cywgb3B0cykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdHMubWluKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZVBhcnRzW1wicmF3eWVhclwiXSkge1xuICAgICAgICAgICAgICAgIHZhciByYXdZZWFyID0gZGF0ZVBhcnRzW1wicmF3eWVhclwiXS5yZXBsYWNlKC9bXjAtOV0vZywgXCJcIiksIG1pblllYXIgPSBvcHRzLm1pbi55ZWFyLnN1YnN0cigwLCByYXdZZWFyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWluWWVhciA8PSByYXdZZWFyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVQYXJ0c1tcInllYXJcIl0gPT09IGRhdGVQYXJ0c1tcInJhd3llYXJcIl0pIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5taW4uZGF0ZS5nZXRUaW1lKCkgPT09IG9wdHMubWluLmRhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wdHMubWluLmRhdGUuZ2V0VGltZSgpIDw9IGRhdGVQYXJ0cy5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCAmJiBvcHRzLm1heCAmJiBvcHRzLm1heC5kYXRlLmdldFRpbWUoKSA9PT0gb3B0cy5tYXguZGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9wdHMubWF4LmRhdGUuZ2V0VGltZSgpID49IGRhdGVQYXJ0cy5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXJzZShmb3JtYXQsIGRhdGVPYmpWYWx1ZSwgb3B0cywgcmF3KSB7XG4gICAgICAgIHZhciBtYXNrID0gXCJcIiwgbWF0Y2g7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IGdldFRva2VuaXplcihvcHRzKS5leGVjKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGlmIChkYXRlT2JqVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDb2RlW21hdGNoWzBdXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXNrICs9IFwiKFwiICsgZm9ybWF0Q29kZVttYXRjaFswXV1bMF0gKyBcIilcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gXCIoXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJdXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrICs9IFwiKT9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG1hdGNoWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdENvZGVbbWF0Y2hbMF1dKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXcgIT09IHRydWUgJiYgZm9ybWF0Q29kZVttYXRjaFswXV1bM10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRGbiA9IGZvcm1hdENvZGVbbWF0Y2hbMF1dWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFzayArPSBnZXRGbi5jYWxsKGRhdGVPYmpWYWx1ZS5kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRDb2RlW21hdGNoWzBdXVsyXSkgbWFzayArPSBkYXRlT2JqVmFsdWVbXCJyYXdcIiArIGZvcm1hdENvZGVbbWF0Y2hbMF1dWzJdXTsgZWxzZSBtYXNrICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBtYXNrICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYWQodmFsLCBsZW4pIHtcbiAgICAgICAgdmFsID0gU3RyaW5nKHZhbCk7XG4gICAgICAgIGxlbiA9IGxlbiB8fCAyO1xuICAgICAgICB3aGlsZSAodmFsLmxlbmd0aCA8IGxlbikgdmFsID0gXCIwXCIgKyB2YWw7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFuYWx5c2VNYXNrKG1hc2tTdHJpbmcsIGZvcm1hdCwgb3B0cykge1xuICAgICAgICB2Y
46184XIgZGF0ZU9iaiA9IHtcbiAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKDEsIDAsIDEpXG4gICAgICAgIH0sIHRhcmdldFByb3AsIG1hc2sgPSBtYXNrU3RyaW5nLCBtYXRjaCwgZGF0ZU9wZXJhdGlvbiwgdGFyZ2V0VmFsaWRhdG9yO1xuICAgICAgICBmdW5jdGlvbiBleHRlbmRQcm9wZXJ0eSh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGNvcnJlY3RlZFZhbHVlID0gdmFsdWUucmVwbGFjZSgvW14wLTldL2csIFwiMFwiKTtcbiAgICAgICAgICAgIGlmIChjb3JyZWN0ZWRWYWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRlcmVkUGFydCA9IHZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCBcIlwiKSwgbWluID0gKG9wdHMubWluICYmIG9wdHMubWluW3RhcmdldFByb3BdIHx8IHZhbHVlKS50b1N0cmluZygpLCBtYXggPSAob3B0cy5tYXggJiYgb3B0cy5tYXhbdGFyZ2V0UHJvcF0gfHwgdmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgY29ycmVjdGVkVmFsdWUgPSBlbnRlcmVkUGFydCArIChlbnRlcmVkUGFydCA8IG1pbi5zbGljZSgwLCBlbnRlcmVkUGFydC5sZW5ndGgpID8gbWluLnNsaWNlKGVudGVyZWRQYXJ0Lmxlbmd0aCkgOiBlbnRlcmVkUGFydCA+IG1heC5zbGljZSgwLCBlbnRlcmVkUGFydC5sZW5ndGgpID8gbWF4LnNsaWNlKGVudGVyZWRQYXJ0Lmxlbmd0aCkgOiBjb3JyZWN0ZWRWYWx1ZS50b1N0cmluZygpLnNsaWNlKGVudGVyZWRQYXJ0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvcnJlY3RlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlKGRhdGVPYmosIHZhbHVlLCBvcHRzKSB7XG4gICAgICAgICAgICBkYXRlT2JqW3RhcmdldFByb3BdID0gZXh0ZW5kUHJvcGVydHkodmFsdWUpO1xuICAgICAgICAgICAgZGF0ZU9ialtcInJhd1wiICsgdGFyZ2V0UHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChkYXRlT3BlcmF0aW9uICE9PSB1bmRlZmluZWQpIGRhdGVPcGVyYXRpb24uY2FsbChkYXRlT2JqLmRhdGUsIHRhcmdldFByb3AgPT0gXCJtb250aFwiID8gcGFyc2VJbnQoZGF0ZU9ialt0YXJnZXRQcm9wXSkgLSAxIDogZGF0ZU9ialt0YXJnZXRQcm9wXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYXNrID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBnZXRUb2tlbml6ZXIob3B0cykuZXhlYyhmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbWFzay5zbGljZSgwLCBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDb2RlLmhhc093blByb3BlcnR5KG1hdGNoWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRWYWxpZGF0b3IgPSBmb3JtYXRDb2RlW21hdGNoWzBdXVswXTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcCA9IGZvcm1hdENvZGVbbWF0Y2hbMF1dWzJdO1xuICAgICAgICAgICAgICAgICAgICBkYXRlT3BlcmF0aW9uID0gZm9ybWF0Q29kZVttYXRjaFswXV1bMV07XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGRhdGVPYmosIHZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFzayA9IG1hc2suc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRlT2JqO1xuICAgICAgICB9IGVsc2UgaWYgKG1hc2sgJiYgdHlwZW9mIG1hc2sgPT09IFwib2JqZWN0XCIgJiYgbWFzay5oYXNPd25Qcm9wZXJ0eShcImRhdGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIElucHV0bWFzay5leHRlbmRBbGlhc2VzKHtcbiAgICAgICAgZGF0ZXRpbWU6IHtcbiAgICAgICAgICAgIG1hc2s6IGZ1bmN0aW9uKG9wdHMpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXRDb2RlLlMgPSBvcHRzLmkxOG4ub3JkaW5hbFN1ZmZpeC5qb2luKFwifFwiKTtcbiAgICAgICAgICAgICAgICBvcHRzLmlucHV0Rm9ybWF0ID0gZm9ybWF0QWxpYXNbb3B0cy5pbnB1dEZvcm1hdF0gfHwgb3B0cy5pbnB1dEZvcm1hdDtcbiAgICAgICAgICAgICAgICBvcHRzLmRpc3BsYXlGb3JtYXQgPSBmb3JtYXRBbGlhc1tvcHRzLmRpc3BsYXlGb3JtYXRdIHx8IG9wdHMuZGlzcGxheUZvcm1hdCB8fCBvcHRzLmlucHV0Rm9ybWF0O1xuICAgICAgICAgICAgICAgIG9wdHMub3V0cHV0Rm9ybWF0ID0gZm9ybWF0QWxpYXNbb3B0cy5vdXRwdXRGb3JtYXRdIHx8IG9wdHMub3V0cHV0Rm9ybWF0IHx8IG9wdHMuaW5wdXRGb3JtYXQ7XG4gICAgICAgICAgICAgICAgb3B0cy5wbGFjZWhvbGRlciA9IG9wdHMucGxhY2Vob2xkZXIgIT09IFwiXCIgPyBvcHRzLnBsYWNlaG9sZGVyIDogb3B0cy5pbnB1dEZvcm1hdC5yZXBsYWNlKC9bXFxbXFxdXS8sIFwiXCIpO1xuICAgICAgICAgICAgICAgIG9wdHMucmVnZXggPSBwYXJzZShvcHRzLmlucHV0Rm9ybWF0LCB1bmRlZmluZWQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiaXNvRGF0ZVRpbWVcIixcbiAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG91dHB1dEZvcm1hdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWluOiBudWxsLFxuICAgICAgICAgICAgbWF4OiBudWxsLFxuICAgICAgICAgICAgaTE4bjoge1xuICAgICAgICAgICAgICAgIGRheU5hbWVzOiBbIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCIsIFwiU3VuXCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIiwgXCJTdW5kYXlcIiBdLFxuICAgICAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsgXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIiwgXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlc
46184IiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiIF0sXG4gICAgICAgICAgICAgICAgb3JkaW5hbFN1ZmZpeDogWyBcInN0XCIsIFwibmRcIiwgXCJyZFwiLCBcInRoXCIgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvc3RWYWxpZGF0aW9uOiBmdW5jdGlvbihidWZmZXIsIHBvcywgY3VycmVudFJlc3VsdCwgb3B0cykge1xuICAgICAgICAgICAgICAgIG9wdHMubWluID0gYW5hbHlzZU1hc2sob3B0cy5taW4sIG9wdHMuaW5wdXRGb3JtYXQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIG9wdHMubWF4ID0gYW5hbHlzZU1hc2sob3B0cy5tYXgsIG9wdHMuaW5wdXRGb3JtYXQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXJyZW50UmVzdWx0LCBkYXRlUGFydHMgPSBhbmFseXNlTWFzayhidWZmZXIuam9pbihcIlwiKSwgb3B0cy5pbnB1dEZvcm1hdCwgb3B0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBkYXRlUGFydHMuZGF0ZS5nZXRUaW1lKCkgPT09IGRhdGVQYXJ0cy5kYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpc1ZhbGlkRGF0ZShkYXRlUGFydHMsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBpc0RhdGVJblJhbmdlKGRhdGVQYXJ0cywgb3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3MgJiYgcmVzdWx0ICYmIGN1cnJlbnRSZXN1bHQucG9zICE9PSBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogcGFyc2Uob3B0cy5pbnB1dEZvcm1hdCwgZGF0ZVBhcnRzLCBvcHRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hGcm9tQnVmZmVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGN1cnJlbnRSZXN1bHQucG9zXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbihlLCBidWZmZXIsIGNhcmV0UG9zLCBvcHRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gSW5wdXRtYXNrLmtleUNvZGUuUklHSFQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKSwgbWF0Y2gsIGRhdGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBnZXRUb2tlbml6ZXIob3B0cykuZXhlYyhvcHRzLmlucHV0Rm9ybWF0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzBdLmNoYXJBdCgwKSA9PT0gXCJkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlICs9IHBhZCh0b2RheS5nZXREYXRlKCksIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzBdLmNoYXJBdCgwKSA9PT0gXCJtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlICs9IHBhZCh0b2RheS5nZXRNb250aCgpICsgMSwgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMF0gPT09IFwieXl5eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSArPSB0b2RheS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzBdLmNoYXJBdCgwKSA9PT0gXCJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlICs9IHBhZCh0b2RheS5nZXRZZWFyKCksIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5wdXRtYXNrLl92YWx1ZVNldChkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkudHJpZ2dlcihcInNldHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Uob3B0cy5vdXRwdXRGb3JtYXQsIGFuYWx5c2VNYXNrKG1hc2tlZFZhbHVlLCBvcHRzLmlucHV0Rm9ybWF0LCBvcHRzKSwgb3B0cywgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FzaW5nOiBmdW5jdGlvbihlbGVtLCB0ZXN0LCBwb3MsIHZhbGlkUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3QubmF0aXZlRGVmLmluZGV4T2YoXCJbYXBdXCIpID09IDApIHJldHVybiBlbGVtLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3QubmF0aXZlRGVmLmluZGV4T2YoXCJbQVBdXCIpID09IDApIHJldHVybiBlbGVtLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5zZXJ0TW9kZTogZmFsc2UsXG4gICAgICAgICAgICBzaGlmdFBvc2l0aW9uczogZmFsc2VcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBJbnB1dG1hc2s7XG59KTsiLCIvKiFcbiogaW5wdXRtYXNrLmV4dGVuc2lvbnMuanNcbiogaHR0cHM6Ly9naXRodWIuY29tL1JvYmluSGVyYm90cy9JbnB1dG1hc2tcbiogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxOSBSb2JpbiBIZXJib3RzXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4qIFZlcnNpb246IDQuMC42XG4qL1xuXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoWyBcIi4vaW5wdXRtYXNrXCIgXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vaW5wdXRtYXNrXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmYWN0b3J5KHdpbmRvdy5JbnB1dG1hc2spO1xuICAgIH1cbn0pKGZ1bmN0aW9uKElucHV0bWFzaykge1xuICAgIElucHV0bWFzay5leHRlbmREZWZpbml0aW9ucyh7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICAgI
46184HZhbGlkYXRvcjogXCJbQS1aYS16XFx1MDQxMC1cXHUwNDRmXFx1MDQwMVxcdTA0NTFcXHhjMC1cXHhmZlxceGI1XVwiLFxuICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCImXCI6IHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05QS1aYS16XFx1MDQxMC1cXHUwNDRmXFx1MDQwMVxcdTA0NTFcXHhjMC1cXHhmZlxceGI1XVwiLFxuICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCIjXCI6IHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05QS1GYS1mXVwiLFxuICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIElucHV0bWFzay5leHRlbmRBbGlhc2VzKHtcbiAgICAgICAgY3NzdW5pdDoge1xuICAgICAgICAgICAgcmVnZXg6IFwiWystXT9bMC05XStcXFxcLj8oWzAtOV0rKT8ocHh8ZW18cmVtfGV4fCV8aW58Y218bW18cHR8cGMpXCJcbiAgICAgICAgfSxcbiAgICAgICAgdXJsOiB7XG4gICAgICAgICAgICByZWdleDogXCIoaHR0cHM/fGZ0cCkvLy4qXCIsXG4gICAgICAgICAgICBhdXRvVW5tYXNrOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBpcDoge1xuICAgICAgICAgICAgbWFzazogXCJpW2lbaV1dLmlbaVtpXV0uaVtpW2ldXS5pW2lbaV1dXCIsXG4gICAgICAgICAgICBkZWZpbml0aW9uczoge1xuICAgICAgICAgICAgICAgIGk6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAtIDEgPiAtMSAmJiBtYXNrc2V0LmJ1ZmZlcltwb3MgLSAxXSAhPT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJzID0gbWFza3NldC5idWZmZXJbcG9zIC0gMV0gKyBjaHJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgLSAyID4gLTEgJiYgbWFza3NldC5idWZmZXJbcG9zIC0gMl0gIT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocnMgPSBtYXNrc2V0LmJ1ZmZlcltwb3MgLSAyXSArIGNocnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNocnMgPSBcIjBcIiArIGNocnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY2hycyA9IFwiMDBcIiArIGNocnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIjI1WzAtNV18MlswLTRdWzAtOV18WzAxXVswLTldWzAtOV1cIikudGVzdChjaHJzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFza2VkVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcIm51bWVyaWNcIlxuICAgICAgICB9LFxuICAgICAgICBlbWFpbDoge1xuICAgICAgICAgICAgbWFzazogXCIqezEsNjR9Wy4qezEsNjR9XVsuKnsxLDY0fV1bLip7MSw2M31dQC17MSw2M30uLXsxLDYzfVsuLXsxLDYzfV1bLi17MSw2M31dXCIsXG4gICAgICAgICAgICBncmVlZHk6IGZhbHNlLFxuICAgICAgICAgICAgY2FzaW5nOiBcImxvd2VyXCIsXG4gICAgICAgICAgICBvbkJlZm9yZVBhc3RlOiBmdW5jdGlvbihwYXN0ZWRWYWx1ZSwgb3B0cykge1xuICAgICAgICAgICAgICAgIHBhc3RlZFZhbHVlID0gcGFzdGVkVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFzdGVkVmFsdWUucmVwbGFjZShcIm1haWx0bzpcIiwgXCJcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBcIipcIjoge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFwiWzAtOVxcdWZmMTEtXFx1ZmYxOUEtWmEtelxcdTA0MTAtXFx1MDQ0ZlxcdTA0MDFcXHUwNDUxXFx4YzAtXFx4ZmZcXHhiNSEjJCUmJyorLz0/Xl9ge3x9fi1dXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiLVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05QS1aYS16LV1cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFza2VkVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcImVtYWlsXCJcbiAgICAgICAgfSxcbiAgICAgICAgbWFjOiB7XG4gICAgICAgICAgICBtYXNrOiBcIiMjOiMjOiMjOiMjOiMjOiMjXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmluOiB7XG4gICAgICAgICAgICBtYXNrOiBcIlZ7MTN9OXs0fVwiLFxuICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBWOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbQS1ISi1OUFItWmEtaGotbnByLXpcXFxcZF1cIixcbiAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYXJJbmNvbXBsZXRlOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1VubWFzazogdHJ1ZVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIElucHV0bWFzaztcbn0pOyIsIi8qIVxuKiBpbnB1dG1hc2suanNcbiogaHR0cHM6Ly9naXRodWIuY29tL1JvYmluSGVyYm90cy9JbnB1dG1hc2tcbiogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxOSBSb2JpbiBIZXJib3RzXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4qIFZlcnNpb246IDQuMC42XG4qL1xuXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoWyBcIi4vZGVwZW5kZW5jeUxpYnMvaW5wdXRtYXNrLmRlcGVuZGVuY3lMaWJcIiwgXCIuL2dsb2JhbC93aW5kb3dcIiBdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9kZXBlbmRlbmN5TGlicy9pbnB1dG1hc2suZGVwZW5kZW5jeUxpYlwiKSwgcmVxdWlyZShcIi4vZ2xvYmFsL3dpbmRvd1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LklucHV0bWFzayA9IGZhY3Rvcnkod2luZG93LmRlcG
46184VuZGVuY3lMaWIgfHwgalF1ZXJ5LCB3aW5kb3cpO1xuICAgIH1cbn0pKGZ1bmN0aW9uKCQsIHdpbmRvdywgdW5kZWZpbmVkKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQsIGllID0gdWEuaW5kZXhPZihcIk1TSUUgXCIpID4gMCB8fCB1YS5pbmRleE9mKFwiVHJpZGVudC9cIikgPiAwLCBtb2JpbGUgPSBpc0lucHV0RXZlbnRTdXBwb3J0ZWQoXCJ0b3VjaHN0YXJ0XCIpLCBpZW1vYmlsZSA9IC9pZW1vYmlsZS9pLnRlc3QodWEpLCBpcGhvbmUgPSAvaXBob25lL2kudGVzdCh1YSkgJiYgIWllbW9iaWxlO1xuICAgIGZ1bmN0aW9uIElucHV0bWFzayhhbGlhcywgb3B0aW9ucywgaW50ZXJuYWwpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIElucHV0bWFzaykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRtYXNrKGFsaWFzLCBvcHRpb25zLCBpbnRlcm5hbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXNrc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlZnJlc2hWYWx1ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoaW50ZXJuYWwgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICgkLmlzUGxhaW5PYmplY3QoYWxpYXMpKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFsaWFzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXMpIG9wdGlvbnMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMubm9NYXNrc0NhY2hlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlZmluaXRpb25zICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnVzZXJPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuaXNSVEwgPSB0aGlzLm9wdHMubnVtZXJpY0lucHV0O1xuICAgICAgICAgICAgcmVzb2x2ZUFsaWFzKHRoaXMub3B0cy5hbGlhcywgb3B0aW9ucywgdGhpcy5vcHRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBJbnB1dG1hc2sucHJvdG90eXBlID0ge1xuICAgICAgICBkYXRhQXR0cmlidXRlOiBcImRhdGEtaW5wdXRtYXNrXCIsXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJfXCIsXG4gICAgICAgICAgICBvcHRpb25hbG1hcmtlcjogWyBcIltcIiwgXCJdXCIgXSxcbiAgICAgICAgICAgIHF1YW50aWZpZXJtYXJrZXI6IFsgXCJ7XCIsIFwifVwiIF0sXG4gICAgICAgICAgICBncm91cG1hcmtlcjogWyBcIihcIiwgXCIpXCIgXSxcbiAgICAgICAgICAgIGFsdGVybmF0b3JtYXJrZXI6IFwifFwiLFxuICAgICAgICAgICAgZXNjYXBlQ2hhcjogXCJcXFxcXCIsXG4gICAgICAgICAgICBtYXNrOiBudWxsLFxuICAgICAgICAgICAgcmVnZXg6IG51bGwsXG4gICAgICAgICAgICBvbmNvbXBsZXRlOiAkLm5vb3AsXG4gICAgICAgICAgICBvbmluY29tcGxldGU6ICQubm9vcCxcbiAgICAgICAgICAgIG9uY2xlYXJlZDogJC5ub29wLFxuICAgICAgICAgICAgcmVwZWF0OiAwLFxuICAgICAgICAgICAgZ3JlZWR5OiBmYWxzZSxcbiAgICAgICAgICAgIGF1dG9Vbm1hc2s6IGZhbHNlLFxuICAgICAgICAgICAgcmVtb3ZlTWFza09uU3VibWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgaW5zZXJ0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFySW5jb21wbGV0ZTogZmFsc2UsXG4gICAgICAgICAgICBhbGlhczogbnVsbCxcbiAgICAgICAgICAgIG9uS2V5RG93bjogJC5ub29wLFxuICAgICAgICAgICAgb25CZWZvcmVNYXNrOiBudWxsLFxuICAgICAgICAgICAgb25CZWZvcmVQYXN0ZTogZnVuY3Rpb24ocGFzdGVkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVNYXNrKSA/IG9wdHMub25CZWZvcmVNYXNrLmNhbGwodGhpcywgcGFzdGVkVmFsdWUsIG9wdHMpIDogcGFzdGVkVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25CZWZvcmVXcml0ZTogbnVsbCxcbiAgICAgICAgICAgIG9uVW5NYXNrOiBudWxsLFxuICAgICAgICAgICAgc2hvd01hc2tPbkZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiB0cnVlLFxuICAgICAgICAgICAgb25LZXlWYWxpZGF0aW9uOiAkLm5vb3AsXG4gICAgICAgICAgICBza2lwT3B0aW9uYWxQYXJ0Q2hhcmFjdGVyOiBcIiBcIixcbiAgICAgICAgICAgIG51bWVyaWNJbnB1dDogZmFsc2UsXG4gICAgICAgICAgICByaWdodEFsaWduOiBmYWxzZSxcbiAgICAgICAgICAgIHVuZG9PbkVzY2FwZTogdHJ1ZSxcbiAgICAgICAgICAgIHJhZGl4UG9pbnQ6IFwiXCIsXG4gICAgICAgICAgICBfcmFkaXhEYW5jZTogZmFsc2UsXG4gICAgICAgICAgICBncm91cFNlcGFyYXRvcjogXCJcIixcbiAgICAgICAgICAgIGtlZXBTdGF0aWM6IG51bGwsXG4gICAgICAgICAgICBwb3NpdGlvbkNhcmV0T25UYWI6IHRydWUsXG4gICAgICAgICAgICB0YWJUaHJvdWdoOiBmYWxzZSxcbiAgICAgICAgICAgIHN1cHBvcnRzSW5wdXRUeXBlOiBbIFwidGV4dFwiLCBcInRlbFwiLCBcInVybFwiLCBcInBhc3N3b3JkXCIsIFwic2VhcmNoXCIgXSxcbiAgICAgICAgICAgIGlnbm9yYWJsZXM6IFsgOCwgOSwgMTMsIDE5LCAyNywgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0NSwgNDYsIDkzLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAwLCAyMjkgXSxcbiAgICAgICAgICAgIGlzQ29tcGxldGU6IG51bGwsXG4gICAgICAgICAgICBwcmVWYWxpZGF0aW9uOiBudWxsLFxuICAgICAgICAgICAgcG9zdFZhbGlkYXRpb246IG51bGwsXG4gICAgICAgICAgICBzdGF0aWNEZWZpbml0aW9uU3ltYm9sOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBqaXRNYXNraW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgaW5wdXRFdmVudE9ubHk6IGZhbHNlLFxuICAgICAgICAgICAgbm9WYWx1ZVBhdGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgI
46184HBvc2l0aW9uQ2FyZXRPbkNsaWNrOiBcImx2cFwiLFxuICAgICAgICAgICAgY2FzaW5nOiBudWxsLFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcInZlcmJhdGltXCIsXG4gICAgICAgICAgICBjb2xvck1hc2s6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZVByZWRpY3RpdmVUZXh0OiBmYWxzZSxcbiAgICAgICAgICAgIGltcG9ydERhdGFBdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgc2hpZnRQb3NpdGlvbnM6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgIDk6IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFwiWzAtOVxcdWZmMTEtXFx1ZmYxOV1cIixcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uU3ltYm9sOiBcIipcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFwiW0EtWmEtelxcdTA0MTAtXFx1MDQ0ZlxcdTA0MDFcXHUwNDUxXFx4YzAtXFx4ZmZcXHhiNV1cIixcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uU3ltYm9sOiBcIipcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiKlwiOiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBcIlswLTlcXHVmZjExLVxcdWZmMTlBLVphLXpcXHUwNDEwLVxcdTA0NGZcXHUwNDAxXFx1MDQ1MVxceGMwLVxceGZmXFx4YjVdXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWxpYXNlczoge30sXG4gICAgICAgIG1hc2tzQ2FjaGU6IHt9LFxuICAgICAgICBtYXNrOiBmdW5jdGlvbihlbGVtcykge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgZnVuY3Rpb24gaW1wb3J0QXR0cmlidXRlT3B0aW9ucyhucHQsIG9wdHMsIHVzZXJPcHRpb25zLCBkYXRhQXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuaW1wb3J0RGF0YUF0dHJpYnV0ZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJPcHRpb25zID0gbnB0LmdldEF0dHJpYnV0ZShkYXRhQXR0cmlidXRlKSwgb3B0aW9uLCBkYXRhb3B0aW9ucywgb3B0aW9uRGF0YSwgcDtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaW1wb3J0T3B0aW9uKG9wdGlvbiwgb3B0aW9uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGF0YSA9IG9wdGlvbkRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbkRhdGEgOiBucHQuZ2V0QXR0cmlidXRlKGRhdGFBdHRyaWJ1dGUgKyBcIi1cIiArIG9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uRGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmluZGV4T2YoXCJvblwiKSA9PT0gMCkgb3B0aW9uRGF0YSA9IHdpbmRvd1tvcHRpb25EYXRhXTsgZWxzZSBpZiAob3B0aW9uRGF0YSA9PT0gXCJmYWxzZVwiKSBvcHRpb25EYXRhID0gZmFsc2U7IGVsc2UgaWYgKG9wdGlvbkRhdGEgPT09IFwidHJ1ZVwiKSBvcHRpb25EYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck9wdGlvbnNbb3B0aW9uXSA9IG9wdGlvbkRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJPcHRpb25zICYmIGF0dHJPcHRpb25zICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyT3B0aW9ucyA9IGF0dHJPcHRpb25zLnJlcGxhY2UoLycvZywgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhb3B0aW9ucyA9IEpTT04ucGFyc2UoXCJ7XCIgKyBhdHRyT3B0aW9ucyArIFwifVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC50b0xvd2VyQ2FzZSgpID09PSBcImFsaWFzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGF0YSA9IGRhdGFvcHRpb25zW3BdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0T3B0aW9uKFwiYWxpYXNcIiwgb3B0aW9uRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy5hbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzKHVzZXJPcHRpb25zLmFsaWFzLCB1c2VyT3B0aW9ucywgb3B0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChvcHRpb24gaW4gb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAudG9Mb3dlckNhc2UoKSA9PT0gb3B0aW9uLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkRhdGEgPSBkYXRhb3B0aW9uc1twXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0T3B0aW9uKG9wdGlvbiwgb3B0aW9uRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgb3B0cywgdXNlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChucHQuZGlyID09PSBcInJ0bFwiIHx8IG9wdHMucmlnaHRBbGlnbikge1xuICAgICAgICAgICAgICAgICAgICBucHQuc3R5bGUudGV4dEFsaWduID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobnB0LmRpciA9PT0gXCJydGxcIiB8fCBvcHRzLm51bWVyaWNJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBucHQuZGlyID0gXCJsdHJcIjtcbiAgICAgICAgICAgICAgICAgICAgbnB0LnJlbW92ZUF0dHJpYnV0ZShcImRpclwiKTtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pc1JUTCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh1c2VyT3B0aW9ucykubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbXMpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbXMgPSBlbGVtcy5ub2RlTmFtZSA/IFsgZWxlbXMgXSA6IGVsZW1zO1xuICAgICAgICAgICAgJC5lYWNoKGVsZW1zLCBmdW5jdGlvbihuZHgsIGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlZE9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhhdC5vcHRzKTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QXR0cmlidXRlT3B0aW9ucyhlbCwgc2NvcGVkT3B0cywgJC5leHRlbmQodHJ1ZSwge30sIHRoYXQudXNlck9wdGlvbnMpLCB0aGF0LmRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXNrc2V0ID0gZ2VuZXJhdGVNYXNrU2V0KHNjb3BlZE9wdHMsIHRoYXQubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmlucHV0bWFzayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLm9wdHMuYXV0b1VubWFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrID0gbmV3IElucHV0bWFzayh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2sub3B0cyA9IHNjb3BlZE9wdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2subm9NYXNrc0NhY2hlID0gdGhhdC5ub01hc2tzQ2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2sudXNlck9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhhdC51c2VyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2suaXNSVEwgPSBzY29wZWRPcHRzLmlzUlRMIHx8IHNjb3BlZE9wdHMubnVtZXJpY0lucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLmVsID0gZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2subWFza3NldCA9IG1hc2tzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmRhdGEoZWwsIFwiX2lucHV0bWFza19vcHRzXCIsIHNjb3BlZE9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFza1Njb3BlLmNhbGwoZWwuaW5wdXRtYXNrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcIm1hc2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtcyAmJiBlbGVtc1swXSA/IGVsZW1zWzBdLmlucHV0bWFzayB8fCB0aGlzIDogdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uOiBmdW5jdGlvbihvcHRpb25zLCBub3JlbWFzaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0c1tvcHRpb25zXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAkLmV4dGVuZCh0aGlzLnVzZXJPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbCAmJiBub3JlbWFzayAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2sodGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1bm1hc2tlZHZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcInVubWFza2VkdmFsdWVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tTY29wZS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwicmVtb3ZlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBnZXRlbXB0eW1hc2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgI
46184HJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldGVtcHR5bWFza1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzTWFza2VkVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm9wdHMuYXV0b1VubWFzaztcbiAgICAgICAgfSxcbiAgICAgICAgaXNDb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tzZXQgPSB0aGlzLm1hc2tzZXQgfHwgZ2VuZXJhdGVNYXNrU2V0KHRoaXMub3B0cywgdGhpcy5ub01hc2tzQ2FjaGUpO1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tTY29wZS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiaXNDb21wbGV0ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0bWV0YWRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldG1ldGFkYXRhXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImlzVmFsaWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHZhbHVlLCBtZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImZvcm1hdFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmVsKS50cmlnZ2VyKFwic2V0dmFsdWVcIiwgWyB2YWx1ZSBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYW5hbHlzZU1hc2s6IGZ1bmN0aW9uKG1hc2ssIHJlZ2V4TWFzaywgb3B0cykge1xuICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IC8oPzpbPyorXXxcXHtbMC05XFwrXFwqXSsoPzosWzAtOVxcK1xcKl0qKT8oPzpcXHxbMC05XFwrXFwqXSopP1xcfSl8W14uPyorXiR7W10oKXxcXFxcXSt8Li9nLCByZWdleFRva2VuaXplciA9IC9cXFtcXF4/XT8oPzpbXlxcXFxcXF1dK3xcXFxcW1xcU1xcc10/KSpdP3xcXFxcKD86MCg/OlswLTNdWzAtN117MCwyfXxbNC03XVswLTddPyk/fFsxLTldWzAtOV0qfHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NH18Y1tBLVphLXpdfFtcXFNcXHNdPyl8XFwoKD86XFw/Wzo9IV0/KT98KD86Wz8qK118XFx7WzAtOV0rKD86LFswLTldKik/XFx9KVxcPz98W14uPyorXiR7WygpfFxcXFxdK3wuL2csIGVzY2FwZWQgPSBmYWxzZSwgY3VycmVudFRva2VuID0gbmV3IE1hc2tUb2tlbigpLCBtYXRjaCwgbSwgb3BlbmVuaW5ncyA9IFtdLCBtYXNrVG9rZW5zID0gW10sIG9wZW5pbmdUb2tlbiwgY3VycmVudE9wZW5pbmdUb2tlbiwgYWx0ZXJuYXRvciwgbGFzdE1hdGNoLCBncm91cFRva2VuO1xuICAgICAgICAgICAgZnVuY3Rpb24gTWFza1Rva2VuKGlzR3JvdXAsIGlzT3B0aW9uYWwsIGlzUXVhbnRpZmllciwgaXNBbHRlcm5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuR3JvdXAgPSBpc0dyb3VwIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWx0ZXJuYXRvckdyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0dyb3VwID0gaXNHcm91cCB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3B0aW9uYWwgPSBpc09wdGlvbmFsIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNRdWFudGlmaWVyID0gaXNRdWFudGlmaWVyIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBbHRlcm5hdG9yID0gaXNBbHRlcm5hdG9yIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucXVhbnRpZmllciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaW5zZXJ0VGVzdERlZmluaXRpb24obXRva2VuLCBlbGVtZW50LCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gIT09IHVuZGVmaW5lZCA/IHBvc2l0aW9uIDogbXRva2VuLm1hdGNoZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2TWF0Y2ggPSBtdG9rZW4ubWF0Y2hlc1twb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdleE1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaW5kZXhPZihcIltcIikgPT09IDAgfHwgZXNjYXBlZCAmJiAvXFxcXGR8XFxcXHN8XFxcXHddL2kudGVzdChlbGVtZW50KSB8fCBlbGVtZW50ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXRva2VuLm1hdGNoZXMuc3BsaWNlKHBvc2l0aW9uKyssIDAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogbmV3IFJlZ0V4cChlbGVtZW50LCBvcHRzLmNhc2luZyA/IFwiaVwiIDogXCJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxpdHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrTWFya2VyOiBwcmV2TWF0Y2ggPT09IHVuZGVmaW5lZCA/IFwibWFzdGVyXCIgOiBwcmV2TWF0Y2guZGVmICE9PSBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2luZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWY6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWY6IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184H0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQpIGVsZW1lbnQgPSBlbGVtZW50W2VsZW1lbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZWxlbWVudC5zcGxpdChcIlwiKSwgZnVuY3Rpb24obmR4LCBsbW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldk1hdGNoID0gbXRva2VuLm1hdGNoZXNbcG9zaXRpb24gLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9rZW4ubWF0Y2hlcy5zcGxpY2UocG9zaXRpb24rKywgMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxpdHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja01hcmtlcjogcHJldk1hdGNoID09PSB1bmRlZmluZWQgPyBcIm1hc3RlclwiIDogcHJldk1hdGNoLmRlZiAhPT0gbG1udCAmJiBwcmV2TWF0Y2guZm4gIT09IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2luZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmOiBvcHRzLnN0YXRpY0RlZmluaXRpb25TeW1ib2wgfHwgbG1udCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IG9wdHMuc3RhdGljRGVmaW5pdGlvblN5bWJvbCAhPT0gdW5kZWZpbmVkID8gbG1udCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRGVmOiAoZXNjYXBlZCA/IFwiJ1wiIDogXCJcIikgKyBsbW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hc2tkZWYgPSAob3B0cy5kZWZpbml0aW9ucyA/IG9wdHMuZGVmaW5pdGlvbnNbZWxlbWVudF0gOiB1bmRlZmluZWQpIHx8IElucHV0bWFzay5wcm90b3R5cGUuZGVmaW5pdGlvbnNbZWxlbWVudF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrZGVmICYmICFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdG9rZW4ubWF0Y2hlcy5zcGxpY2UocG9zaXRpb24rKywgMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBtYXNrZGVmLnZhbGlkYXRvciA/IHR5cGVvZiBtYXNrZGVmLnZhbGlkYXRvciA9PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXNrZGVmLnZhbGlkYXRvciwgb3B0cy5jYXNpbmcgPyBcImlcIiA6IFwiXCIpIDogbmV3IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlc3QgPSBtYXNrZGVmLnZhbGlkYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkgOiBuZXcgUmVnRXhwKFwiLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbGl0eTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2tNYXJrZXI6IHByZXZNYXRjaCA9PT0gdW5kZWZpbmVkID8gXCJtYXN0ZXJcIiA6IHByZXZNYXRjaC5kZWYgIT09IChtYXNrZGVmLmRlZmluaXRpb25TeW1ib2wgfHwgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBtYXNrZGVmLmNhc2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWY6IG1hc2tkZWYuZGVmaW5pdGlvblN5bWJvbCB8fCBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBtYXNrZGVmLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZURlZjogZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdG9rZW4ubWF0Y2hlcy5zcGxpY2UocG9zaXRpb24rKywgMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsaXR5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja01hcmtlcjogcHJldk1hdGNoID09PSB1bmRlZmluZWQgPyBcIm1hc3RlclwiIDogcHJldk1hdGNoLmRlZiAhPT0gZWxlbWVudCAmJiBwcmV2TWF0Y2guZm4gIT09IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZjogb3B0cy5zdGF0aWNEZWZpbml0aW9uU3ltYm9sIHx8IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IG9wdHMuc3RhdGljRGVmaW5pdGlvblN5bWJvbCAhPT0gdW5kZWZpbmVkID8gZWxlbWVudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWY6IChlc2NhcGVkID8gXCInXCIgOiBcIlwiKSArIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gdmVyaWZ5R3JvdXBNYXJrZXIobWFza1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hc2tUb2tlbiAmJiBtYXNrVG9rZW4ubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFza1Rva2VuLm1hdGNoZXMsIGZ1bmN0aW9uKG5keCwgdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VG9rZW4gPSBtYXNrVG9rZW4ubWF0Y2hlc1tuZHggKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dFRva2VuID09PSB1bmRlZmluZWQgfHwgKG5leHRUb2tlbi5tYXRjaGVzID09PSB1bmRlZmluZWQgfHwgbmV4dFRva2VuLmlzUXVhbnRpZmllciA9PT0gZmFsc2UpKSAmJiB0b2tlbiAmJiB0b2tlbi5pc0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uaXNHcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnZXhNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFRlc3RE
46184ZWZpbml0aW9uKHRva2VuLCBvcHRzLmdyb3VwbWFya2VyWzBdLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLm9wZW5Hcm91cCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGVzdERlZmluaXRpb24odG9rZW4sIG9wdHMuZ3JvdXBtYXJrZXJbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5R3JvdXBNYXJrZXIodG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Q2FzZSgpIHtcbiAgICAgICAgICAgICAgICBpZiAob3BlbmVuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcGVuaW5nVG9rZW4gPSBvcGVuZW5pbmdzW29wZW5lbmluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRlc3REZWZpbml0aW9uKGN1cnJlbnRPcGVuaW5nVG9rZW4sIG0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9wZW5pbmdUb2tlbi5pc0FsdGVybmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IgPSBvcGVuZW5pbmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbW5keCA9IDA7IG1uZHggPCBhbHRlcm5hdG9yLm1hdGNoZXMubGVuZ3RoOyBtbmR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRvci5tYXRjaGVzW21uZHhdLmlzR3JvdXApIGFsdGVybmF0b3IubWF0Y2hlc1ttbmR4XS5pc0dyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmVuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5pbmdUb2tlbiA9IG9wZW5lbmluZ3Nbb3BlbmVuaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlbmluZ1Rva2VuLm1hdGNoZXMucHVzaChhbHRlcm5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLm1hdGNoZXMucHVzaChhbHRlcm5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRlc3REZWZpbml0aW9uKGN1cnJlbnRUb2tlbiwgbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gcmV2ZXJzZVRva2VucyhtYXNrVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXZlcnNlU3RhdGljKHN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdCA9PT0gb3B0cy5vcHRpb25hbG1hcmtlclswXSkgc3QgPSBvcHRzLm9wdGlvbmFsbWFya2VyWzFdOyBlbHNlIGlmIChzdCA9PT0gb3B0cy5vcHRpb25hbG1hcmtlclsxXSkgc3QgPSBvcHRzLm9wdGlvbmFsbWFya2VyWzBdOyBlbHNlIGlmIChzdCA9PT0gb3B0cy5ncm91cG1hcmtlclswXSkgc3QgPSBvcHRzLmdyb3VwbWFya2VyWzFdOyBlbHNlIGlmIChzdCA9PT0gb3B0cy5ncm91cG1hcmtlclsxXSkgc3QgPSBvcHRzLmdyb3VwbWFya2VyWzBdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hc2tUb2tlbi5tYXRjaGVzID0gbWFza1Rva2VuLm1hdGNoZXMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG1hdGNoIGluIG1hc2tUb2tlbi5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrVG9rZW4ubWF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShtYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRNYXRjaCA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrVG9rZW4ubWF0Y2hlc1ttYXRjaF0uaXNRdWFudGlmaWVyICYmIG1hc2tUb2tlbi5tYXRjaGVzW2ludE1hdGNoICsgMV0gJiYgbWFza1Rva2VuLm1hdGNoZXNbaW50TWF0Y2ggKyAxXS5pc0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF0ID0gbWFza1Rva2VuLm1hdGNoZXNbbWF0Y2hdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tUb2tlbi5tYXRjaGVzLnNwbGljZShtYXRjaCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1Rva2VuLm1hdGNoZXMuc3BsaWNlKGludE1hdGNoICsgMSwgMCwgcXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tUb2tlbi5tYXRjaGVzW21hdGNoXS5tYXRjaGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrVG9rZW4ubWF0Y2hlc1ttYXRjaF0gPSByZXZlcnNlVG9rZW5zKG1hc2tUb2tlbi5tYXRjaGVzW21hdGNoXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tUb2tlbi5tYXRjaGVzW21hdGNoXSA9IHJldmVyc2VTdGF0aWMobWFza1Rva2VuLm1hdGNoZXNbbWF0Y2hdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWFza1Rva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ3JvdXBpZnkobWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHZhciBncm91cFRva2VuID0gbmV3IE1hc2tUb2tlbih0cnVlKTtcbiAgICAgICAgICAgICAgICBncm91cFRva2VuLm9wZW5Hcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdyb3VwVG9rZW4ubWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwVG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVnZXhNYXNrKSB7XG4gICAgICAgICAgICAgICAgb3B0cy5vcHRpb25hbG1hcmtlclswXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBvcHRzLm9wdGlvbmFsbWFya2VyWzFdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXhNYXNrID8gcmVnZXhUb2tlbml6ZXIuZXhlYyhtYXNrKSA6IHRva2VuaXplci5leGVjKG1hc2spKSB7XG4gICAgICAgICAgICAgICAgbSA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdleE1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI/XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJ7MCwxfVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiK1wiOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIqXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJ7XCIgKyBtICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoIChtLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIig/PVwiOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBcIig/IVwiOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBcIig/PD1cIjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIoPzwhXCI6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIG9wdHMuZXNjYXBlQ2hhcjpcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdleE1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2Ugb3B0cy5vcHRpb25hbG1hcmtlclsxXTpcbiAgICAgICAgICAgICAgICAgIGNhc2Ugb3B0cy5ncm91cG1hcmtlclsxXTpcbiAgICAgICAgICAgICAgICAgICAgb3BlbmluZ1Rva2VuID0gb3BlbmVuaW5ncy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlbmluZ1Rva2VuLm9wZW5Hcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmluZ1Rva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGVuZW5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlbmluZ1Rva2VuID0gb3BlbmVuaW5nc1tvcGVuZW5pbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcGVuaW5nVG9rZW4ubWF0Y2hlcy5wdXNoKG9wZW5pbmdUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPcGVuaW5nVG9rZW4uaXNBbHRlcm5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IgPSBvcGVuZW5pbmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtbmR4ID0gMDsgbW5keCA8IGFsdGVybmF0b3IubWF0Y2hlcy5sZW5ndGg7IG1uZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRvci5tYXRjaGVzW21uZHhdLmlzR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IubWF0Y2hlc1ttbmR4XS5hbHRlcm5hdG9yR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmVuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlbmluZ1Rva2VuID0gb3BlbmVuaW5nc1tvcGVuZW5pbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5pbmdUb2tlbi5tYXRjaGVzLnB1c2goYWx0ZXJuYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4ubWF0Y2hlcy5wdXNoKGFsdGVybmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4ubWF0Y2hlcy5wdXNoKG9wZW5pbmdUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZhdWx0Q2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBvcHRzLm9wdGlvbmFsbWFya2VyWzBdOlxuICAgICAgICAgICAgICAgICAgICBvcGVuZW5pbmdzLnB1c2gobmV3IE1hc2tUb2tlbihmYWxzZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBvcHRzLmdyb3VwbWFya2VyWzBdOlxuICAgICAgICAgICAgICAgICAgICBvcGVuZW5pbmdzLnB1c2gobmV3IE1hc2tUb2tlbih0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIG9wdHMucXVhbnRpZmllcm1hcmtlclswXTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1YW50aWZpZXIgPSBuZXcgTWFza1Rva2VuKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG0gPSBtLnJlcGxhY2UoL1t7fV0vZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtcWogPSBtLnNwbGl0KFwifFwiKSwgbXEgPSBtcWpbMF0uc3BsaXQoXCIsXCIpLCBtcTAgPSBpc05hTihtcVswXSkgPyBtcVswXSA6IHBhcnNlSW50KG1xWzBdKSwgbXExID0gbXEubGVuZ3RoID09PSAxID8gbXEwIDogaXNOYU4obXFbMV0pID8gbXFbMV0gOiBwYXJzZUludChtcVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtcTAgPT09IFwiKlwiIHx8IG1xMCA9PT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1xMCA9IG1xMSA9PT0gXCIqXCIgPyAwIDogMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBxdWFudGlmaWVyLnF1YW50aWZpZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IG1xMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogbXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgaml0OiBtcWpbMV1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBvcGVuZW5pbmdzLmxlbmd0aCA+IDAgPyBvcGVuZW5pbmdzW29wZW5lbmluZ3MubGVuZ3RoIC0gMV0ubWF0Y2hlcyA6IGN1cnJlbnRUb2tlbi5tYXRjaGVzO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pc0FsdGVybmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gbWF0Y2gubWF0Y2hlcztcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciBncm91cFRva2VuID0gbmV3IE1hc2tUb2tlbih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXBNYXRjaCA9IG1hdGNoZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZ3JvdXBUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gZ3JvdXBUb2tlbi5tYXRjaGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0bXBNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoLmlzR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZ3JvdXBpZnkoWyBtYXRjaCBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gocXVhbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIG9wdHMuYWx0ZXJuYXRvcm1hcmtlcjpcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ3JvdXBRdWFudGlmaWVyKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0TWF0Y2ggPSBtYXRjaGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RNYXRjaC5pc1F1YW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TWF0Y2ggPSBncm91cGlmeShbIG1hdGNoZXMucG9wKCksIGxhc3RNYXRjaCBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wZW5lbmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5pbmdUb2tlbiA9IG9wZW5lbmluZ3Nbb3BlbmVuaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUb2tlbiA9IGN1cnJlbnRPcGVuaW5nVG9rZW4ubWF0Y2hlc1tjdXJyZW50T3BlbmluZ1Rva2VuLm1hdGNoZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9wZW5pbmdUb2tlbi5vcGVuR3JvdXAgJiYgKHN1YlRva2VuLm1hdGNoZXMgPT09IHVuZGVmaW5lZCB8fCBzdWJUb2tlbi5pc0dyb3VwID09PSBmYWxzZSAmJiBzdWJUb2tlbi5pc0FsdGVybmF0b3IgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaCA9IG9wZW5lbmluZ3MucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaCA9IGdyb3VwUXVhbnRpZmllcihjdXJyZW50T3BlbmluZ1Rva2VuLm1hdGNoZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoID0gZ3JvdXBRdWFudGlmaWVyKGN1cnJlbnRUb2tlbi5tYXRjaGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE1hdGNoLmlzQWx0ZXJuYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVuaW5ncy5wdXNoKGxhc3RNYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE1hdGNoLmFsdGVybmF0b3JHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IgPSBvcGVuZW5pbmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaC5hbHRlcm5hdG9yR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRvciA9IG5ldyBNYXNrVG9rZW4oZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdG9yLm1hdGNoZXMucHVzaChsYXN0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVuaW5ncy5wdXNoKGFsdGVybmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RNYXRjaC5vcGVuR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TWF0Y2gub3Blbkdyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdGVybmF0b3JHcm91cCA9IG5ldyBNYXNrVG9rZW4odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRvckdyb3VwLmFsdGVybmF0b3JHcm91cCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVuaW5ncy5wdXNoKGFsdGVybmF0b3JHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKG9wZW5lbmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG9wZW5pbmdUb2tlbiA9IG9wZW5lbmluZ3MucG9wKCk7XG4gICAgICAgICAgICAgICAgY3VycmVudFRva2VuLm1hdGNoZXMucHVzaChvcGVuaW5nVG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbi5tYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2ZXJpZnlHcm91cE1hcmtlcihjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgICAgIG1hc2tUb2tlbnMucHVzaChjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdHMubnVtZXJpY0lucHV0IHx8IG9wdHMuaXNSVEwpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlVG9rZW5zKG1hc2tUb2tlbnNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hc2tUb2tlbnM7XG4gICAgICAgI
46184H1cbiAgICB9O1xuICAgIElucHV0bWFzay5leHRlbmREZWZhdWx0cyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgJC5leHRlbmQodHJ1ZSwgSW5wdXRtYXNrLnByb3RvdHlwZS5kZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBJbnB1dG1hc2suZXh0ZW5kRGVmaW5pdGlvbnMgPSBmdW5jdGlvbihkZWZpbml0aW9uKSB7XG4gICAgICAgICQuZXh0ZW5kKHRydWUsIElucHV0bWFzay5wcm90b3R5cGUuZGVmaW5pdGlvbnMsIGRlZmluaXRpb24pO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLmV4dGVuZEFsaWFzZXMgPSBmdW5jdGlvbihhbGlhcykge1xuICAgICAgICAkLmV4dGVuZCh0cnVlLCBJbnB1dG1hc2sucHJvdG90eXBlLmFsaWFzZXMsIGFsaWFzKTtcbiAgICB9O1xuICAgIElucHV0bWFzay5mb3JtYXQgPSBmdW5jdGlvbih2YWx1ZSwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIElucHV0bWFzayhvcHRpb25zKS5mb3JtYXQodmFsdWUsIG1ldGFkYXRhKTtcbiAgICB9O1xuICAgIElucHV0bWFzay51bm1hc2sgPSBmdW5jdGlvbih2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSW5wdXRtYXNrKG9wdGlvbnMpLnVubWFza2VkdmFsdWUodmFsdWUpO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLmlzVmFsaWQgPSBmdW5jdGlvbih2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSW5wdXRtYXNrKG9wdGlvbnMpLmlzVmFsaWQodmFsdWUpO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLnJlbW92ZSA9IGZ1bmN0aW9uKGVsZW1zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbXMpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1zID0gZWxlbXMubm9kZU5hbWUgPyBbIGVsZW1zIF0gOiBlbGVtcztcbiAgICAgICAgJC5lYWNoKGVsZW1zLCBmdW5jdGlvbihuZHgsIGVsKSB7XG4gICAgICAgICAgICBpZiAoZWwuaW5wdXRtYXNrKSBlbC5pbnB1dG1hc2sucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLnNldFZhbHVlID0gZnVuY3Rpb24oZWxlbXMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbXMpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1zID0gZWxlbXMubm9kZU5hbWUgPyBbIGVsZW1zIF0gOiBlbGVtcztcbiAgICAgICAgJC5lYWNoKGVsZW1zLCBmdW5jdGlvbihuZHgsIGVsKSB7XG4gICAgICAgICAgICBpZiAoZWwuaW5wdXRtYXNrKSBlbC5pbnB1dG1hc2suc2V0VmFsdWUodmFsdWUpOyBlbHNlICQoZWwpLnRyaWdnZXIoXCJzZXR2YWx1ZVwiLCBbIHZhbHVlIF0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIElucHV0bWFzay5lc2NhcGVSZWdleCA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICB2Y
46184XIgc3BlY2lhbHMgPSBbIFwiL1wiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLCBcIj9cIiwgXCJ8XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIFwiXFxcXFwiLCBcIiRcIiwgXCJeXCIgXTtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXFxcXFwiICsgc3BlY2lhbHMuam9pbihcInxcXFxcXCIpICsgXCIpXCIsIFwiZ2ltXCIpLCBcIlxcXFwkMVwiKTtcbiAgICB9O1xuICAgIElucHV0bWFzay5rZXlDb2RlID0ge1xuICAgICAgICBCQUNLU1BBQ0U6IDgsXG4gICAgICAgIEJBQ0tTUEFDRV9TQUZBUkk6IDEyNyxcbiAgICAgICAgREVMRVRFOiA0NixcbiAgICAgICAgRE9XTjogNDAsXG4gICAgICAgIEVORDogMzUsXG4gICAgICAgIEVOVEVSOiAxMyxcbiAgICAgICAgRVNDQVBFOiAyNyxcbiAgICAgICAgSE9NRTogMzYsXG4gICAgICAgIElOU0VSVDogNDUsXG4gICAgICAgIExFRlQ6IDM3LFxuICAgICAgICBQQUdFX0RPV046IDM0LFxuICAgICAgICBQQUdFX1VQOiAzMyxcbiAgICAgICAgUklHSFQ6IDM5LFxuICAgICAgICBTUEFDRTogMzIsXG4gICAgICAgIFRBQjogOSxcbiAgICAgICAgVVA6IDM4LFxuICAgICAgICBYOiA4OCxcbiAgICAgICAgQ09OVFJPTDogMTdcbiAgICB9O1xuICAgIElucHV0bWFzay5kZXBlbmRlbmN5TGliID0gJDtcbiAgICBmdW5jdGlvbiByZXNvbHZlQWxpYXMoYWxpYXNTdHIsIG9wdGlvbnMsIG9wdHMpIHtcbiAgICAgICAgdmFyIGFsaWFzRGVmaW5pdGlvbiA9IElucHV0bWFzay5wcm90b3R5cGUuYWxpYXNlc1thbGlhc1N0cl07XG4gICAgICAgIGlmIChhbGlhc0RlZmluaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChhbGlhc0RlZmluaXRpb24uYWxpYXMpIHJlc29sdmVBbGlhcyhhbGlhc0RlZmluaXRpb24uYWxpYXMsIHVuZGVmaW5lZCwgb3B0cyk7XG4gICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCBvcHRzLCBhbGlhc0RlZmluaXRpb24pO1xuICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgb3B0cywgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRzLm1hc2sgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG9wdHMubWFzayA9IGFsaWFzU3RyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVNYXNrU2V0KG9wdHMsIG5vY2FjaGUpIHtcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVNYXNrKG1hc2ssIG1ldGFkYXRhLCBvcHRzKSB7XG4gICAgICAgICAgICB2Y
46184XIgcmVnZXhNYXNrID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWFzayA9PT0gbnVsbCB8fCBtYXNrID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgcmVnZXhNYXNrID0gb3B0cy5yZWdleCAhPT0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hc2sgPSBvcHRzLnJlZ2V4O1xuICAgICAgICAgICAgICAgICAgICBtYXNrID0gbWFzay5yZXBsYWNlKC9eKFxcXikoLiopKFxcJCkkLywgXCIkMlwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWdleE1hc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBtYXNrID0gXCIuKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXNrLmxlbmd0aCA9PT0gMSAmJiBvcHRzLmdyZWVkeSA9PT0gZmFsc2UgJiYgb3B0cy5yZXBlYXQgIT09IDApIHtcbiAgICAgICAgICAgICAgICBvcHRzLnBsYWNlaG9sZGVyID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRzLnJlcGVhdCA+IDAgfHwgb3B0cy5yZXBlYXQgPT09IFwiKlwiIHx8IG9wdHMucmVwZWF0ID09PSBcIitcIikge1xuICAgICAgICAgICAgICAgIHZhciByZXBlYXRTdGFydCA9IG9wdHMucmVwZWF0ID09PSBcIipcIiA/IDAgOiBvcHRzLnJlcGVhdCA9PT0gXCIrXCIgPyAxIDogb3B0cy5yZXBlYXQ7XG4gICAgICAgICAgICAgICAgbWFzayA9IG9wdHMuZ3JvdXBtYXJrZXJbMF0gKyBtYXNrICsgb3B0cy5ncm91cG1hcmtlclsxXSArIG9wdHMucXVhbnRpZmllcm1hcmtlclswXSArIHJlcGVhdFN0YXJ0ICsgXCIsXCIgKyBvcHRzLnJlcGVhdCArIG9wdHMucXVhbnRpZmllcm1hcmtlclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtYXNrc2V0RGVmaW5pdGlvbiwgbWFza2RlZktleSA9IHJlZ2V4TWFzayA/IFwicmVnZXhfXCIgKyBvcHRzLnJlZ2V4IDogb3B0cy5udW1lcmljSW5wdXQgPyBtYXNrLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpIDogbWFzaztcbiAgICAgICAgICAgIGlmIChJbnB1dG1hc2sucHJvdG90eXBlLm1hc2tzQ2FjaGVbbWFza2RlZktleV0gPT09IHVuZGVmaW5lZCB8fCBub2NhY2hlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbWFza3NldERlZmluaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIG1hc2s6IG1hc2ssXG4gICAgICAgICAgICAgICAgICAgIG1hc2tUb2tlbjogSW5wdXRtYXNrLnByb3RvdHlwZS5hbmFseXNlTWFzayhtYXNrLCByZWdleE1hc2ssIG9wdHMpLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZFBvc2l0aW9uczoge30sXG4gICAgICAgICAgICAgICAgICAgIF9idWZmZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1hc2tMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgaml0T2Zmc2V0OiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKG5vY2FjaGUgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRtYXNrLnByb3RvdHlwZS5tYXNrc0NhY2hlW21hc2tkZWZLZXldID0gbWFza3NldERlZmluaXRpb247XG4gICAgICAgICAgICAgICAgICAgIG1hc2tzZXREZWZpbml0aW9uID0gJC5leHRlbmQodHJ1ZSwge30sIElucHV0bWFzay5wcm90b3R5cGUubWFza3NDYWNoZVttYXNrZGVmS2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIG1hc2tzZXREZWZpbml0aW9uID0gJC5leHRlbmQodHJ1ZSwge30sIElucHV0bWFzay5wcm90b3R5cGUubWFza3NDYWNoZVttYXNrZGVmS2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gbWFza3NldERlZmluaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1zO1xuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMubWFzaykpIHtcbiAgICAgICAgICAgIG9wdHMubWFzayA9IG9wdHMubWFzayhvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJC5pc0FycmF
461845KG9wdHMubWFzaykpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm1hc2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmtlZXBTdGF0aWMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5rZWVwU3RhdGljID0gXCJhdXRvXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0cy5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5tYXNrW2ldLmNoYXJBdCgwKSAhPT0gb3B0cy5tYXNrWzBdLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMua2VlcFN0YXRpYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGFsdE1hc2sgPSBvcHRzLmdyb3VwbWFya2VyWzBdO1xuICAgICAgICAgICAgICAgICQuZWFjaChvcHRzLmlzUlRMID8gb3B0cy5tYXNrLnJldmVyc2UoKSA6IG9wdHMubWFzaywgZnVuY3Rpb24obmR4LCBtc2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsdE1hc2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0TWFzayArPSBvcHRzLmdyb3VwbWFya2VyWzFdICsgb3B0cy5hbHRlcm5hdG9ybWFya2VyICsgb3B0cy5ncm91cG1hcmtlclswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobXNrLm1hc2sgIT09IHVuZGVmaW5lZCAmJiAhJC5pc0Z1bmN0aW9uKG1zay5tYXNrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0TWFzayArPSBtc2subWFzaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdE1hc2sgKz0gbXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWx0TWFzayArPSBvcHRzLmdyb3VwbWFya2VyWzFdO1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU1hc2soYWx0TWFzaywgb3B0cy5tYXNrLCBvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBvcHRzLm1hc2sgPSBvcHRzLm1hc2sucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMubWFzayAmJi
46184BvcHRzLm1hc2subWFzayAhPT0gdW5kZWZpbmVkICYmICEkLmlzRnVuY3Rpb24ob3B0cy5tYXNrLm1hc2spKSB7XG4gICAgICAgICAgICBtcyA9IGdlbmVyYXRlTWFzayhvcHRzLm1hc2subWFzaywgb3B0cy5tYXNrLCBvcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1zID0gZ2VuZXJhdGVNYXNrKG9wdHMubWFzaywgb3B0cy5tYXNrLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzSW5wdXRFdmVudFN1cHBvcnRlZChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLCBldk5hbWUgPSBcIm9uXCIgKyBldmVudE5hbWUsIGlzU3VwcG9ydGVkID0gZXZOYW1lIGluIGVsO1xuICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoZXZOYW1lLCBcInJldHVybjtcIik7XG4gICAgICAgICAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbFtldk5hbWVdID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWwgPSBudWxsO1xuICAgICAgICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1hc2tTY29wZShhY3Rpb25PYmosIG1hc2tzZXQsIG9wdHMpIHtcbiAgICAgICAgbWFza3NldCA9IG1hc2tzZXQgfHwgdGhpcy5tYXNrc2V0O1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB0aGlzLm9wdHM7XG4gICAgICAgIHZhciBpbnB1dG1hc2sgPSB0aGlzLCBlbCA9IHRoaXMuZWwsIGlzUlRMID0gdGhpcy5pc1JUTCwgdW5kb1ZhbHVlLCAkZWwsIHNraXBLZXlQcmVzc0V2ZW50ID0gZmFsc2UsIHNraXBJbnB1dEV2ZW50ID0gZmFsc2UsIGlnbm9yYWJsZSA9IGZhbHNlLCBtYXhMZW5ndGgsIG1vdXNlRW50ZXIgPSBmYWxzZSwgY29sb3JNYXNrLCBvcmlnaW5hbFBsYWNlaG9sZGVyO1xuICAgICAgICBmdW5jdGlvbiBnZXRNYXNrVGVtcGxhdGUoYmFzZU9uSW5wdXQsIG1pbmltYWxQb3MsIGluY2x1ZGVNb2RlLCBub0ppdCwgY2xlYXJPcHRpb25hbFRhaWwpIHtcbiAgICAgICAgICAgIHZhciBncmVlZHkgPSBvcHRzLmdyZWVkeTtcbiAgICAgICAgICAgIGlmIChjbGVhck9wdGlvbmFsVGFpbCkgb3B0cy5ncmVlZHkgPSBmYWxzZTtcbiAgICAgICAgICAgIG1pbmltYWxQb3MgPSBtaW5pbWFsUG9zIHx8IDA7XG4gICAgICAgICAgICB2Y
46184XIgbWFza1RlbXBsYXRlID0gW10sIG5keEludGx6ciwgcG9zID0gMCwgdGVzdCwgdGVzdFBvcywgbHZwID0gZ2V0TGFzdFZhbGlkUG9zaXRpb24oKTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZU9uSW5wdXQgPT09IHRydWUgJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvc10pIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IGNsZWFyT3B0aW9uYWxUYWlsICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3NdLm1hdGNoLm9wdGlvbmFsaXR5ID09PSB0cnVlICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3MgKyAxXSA9PT0gdW5kZWZpbmVkICYmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXS5nZW5lcmF0ZWRJbnB1dCA9PT0gdHJ1ZSB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXS5pbnB1dCA9PSBvcHRzLnNraXBPcHRpb25hbFBhcnRDaGFyYWN0ZXIgJiYgcG9zID4gMCkgPyBkZXRlcm1pbmVUZXN0VGVtcGxhdGUocG9zLCBnZXRUZXN0cyhwb3MsIG5keEludGx6ciwgcG9zIC0gMSkpIDogZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvc107XG4gICAgICAgICAgICAgICAgICAgIHRlc3QgPSB0ZXN0UG9zLm1hdGNoO1xuICAgICAgICAgICAgICAgICAgICBuZHhJbnRsenIgPSB0ZXN0UG9zLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFza1RlbXBsYXRlLnB1c2goaW5jbHVkZU1vZGUgPT09IHRydWUgPyB0ZXN0UG9zLmlucHV0IDogaW5jbHVkZU1vZGUgPT09IGZhbHNlID8gdGVzdC5uYXRpdmVEZWYgOiBnZXRQbGFjZWhvbGRlcihwb3MsIHRlc3QpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zID0gZ2V0VGVzdFRlbXBsYXRlKHBvcywgbmR4SW50bHpyLCBwb3MgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdCA9IHRlc3RQb3MubWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIG5keEludGx6ciA9IHRlc3RQb3MubG9jYXRvci5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaml0TWFza2luZyA9IG5vSml0ID09PSB0cnVlID8gZmFsc2UgOiBvcHRzLmppdE1hc2tpbmcgIT09IGZhbHNlID8gb3B0cy5qaXRNYXNraW5nIDogdGVzdC5qaXQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqaXRNYXNraW5nID09PSBmYWxzZSB8fCBqaXRNYXNraW5nID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGppdE1hc2tpbmcgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUoaml0TWFza2luZykgJiYgaml0TWFza2luZyA+IHBvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFza1RlbXBsYXRlLnB1c2goaW5jbHVkZU1vZGUgPT09IGZhbHNlID8gdGVzdC5uYXRpdmVEZWYgOiBnZXRQbGFjZWhvbGRlcihwb3MsIHRlc3QpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5rZWVwU3RhdGljID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdC5uZXdCbG9ja01hcmtlciAmJiB0ZXN0LmZuICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmtlZXBTdGF0aWMgPSBwb3MgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICAgICAgfSB3aGlsZSAoKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IHBvcyA8IG1heExlbmd0aCkgJiYgKHRlc3QuZm4gIT09IG51bGwgfHwgdGVzdC5kZWYgIT09IFwiXCIpIHx8IG1pbmltYWxQb3MgPiBwb3MpO1xuICAgICAgICAgICAgaWYgKG1hc2tUZW1wbGF0ZVttYXNrVGVtcGxhdGUubGVuZ3RoIC0gMV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5jbHVkZU1vZGUgIT09IGZhbHNlIHx8IGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoID09PSB1bmRlZmluZWQpIGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoID0gcG9zIC0gMTtcbiAgICAgICAgICAgIG9wdHMuZ3JlZWR5ID0gZ3JlZWR5O1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRNYXNrU2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVzZXRNYXNrU2V0KHNvZnQpIHtcbiAgICAgICAgICAgIHZhciBtYXNrc2V0ID0gZ2V0TWFza1NldCgpO1xuICAgICAgICAgICAgbWFza3NldC5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoc29mdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIG1hc2tzZXQudmFsaWRQb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgICAgICAgICBtYXNrc2V0LnAgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldExhc3RWYWxpZFBvc2l0aW9uKGNsb3Nlc3RUbywgc3RyaWN0LCB2YWxpZFBvc2l0aW9ucykge1xuICAgICAgICAgICAgdmFyIGJlZm9yZSA9IC0xLCBhZnRlciA9IC0xLCB2YWxpZHMgPSB2YWxpZFBvc2l0aW9ucyB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnM7XG4gICAgICAgICAgICBpZiAoY2xvc2VzdFRvID09PSB1bmRlZmluZWQpIGNsb3Nlc3RUbyA9IC0xO1xuICAgICAgICAgICAgZm9yICh2YXIgcG9zTmR4IGluIHZhbGlkcykge1xuICAgICAgICAgICAgICAgIHZhciBwc05keCA9IHBhcnNlSW50KHBvc05keCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkc1twc05keF0gJiYgKHN0cmljdCB8fCB2YWxpZHNbcHNOZHhdLmdlbmVyYXRlZElucHV0ICE9PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHNOZHggPD0gY2xvc2VzdFRvKSBiZWZvcmUgPSBwc05keDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBzTmR4ID49IGNsb3Nlc3RUbykgYWZ0ZXIgPSBwc05keDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmVmb3JlID09PSAtMSB8fCBiZWZvcmUgPT0gY2xvc2VzdFRvID8gYWZ0ZXIgOiBhZnRlciA9PSAtMSA/IGJlZm9yZSA6IGNsb3Nlc3RUbyAtIGJlZm9yZSA8IGFmdGVyIC0gY2xvc2VzdFRvID8gYmVmb3JlIDogYWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0RGVjaXNpb25UYWtlcih0c3QpIHtcbiAgICAgICAgICAgIHZhciBkZWNpc2lvblRha2VyID0gdHN0LmxvY2F0b3JbdHN0LmFsdGVybmF0aW9uXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVjaXNpb25UYWtlciA9PSBcInN0cmluZ1wiICYmIGRlY2lzaW9uVGFrZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRlY2lzaW9uVGFrZXIgPSBkZWNpc2lvblRha2VyLnNwbGl0KFwiLFwiKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNpc2lvblRha2VyICE9PSB1bmRlZmluZWQgPyBkZWNpc2lvblRha2VyLnRvU3RyaW5nKCkgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldExvY2F0b3IodHN0LCBhbGlnbikge1xuICAgICAgICAgICAgdmFyIGxvY2F0b3IgPSAodHN0LmFsdGVybmF0aW9uICE9IHVuZGVmaW5lZCA/IHRzdC5tbG9jW2dldERlY2lzaW9uVGFrZXIodHN0KV0gOiB0c3QubG9jYXRvcikuam9pbihcIlwiKTtcbiAgICAgICAgICAgIGlmIChsb2NhdG9yICE9PSBcIlwiKSB3aGlsZSAobG9jYXRvci5sZW5ndGggPCBhbGlnbikgbG9jYXRvciArPSBcIjBcIjtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRldGVybWluZVRlc3RUZW1wbGF0ZShwb3MsIHRlc3RzKSB7XG4gICAgICAgICAgICBwb3MgPSBwb3MgPiAwID8gcG9zIC0gMSA6IDA7XG4gICAgICAgICAgICB2Y
46184XIgYWx0VGVzdCA9IGdldFRlc3QocG9zKSwgdGFyZ2V0TG9jYXRvciA9IGdldExvY2F0b3IoYWx0VGVzdCksIHRzdExvY2F0b3IsIGNsb3Nlc3QsIGJlc3RNYXRjaDtcbiAgICAgICAgICAgIGZvciAodmFyIG5keCA9IDA7IG5keCA8IHRlc3RzLmxlbmd0aDsgbmR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdHN0ID0gdGVzdHNbbmR4XTtcbiAgICAgICAgICAgICAgICB0c3RMb2NhdG9yID0gZ2V0TG9jYXRvcih0c3QsIHRhcmdldExvY2F0b3IubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLmFicyh0c3RMb2NhdG9yIC0gdGFyZ2V0TG9jYXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3QgPT09IHVuZGVmaW5lZCB8fCB0c3RMb2NhdG9yICE9PSBcIlwiICYmIGRpc3RhbmNlIDwgY2xvc2VzdCB8fCBiZXN0TWF0Y2ggJiYgIW9wdHMuZ3JlZWR5ICYmIGJlc3RNYXRjaC5tYXRjaC5vcHRpb25hbGl0eSAmJiBiZXN0TWF0Y2gubWF0Y2gubmV3QmxvY2tNYXJrZXIgPT09IFwibWFzdGVyXCIgJiYgKCF0c3QubWF0Y2gub3B0aW9uYWxpdHkgfHwgIXRzdC5tYXRjaC5uZXdCbG9ja01hcmtlcikgfHwgYmVzdE1hdGNoICYmIGJlc3RNYXRjaC5tYXRjaC5vcHRpb25hbFF1YW50aWZpZXIgJiYgIXRzdC5tYXRjaC5vcHRpb25hbFF1YW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdCA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSB0c3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRUZXN0VGVtcGxhdGUocG9zLCBuZHhJbnRsenIsIHRzdFBzKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvc10gfHwgZGV0ZXJtaW5lVGVzdFRlbXBsYXRlKHBvcywgZ2V0VGVzdHMocG9zLCBuZHhJbnRsenIgPyBuZHhJbnRsenIuc2xpY2UoKSA6IG5keEludGx6ciwgdHN0UHMpKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRUZXN0KHBvcywgdGVzdHMpIHtcbiAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAodGVzdHMgfHwgZ2V0VGVzdHMocG9zKSlbMF07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcG9zaXRpb25DYW5NYXRjaERlZmluaXRpb24ocG9zLCBkZWYpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlLCB0ZXN0cyA9IGdldFRlc3RzKHBvcyk7XG4gICAgICAgICAgICBmb3IgKHZhciB0bmR4ID0gMDsgdG5keCA8IHRlc3RzLmxlbmd0aDsgdG5keCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RzW3RuZHhdLm1hdGNoICYmIHRlc3RzW3RuZHhdLm1hdGNoLmRlZiA9PT0gZGVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldFRlc3RzKHBvcywgbmR4SW50bHpyLCB0c3RQcykge1xuICAgICAgICAgICAgdmFyIG1hc2tUb2tlbnMgPSBnZXRNYXNrU2V0KCkubWFza1Rva2VuLCB0ZXN0UG9zID0gbmR4SW50bHpyID8gdHN0UHMgOiAwLCBuZHhJbml0aWFsaXplciA9IG5keEludGx6ciA/IG5keEludGx6ci5zbGljZSgpIDogWyAwIF0sIG1hdGNoZXMgPSBbXSwgaW5zZXJ0U3RvcCA9IGZhbHNlLCBsYXRlc3RNYXRjaCwgY2FjaGVEZXBlbmRlbmN5ID0gbmR4SW50bHpyID8gbmR4SW50bHpyLmpvaW4oXCJcIikgOiBcIlwiO1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVRlc3RGcm9tVG9rZW4obWFza1Rva2VuLCBuZHhJbml0aWFsaXplciwgbG9vcE5keCwgcXVhbnRpZmllclJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVNYXRjaChtYXRjaCwgbG9vcE5keCwgcXVhbnRpZmllclJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXNGaXJzdE1hdGNoKGxhdGVzdE1hdGNoLCB0b2tlbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZmlyc3RNYXRjaCA9ICQuaW5BcnJheShsYXRlc3RNYXRjaCwgdG9rZW5Hcm91cC5tYXRjaGVzKSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0b2tlbkdyb3VwLm1hdGNoZXMsIGZ1bmN0aW9uKG5keCwgbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzUXVhbnRpZmllciA9PT0gdHJ1ZSkgZmlyc3RNYXRjaCA9IGlzRmlyc3RNYXRjaChsYXRlc3RNYXRjaCwgdG9rZW5Hcm91cC5tYXRjaGVzW25keCAtIDFdKTsgZWxzZSBpZiAobWF0Y2guaGFzT3duUHJvcGVydHkoXCJtYXRjaGVzXCIpKSBmaXJzdE1hdGNoID0gaXNGaXJzdE1hdGNoKGxhdGVzdE1hdGNoLCBtYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1hdGNoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlTmR4SW5pdGlhbGl6ZXIocG9zLCBhbHRlcm5hdGVOZHgsIHRhcmdldEFsdGVybmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVzdE1hdGNoLCBpbmRleFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudGVzdHNbcG9zXSB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChnZXRNYXNrU2V0KCkudGVzdHNbcG9zXSB8fCBbIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3NdIF0sIGZ1bmN0aW9uKG5keCwgbG1udCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG1udC5tbG9jW2FsdGVybmF0ZU5keF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGxtbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdGVybmF0aW9uID0gdGFyZ2V0QWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCA/IHRhcmdldEFsdGVybmF0aW9uIDogbG1udC5hbHRlcm5hdGlvbiwgbmR4UG9zID0gbG1udC5sb2NhdG9yW2FsdGVybmF0aW9uXSAhPT0gdW5kZWZpbmVkID8gbG1udC5sb2NhdG9yW2FsdGVybmF0aW9uXS50b1N0cmluZygpLmluZGV4T2YoYWx0ZXJuYXRlTmR4KSA6IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4UG9zID09PSB1bmRlZmluZWQgfHwgbmR4UG9zIDwgaW5kZXhQb3MpICYmIG5keFBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGxtbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFBvcyA9IG5keFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiZXN0TWF0Y2hBbHRJbmRleCA9IGJlc3RNYXRjaC5sb2NhdG9yW2Jlc3RNYXRjaC5hbHRlcm5hdGlvbl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0b3IgPSBiZXN0TWF0Y2gubWxvY1thbHRlcm5hdGVOZHhdIHx8IGJlc3RNYXRjaC5tbG9jW2Jlc3RNYXRjaEFsdEluZGV4XSB8fCBiZXN0TWF0Y2gubG9jYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zbGljZSgodGFyZ2V0QWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCA/IHRhcmdldEFsdGVybmF0aW9uIDogYmVzdE1hdGNoLmFsdGVybmF0aW9uKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0QWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCA/IHJlc29sdmVOZHhJbml0aWFsaXplcihwb3MsIGFsdGVybmF0ZU5keCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXNTdWJzZXRPZihzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXhwYW5kKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZXhwYW5kZWQgPSBbXSwgc3RhcnQsIGVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhdHRlcm4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNoYXJBdChpKSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHBhdHRlcm4uY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytzdGFydCA8IGVuZCkgZXhwYW5kZWQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBhdHRlcm4uY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkLnB1c2gocGF0dGVybi5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmRlZC5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmVnZXggJiYgc291cmNlLm1hdGNoLmZuICE9PSBudWxsICYmIHRhcmdldC5tYXRjaC5mbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmQodGFyZ2V0Lm1hdGNoLmRlZi5yZXBsYWNlKC9bXFxbXFxdXS9nLCBcIlwiKSkuaW5kZXhPZihleHBhbmQoc291cmNlLm1hdGNoLmRlZi5yZXBsYWNlKC9bXFxbXFxdXS9nLCBcIlwiKSkpICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UubWF0Y2guZGVmID09PSB0YXJnZXQubWF0Y2gubmF0aXZlRGVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHN0YXRpY0Nhbk1hdGNoRGVmaW5pdGlvbihzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNsb2MgPSBzb3VyY2UubG9jYXRvci5zbGljZShzb3VyY2UuYWx0ZXJuYXRpb24pLmpvaW4oXCJcIiksIHRsb2MgPSB0YXJnZXQubG9jYXRvci5zbGljZSh0YXJnZXQuYWx0ZXJuYXRpb24pLmpvaW4oXCJcIiksIGNhbk1hdGNoID0gc2xvYyA9PSB0bG9jO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuTWF0Y2ggPSBjYW5NYXRjaCAmJiBzb3VyY2UubWF0Y2guZm4gPT09IG51bGwgJiYgdGFyZ2V0Lm1hdGNoLmZuICE9PSBudWxsID8gdGFyZ2V0Lm1hdGNoLmZuLnRlc3Qoc291cmNlLm1hdGNoLmRlZiwgZ2V0TWFza1NldCgpLCBwb3MsIGZhbHNlLCBvcHRzLCBmYWxzZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5NYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRNZXJnZUxvY2F0b3JzKHRhcmdldE1hdGNoLCBhbHRNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsdE1hdGNoID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb24gPT09IGFsdE1hdGNoLmFsdGVybmF0aW9uICYmIHRhcmdldE1hdGNoLmxvY2F0b3JbdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb25dLnRvU3RyaW5nKCkuaW5kZXhPZihhbHRNYXRjaC5sb2NhdG9yW2FsdE1hdGNoLmFsdGVybmF0aW9uXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2gubWxvYyA9IHRhcmdldE1hdGNoLm1sb2MgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY05keCA9IHRhcmdldE1hdGNoLmxvY2F0b3JbdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb25dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NOZHggPT09IHVuZGVmaW5lZCkgdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb24gPSB1bmRlZmluZWQ7IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvY05keCA9PT0gXCJzdHJpbmdcIikgbG9jTmR4ID0gbG9jTmR4LnNwbGl0KFwiLFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1hdGNoLm1sb2NbbG9jTmR4XSA9PT0gdW5kZWZpbmVkKSB0YXJnZXRNYXRjaC5tbG9jW2xvY05keF0gPSB0YXJnZXRNYXRjaC5sb2NhdG9yLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHRNYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZHggaW4gYWx0TWF0Y2gubWxvYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmR4ID09PSBcInN0cmluZ1wiKSBuZHggPSBuZHguc3BsaXQoXCIsXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRNYXRjaC5tbG9jW25keF0gPT09IHVuZGVmaW5lZCkgdGFyZ2V0TWF0Y2gubWxvY1tuZHhdID0gYWx0TWF0Y2gubWxvY1tuZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2gubG9jYXRvclt0YXJnZXRNYXRjaC5hbHRlcm5hdGlvbl0gPSBPYmplY3Qua2V5cyh0YXJnZXRNYXRjaC5tbG9jKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RQb3MgPiA1MDAgJiYgcXVhbnRpZmllclJlY3Vyc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJJbnB1dG1hc2s6IFRoZXJlIGlzIHByb2JhYmx5IGFuIGVycm9yIGluIHlvdXIgbWFzayBkZWZpbml0aW9uIG9yIGluIHRoZSBjb2RlLiBDcmVhdGUgYW4gaXNzdWUgb24gZ2l0aHViIHdpdGggYW4gZXhhbXBsZSBvZiB0aGUgbWFzayB5b3UgYXJlIHVzaW5nLiBcIiArIGdldE1hc2tTZXQoKS5tYXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0UG9zID09PSBwb3MgJiYgbWF0Y2gubWF0Y2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBtYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yOiBsb29wTmR4LnJldmVyc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZDogY2FjaGVEZXBlbmRlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sb2M6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLm1hdGNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzR3JvdXAgJiYgcXVhbnRpZmllclJlY3Vyc2UgIT09IG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBoYW5kbGVNYXRjaChtYXNrVG9rZW4ubWF0Y2hlc1skLmluQXJyYXkobWF0Y2gsIG1hc2tUb2tlbi5tYXRjaGVzKSArIDFdLCBsb29wTmR4LCBxdWFudGlmaWVyUmVjdXJzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2guaXNPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25hbFRva2VuID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSByZXNvbHZlVGVzdEZyb21Ub2tlbihtYXRjaCwgbmR4SW5pdGlhbGl6ZXIsIGxvb3BOZHgsIHF1YW50aWZpZXJSZWN1cnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKG5keCwgbXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRjaC5tYXRjaC5vcHRpb25hbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXS5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YW50aWZpZXJSZWN1cnNlID09PSB1bmRlZmluZWQgJiYgaXNGaXJzdE1hdGNoKGxhdGVzdE1hdGNoLCBvcHRpb25hbFRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3RvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zID0gcG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5pc0FsdGVybmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYWx0ZXJuYXRlVG9rZW4gPSBtYXRjaCwgbWFsdGVybmF0ZU1hdGNoZXMgPSBbXSwgbWFsdE1hdGNoZXMsIGN1cnJlbnRNYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgpLCBsb29wTmR4Q250ID0gbG9vcE5keC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdEluZGV4ID0gbmR4SW5pdGlhbGl6ZXIubGVuZ3RoID4gMCA/IG5keEluaXRpYWxpemVyLnNoaWZ0KCkgOiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0SW5kZXggPT09IC0xIHx8IHR5cGVvZiBhbHRJbmRleCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFBvcyA9IHRlc3RQb3MsIG5keEluaXRpYWxpemVyQ2xvbmUgPSBuZHhJbml0aWFsaXplci5zbGljZSgpLCBhbHRJbmRleEFyciA9IFtdLCBhbW5keDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbHRJbmRleCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRJbmRleEFyciA9IGFsdEluZGV4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYW1uZHggPSAwOyBhbW5keCA8IGFsdGVybmF0ZVRva2VuLm1hdGNoZXMubGVuZ3RoOyBhbW5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0SW5kZXhBcnIucHVzaChhbW5keC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW3Bvc10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHRJbmRleEFyckNsb25lID0gYWx0SW5kZXhBcnIuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBlbCA9IGdldE1hc2tTZXQoKS5leGNsdWRlc1twb3NdLmxlbmd0aDsgaSA8IGVsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRJbmRleEFyci5zcGxpY2UoYWx0SW5kZXhBcnIuaW5kZXhPZihnZXRNYXNrU2V0KCkuZXhjbHVkZXNbcG9zXVtpXS50b1N0cmluZygpKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0SW5kZXhBcnIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW3Bvc10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0SW5kZXhBcnIgPSBhbHRJbmRleEFyckNsb25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmtlZXBTdGF0aWMgPT09IHRydWUgfHwgaXNGaW5pdGUocGFyc2VJbnQob3B0cy5rZWVwU3RhdGljKSkgJiYgY3VycmVudFBvcyA+PSBvcHRzLmtlZXBTdGF0aWMpIGFsdEluZGV4QXJyID0gYWx0SW5kZXhBcnIuc2xpY2UoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bk1hdGNoZWRBbHRlcm5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZHggPSAwOyBuZHggPCBhbHRJbmRleEFyci5sZW5ndGg7IG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW5keCA9IHBhcnNlSW50KGFsdEluZGV4QXJyW25keF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmR4SW5pdGlhbGl6ZXIgPSB0eXBlb2YgYWx0SW5kZXggPT09IFwic3RyaW5nXCIgPyByZXNvbHZlTmR4SW5pdGlhbGl6ZXIodGVzdFBvcywgYW1uZHgsIGxvb3BOZHhDbnQpIHx8IG5keEluaXRpYWxpemVyQ2xvbmUuc2xpY2UoKSA6IG5keEluaXRpYWxpemVyQ2xvbmUuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHRlcm5hdGVUb2tlbi5tYXRjaGVzW2FtbmR4XSAmJiBoYW5kbGVNYXRjaChhbHRlcm5hdGVUb2tlbi5tYXRjaGVzW2FtbmR4XSwgWyBhbW5keCBdLmNvbmNhdChsb29wTmR4KSwgcXVhbnRpZmllclJlY3Vyc2UpKSBtYXRjaCA9IHRydWU7IGVsc2UgaWYgKG5keCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuTWF0Y2hlZEFsdGVybmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbHRNYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IGN1cnJlbnRQb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZHgxID0gMDsgbmR4MSA8IG1hbHRNYXRjaGVzLmxlbmd0aDsgbmR4MSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdE1hdGNoID0gbWFsdE1hdGNoZXNbbmR4MV0sIGRyb3BNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdE1hdGNoLm1hdGNoLmppdCA9IGFsdE1hdGNoLm1hdGNoLmppdCB8fCB1bk1hdGNoZWRBbHRlcm5hdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRNYXRjaC5hbHRlcm5hdGlvbiA9IGFsdE1hdGNoLmFsdGVybmF0aW9uIHx8IGxvb3BOZHhDbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVyZ2VMb2NhdG9ycyhhbHRNYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmR4MiA9IDA7IG5keDIgPCBtYWx0ZXJuYXRlTWF0Y2hlcy5sZW5ndGg7IG5keDIrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYWx0TWF0Y2gyID0gbWFsdGVybmF0ZU1hdGNoZXNbbmR4Ml07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWx0SW5kZXggIT09IFwic3RyaW5nXCIgfHwgYWx0TWF0Y2guYWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCAmJiAkLmluQXJyYXkoYWx0TWF0Y2gubG9jYXRvclthbHRNYXRjaC5hbHRlcm5hdGlvbl0udG9TdHJpbmcoKSwgYWx0SW5kZXhBcnIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsdE1hdGNoLm1hdGNoLm5hdGl2ZURlZiA9PT0gYWx0TWF0Y2gyLm1hdGNoLm5hdGl2ZURlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVyZ2VMb2NhdG9ycyhhbHRNYXRjaDIsIGFsdE1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdWJzZXRPZihhbHRNYXRjaCwgYWx0TWF0Y2gyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRNZXJnZUxvY2F0b3JzKGFsdE1hdGNoLCBhbHRNYXRjaDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbHRlcm5hdGVNYXRjaGVzLnNwbGljZShtYWx0ZXJuYXRlTWF0Y2hlcy5pbmRleE9mKGFsdE1hdGNoMiksIDAsIGFsdE1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3Vic2V0T2YoYWx0TWF0Y2gyLCBhbHRNYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNZXJnZUxvY2F0b3JzKGFsdE1hdGNoMiwgYWx0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0aWNDYW5NYXRjaERlZmluaXRpb24oYWx0TWF0Y2gsIGFsdE1hdGNoMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0TWVyZ2VMb2NhdG9ycyhhbHRNYXRjaCwgYWx0TWF0Y2gyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWx0ZXJuYXRlTWF0Y2hlcy5zcGxpY2UobWFsdGVybmF0ZU1hdGNoZXMuaW5kZXhPZihhbHRNYXRjaDIpLCAwLCBhbHRNYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZHJvcE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbHRlcm5hdGVNYXRjaGVzLnB1c2goYWx0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gY3VycmVudE1hdGNoZXMuY29uY2F0KG1hbHRlcm5hdGVNYXRjaGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IHBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3RvcCA9IG1hdGNoZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYWx0ZXJuYXRlTWF0Y2hlcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZHhJbml0aWFsaXplciA9IG5keEluaXRpYWxpemVyQ2xvbmUuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgbWF0Y2ggPSBoYW5kbGVNYXRjaChhbHRlcm5hdGVUb2tlbi5tYXRjaGVzW2FsdEluZGV4XSB8fCBtYXNrVG9rZW4ubWF0Y2hlc1thbHRJbmRleF0sIFsgYWx0SW5kZXggXS5jb25jYXQobG9vcE5keCksIHF1YW50aWZpZXJSZWN1cnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5pc1F1YW50aWZpZXIgJiYgcXVhbnRpZmllclJlY3Vyc2UgIT09IG1hc2tUb2tlbi5tYXRjaGVzWyQuaW5BcnJheShtYXRjaCwgbWFza1Rva2VuLm1hdGNoZXMpIC0gMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcXQgPSBtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBxbmR4ID0gbmR4SW5pdGlhbGl6ZXIubGVuZ3RoID4gMCA/IG5keEluaXRpYWxpemVyLnNoaWZ0KCkgOiAwOyBxbmR4IDwgKGlzTmFOKHF0LnF1YW50aWZpZXIubWF4KSA/IHFuZHggKyAxIDogcXQucXVhbnRpZmllci5tYXgpICYmIHRlc3RQb3MgPD0gcG9zOyBxbmR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuR3JvdXAgPSBtYXNrVG9rZW4ubWF0Y2hlc1skLmluQXJyYXkocXQsIG1hc2tUb2tlbi5tYXRjaGVzKSAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGhhbmRsZU1hdGNoKHRva2VuR3JvdXAsIFsgcW5keCBdLmNvbmNhdChsb29wTmR4KSwgdG9rZW5Hcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0TWF0Y2ggPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ubWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RNYXRjaC5vcHRpb25hbFF1YW50aWZpZXIgPSBxbmR4ID49IHF0LnF1YW50aWZpZXIubWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0TWF0Y2guaml0ID0gKHFuZHggfHwgMSkgKiB0b2tlbkdyb3VwLm1hdGNoZXMuaW5kZXhPZihsYXRlc3RNYXRjaCkgPj0gcXQucXVhbnRpZmllci5qaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZXN0TWF0Y2gub3B0aW9uYWxRdWFudGlmaWVyICYmIGlzRmlyc3RNYXRjaChsYXRlc3RNYXRjaCwgdG9rZW5Hcm91cCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRTdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zID0gcG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVzdE1hdGNoLmppdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5qaXRPZmZzZXRbcG9zXSA9IHRva2VuR3JvdXAubWF0Y2hlcy5pbmRleE9mKGxhdGVzdE1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHJlc29sdmVUZXN0RnJvbVRva2VuKG1hdGNoLCBuZHhJbml0aWFsaXplciwgbG9vcE5keCwgcXVhbnRpZmllclJlY3Vyc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdG5keCA9IG5keEluaXRpYWxpemVyLmxlbmd0aCA+IDAgPyBuZHhJbml0aWFsaXplci5zaGlmdCgpIDogMDsgdG5keCA8IG1hc2tUb2tlbi5tYXRjaGVzLmxlbmd0aDsgdG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrVG9rZW4ubWF0Y2hlc1t0bmR4XS5pc1F1YW50aWZpZXIgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IGhhbmRsZU1hdGNoKG1hc2tUb2tlbi5tYXRjaGVzW3RuZHhdLCBbIHRuZHggXS5jb25jYXQobG9vcE5keCksIHF1YW50aWZpZXJSZWN1cnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiB0ZXN0UG9zID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlc3RQb3MgPiBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlTG9jYXRvcnMocG9zLCB0ZXN0cykge1xuICAgICAgICAgICAgICAgIHZhciBsb2NhdG9yID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCEkLmlzQXJyYXkodGVzdHMpKSB0ZXN0cyA9IFsgdGVzdHMgXTtcbiAgICAgICAgICAgICAgICBpZiAodGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdHNbMF0uYWx0ZXJuYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvciA9IGRldGVybWluZVRlc3RUZW1wbGF0ZShwb3MsIHRlc3RzLnNsaWNlKCkpLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdG9yLmxlbmd0aCA9PT0gMCkgbG9jYXRvciA9IHRlc3RzWzBdLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0ZXN0cywgZnVuY3Rpb24obmR4LCB0c3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHN0LmRlZiAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRvci5sZW5ndGggPT09IDApIGxvY2F0b3IgPSB0c3QubG9jYXRvci5zbGljZSgpOyBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYXRvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c3QubG9jYXRvcltpXSAmJiBsb2NhdG9yW2ldLnRvU3RyaW5nKCkuaW5kZXhPZih0c3QubG9jYXRvcltpXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3JbaV0gKz0gXCIsXCIgKyB0c3QubG9jYXRvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChuZHhJbnRsenIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNQb3MgPSBwb3MgLSAxLCB0ZXN0O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHRlc3QgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcHJldmlvdXNQb3NdIHx8IGdldE1hc2tTZXQoKS50ZXN0c1twcmV2aW91c1Bvc10pID09PSB1bmRlZmluZWQgJiYgcHJldmlvdXNQb3MgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdCAhPT0gdW5kZWZpbmVkICYmIHByZXZpb3VzUG9zID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5keEluaXRpYWxpemVyID0gbWVyZ2VMb2NhdG9ycyhwcmV2aW91c1BvcywgdGVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURlcGVuZGVuY3kgPSBuZHhJbml0aWFsaXplci5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IHByZXZpb3VzUG9zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudGVzdHNbcG9zXSAmJiBnZXRNYXNrU2V0KCkudGVzdHNbcG9zXVswXS5jZCA9PT0gY2FjaGVEZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYXNrU2V0KCkudGVzdHNbcG9zXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbXRuZHggPSBuZHhJbml0aWFsaXplci5zaGlmdCgpOyBtdG5keCA8IG1hc2tUb2tlbnMubGVuZ3RoOyBtdG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlc29sdmVUZXN0RnJvbVRva2VuKG1hc2tUb2tlbnNbbXRuZHhdLCBuZHhJbml0aWFsaXplciwgWyBtdG5keCBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRlc3RQb3MgPT09IHBvcyB8fCB0ZXN0UG9zID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCB8fCBpbnNlcnRTdG9wKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxpdHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRvcjogW10sXG4gICAgICAgICAgICAgICAgICAgIG1sb2M6IHt9LFxuICAgICAgICAgICAgICAgICAgICBjZDogY2FjaGVEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmR4SW50bHpyICE9PSB1bmRlZmluZWQgJiYgZ2V0TWFza1NldCgpLnRlc3RzW3Bvc10pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5leHRlbmQodHJ1ZSwgW10sIG1hdGNoZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0TWFza1NldCgpLnRlc3RzW3Bvc10gPSAkLmV4dGVuZCh0cnVlLCBbXSwgbWF0Y2hlcyk7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWFza1NldCgpLnRlc3RzW3Bvc107XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0QnVmZmVyVGVtcGxhdGUoKSB7XG4gICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLl9idWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5fYnVmZmVyID0gZ2V0TWFza1RlbXBsYXRlKGZhbHNlLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLmJ1ZmZlciA9PT0gdW5kZWZpbmVkKSBnZXRNYXNrU2V0KCkuYnVmZmVyID0gZ2V0TWFza1NldCgpLl9idWZmZXIuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZXRNYXNrU2V0KCkuX2J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRCdWZmZXIobm9DYWNoZSkge1xuICAgICAgICAgICAgaWYgKGdldE1hc2tTZXQoKS5idWZmZXIgPT09IHVuZGVmaW5lZCB8fCBub0NhY2hlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLmJ1ZmZlciA9IGdldE1hc2tUZW1wbGF0ZSh0cnVlLCBnZXRMYXN0VmFsaWRQb3NpdGlvbigpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLl9idWZmZXIgPT09IHVuZGVmaW5lZCkgZ2V0TWFza1NldCgpLl9idWZmZXIgPSBnZXRNYXNrU2V0KCkuYnVmZmVyLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWFza1NldCgpLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZWZyZXNoRnJvbUJ1ZmZlcihzdGFydCwgZW5kLCBidWZmZXIpIHtcbiAgICAgICAgICAgIHZhciBpLCBwO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KCk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwID0gc3RhcnQ7XG4gICAgICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gIT09IG9wdHMuc2tpcE9wdGlvbmFsUGFydENoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgdmFsUmVzdWx0ID0gaXNWYWxpZChwLCBidWZmZXJbaV0sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHZhbFJlc3VsdC5jYXJldCAhPT0gdW5kZWZpbmVkID8gdmFsUmVzdWx0LmNhcmV0IDogdmFsUmVzdWx0LnBvcyArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FzaW5nKGVsZW0sIHRlc3QsIHBvcykge1xuICAgICAgICAgICAgc3dpdGNoIChvcHRzLmNhc2luZyB8fCB0ZXN0LmNhc2luZykge1xuICAgICAgICAgICAgICBjYXNlIFwidXBwZXJcIjpcbiAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJsb3dlclwiOlxuICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInRpdGxlXCI6XG4gICAgICAgICAgICAgICAgdmFyIHBvc0JlZm9yZSA9IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3MgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID09PSAwIHx8IHBvc0JlZm9yZSAmJiBwb3NCZWZvcmUuaW5wdXQgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoSW5wdXRtYXNrLmtleUNvZGUuU1BBQ0UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbSA9IGVsZW0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMuY2FzaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtID0gb3B0cy5jYXNpbmcuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbHRlcm5hdGlvbk1hdGNoKGFsdEFycjEsIGFsdEFycjIsIG5hKSB7XG4gICAgICAgICAgICB2YXIgYWx0QXJyQyA9IG9wdHMuZ3JlZWR5ID8gYWx0QXJyMiA6IGFsdEFycjIuc2xpY2UoMCwgMSksIGlzTWF0Y2ggPSBmYWxzZSwgbmFBcnIgPSBuYSAhPT0gdW5kZWZpbmVkID8gbmEuc3BsaXQoXCIsXCIpIDogW10sIG5hTmR4O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICgobmFOZHggPSBhbHRBcnIxLmluZGV4T2YobmFBcnJbaV0pKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgYWx0QXJyMS5zcGxpY2UobmFOZHgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGFsbmR4ID0gMDsgYWxuZHggPCBhbHRBcnIxLmxlbmd0aDsgYWxuZHgrKykge1xuICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkoYWx0QXJyMVthbG5keF0sIGFsdEFyckMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWx0ZXJuYXRlKHBvcywgYywgc3RyaWN0LCBmcm9tU2V0VmFsaWQsIHJBbHRQb3MpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZFBzQ2xvbmUgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zKSwgbGFzdEFsdCwgYWx0ZXJuYXRpb24sIGlzVmFsaWRSc2x0ID0gZmFsc2UsIGFsdFBvcywgcHJldkFsdFBvcywgaSwgdmFsaWRQb3MsIGRlY2lzaW9uUG9zLCBsQWx0UG9zID0gckFsdFBvcyAhPT0gdW5kZWZpbmVkID8gckFsdFBvcyA6IGdldExhc3RWYWxpZFBvc2l0aW9uKCk7XG4gICAgICAgICAgICBpZiAobEFsdFBvcyA9PT0gLTEgJiYgckFsdFBvcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGFzdEFsdCA9IDA7XG4gICAgICAgICAgICAgICAgcHJldkFsdFBvcyA9IGdldFRlc3QobGFzdEFsdCk7XG4gICAgICAgICAgICAgICAgYWx0ZXJuYXRpb24gPSBwcmV2QWx0UG9zLmFsdGVybmF0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDtsQWx0UG9zID49IDA7IGxBbHRQb3MtLSkge1xuICAgICAgICAgICAgICAgICAgICBhbHRQb3MgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbbEFsdFBvc107XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHRQb3MgJiYgYWx0UG9zLmFsdGVybmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2QWx0UG9zICYmIHByZXZBbHRQb3MubG9jYXRvclthbHRQb3MuYWx0ZXJuYXRpb25dICE9PSBhbHRQb3MubG9jYXRvclthbHRQb3MuYWx0ZXJuYXRpb25dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWx0ID0gbEFsdFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aW9uID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW2xhc3RBbHRdLmFsdGVybmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFsdFBvcyA9IGFsdFBvcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbHRlcm5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVjaXNpb25Qb3MgPSBwYXJzZUludChsYXN0QWx0KTtcbiAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdID0gZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW2RlY2lzaW9uUG9zXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5leGNsdWRlc1tkZWNpc2lvblBvc10ucHVzaChnZXREZWNpc2lvblRha2VyKHByZXZBbHRQb3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkSW5wdXRzQ2xvbmUgPSBbXSwgc3RhdGljSW5wdXRzQmVmb3JlUG9zID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBkZWNpc2lvblBvczsgaSA8IGdldExhc3RWYWxpZFBvc2l0aW9uKHVuZGVmaW5lZCwgdHJ1ZSkgKyAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRQb3MgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFBvcyAmJiB2YWxpZFBvcy5nZW5lcmF0ZWRJbnB1dCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRJbnB1dHNDbG9uZS5wdXNoKHZhbGlkUG9zLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgcG9zKSBzdGF0aWNJbnB1dHNCZWZvcmVQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGdldE1hc2tTZXQoKS5leGNsdWRlc1tkZWNpc2lvblBvc10gJiYgZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW2RlY2lzaW9uUG9zXS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcG9zT2Zmc2V0ID0gc3RhdGljSW5wdXRzQmVmb3JlUG9zICogLTEsIHZhbGlkSW5wdXRzID0gdmFsaWRJbnB1dHNDbG9uZS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudGVzdHNbZGVjaXNpb25Qb3NdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXNldE1hc2tTZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRSc2x0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbGlkSW5wdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHZhbGlkSW5wdXRzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpc1ZhbGlkUnNsdCA9IGlzVmFsaWQoZ2V0TGFzdFZhbGlkUG9zaXRpb24odW5kZWZpbmVkLCB0cnVlKSArIDEsIGlucHV0LCBmYWxzZSwgZnJvbVNldFZhbGlkLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFJzbHQgJiYgYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0THZwID0gZ2V0TGFzdFZhbGlkUG9zaXRpb24ocG9zKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBkZWNpc2lvblBvczsgaSA8IGdldExhc3RWYWxpZFBvc2l0aW9uKCkgKyAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFBvcyA9IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkUG9zID09PSB1bmRlZmluZWQgfHwgdmFsaWRQb3MubWF0Y2guZm4gPT0gbnVsbCkgJiYgaSA8IHBvcyArIHBvc09mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NPZmZzZXQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBwb3MgKyBwb3NPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkUnNsdCA9IGlzVmFsaWQocG9zID4gdGFyZ2V0THZwID8gdGFyZ2V0THZwIDogcG9zLCBjLCBzdHJpY3QsIGZyb21TZXRWYWxpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUnNsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2QWx0UG9zID0gZ2V0VGVzdChkZWNpc2lvblBvcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdmFsaWRQc0Nsb25lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2lzaW9uVGFrZXIgPSBnZXREZWNpc2lvblRha2VyKHByZXZBbHRQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdLmluZGV4T2YoZGVjaXNpb25UYWtlcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWRSc2x0ID0gYWx0ZXJuYXRlKHBvcywgYywgc3RyaWN0LCBmcm9tU2V0VmFsaWQsIGRlY2lzaW9uUG9zIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdLnB1c2goZGVjaXNpb25UYWtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gZGVjaXNpb25Qb3M7IGkgPCBnZXRMYXN0VmFsaWRQb3NpdGlvbih1bmRlZmluZWQsIHRydWUpICsgMTsgaSsrKSBkZWxldGUgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkUnNsdCA9IGFsdGVybmF0ZShwb3MsIGMsIHN0cmljdCwgZnJvbVNldFZhbGlkLCBkZWNpc2lvblBvcyAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW2RlY2lzaW9uUG9zXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkUnNsdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkKHBvcywgYywgc3RyaWN0LCBmcm9tU2V0VmFsaWQsIGZyb21BbHRlcm5hdGUsIHZhbGlkYXRlT25seSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gaXNTZWxlY3Rpb24ocG9zT2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzUlRMID8gcG9zT2JqLmJlZ2luIC0gcG9zT2JqLmVuZCA+IDEgfHwgcG9zT2JqLmJlZ2luIC0gcG9zT2JqLmVuZCA9PT0gMSA6IHBvc09iai5lbmQgLSBwb3NPYmouYmVnaW4gPiAxIHx8IHBvc09iai5lbmQgLSBwb3NPYmouYmVnaW4gPT09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJpY3QgPSBzdHJpY3QgPT09IHRydWU7XG4gICAgICAgICAgICB2Y
46184XIgbWFza1BvcyA9IHBvcztcbiAgICAgICAgICAgIGlmIChwb3MuYmVnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1hc2tQb3MgPSBpc1JUTCA/IHBvcy5lbmQgOiBwb3MuYmVnaW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBfaXNWYWxpZChwb3NpdGlvbiwgYywgc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJzbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAkLmVhY2goZ2V0VGVzdHMocG9zaXRpb24pLCBmdW5jdGlvbihuZHgsIHRzdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdCA9IHRzdC5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByc2x0ID0gdGVzdC5mbiAhPSBudWxsID8gdGVzdC5mbi50ZXN0KGMsIGdldE1hc2tTZXQoKSwgcG9zaXRpb24sIHN0cmljdCwgb3B0cywgaXNTZWxlY3Rpb24ocG9zKSkgOiAoYyA9PT0gdGVzdC5kZWYgfHwgYyA9PT0gb3B0cy5za2lwT3B0aW9uYWxQYXJ0Q2hhcmFjdGVyKSAmJiB0ZXN0LmRlZiAhPT0gXCJcIiA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IGdldFBsYWNlaG9sZGVyKHBvc2l0aW9uLCB0ZXN0LCB0cnVlKSB8fCB0ZXN0LmRlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvczogcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocnNsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gcnNsdC5jICE9PSB1bmRlZmluZWQgPyByc2x0LmMgOiBjLCB2YWxpZGF0ZWRQb3MgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtID09PSBvcHRzLnNraXBPcHRpb25hbFBhcnRDaGFyYWN0ZXIgJiYgdGVzdC5mbiA9PT0gbnVsbCA/IGdldFBsYWNlaG9sZGVyKHBvc2l0aW9uLCB0ZXN0LCB0cnVlKSB8fCB0ZXN0LmRlZiA6IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnNsdC5yZW1vdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJC5pc0FycmF
461845KHJzbHQucmVtb3ZlKSkgcnNsdC5yZW1vdmUgPSBbIHJzbHQucmVtb3ZlIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHJzbHQucmVtb3ZlLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiAtIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uKG5keCwgbG1udCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZhbGlkYXRlTWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbG1udCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbG1udCArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnNsdC5pbnNlcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJC5pc0FycmF5KHJzbHQuaW5zZXJ0KSkgcnNsdC5pbnNlcnQgPSBbIHJzbHQuaW5zZXJ0IF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHJzbHQuaW5zZXJ0LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uKG5keCwgbG1udCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkKGxtbnQucG9zLCBsbW50LmMsIHRydWUsIGZyb21TZXRWYWxpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnNsdCAhPT0gdHJ1ZSAmJiByc2x0LnBvcyAhPT0gdW5kZWZpbmVkICYmIHJzbHQucG9zICE9PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBvcyA9IHJzbHQucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJzbHQgIT09IHRydWUgJiYgcnNsdC5wb3MgPT09IHVuZGVmaW5lZCAmJiByc2x0LmMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV2YWxpZGF0ZU1hc2socG9zLCAkLmV4dGVuZCh7fSwgdHN0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGNhc2luZyhlbGVtLCB0ZXN0LCB2YWxpZGF0ZWRQb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgZnJvbVNldFZhbGlkLCB2YWxpZGF0ZWRQb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzbHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2Y
46184XIgcmVzdWx0ID0gdHJ1ZSwgcG9zaXRpb25zQ2xvbmUgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zKTtcbiAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0cy5wcmVWYWxpZGF0aW9uKSAmJiAhc3RyaWN0ICYmIGZyb21TZXRWYWxpZCAhPT0gdHJ1ZSAmJiB2YWxpZGF0ZU9ubHkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBvcHRzLnByZVZhbGlkYXRpb24oZ2V0QnVmZmVyKCksIG1hc2tQb3MsIGMsIGlzU2VsZWN0aW9uKHBvcyksIG9wdHMsIGdldE1hc2tTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJhY2tiYWNrUG9zaXRpb25zKHVuZGVmaW5lZCwgbWFza1BvcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1hc2tQb3MgPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2lzVmFsaWQobWFza1BvcywgYywgc3RyaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghc3RyaWN0IHx8IGZyb21TZXRWYWxpZCA9PT0gdHJ1ZSkgJiYgcmVzdWx0ID09PSBmYWxzZSAmJiB2YWxpZGF0ZU9ubHkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UG9zVmFsaWQgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbbWFza1Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc1ZhbGlkICYmIGN1cnJlbnRQb3NWYWxpZC5tYXRjaC5mbiA9PT0gbnVsbCAmJiAoY3VycmVudFBvc1ZhbGlkLm1hdGNoLmRlZiA9PT0gYyB8fCBjID09PSBvcHRzLnNraXBPcHRpb25hbFBhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldDogc2Vla05leHQobWFza1BvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdHMuaW5zZXJ0TW9kZSB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbc2Vla05leHQobWFza1BvcyldID09PSB1bmRlZmluZWQpICYmICghaXNNYXNrKG1hc2tQb3MsIHRydWUpIHx8IGdldE1hc2tTZXQoKS5qaXRPZmZzZXRbbWFza1Bvc10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkuaml0T2Zmc2V0W21hc2tQb3NdICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tzZWVrTmV4dChtYXNrUG9zKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZChtYXNrUG9zICsgZ2V0TWFza1NldCgpLmppdE9mZnNldFttYXNrUG9zXSwgYywgc3RyaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXN1bHQuY2FyZXQgPSBtYXNrUG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZm9yICh2YXIgblBvcyA9IG1hc2tQb3MgKyAxLCBzblBvcyA9IHNlZWtOZXh0KG1hc2tQb3MpOyBuUG9zIDw9IHNuUG9zOyBuUG9zKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9pc1ZhbGlkKG5Qb3MsIGMsIHN0cmljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRyYWNrYmFja1Bvc2l0aW9ucyhtYXNrUG9zLCByZXN1bHQucG9zICE9PSB1bmRlZmluZWQgPyByZXN1bHQucG9zIDogblBvcykgfHwgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tQb3MgPSBuUG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlICYmIG9wdHMua2VlcFN0YXRpYyAhPT0gZmFsc2UgJiYgKG9wdHMucmVnZXggPT0gbnVsbCB8fCBpc0NvbXBsZXRlKGdldEJ1ZmZlcigpKSkgJiYgIXN0cmljdCAmJiBmcm9tQWx0ZXJuYXRlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsdGVybmF0ZShtYXNrUG9zLCBjLCBzdHJpY3QsIGZyb21TZXRWYWxpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBtYXNrUG9zXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRzLnBvc3RWYWxpZGF0aW9uKSAmJiByZXN1bHQgIT09IGZhbHNlICYmICFzdHJpY3QgJiYgZnJvbVNldFZhbGlkICE9PSB0cnVlICYmIHZhbGlkYXRlT25seSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBwb3N0UmVzdWx0ID0gb3B0cy5wb3N0VmFsaWRhdGlvbihnZXRCdWZmZXIodHJ1ZSksIHBvcy5iZWdpbiAhPT0gdW5kZWZpbmVkID8gaXNSVEwgPyBwb3MuZW5kIDogcG9zLmJlZ2luIDogcG9zLCByZXN1bHQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGlmIChwb3N0UmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZXN1bHQucmVmcmVzaEZyb21CdWZmZXIgJiYgcG9zdFJlc3VsdC5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciByZWZyZXNoID0gcG9zdFJlc3VsdC5yZWZyZXNoRnJvbUJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hGcm9tQnVmZmVyKHJlZnJlc2ggPT09IHRydWUgPyByZWZyZXNoIDogcmVmcmVzaC5zdGFydCwgcmVmcmVzaC5lbmQsIHBvc3RSZXN1bHQuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwb3N0UmVzdWx0ID09PSB0cnVlID8gcmVzdWx0IDogcG9zdFJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5wb3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wb3MgPSBtYXNrUG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UgfHwgdmFsaWRhdGVPbmx5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBwb3NpdGlvbnNDbG9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHRyYWNrYmFja1Bvc2l0aW9ucyhvcmlnaW5hbFBvcywgbmV3UG9zLCBmaWxsT25seSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFBvcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChvcmlnaW5hbFBvcyA9IG5ld1BvcyAtIDE7IG9yaWdpbmFsUG9zID4gMDsgb3JpZ2luYWxQb3MtLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW29yaWdpbmFsUG9zXSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgcHMgPSBvcmlnaW5hbFBvczsgcHMgPCBuZXdQb3M7IHBzKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3BzXSA9PT0gdW5kZWZpbmVkICYmICFpc01hc2socHMsIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2cCA9IHBzID09IDAgPyBnZXRUZXN0KHBzKSA6IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twcyAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodnApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzKHBzKS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzW3Rlc3RzLmxlbmd0aCAtIDFdLm1hdGNoLmRlZiA9PT0gXCJcIikgdGVzdHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYmVzdE1hdGNoID0gZGV0ZXJtaW5lVGVzdFRlbXBsYXRlKHBzLCB0ZXN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSAkLmV4dGVuZCh7fSwgYmVzdE1hdGNoLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBsYWNlaG9sZGVyKHBzLCBiZXN0TWF0Y2gubWF0Y2gsIHRydWUpIHx8IGJlc3RNYXRjaC5tYXRjaC5kZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmdlbmVyYXRlZElucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmFsaWRhdGVNYXNrKHBzLCBiZXN0TWF0Y2gsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGxPbmx5ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN2cElucHV0ID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW25ld1Bvc10uaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW25ld1Bvc10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZChuZXdQb3MsIGN2cElucHV0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmV2YWxpZGF0ZU1hc2socG9zLCB2YWxpZFRlc3QsIGZyb21TZXRWYWxpZCwgdmFsaWRhdGVkUG9zKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBJc0VuY2xvc2VkU3RhdGljKHBvcywgdmFsaWRzLCBzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgcG9zTWF0Y2ggPSB2YWxpZHNbcG9zXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zTWF0Y2ggIT09IHVuZGVmaW5lZCAmJiAocG9zTWF0Y2gubWF0Y2guZm4gPT09IG51bGwgJiYgcG9zTWF0Y2gubWF0Y2gub3B0aW9uYWxpdHkgIT09IHRydWUgfHwgcG9zTWF0Y2guaW5wdXQgPT09IG9wdHMucmFkaXhQb2ludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZNYXRjaCA9IHNlbGVjdGlvbi5iZWdpbiA8PSBwb3MgLSAxID8gdmFsaWRzW3BvcyAtIDFdICYmIHZhbGlkc1twb3MgLSAxXS5tYXRjaC5mbiA9PT0gbnVsbCAmJiB2YWxpZHNbcG9zIC0gMV0gOiB2YWxpZHNbcG9zIC0gMV0sIG5leHRNYXRjaCA9IHNlbGVjdGlvbi5lbmQgPiBwb3MgKyAxID8gdmFsaWRzW3BvcyArIDFdICYmIHZhbGlkc1twb3MgKyAxXS5tYXRjaC5mbiA9PT0gbnVsbCAmJiB2YWxpZHNbcG9zICsgMV0gOiB2YWxpZHNbcG9zICsgMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2TWF0Y2ggJiYgbmV4dE1hdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmVnaW4gPSBwb3MuYmVnaW4gIT09IHVuZGVmaW5lZCA/IHBvcy5iZWdpbiA6IHBvcywgZW5kID0gcG9zLmVuZCAhPT0gdW5kZWZpbmVkID8gcG9zLmVuZCA6IHBvcztcbiAgICAgICAgICAgIGlmIChwb3MuYmVnaW4gPiBwb3MuZW5kKSB7XG4gICAgICAgICAgICAgICAgYmVnaW4gPSBwb3MuZW5kO1xuICAgICAgICAgICAgICAgIGVuZCA9IHBvcy5iZWdpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkYXRlZFBvcyA9IHZhbGlkYXRlZFBvcyAhPT0gdW5kZWZpbmVkID8gdmFsaWRhdGVkUG9zIDogYmVnaW47XG4gICAgICAgICAgICBpZiAoYmVnaW4gIT09IGVuZCB8fCBvcHRzLmluc2VydE1vZGUgJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3ZhbGlkYXRlZFBvc10gIT09IHVuZGVmaW5lZCAmJiBmcm9tU2V0VmFsaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbnNDbG9uZSA9ICQuZXh0ZW5kKHRydWUsIHt9LCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMpLCBsdnAgPSBnZXRMYXN0VmFsaWRQb3NpdGlvbih1bmRlZmluZWQsIHRydWUpLCBpO1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wID0gYmVnaW47XG4gICAgICAgICAgICAgICAgZm9yIChpID0gbHZwOyBpID49IGJlZ2luOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXSAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbaV0ubWF0Y2gubmF0aXZlRGVmID09PSBcIitcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5pc05lZ2F0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZSwgaiA9IHZhbGlkYXRlZFBvcywgdnBzID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zLCBuZWVkc1ZhbGlkYXRpb24gPSBmYWxzZSwgcG9zTWF0Y2ggPSBqLCBpID0gajtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1t2YWxpZGF0ZWRQb3NdID0gJC5leHRlbmQodHJ1ZSwge30sIHZhbGlkVGVzdCk7XG4gICAgICAgICAgICAgICAgICAgIHBvc01hdGNoKys7XG4gICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZ2luIDwgZW5kKSBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoO2kgPD0gbHZwOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwb3NpdGlvbnNDbG9uZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT09IHVuZGVmaW5lZCAmJiAoaSA+PSBlbmQgfHwgaSA+PSBiZWdpbiAmJiB0LmdlbmVyYXRlZElucHV0ICE9PSB0cnVlICYmIElzRW5jbG9zZWRTdGF0aWMoaSwgcG9zaXRpb25zQ2xvbmUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBiZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kXG4gICAgICAgICAgICAgICAgICAgIH0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGdldFRlc3QocG9zTWF0Y2gpLm1hdGNoLmRlZiAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc1ZhbGlkYXRpb24gPT09IGZhbHNlICYmIHBvc2l0aW9uc0Nsb25lW3Bvc01hdGNoXSAmJiBwb3NpdGlvbnNDbG9uZVtwb3NNYXRjaF0ubWF0Y2gubmF0aXZlRGVmID09PSB0Lm1hdGNoLm5hdGl2ZURlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zTWF0Y2hdID0gJC5leHRlbmQodHJ1ZSwge30sIHBvc2l0aW9uc0Nsb25lW3Bvc01hdGNoXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3NNYXRjaF0uaW5wdXQgPSB0LmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2JhY2tQb3NpdGlvbnModW5kZWZpbmVkLCBwb3NNYXRjaCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwb3NNYXRjaCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMuc2hpZnRQb3NpdGlvbnMgJiYgcG9zaXRpb25DYW5NYXRjaERlZmluaXRpb24ocG9zTWF0Y2gsIHQubWF0Y2guZGVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcmVzdWx0ID0gaXNWYWxpZChwb3NNYXRjaCwgdC5pbnB1dCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gcmVzdWx0ICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHJlc3VsdC5jYXJldCB8fCByZXN1bHQuaW5zZXJ0ID8gZ2V0TGFzdFZhbGlkUG9zaXRpb24oKSA6IHBvc01hdGNoICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHQuZ2VuZXJhdGVkSW5wdXQgPT09IHRydWUgfHwgdC5pbnB1dCA9PT0gb3B0cy5yYWRpeFBvaW50ICYmIG9wdHMubnVtZXJpY0lucHV0ID09PSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWQgJiYgcG9zTWF0Y2ggPiBlbmQgJiYgaXNNYXNrKHBvc01hdGNoLCB0cnVlKSAmJiAodC5tYXRjaC5mbiAhPT0gbnVsbCB8fCBwb3NNYXRjaCA+IGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0Y2grKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUZXN0KHBvc01hdGNoKS5tYXRjaC5kZWYgPT0gXCJcIikgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdGNoID0gajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgcG9zaXRpb25zQ2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICByZXNldE1hc2tTZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkVGVzdCkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1t2YWxpZGF0ZWRQb3NdID0gJC5leHRlbmQodHJ1ZSwge30sIHZhbGlkVGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNldE1hc2tTZXQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc01hc2socG9zLCBzdHJpY3QpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gZ2V0VGVzdFRlbXBsYXRlKHBvcykubWF0Y2g7XG4gICAgICAgICAgICBpZiAodGVzdC5kZWYgPT09IFwiXCIpIHRlc3QgPSBnZXRUZXN0KHBvcykubWF0Y2g7XG4gICAgICAgICAgICBpZiAodGVzdC5mbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3QuZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICE9PSB0cnVlICYmIHBvcyA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gZ2V0VGVzdHMocG9zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMubGVuZ3RoID4gMSArICh0ZXN0c1t0ZXN0cy5sZW5ndGggLSAxXS5tYXRjaC5kZWYgPT09IFwiXCIgPyAxIDogMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2Vla05leHQocG9zLCBuZXdCbG9jaykge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gcG9zICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChnZXRUZXN0KHBvc2l0aW9uKS5tYXRjaC5kZWYgIT09IFwiXCIgJiYgKG5ld0Jsb2NrID09PSB0cnVlICYmIChnZXRUZXN0KHBvc2l0aW9uKS5tYXRjaC5uZXdCbG9ja01hcmtlciAhPT0gdHJ1ZSB8fCAhaXNNYXNrKHBvc2l0aW9uKSkgfHwgbmV3QmxvY2sgIT09IHRydWUgJiYgIWlzTWFzayhwb3NpdGlvbikpKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZWVrUHJldmlvdXMocG9zLCBuZXdCbG9jaykge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gcG9zLCB0ZXN0cztcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSAwKSByZXR1cm4gMDtcbiAgICAgICAgICAgIHdoaWxlICgtLXBvc2l0aW9uID4gMCAmJiAobmV3QmxvY2sgPT09IHRydWUgJiYgZ2V0VGVzdChwb3NpdGlvbikubWF0Y2gubmV3QmxvY2tNYXJrZXIgIT09IHRydWUgfHwgbmV3QmxvY2sgIT09IHRydWUgJiYgIWlzTWFzayhwb3NpdGlvbikgJiYgKHRlc3RzID0gZ2V0VGVzdHMocG9zaXRpb24pLCBcbiAgICAgICAgICAgIHRlc3RzLmxlbmd0aCA8IDIgfHwgdGVzdHMubGVuZ3RoID09PSAyICYmIHRlc3RzWzFdLm1hdGNoLmRlZiA9PT0gXCJcIikpKSB7fVxuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlQnVmZmVyKGlucHV0LCBidWZmZXIsIGNhcmV0UG9zLCBldmVudCwgdHJpZ2dlckV2ZW50cykge1xuICAgICAgICAgICAgaWYgKGV2ZW50ICYmICQuaXNGdW5jdGlvbihvcHRzLm9uQmVmb3JlV3JpdGUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdHMub25CZWZvcmVXcml0ZS5jYWxsKGlucHV0bWFzaywgZXZlbnQsIGJ1ZmZlciwgY2FyZXRQb3MsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWZyZXNoRnJvbUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZnJlc2ggPSByZXN1bHQucmVmcmVzaEZyb21CdWZmZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoRnJvbUJ1ZmZlcihyZWZyZXNoID09PSB0cnVlID8gcmVmcmVzaCA6IHJlZnJlc2guc3RhcnQsIHJlZnJlc2guZW5kLCByZXN1bHQuYnVmZmVyIHx8IGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBnZXRCdWZmZXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmV0UG9zICE9PSB1bmRlZmluZWQpIGNhcmV0UG9zID0gcmVzdWx0LmNhcmV0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQuY2FyZXQgOiBjYXJldFBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlucHV0LmlucHV0bWFzay5fdmFsdWVTZXQoYnVmZmVyLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIGlmIChjYXJldFBvcyAhPT0gdW5kZWZpbmVkICYmIChldmVudCA9PT0gdW5kZWZpbmVkIHx8IGV2ZW50LnR5cGUgIT09IFwiYmx1clwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgY2FyZXRQb3MpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZW5kZXJDb2xvck1hc2soaW5wdXQsIGNhcmV0UG9zLCBidWZmZXIubGVuZ3RoID09PSAwKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckV2ZW50cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJGlucHV0ID0gJChpbnB1dCksIG5wdFZhbCA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcElucHV0RXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5wdFZhbCA9PT0gZ2V0QnVmZmVyVGVtcGxhdGUoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnRyaWdnZXIoXCJjbGVhcmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NvbXBsZXRlKGJ1ZmZlcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImNvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXIocG9zLCB0ZXN0LCByZXR1cm5QTCkge1xuICAgICAgICAgICAgdGVzdCA9IHRlc3QgfHwgZ2V0VGVzdChwb3MpLm1hdGNoO1xuICAgICAgICAgICAgaWYgKHRlc3QucGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCB8fCByZXR1cm5QTCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkLmlzRnVuY3Rpb24odGVzdC5wbGFjZWhvbGRlcikgPyB0ZXN0LnBsYWNlaG9sZGVyKG9wdHMpIDogdGVzdC5wbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGVzdC5mbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiAtMSAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzKHBvcyksIHN0YXRpY0FsdGVybmF0aW9ucyA9IFtdLCBwcmV2VGVzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzLmxlbmd0aCA+IDEgKyAodGVzdHNbdGVzdHMubGVuZ3RoIC0gMV0ubWF0Y2guZGVmID09PSBcIlwiID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzW2ldLm1hdGNoLm9wdGlvbmFsaXR5ICE9PSB0cnVlICYmIHRlc3RzW2ldLm1hdGNoLm9wdGlvbmFsUXVhbnRpZmllciAhPT0gdHJ1ZSAmJiAodGVzdHNbaV0ubWF0Y2guZm4gPT09IG51bGwgfHwgKHByZXZUZXN0ID09PSB1bmRlZmluZWQgfHwgdGVzdHNbaV0ubWF0Y2guZm4udGVzdChwcmV2VGVzdC5tYXRjaC5kZWYsIGdldE1hc2tTZXQoKSwgcG9zLCB0cnVlLCBvcHRzKSAhPT0gZmFsc2UpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNBbHRlcm5hdGlvbnMucHVzaCh0ZXN0c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0c1tpXS5tYXRjaC5mbiA9PT0gbnVsbCkgcHJldlRlc3QgPSB0ZXN0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY0FsdGVybmF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1swLTlhLWJBLVpdLy50ZXN0KHN0YXRpY0FsdGVybmF0aW9uc1swXS5tYXRjaC5kZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KHBvcyAlIG9wdHMucGxhY2Vob2xkZXIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5kZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3B0cy5wbGFjZWhvbGRlci5jaGFyQXQocG9zICUgb3B0cy5wbGFjZWhvbGRlci5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIEhhbmRsZU5hdGl2ZVBsYWNlaG9sZGVyKG5wdCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChpZSkge1xuICAgICAgICAgICAgICAgIGlmIChucHQuaW5wdXRtYXNrLl92YWx1ZUdldCgpICE9PSB2YWx1ZSAmJiAobnB0LnBsYWNlaG9sZGVyICE9PSB2YWx1ZSB8fCBucHQucGxhY2Vob2xkZXIgPT09IFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBnZXRCdWZmZXIoKS5zbGljZSgpLCBucHRWYWx1ZSA9IG5wdC5pbnB1dG1hc2suX3ZhbHVlR2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucHRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciBsdnAgPSBnZXRMYXN0VmFsaWRQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx2cCA9PT0gLTEgJiYgbnB0VmFsdWUgPT09IGdldEJ1ZmZlclRlbXBsYXRlKCkuam9pbihcIlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsdnAgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJPcHRpb25hbFRhaWwoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKG5wdCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnB0LnBsYWNlaG9sZGVyICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG5wdC5wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChucHQucGxhY2Vob2xkZXIgPT09IFwiXCIpIG5wdC5yZW1vdmVBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgRXZlbnRSdWxlciA9IHtcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbihpbnB1dCwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXYgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaW5wdXRtYXNrID09PSB1bmRlZmluZWQgJiYgdGhpcy5ub2RlTmFtZSAhPT0gXCJGT1JNXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbU9wdHMgPSAkLmRhdGEodGhhdCwgXCJfaW5wdXRtYXNrX29wdHNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1PcHRzKSBuZXcgSW5wdXRtYXNrKGltT3B0cykubWFzayh0aGF0KTsgZWxzZSBFdmVudFJ1bGVyLm9mZih0aGF0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLnR5cGUgIT09IFwic2V0dmFsdWVcIiAmJiB0aGlzLm5vZGVOYW1lICE9PSBcIkZPUk1cIiAmJiAodGhhdC5kaXNhYmxlZCB8fCB0aGF0LnJlYWRPbmx5ICYmICEoZS50eXBlID09PSBcImtleWRvd25cIiAmJiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gNjcpIHx8IG9wdHMudGFiVGhyb3VnaCA9PT0gZmFsc2UgJiYgZS5rZXlDb2RlID09PSBJbnB1dG1hc2sua2V5Q29kZS5UQUIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBJbnB1dEV2ZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBJbnB1dEV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEhhbmRsZXIuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldCh0aGF0LCB0aGF0LmlucHV0bWFzay5jYXJldFBvcywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImtleWRvd25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwS2V5UHJlc3NFdmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBJbnB1dEV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImtleXByZXNzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBLZXlQcmVzc0V2ZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBLZXlQcmVzc0V2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2xpY2tcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWVtb2JpbGUgfHwgaXBob25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciByZXR1cm5WYWwgPSBldmVudEhhbmRsZXIuYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dG1hc2suZXZlbnRzW2V2ZW50TmFtZV0gPSBpbnB1dC5pbnB1dG1hc2suZXZlbnRzW2V2ZW50TmFtZV0gfHwgW107XG4gICAgICAgICAgICAgICAgaW5wdXQuaW5wdXRtYXNrLmV2ZW50c1tldmVudE5hbWVdLnB1c2goZXYpO1xuICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkoZXZlbnROYW1lLCBbIFwic3VibWl0XCIsIFwicmVzZXRcIiBdKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmZvcm0gIT09IG51bGwpICQoaW5wdXQuZm9ybSkub24oZXZlbnROYW1lLCBldik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkub24oZXZlbnROYW1lLCBldik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9mZjogZnVuY3Rpb24oaW5wdXQsIGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzayAmJiBpbnB1dC5pbnB1dG1hc2suZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBldmVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNbZXZlbnRdID0gaW5wdXQuaW5wdXRtYXNrLmV2ZW50c1tldmVudF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBpbnB1dC5pbnB1dG1hc2suZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQuZWFjaChldmVudHMsIGZ1bmN0aW9uKGV2ZW50TmFtZSwgZXZBcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChldkFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ID0gZXZBcnIucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheShldmVudE5hbWUsIFsgXCJzdWJtaXRcIiwgXCJyZXNldFwiIF0pICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZm9ybSAhPT0gbnVsbCkgJChpbnB1dC5mb3JtKS5vZmYoZXZlbnROYW1lLCBldik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkub2ZmKGV2ZW50TmFtZSwgZXYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnB1dC5pbnB1dG1hc2suZXZlbnRzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIEV2ZW50SGFuZGxlcnMgPSB7XG4gICAgICAgICAgICBrZXlkb3duRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgaW5wdXQgPSB0aGlzLCAkaW5wdXQgPSAkKGlucHV0KSwgayA9IGUua2V5Q29kZSwgcG9zID0gY2FyZXQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UgfHwgayA9PT0gSW5wdXRtYXNrLmtleUNvZGUuREVMRVRFIHx8IGlwaG9uZSAmJiBrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0VfU0FGQVJJIHx8IGUuY3RybEtleSAmJiBrID09PSBJbnB1dG1hc2sua2V5Q29kZS5YICYmICFpc0lucHV0RXZlbnRTdXBwb3J0ZWQoXCJjdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZW1vdmUoaW5wdXQsIGssIHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKGlucHV0LCBnZXRCdWZmZXIodHJ1ZSksIGdldE1hc2tTZXQoKS5wLCBlLCBpbnB1dC5pbnB1dG1hc2suX3ZhbHVlR2V0KCkgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoayA9PT0gSW5wdXRtYXNrLmtleUNvZGUuRU5EIHx8IGsgPT09IElucHV0bWFzay5rZXlDb2RlLlBBR0VfRE9XTikge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXJldFBvcyA9IHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpO1xuICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgZS5zaGlmdEtleSA/IHBvcy5iZWdpbiA6IGNhcmV0UG9zLCBjYXJldFBvcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5IT01FICYmICFlLnNoaWZ0S2V5IHx8IGsgPT09IElucHV0bWFzay5rZXlDb2RlLlBBR0VfVVApIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgMCwgZS5zaGlmdEtleSA/IHBvcy5iZWdpbiA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wdHMudW5kb09uRXNjYXBlICYmIGsgPT09IElucHV0bWFzay5rZXlDb2RlLkVTQ0FQRSB8fCBrID09PSA5MCAmJiBlLmN0cmxLZXkpICYmIGUuYWx0S2V5ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVmFsKGlucHV0LCB0cnVlLCBmYWxzZSwgdW5kb1ZhbHVlLnNwbGl0KFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgJGlucHV0LnRyaWdnZXIoXCJjbGlja1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGsgPT09IElucHV0bWFzay5rZXlDb2RlLklOU0VSVCAmJiAhKGUuc2hpZnRLZXkgfHwgZS5jdHJsS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRzLmluc2VydE1vZGUgPSAhb3B0cy5pbnNlcnRNb2RlO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJpbS1pbnNlcnRcIiwgb3B0cy5pbnNlcnRNb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMudGFiVGhyb3VnaCA9PT0gdHJ1ZSAmJiBrID09PSBJbnB1dG1hc2sua2V5Q29kZS5UQUIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUZXN0KHBvcy5iZWdpbikubWF0Y2guZm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MuYmVnaW4gPSBzZWVrTmV4dChwb3MuYmVnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmVuZCA9IHNlZWtQcmV2aW91cyhwb3MuYmVnaW4sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmJlZ2luID0gc2Vla1ByZXZpb3VzKHBvcy5lbmQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmJlZ2luID0gc2Vla05leHQocG9zLmJlZ2luLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5lbmQgPSBzZWVrTmV4dChwb3MuYmVnaW4sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcy5lbmQgPCBnZXRNYXNrU2V0KCkubWFza0xlbmd0aCkgcG9zLmVuZC0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MuYmVnaW4gPCBnZXRNYXNrU2V0KCkubWFza0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHBvcy5iZWdpbiwgcG9zLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0cy5vbktleURvd24uY2FsbCh0aGlzLCBlLCBnZXRCdWZmZXIoKSwgY2FyZXQoaW5wdXQpLmJlZ2luLCBvcHRzKTtcbiAgICAgICAgICAgICAgICBpZ25vcmFibGUgPSAkLmluQXJyYXkoaywgb3B0cy5pZ25vcmFibGVzKSAhPT0gLTE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5cHJlc3NFdmVudDogZnVuY3Rpb24oZSwgY2hlY2t2YWwsIHdyaXRlT3V0LCBzdHJpY3QsIG5keCkge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMsICRpbnB1dCA9ICQoaW5wdXQpLCBrID0gZS53aGljaCB8fCBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2t2YWwgIT09IHRydWUgJiYgKCEoZS5jdHJsS2V5ICYmIGUuYWx0S2V5KSAmJiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBpZ25vcmFibGUpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gSW5wdXRtYXNrLmtleUNvZGUuRU5URVIgJiYgdW5kb1ZhbHVlICE9PSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRvVmFsdWUgPSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImNoYW5nZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184H0sIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gNDYgJiYgZS5zaGlmdEtleSA9PT0gZmFsc2UgJiYgb3B0cy5yYWRpeFBvaW50ICE9PSBcIlwiKSBrID0gb3B0cy5yYWRpeFBvaW50LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gY2hlY2t2YWwgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IG5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5keFxuICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGNhcmV0KGlucHV0KSwgZm9yd2FyZFBvc2l0aW9uLCBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShrKSwgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLl9yYWRpeERhbmNlICYmIG9wdHMubnVtZXJpY0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhcmV0UG9zID0gZ2V0QnVmZmVyKCkuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQuY2hhckF0KDApKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcy5iZWdpbiA8PSBjYXJldFBvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gb3B0cy5yYWRpeFBvaW50LmNoYXJDb2RlQXQoMCkpIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5iZWdpbiAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MuZW5kIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLndyaXRlT3V0QnVmZmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxSZXN1bHQgPSBpc1ZhbGlkKHBvcywgYywgc3RyaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxSZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRQb3NpdGlvbiA9IHZhbFJlc3VsdC5jYXJldCAhPT0gdW5kZWZpbmVkID8gdmFsUmVzdWx0LmNhcmV0IDogc2Vla05leHQodmFsUmVzdWx0LnBvcy5iZWdpbiA/IHZhbFJlc3VsdC5wb3MuYmVnaW4gOiB2YWxSZXN1bHQucG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkucCA9IGZvcndhcmRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRQb3NpdGlvbiA9IChvcHRzLm51bWVyaWNJbnB1dCAmJiB2YWxSZXN1bHQuY2FyZXQgPT09IHVuZGVmaW5lZCA/IHNlZWtQcmV2aW91cyhmb3J3YXJkUG9zaXRpb24pIDogZm9yd2FyZFBvc2l0aW9uKSArIG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZU91dCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLm9uS2V5VmFsaWRhdGlvbi5jYWxsKGlucHV0LCBrLCB2YWxSZXN1bHQsIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkud3JpdGVPdXRCdWZmZXIgJiYgdmFsUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKGlucHV0LCBidWZmZXIsIGZvcndhcmRQb3NpdGlvbiwgZSwgY2hlY2t2YWwgIT09IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja3ZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxSZXN1bHQgIT09IGZhbHNlKSB2YWxSZXN1bHQuZm9yd2FyZFBvc2l0aW9uID0gZm9yd2FyZFBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdGVFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMsIGV2ID0gZS5vcmlnaW5hbEV2ZW50IHx8IGUsICRpbnB1dCA9ICQoaW5wdXQpLCBpbnB1dFZhbHVlID0gaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKSwgY2FyZXRQb3MgPSBjYXJldChpbnB1dCksIHRlbXBWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSVEwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcFZhbHVlID0gY2FyZXRQb3MuZW5kO1xuICAgICAgICAgICAgICAgICAgICBjYXJldFBvcy5lbmQgPSBjYXJldFBvcy5iZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgY2FyZXRQb3MuYmVnaW4gPSB0ZW1wVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUJlZm9yZUNhcmV0ID0gaW5wdXRWYWx1ZS
461845zdWJzdHIoMCwgY2FyZXRQb3MuYmVnaW4pLCB2YWx1ZUFmdGVyQ2FyZXQgPSBpbnB1dFZhbHVlLnN1YnN0cihjYXJldFBvcy5lbmQsIGlucHV0VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVCZWZvcmVDYXJldCA9PT0gKGlzUlRMID8gZ2V0QnVmZmVyVGVtcGxhdGUoKS5yZXZlcnNlKCkgOiBnZXRCdWZmZXJUZW1wbGF0ZSgpKS5zbGljZSgwLCBjYXJldFBvcy5iZWdpbikuam9pbihcIlwiKSkgdmFsdWVCZWZvcmVDYXJldCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlQWZ0ZXJDYXJldCA9PT0gKGlzUlRMID8gZ2V0QnVmZmVyVGVtcGxhdGUoKS5yZXZlcnNlKCkgOiBnZXRCdWZmZXJUZW1wbGF0ZSgpKS5zbGljZShjYXJldFBvcy5lbmQpLmpvaW4oXCJcIikpIHZhbHVlQWZ0ZXJDYXJldCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5jbGlwYm9hcmREYXRhICYmIHdpbmRvdy5jbGlwYm9hcmREYXRhLmdldERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHZhbHVlQmVmb3JlQ2FyZXQgKyB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKSArIHZhbHVlQWZ0ZXJDYXJldDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2LmNsaXBib2FyZERhdGEgJiYgZXYuY2xpcGJvYXJkRGF0YS5nZXREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB2YWx1ZUJlZm9yZUNhcmV0ICsgZXYuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKSArIHZhbHVlQWZ0ZXJDYXJldDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHBhc3RlVmFsdWUgPSBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0cy5vbkJlZm9yZVBhc3RlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXN0ZVZhbHVlID0gb3B0cy5vbkJlZm9yZVBhc3RlLmNhbGwoaW5wdXRtYXNrLCBpbnB1dFZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzdGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGVWYWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tWYWwoaW5wdXQsIGZhbHNlLCBmYWxzZSwgcGFzdGVWYWx1ZS50b1N0cmluZygpLnNwbGl0KFwiXCIpKTtcbiAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpLCBlLCB1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRGYWxsQmFja0V2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcmFkaXhQb2ludEhhbmRsZXIoaW5wdXQsIGlucHV0VmFsdWUsIGNhcmV0UG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFZhbHVlLmNoYXJBdChjYXJldFBvcy5iZWdpbiAtIDEpID09PSBcIi5cIiAmJiBvcHRzLnJhZGl4UG9pbnQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnNwbGl0KFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVtjYXJldFBvcy5iZWdpbiAtIDFdID0gb3B0cy5yYWRpeFBvaW50LmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGllTW9iaWxlSGFuZGxlcihpbnB1dCwgaW5wdXRWYWx1ZSwgY2FyZXRQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGllbW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW5wdXRDaGFyID0gaW5wdXRWYWx1ZS5yZXBsYWNlKGdldEJ1ZmZlcigpLmpvaW4oXCJcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Q2hhci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXYgPSBpbnB1dFZhbHVlLnNwbGl0KFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LnNwbGljZShjYXJldFBvcy5iZWdpbiwgMCwgaW5wdXRDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaXYuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcywgaW5wdXRWYWx1ZSA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0QnVmZmVyKCkuam9pbihcIlwiKSAhPT0gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FyZXRQb3MgPSBjYXJldChpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSByYWRpeFBvaW50SGFuZGxlcihpbnB1dCwgaW5wdXRWYWx1ZSwgY2FyZXRQb3MpO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaWVNb2JpbGVIYW5kbGVyKGlucHV0LCBpbnB1dFZhbHVlLCBjYXJldFBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRCdWZmZXIoKS5qb2luKFwiXCIpICE9PSBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyID0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKSwgb2Zmc2V0ID0gIW9wdHMubnVtZXJpY0lucHV0ICYmIGlucHV0VmFsdWUubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCA/IC0xIDogMCwgZnJvbnRQYXJ0ID0gaW5wdXRWYWx1ZS5zdWJzdHIoMCwgY2FyZXRQb3MuYmVnaW4pLCBiYWNrUGFydCA9IGlucHV0VmFsdWUuc3Vic3RyKGNhcmV0UG9zLmJlZ2luKSwgZnJvbnRCdWZmZXJQYXJ0ID0gYnVmZmVyLnN1YnN0cigwLCBjYXJldFBvcy5iZWdpbiArIG9mZnNldCksIGJhY2tCdWZmZXJQYXJ0ID0gYnVmZmVyLnN1YnN0cihjYXJldFBvcy5iZWdpbiArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gY2FyZXRQb3MsIGVudHJpZXMgPSBcIlwiLCBpc0VudHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnRQYXJ0ICE9PSBmcm9udEJ1ZmZlclBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnBsID0gKGlzRW50cnkgPSBmcm9udFBhcnQubGVuZ3RoID49IGZyb250QnVmZmVyUGFydC5sZW5ndGgpID8gZnJvbnRQYXJ0Lmxlbmd0aCA6IGZyb250QnVmZmVyUGFydC5sZW5ndGgsIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgZnJvbnRQYXJ0LmNoYXJBdChpKSA9PT0gZnJvbnRCdWZmZXJQYXJ0LmNoYXJBdChpKSAmJiBpIDwgZnBsOyBpKyspIDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYmVnaW4gPSBpIC0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzICs9IGZyb250UGFydC5zbGljZShpLCBzZWxlY3Rpb24uZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhcnQgIT09IGJhY2tCdWZmZXJQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXJ0Lmxlbmd0aCA+IGJhY2tCdWZmZXJQYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzICs9IGJhY2tQYXJ0LnNsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGFydC5sZW5ndGggPCBiYWNrQnVmZmVyUGFydC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5lbmQgKz0gYmFja0J1ZmZlclBhcnQubGVuZ3RoIC0gYmFja1BhcnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VudHJ5ICYmIG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIiAmJiBiYWNrUGFydCA9PT0gXCJcIiAmJiBmcm9udFBhcnQuY2hhckF0KHNlbGVjdGlvbi5iZWdpbiArIG9mZnNldCAtIDEpID09PSBvcHRzLnJhZGl4UG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYmVnaW4tLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gb3B0cy5yYWRpeFBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXIoaW5wdXQsIGdldEJ1ZmZlcigpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IHNlbGVjdGlvbi5iZWdpbiArIG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHNlbGVjdGlvbi5lbmQgKyBvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChlbnRyaWVzLnNwbGl0KFwiXCIpLCBmdW5jdGlvbihuZHgsIGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlwcmVzcyA9IG5ldyAkLkV2ZW50KFwia2V5cHJlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXByZXNzLndoaWNoID0gZW50cnkuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlcnMua2V5cHJlc3NFdmVudC5jYWxsKGlucHV0LCBrZXlwcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uYmVnaW4gPT09IHNlbGVjdGlvbi5lbmQgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5iZWdpbiA9IHNlZWtQcmV2aW91cyhzZWxlY3Rpb24uYmVnaW4gKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5iZWdpbiA9PT0gc2VsZWN0aW9uLmVuZCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGlucHV0LCBzZWxlY3Rpb24uYmVnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHNlbGVjdGlvbi5iZWdpbiwgc2VsZWN0aW9uLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleWRvd24gPSBuZXcgJC5FdmVudChcImtleWRvd25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZG93bi5rZXlDb2RlID0gb3B0cy5udW1lcmljSW5wdXQgP
46184yBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UgOiBJbnB1dG1hc2sua2V5Q29kZS5ERUxFVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5rZXlkb3duRXZlbnQuY2FsbChpbnB1dCwga2V5ZG93bik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmVmb3JlSW5wdXRFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnNlcnRUZXh0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZS5kYXRhLnNwbGl0KFwiXCIpLCBmdW5jdGlvbihuZHgsIGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleXByZXNzID0gbmV3ICQuRXZlbnQoXCJrZXlwcmVzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwcmVzcy53aGljaCA9IGVudHJ5LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5rZXlwcmVzc0V2ZW50LmNhbGwoaW5wdXQsIGtleXByZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVDb250ZW50QmFja3dhcmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlkb3duID0gbmV3ICQuRXZlbnQoXCJrZXlkb3duXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ZG93bi5rZXlDb2RlID0gSW5wdXRtYXNrLmtleUNvZGUuQkFDS1NQQUNFO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5rZXlkb3duRXZlbnQuY2FsbChpbnB1dCwga2V5ZG93bik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIga2V5ZG93biA9IG5ldyAkLkV2ZW50KFwia2V5ZG93blwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleWRvd24ua2V5Q29kZSA9IElucHV0bWFzay5rZXlDb2RlLkRFTEVURTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlcnMua2V5ZG93bkV2ZW50LmNhbGwoaW5wdXQsIGtleWRvd24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRWYWx1ZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dG1hc2sucmVmcmVzaFZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcywgdmFsdWUgPSBlICYmIGUuZGV0YWlsID8gZS5kZXRhaWxbMF0gOiBhcmd1bWVudHNbMV0sIHZhbHVlID0gdmFsdWUgfHwgaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVNYXNrKSkgdmFsdWUgPSBvcHRzLm9uQmVmb3JlTWFzay5jYWxsKGlucHV0bWFzaywgdmFsdWUsIG9wdHMpIHx8IHZhbHVlO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgICAgICAgICAgY2hlY2tWYWwoaW5wdXQsIHRydWUsIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdW5kb1ZhbHVlID0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoKG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgfHwgb3B0cy5jbGVhckluY29tcGxldGUpICYmIGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKSA9PT0gZ2V0QnVmZmVyVGVtcGxhdGUoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmlucHV0bWFzay5fdmFsdWVTZXQoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgaW5wdXQgPSB0aGlzLCBucHRWYWx1ZSA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5zaG93TWFza09uRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5wdFZhbHVlICE9PSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3VzZUVudGVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5wb3NpdGlvbkNhcmV0T25UYWIgPT09IHRydWUgJiYgbW91c2VFbnRlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5jbGlja0V2ZW50LmFwcGx5KGlucHV0LCBbIGUsIHRydWUgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuZG9WYWx1ZSA9IGdldEJ1ZmZlcigpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2VsZWF2ZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBtb3VzZUVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgSGFuZGxlTmF0aXZlUGxhY2Vob2xkZXIoaW5wdXQsIG9yaWdpbmFsUGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGlja0V2ZW50OiBmdW5jdGlvbihlLCB0YWJiZWQpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1JhZGl4Rm9jdXMoY2xpY2tQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZwcyA9IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cHNbY2xpY2tQb3NdID09PSB1bmRlZmluZWQgfHwgdnBzW2NsaWNrUG9zXS5pbnB1dCA9PT0gZ2V0UGxhY2Vob2xkZXIoY2xpY2tQb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWNrUG9zIDwgc2Vla05leHQoLTEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcmFkaXhQb3MgPSAkLmluQXJyYXkob3B0cy5yYWRpeFBvaW50LCBnZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl4UG9zICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB2cCBpbiB2cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWRpeFBvcyA8IHZwICYmIHZwc1t2cF0uaW5wdXQgIT09IGdldFBsYWNlaG9sZGVyKHZwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkQ2FyZXQgPSBjYXJldChpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUlRMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2FyZXQuZW5kID0gc2VsZWN0ZWRDYXJldC5iZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENhcmV0LmJlZ2luID0gc2VsZWN0ZWRDYXJldC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2FyZXQuYmVnaW4gPT09IHNlbGVjdGVkQ2FyZXQuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRzLnBvc2l0aW9uQ2FyZXRPbkNsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm9uZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgMCwgZ2V0QnVmZmVyKCkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpZ25vcmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyYWRpeEZvY3VzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb1JhZGl4Rm9jdXMoc2VsZWN0ZWRDYXJldC5iZWdpbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYWRpeFBvcyA9IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIG9wdHMubnVtZXJpY0lucHV0ID8gc2Vla05leHQocmFkaXhQb3MpIDogcmFkaXhQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaWNrUG9zaXRpb24gPSBzZWxlY3RlZENhcmV0LmJlZ2luLCBsdmNsaWNrUG9zaXRpb24gPSBnZXRMYXN0VmFsaWRQb3NpdGlvbihjbGlja1Bvc2l0aW9uLCB0cnVlKSwgbGFzdFBvc2l0aW9uID0gc2Vla05leHQobHZjbGlja1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWNrUG9zaXRpb24gPCBsYXN0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGlucHV0LCAhaXNNYXNrKGNsaWNrUG9zaXRpb24sIHRydWUpICYmICFpc01hc2soY2xpY2tQb3NpdGlvbiAtIDEsIHRydWUpID8gc2Vla05leHQoY2xpY2tQb3NpdGlvbikgOiBjbGlja1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsdnAgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbbHZjbGlja1Bvc2l0aW9uXSwgdHQgPSBnZXRUZXN0VGVtcGxhdGUobGFzdFBvc2l0aW9uLCBsdnAgPyBsdnAubWF0Y2gubG9jYXRvciA6IHVuZGVmaW5lZCwgbHZwKSwgcGxhY2Vob2xkZXIgPSBnZXRQbGFjZWhvbGRlcihsYXN0UG9zaXRpb24sIHR0Lm1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciAhPT0gXCJcIiAmJiBnZXRCdWZmZXIoKVtsYXN0UG9zaXRpb25dICE9PSBwbGFjZWhvbGRlciAmJiB0dC5tYXRjaC5vcHRpb25hbFF1YW50aWZpZXIgIT09IHRydWUgJiYgdHQubWF0Y2gubmV3QmxvY2tNYXJrZXIgIT09IHRydWUgfHwgIWlzTWFzayhsYXN0UG9zaXRpb24sIG9wdHMua2VlcFN0YXRpYykgJiYgdHQubWF0Y2guZGVmID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciBuZXdQb3MgPSBzZWVrTmV4dChsYXN0UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlja1Bvc2l0aW9uID49IG5ld1BvcyB8fCBjbGlja1Bvc2l0aW9uID09PSBsYXN0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBvc2l0aW9uID0gbmV3UG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGlucHV0LCBsYXN0UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1dEV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcywgJGlucHV0ID0gJChpbnB1dCksIHBvcyA9IGNhcmV0KGlucHV0KSwgZXYgPSBlLm9yaWdpbmFsRXZlbnQgfHwgZTtcbiAgICAgICAgICAgICAgICB2YXIgY2xpcGJvYXJkRGF0YSA9IHdpbmRvdy5jbGlwYm9hcmREYXRhIHx8IGV2LmNsaXBib2FyZERhdGEsIGNsaXBEYXRhID0gaXNSVEwgPyBnZXRCdWZmZXIoKS5zbGljZShwb3MuZW5kLCBwb3MuYmVnaW4pIDogZ2V0QnVmZmVyKCkuc2xpY2UocG9zLmJlZ2luLCBwb3MuZW5kKTtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0XCIsIGlzUlRMID8gY2xpcERhdGEucmV2ZXJzZSgpLmpvaW4oXCJcIikgOiBjbGlwRGF0YS5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQpIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVSZW1vdmUoaW5wdXQsIElucHV0bWFzay5rZXlDb2RlLkRFTEVURSwgcG9zKTtcbiAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIGdldE1hc2tTZXQoKS5wLCBlLCB1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsdXJFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciAkaW5wdXQgPSAkKHRoaXMpLCBpbnB1dCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzaykge1xuICAgICAgICAgICAgICAgICAgICBIYW5kbGVOYXRpdmVQbGFjZWhvbGRlcihpbnB1dCwgb3JpZ2luYWxQbGFjZWhvbGRlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBucHRWYWx1ZSA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKSwgYnVmZmVyID0gZ2V0QnVmZmVyKCkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5wdFZhbHVlICE9PSBcIlwiIHx8IGNvbG9yTWFzayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhck1hc2tPbkxvc3RGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRMYXN0VmFsaWRQb3NpdGlvbigpID09PSAtMSAmJiBucHRWYWx1ZSA9PT0gZ2V0QnVmZmVyVGVtcGxhdGUoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3B0aW9uYWxUYWlsKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGUoYnVmZmVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImluY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJJbmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0TWFza1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhck1hc2tPbkxvc3RGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBnZXRCdWZmZXJUZW1wbGF0ZSgpLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgYnVmZmVyLCB1bmRlZmluZWQsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZG9WYWx1ZSA9IGJ1ZmZlci5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnRyaWdnZXIoXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2VlbnRlckV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBtb3VzZUVudGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaW5wdXQgJiYgb3B0cy5zaG93TWFza09uSG92ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgSGFuZGxlTmF0aXZlUGxhY2Vob2xkZXIoaW5wdXQsIChpc1JUTCA/IGdldEJ1ZmZlcigpLnNsaWNlKCkucmV2ZXJzZSgpIDogZ2V0QnVmZmVyKCkpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJtaXRFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmICh1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJGVsLnRyaWdnZXIoXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmNsZWFyTWFza09uTG9zdEZvY3VzICYmIGdldExhc3RWYWxpZFBvc2l0aW9uKCkgPT09IC0xICYmIGVsLmlucHV0bWFzay5fdmFsdWVHZXQgJiYgZWwuaW5wdXRtYXNrLl92YWx1ZUdldCgpID09PSBnZXRCdWZmZXJUZW1wbGF0ZSgpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLl92YWx1ZVNldChcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJJbmNvbXBsZXRlICYmIGlzQ29tcGxldGUoZ2V0QnVmZmVyKCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2suX3ZhbHVlU2V0KFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5yZW1vdmVNYXNrT25TdWJtaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLl92YWx1ZVNldChlbC5pbnB1dG1hc2sudW5tYXNrZWR2YWx1ZSgpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKGVsLCBnZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNldEV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLnJlZnJlc2hWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgJGVsLnRyaWdnZXIoXCJzZXR2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tWYWwoaW5wdXQsIHdyaXRlT3V0LCBzdHJpY3QsIG5wdHZsLCBpbml0aWF0aW5nRXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dG1hc2sgPSB0aGlzIHx8IGlucHV0LmlucHV0bWFzaywgaW5wdXRWYWx1ZSA9IG5wdHZsLnNsaWNlKCksIGNoYXJDb2RlcyA9IFwiXCIsIGluaXRpYWxOZHggPSAtMSwgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZnVuY3Rpb24gaXNUZW1wbGF0ZU1hdGNoKG5keCwgY2hhckNvZGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYXJDb2RlTmR4ID0gZ2V0TWFza1RlbXBsYXRlKHRydWUsIDAsIGZhbHNlKS5zbGljZShuZHgsIHNlZWtOZXh0KG5keCkpLmpvaW4oXCJcIikucmVwbGFjZSgvJy9nLCBcIlwiKS5pbmRleE9mKGNoYXJDb2Rlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJDb2RlTmR4ICE9PSAtMSAmJiAhaXNNYXNrKG5keCkgJiYgKGdldFRlc3QobmR4KS5tYXRjaC5uYXRpdmVEZWYgPT09IGNoYXJDb2Rlcy5jaGFyQXQoMCkgfHwgZ2V0VGVzdChuZHgpLm1hdGNoLmZuID09PSBudWxsICYmIGdldFRlc3QobmR4KS5tYXRjaC5uYXRpdmVEZWYgPT09IFwiJ1wiICsgY2hhckNvZGVzLmNoYXJBdCgwKSB8fCBnZXRUZXN0KG5keCkubWF0Y2gubmF0aXZlRGVmID09PSBcIiBcIiAmJiAoZ2V0VGVzdChuZHggKyAxKS5tYXRjaC5uYXRpdmVEZWYgPT09IGNoYXJDb2Rlcy5jaGFyQXQoMCkgfHwgZ2V0VGVzdChuZHggKyAxKS5tYXRjaC5mbiA9PT0gbnVsbCAmJiBnZXRUZXN0KG5keCArIDEpLm1hdGNoLm5hdGl2ZURlZiA9PT0gXCInXCIgKyBjaGFyQ29kZXMuY2hhckF0KDApKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNldE1hc2tTZXQoKTtcbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmIG9wdHMuYXV0b1VubWFzayAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0aWNJbnB1dCA9IGdldEJ1ZmZlclRlbXBsYXRlKCkuc2xpY2UoMCwgc2Vla05leHQoLTEpKS5qb2luKFwiXCIpLCBtYXRjaGVzID0gaW5wdXRWYWx1ZS
461845qb2luKFwiXCIpLm1hdGNoKG5ldyBSZWdFeHAoXCJeXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgoc3RhdGljSW5wdXQpLCBcImdcIikpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLnNwbGljZSgwLCBtYXRjaGVzLmxlbmd0aCAqIHN0YXRpY0lucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxOZHggPSBzZWVrTmV4dChpbml0aWFsTmR4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluaXRpYWxOZHggPSBzZWVrTmV4dChpbml0aWFsTmR4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0aWFsTmR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wID0gc2Vla05leHQoaW5pdGlhbE5keCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhbE5keCA9IDA7XG4gICAgICAgICAgICB9IGVsc2UgZ2V0TWFza1NldCgpLnAgPSBpbml0aWFsTmR4O1xuICAgICAgICAgICAgaW5wdXRtYXNrLmNhcmV0UG9zID0ge1xuICAgICAgICAgICAgICAgIGJlZ2luOiBpbml0aWFsTmR4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJC5lYWNoKGlucHV0VmFsdWUsIGZ1bmN0aW9uKG5keCwgY2hhckNvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW25keF0gPT09IHVuZGVmaW5lZCAmJiBpbnB1dFZhbHVlW25keF0gPT09IGdldFBsYWNlaG9sZGVyKG5keCkgJiYgaXNNYXNrKG5keCwgdHJ1ZSkgJiYgaXNWYWxpZChuZHgsIGlucHV0VmFsdWVbbmR4XSwgdHJ1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLnArKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlwcmVzcyA9IG5ldyAkLkV2ZW50KFwiX2NoZWNrdmFsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cHJlc3Mud2hpY2ggPSBjaGFyQ29kZS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvZGVzICs9IGNoYXJDb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGx2cCA9IGdldExhc3RWYWxpZFBvc2l0aW9uKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGVtcGxhdGVNYXRjaChpbml0aWFsTmR4LCBjaGFyQ29kZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRXZlbnRIYW5kbGVycy5rZXlwcmVzc0V2ZW50LmNhbGwoaW5wdXQsIGtleXByZXNzLCB0cnVlLCBmYWxzZSwgc3RyaWN0LCBpbnB1dG1hc2suY2FyZXRQb3MuYmVnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5keCA9IGlucHV0bWFzay5jYXJldFBvcy5iZWdpbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFdmVudEhhbmRsZXJzLmtleXByZXNzRXZlbnQuY2FsbChpbnB1dCwga2V5cHJlc3MsIHRydWUsIGZhbHNlLCBzdHJpY3QsIGx2cCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKHVuZGVmaW5lZCwgZ2V0QnVmZmVyKCksIHJlc3VsdC5mb3J3YXJkUG9zaXRpb24sIGtleXByZXNzLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtYXNrLmNhcmV0UG9zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogcmVzdWx0LmZvcndhcmRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiByZXN1bHQuZm9yd2FyZFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHdyaXRlT3V0KSB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIHJlc3VsdCA/IHJlc3VsdC5mb3J3YXJkUG9zaXRpb24gOiB1bmRlZmluZWQsIGluaXRpYXRpbmdFdmVudCB8fCBuZXcgJC5FdmVudChcImNoZWNrdmFsXCIpLCBpbml0aWF0aW5nRXZlbnQgJiYgaW5pdGlhdGluZ0V2ZW50LnR5cGUgPT09IFwiaW5wdXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdW5tYXNrZWR2YWx1ZShpbnB1dCkge1xuICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzayAmJiBpbnB1dC5pbnB1dG1hc2sucmVmcmVzaFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlcnMuc2V0VmFsdWVFdmVudC5jYWxsKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2Y
46184XIgdW1WYWx1ZSA9IFtdLCB2cHMgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnM7XG4gICAgICAgICAgICBmb3IgKHZhciBwbmR4IGluIHZwcykge1xuICAgICAgICAgICAgICAgIGlmICh2cHNbcG5keF0ubWF0Y2ggJiYgdnBzW3BuZHhdLm1hdGNoLmZuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdW1WYWx1ZS5wdXNoKHZwc1twbmR4XS5pbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHVubWFza2VkVmFsdWUgPSB1bVZhbHVlLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiAoaXNSVEwgPyB1bVZhbHVlLnJldmVyc2UoKSA6IHVtVmFsdWUpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMub25Vbk1hc2spKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclZhbHVlID0gKGlzUlRMID8gZ2V0QnVmZmVyKCkuc2xpY2UoKS5yZXZlcnNlKCkgOiBnZXRCdWZmZXIoKSkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICB1bm1hc2tlZFZhbHVlID0gb3B0cy5vblVuTWFzay5jYWxsKGlucHV0bWFzaywgYnVmZmVyVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVubWFza2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FyZXQoaW5wdXQsIGJlZ2luLCBlbmQsIG5vdHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVQb3NpdGlvbihwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSVEwgJiYgdHlwZW9mIHBvcyA9PT0gXCJudW1iZXJcIiAmJiAoIW9wdHMuZ3JlZWR5IHx8IG9wdHMucGxhY2Vob2xkZXIgIT09IFwiXCIpICYmIGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IGVsLmlucHV0bWFzay5fdmFsdWVHZXQoKS5sZW5ndGggLSBwb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2Y
46184XIgcmFuZ2U7XG4gICAgICAgICAgICBpZiAoYmVnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICgkLmlzQXJyYXkoYmVnaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlzUlRMID8gYmVnaW5bMF0gOiBiZWdpblsxXTtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSBpc1JUTCA/IGJlZ2luWzFdIDogYmVnaW5bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZWdpbi5iZWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlzUlRMID8gYmVnaW4uYmVnaW4gOiBiZWdpbi5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gaXNSVEwgPyBiZWdpbi5lbmQgOiBiZWdpbi5iZWdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IG5vdHJhbnNsYXRlID8gYmVnaW4gOiB0cmFuc2xhdGVQb3NpdGlvbihiZWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IG5vdHJhbnNsYXRlID8gZW5kIDogdHJhbnNsYXRlUG9zaXRpb24oZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHlwZW9mIGVuZCA9PSBcIm51bWJlclwiID8gZW5kIDogYmVnaW47XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxDYWxjID0gcGFyc2VJbnQoKChpbnB1dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZ2V0Q29tcHV0ZWRTdHlsZSA/IChpbnB1dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZ2V0Q29tcHV0ZWRTdHlsZShpbnB1dCwgbnVsbCkgOiBpbnB1dC5jdXJyZW50U3R5bGUpLmZvbnRTaXplKSAqIGVuZDtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2Nyb2xsTGVmdCA9IHNjcm9sbENhbGMgPiBpbnB1dC5zY3JvbGxXaWR0aCA/IHNjcm9sbENhbGMgOiAwO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dG1hc2suY2FyZXRQb3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGVuZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInNlbGVjdGlvblN0YXJ0XCIgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IGJlZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZmlyc3RDaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGlucHV0LmZpcnN0Q2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmFwcGVuZENoaWxkKHRleHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoaW5wdXQuZmlyc3RDaGlsZCwgYmVnaW4gPCBpbnB1dC5pbnB1dG1hc2suX3ZhbHVlR2V0KCkubGVuZ3RoID8gYmVnaW4gOiBpbnB1dC5pbnB1dG1hc2suX3ZhbHVlR2V0KCkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQoaW5wdXQuZmlyc3RDaGlsZCwgZW5kIDwgaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCgpLmxlbmd0aCA/IGVuZCA6IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmNyZWF0ZVRleHRSYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gaW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubW92ZUVuZChcImNoYXJhY3RlclwiLCBlbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLm1vdmVTdGFydChcImNoYXJhY3RlclwiLCBiZWdpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJDb2xvck1hc2soaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJzZWxlY3Rpb25TdGFydFwiIGluIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IGlucHV0IHx8IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSByYW5nZS5zdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
46184H0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IDAgLSByYW5nZS5kdXBsaWNhdGUoKS5tb3ZlU3RhcnQoXCJjaGFyYWN0ZXJcIiwgLWlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBiZWdpbiArIHJhbmdlLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbjogbm90cmFuc2xhdGUgPyBiZWdpbiA6IHRyYW5zbGF0ZVBvc2l0aW9uKGJlZ2luKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBub3RyYW5zbGF0ZSA/IGVuZCA6IHRyYW5zbGF0ZVBvc2l0aW9uKGVuZClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRldGVybWluZUxhc3RSZXF1aXJlZFBvc2l0aW9uKHJldHVybkRlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBnZXRNYXNrVGVtcGxhdGUodHJ1ZSwgZ2V0TGFzdFZhbGlkUG9zaXRpb24oKSwgdHJ1ZSwgdHJ1ZSksIGJsID0gYnVmZmVyLmxlbmd0aCwgcG9zLCBsdnAgPSBnZXRMYXN0VmFsaWRQb3NpdGlvbigpLCBwb3NpdGlvbnMgPSB7fSwgbHZUZXN0ID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW2x2cF0sIG5keEludGx6ciA9IGx2VGVzdCAhPT0gdW5kZWZpbmVkID8gbHZUZXN0LmxvY2F0b3Iuc2xpY2UoKSA6IHVuZGVmaW5lZCwgdGVzdFBvcztcbiAgICAgICAgICAgIGZvciAocG9zID0gbHZwICsgMTsgcG9zIDwgYnVmZmVyLmxlbmd0aDsgcG9zKyspIHtcbiAgICAgICAgICAgICAgICB0ZXN0UG9zID0gZ2V0VGVzdFRlbXBsYXRlKHBvcywgbmR4SW50bHpyLCBwb3MgLSAxKTtcbiAgICAgICAgICAgICAgICBuZHhJbnRsenIgPSB0ZXN0UG9zLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbcG9zXSA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0ZXN0UG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsdlRlc3RBbHQgPSBsdlRlc3QgJiYgbHZUZXN0LmFsdGVybmF0aW9uICE9PSB1bmRlZmluZWQgPyBsdlRlc3QubG9jYXRvcltsdlRlc3QuYWx0ZXJuYXRpb25dIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgZm9yIChwb3MgPSBibCAtIDE7IHBvcyA+IGx2cDsgcG9zLS0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0UG9zID0gcG9zaXRpb25zW3Bvc107XG4gICAgICAgICAgICAgICAgaWYgKCh0ZXN0UG9zLm1hdGNoLm9wdGlvbmFsaXR5IHx8IHRlc3RQb3MubWF0Y2gub3B0aW9uYWxRdWFudGlmaWVyICYmIHRlc3RQb3MubWF0Y2gubmV3QmxvY2tNYXJrZXIgfHwgbHZUZXN0QWx0ICYmIChsdlRlc3RBbHQgIT09IHBvc2l0aW9uc1twb3NdLmxvY2F0b3JbbHZUZXN0LmFsdGVybmF0aW9uXSAmJiB0ZXN0UG9zLm1hdGNoLmZuICE9IG51bGwgfHwgdGVzdFBvcy5tYXRjaC5mbiA9PT0gbnVsbCAmJiB0ZXN0UG9zLmxvY2F0b3JbbHZUZXN0LmFsdGVybmF0aW9uXSAmJiBjaGVja0FsdGVybmF0aW9uTWF0Y2godGVzdFBvcy5sb2NhdG9yW2x2VGVzdC5hbHRlcm5hdGlvbl0udG9TdHJpbmcoKS5zcGxpdChcIixcIiksIGx2VGVzdEFsdC50b1N0cmluZygpLnNwbGl0KFwiLFwiKSkgJiYgZ2V0VGVzdHMocG9zKVswXS5kZWYgIT09IFwiXCIpKSAmJiBidWZmZXJbcG9zXSA9PT0gZ2V0UGxhY2Vob2xkZXIocG9zLCB0ZXN0UG9zLm1hdGNoKSkge1xuICAgICAgICAgICAgICAgICAgICBibC0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5EZWZpbml0aW9uID8ge1xuICAgICAgICAgICAgICAgIGw6IGJsLFxuICAgICAgICAgICAgICAgIGRlZjogcG9zaXRpb25zW2JsXSA/IHBvc2l0aW9uc1tibF0ubWF0Y2ggOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0gOiBibDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjbGVhck9wdGlvbmFsVGFpbChidWZmZXIpIHtcbiAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPSAwO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gZ2V0TWFza1RlbXBsYXRlKHRydWUsIDAsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSksIGxtbnQsIHZhbGlkUG9zO1xuICAgICAgICAgICAgd2hpbGUgKGxtbnQgPSB0ZW1wbGF0ZS5zaGlmdCgpLCBsbW50ICE9PSB1bmRlZmluZWQpIGJ1ZmZlci5wdXNoKGxtbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc0NvbXBsZXRlKGJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRzLmlzQ29tcGxldGUpKSByZXR1cm4gb3B0cy5pc0NvbXBsZXRlKGJ1ZmZlciwgb3B0cyk7XG4gICAgICAgICAgICBpZiAob3B0cy5yZXBlYXQgPT09IFwiKlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNvbXBsZXRlID0gZmFsc2UsIGxycCA9IGRldGVybWluZUxhc3RSZXF1aXJlZFBvc2l0aW9uKHRydWUpLCBhbWwgPSBzZWVrUHJldmlvdXMobHJwLmwpO1xuICAgICAgICAgICAgaWYgKGxycC5kZWYgPT09IHVuZGVmaW5lZCB8fCBscnAuZGVmLm5ld0Jsb2NrTWFya2VyIHx8IGxycC5kZWYub3B0aW9uYWxpdHkgfHwgbHJwLmRlZi5vcHRpb25hbFF1YW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYW1sOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3QgPSBnZXRUZXN0VGVtcGxhdGUoaSkubWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0LmZuICE9PSBudWxsICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXSA9PT0gdW5kZWZpbmVkICYmIHRlc3Qub3B0aW9uYWxpdHkgIT09IHRydWUgJiYgdGVzdC5vcHRpb25hbFF1YW50aWZpZXIgIT09IHRydWUgfHwgdGVzdC5mbiA9PT0gbnVsbCAmJiBidWZmZXJbaV0gIT09IGdldFBsYWNlaG9sZG
46184VyKGksIHRlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29tcGxldGU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVtb3ZlKGlucHV0LCBrLCBwb3MsIHN0cmljdCwgZnJvbUlzVmFsaWQpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm51bWVyaWNJbnB1dCB8fCBpc1JUTCkge1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgayA9IElucHV0bWFzay5rZXlDb2RlLkRFTEVURTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGsgPT09IElucHV0bWFzay5rZXlDb2RlLkRFTEVURSkge1xuICAgICAgICAgICAgICAgICAgICBrID0gSW5wdXRtYXNrLmtleUNvZGUuQkFDS1NQQUNFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNSVEwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlbmQgPSBwb3MuZW5kO1xuICAgICAgICAgICAgICAgICAgICBwb3MuZW5kID0gcG9zLmJlZ2luO1xuICAgICAgICAgICAgICAgICAgICBwb3MuYmVnaW4gPSBwZW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UgJiYgcG9zLmVuZCAtIHBvcy5iZWdpbiA8IDEpIHtcbiAgICAgICAgICAgICAgICBwb3MuYmVnaW4gPSBzZWVrUHJldmlvdXMocG9zLmJlZ2luKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvcy5iZWdpbl0gIT09IHVuZGVmaW5lZCAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zLmJlZ2luXS5pbnB1dCA9PT0gb3B0cy5ncm91cFNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICBwb3MuYmVnaW4tLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGsgPT09IElucHV0bWFzay5rZXlDb2RlLkRFTEVURSAmJiBwb3MuYmVnaW4gPT09IHBvcy5lbmQpIHtcbiAgICAgICAgICAgICAgICBwb3MuZW5kID0gaXNNYXNrKHBvcy5lbmQsIHRydWUpICYmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zLmVuZF0gJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvcy5lbmRdLmlucHV0ICE9PSBvcHRzLnJhZGl4UG9pbnQpID8gcG9zLmVuZCArIDEgOiBzZWVrTmV4dChwb3MuZW5kKSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3MuYmVnaW5dICE9PSB1bmRlZmluZWQgJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvcy5iZWdpbl0uaW5wdXQgPT09IG9wdHMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zLmVuZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldmFsaWRhdGVNYXNrKHBvcyk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICE9PSB0cnVlICYmIG9wdHMua2VlcFN0YXRpYyAhPT0gZmFsc2UgfHwgb3B0cy5yZWdleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhbHRlcm5hdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbmV3UG9zID0gcmVzdWx0LmNhcmV0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQuY2FyZXQgOiByZXN1bHQucG9zID8gc2Vla05leHQocmVzdWx0LnBvcy5iZWdpbiA/IHJlc3VsdC5wb3MuYmVnaW4gOiByZXN1bHQucG9zKSA6IGdldExhc3RWYWxpZFBvc2l0aW9uKC0xLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGsgIT09IElucHV0bWFzay5rZXlDb2RlLkRFTEVURSB8fCBwb3MuYmVnaW4gPiBuZXdQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5iZWdpbiA9PSBuZXdQb3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbHZwID0gZ2V0TGFzdFZhbGlkUG9zaXRpb24ocG9zLmJlZ2luLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChsdnAgPCBwb3MuYmVnaW4gfHwgcG9zLmJlZ2luID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wID0gc2Vla05leHQobHZwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLnAgPSBwb3MuYmVnaW47XG4gICAgICAgICAgICAgICAgaWYgKGZyb21Jc1ZhbGlkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChnZXRNYXNrU2V0KCkucCA8IGx2cCAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbZ2V0TWFza1NldCgpLnBdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbG9yTWFzayhpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSAoaW5wdXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cpLmdldENvbXB1dGVkU3R5bGUoaW5wdXQsIG51bGwpO1xuICAgICAgICAgICAgZnVuY3Rpb24gZmluZENhcmV0UG9zKGNsaWVudHgpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpLCBjYXJldFBvcztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlsZSBpbiBjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihzdHlsZSkgJiYgc3R5bGUuaW5kZXhPZihcImZvbnRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVbc3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGUuc3R5bGUudGV4dFRyYW5zZm9ybSA9IGNvbXB1dGVkU3R5bGUudGV4dFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICBlLnN0eWxlLmxldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmxldHRlclNwYWNpbmc7XG4gICAgICAgICAgICAgICAgZS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICAgICAgICBlLnN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICAgICAgICAgIGUuc3R5bGUud2lkdGggPSBcImF1dG9cIjtcbiAgICAgICAgICAgICAgICBlLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAgICAgICAgIGUuc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTtcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRUZXh0ID0gaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCgpLCBwcmV2aW91c1dpZHRoID0gMCwgaXRsO1xuICAgICAgICAgICAgICAgIGZvciAoY2FyZXRQb3MgPSAwLCBpdGwgPSBpbnB1dFRleHQubGVuZ3RoOyBjYXJldFBvcyA8PSBpdGw7IGNhcmV0UG9zKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZS5pbm5lckhUTUwgKz0gaW5wdXRUZXh0LmNoYXJBdChjYXJldFBvcykgfHwgXCJfXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFdpZHRoID49IGNsaWVudHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQxID0gY2xpZW50eCAtIHByZXZpb3VzV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgb2Zmc2V0MiA9IGUub2Zmc2V0V2lkdGggLSBjbGllbnR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5pbm5lckhUTUwgPSBpbnB1dFRleHQuY2hhckF0KGNhcmV0UG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEgLT0gZS5vZmZzZXRXaWR0aCAvIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJldFBvcyA9IG9mZnNldDEgPCBvZmZzZXQyID8gY2FyZXRQb3MgLSAxIDogY2FyZXRQb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1dpZHRoID0gZS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZXRQb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGVtcGxhdGUuc3R5bGUud2lkdGggPSBjb21wdXRlZFN0eWxlLndpZHRoO1xuICAgICAgICAgICAgdGVtcGxhdGUuc3R5bGUudGV4dEFsaWduID0gY29tcHV0ZWRTdHlsZS50ZXh0QWxpZ247XG4gICAgICAgICAgICBjb2xvck1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgaW5wdXQuaW5wdXRtYXNrLmNvbG9yTWFzayA9IGNvbG9yTWFzaztcbiAgICAgICAgICAgIGNvbG9yTWFzay5jbGFzc05hbWUgPSBcImltLWNvbG9ybWFza1wiO1xuICAgICAgICAgICAgaW5wdXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29sb3JNYXNrLCBpbnB1dCk7XG4gICAgICAgICAgICBpbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGlucHV0KTtcbiAgICAgICAgICAgIGNvbG9yTWFzay5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICBjb2xvck1hc2suYXBwZW5kQ2hpbGQodGVtcGxhdGUpO1xuICAgICAgICAgICAgaW5wdXQuc3R5bGUubGVmdCA9IHRlbXBsYXRlLm9mZnNldExlZnQgKyBcInB4XCI7XG4gICAgICAgICAgICAkKGNvbG9yTWFzaykub24oXCJtb3VzZWxlYXZlXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVycy5tb3VzZWxlYXZlRXZlbnQuY2FsbChpbnB1dCwgWyBlIF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkKGNvbG9yTWFzaykub24oXCJtb3VzZWVudGVyXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVycy5tb3VzZWVudGVyRXZlbnQuY2FsbChpbnB1dCwgWyBlIF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkKGNvbG9yTWFzaykub24oXCJjbGlja1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIGZpbmRDYXJldFBvcyhlLmNsaWVudFgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVycy5jbGlja0V2ZW50LmNhbGwoaW5wdXQsIFsgZSBdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIElucHV0bWFzay5wcm90b3R5cGUucG9zaXRpb25Db2xvck1hc2sgPSBmdW5jdGlvbihpbnB1dCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGlucHV0LnN0eWxlLmxlZnQgPSB0ZW1wbGF0ZS5vZmZzZXRMZWZ0ICsgXCJweFwiO1xuICAgICAgICB9O1xuICAgICAgICBmdW5jdGlvbiByZW5kZXJDb2xvck1hc2soaW5wdXQsIGNhcmV0UG9zLCBjbGVhcikge1xuICAgICAgICAgICAgdmFyIG1hc2tUZW1wbGF0ZSA9IFtdLCBpc1N0YXRpYyA9IGZhbHNlLCB0ZXN0LCB0ZXN0UG9zLCBuZHhJbnRsenIsIHBvcyA9IDA7XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRFbnRyeShlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSBlbnRyeSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1N0YXRpYyAmJiAodGVzdC5mbiA9PT0gbnVsbCB8fCB0ZXN0UG9zLmlucHV0ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbWFza1RlbXBsYXRlLnB1c2goXCI8c3BhbiBjbGFzcz0naW0tc3RhdGljJz5cIiArIGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RhdGljICYmICh0ZXN0LmZuICE9PSBudWxsICYmIHRlc3RQb3MuaW5wdXQgIT09IHVuZGVmaW5lZCB8fCB0ZXN0LmRlZiA9PT0gXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNTdGF0aWMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG10bCA9IG1hc2tUZW1wbGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIG1hc2tUZW1wbGF0ZVttdGwgLSAxXSA9IG1hc2tUZW1wbGF0ZVttdGwgLSAxXSArIFwiPC9zcGFuPlwiO1xuICAgICAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG1hc2tUZW1wbGF0ZS5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldENhcmV0KCkge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUuc3BsaWNlKGNhcmV0UG9zLmJlZ2luLCAwLCBjYXJldFBvcy5iZWdpbiA9PT0gY2FyZXRQb3MuZW5kIHx8IGNhcmV0UG9zLmVuZCA+IGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoID8gJzxtYXJrIGNsYXNzPVwiaW0tY2FyZXRcIiBzdHlsZT1cImJvcmRlci1yaWdodC13aWR0aDogMXB4O2JvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XCI+JyA6ICc8bWFyayBjbGFzcz1cImltLWNhcmV0LXNlbGVjdFwiPicpO1xuICAgICAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUuc3BsaWNlKGNhcmV0UG9zLmVuZCArIDEsIDAsIFwiPC9tYXJrPlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sb3JNYXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNhcmV0UG9zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FyZXRQb3MgPSBjYXJldChpbnB1dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJldFBvcy5iZWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmV0UG9zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBjYXJldFBvc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xlYXIgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGx2cCA9IGdldExhc3RWYWxpZFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQb3MgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gdGVzdFBvcy5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZHhJbnRsenIgPSB0ZXN0UG9zLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFbnRyeShidWZmZXJbcG9zXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQb3MgPSBnZXRUZXN0VGVtcGxhdGUocG9zLCBuZHhJbnRsenIsIHBvcyAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSB0ZXN0UG9zLm1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5keEludGx6ciA9IHRlc3RQb3MubG9jYXRvci5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmppdE1hc2tpbmcgPT09IGZhbHNlIHx8IHBvcyA8IGx2cCB8fCB0eXBlb2Ygb3B0cy5qaXRNYXNraW5nID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKG9wdHMuaml0TWFza2luZykgJiYgb3B0cy5qaXRNYXNraW5nID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVudHJ5KGdldFBsYWNlaG9sZGVyKHBvcywgdGVzdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBwb3MgPCBtYXhMZW5ndGgpICYmICh0ZXN0LmZuICE9PSBudWxsIHx8IHRlc3QuZGVmICE9PSBcIlwiKSB8fCBsdnAgPiBwb3MgfHwgaXNTdGF0aWMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHNldEVudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHNldENhcmV0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IGNvbG9yTWFzay5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRpdlwiKVswXTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBtYXNrVGVtcGxhdGUuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dG1hc2sucG9zaXRpb25Db2xvck1hc2soaW5wdXQsIHRlbXBsYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYXNrKGVsZW0pIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzRWxlbWVudFR5cGVTdXBwb3J0ZWQoaW5wdXQsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXRjaFZhbHVlUHJvcGVydHkobnB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZUdldDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlU2V0O1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXRjaFZhbGhvb2sodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQudmFsSG9va3MgJiYgKCQudmFsSG9va3NbdHlwZV0gPT09IHVuZGVmaW5lZCB8fCAkLnZhbEhvb2tzW3R5cGVdLmlucHV0bWFza3BhdGNoICE9PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxob29rR2V0ID0gJC52YWxIb29rc1t0eXBlXSAmJiAkLnZhbEhvb2tzW3R5cGVdLmdldCA/ICQudmFsSG9va3NbdHlwZV0uZ2V0IDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxob29rU2V0ID0gJC52YWxIb29rc1t0eXBlXSAmJiAkLnZhbEhvb2tzW3R5cGVdLnNldCA/ICQudmFsSG9va3NbdHlwZV0uc2V0IDogZnVuY3Rpb24oZWxlbSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQudmFsSG9va3NbdHlwZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaW5wdXRtYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaW5wdXRtYXNrLm9wdHMuYXV0b1VubWFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5pbnB1dG1hc2sudW5tYXNrZWR2YWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciByZXN1bHQgPSB2YWxob29rR2V0KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGFzdFZhbGlkUG9zaXRpb24odW5kZWZpbmVkLCB1bmRlZmluZWQsIGVsZW0uaW5wdXRtYXNrLm1hc2tzZXQudmFsaWRQb3NpdGlvbnMpICE9PSAtMSB8fCBvcHRzLm51bGxhYmxlICE9PSB0cnVlID8gcmVzdWx0IDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHZhbGhvb2tHZXQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oZWxlbSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZWxlbSA9ICQoZWxlbSksIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGhvb2tTZXQoZWxlbSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaW5wdXRtYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0udHJpZ2dlcihcInNldHZhbHVlXCIsIFsgdmFsdWUgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1hc2twYXRjaDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dGVyKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRtYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRtYXNrLm9wdHMuYXV0b1VubWFzayA/IHRoaXMuaW5wdXRtYXNrLnVubWFza2VkdmFsdWUoKSA6IGdldExhc3RWYWxpZFBvc2l0aW9uKCkgIT09IC0xIHx8IG9wdHMubnVsbGFibGUgIT09IHRydWUgPyBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzICYmIG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgPyAoaXNSVEwgPyBjbGVhck9wdGlvbmFsVGFpbChnZXRCdWZmZXIoKS5zbGljZSgpKS5yZXZlcnNlKCkgOiBjbGVhck9wdGlvbmFsVGFpbChnZXRCdWZmZXIoKS5zbGljZSgpKSkuam9pbihcIlwiKSA6IHZhbHVlR2V0LmNhbGwodGhpcykgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiB2YWx1ZUdldC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldHRlcih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dG1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoXCJzZXR2YWx1ZVwiLCBbIHZhbHVlIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbGxOYXRpdmVWYWx1ZVNldEZhbGxiYWNrKG5wdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihucHQsIFwibW91c2VlbnRlclwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkaW5wdXQgPSAkKHRoaXMpLCBpbnB1dCA9IHRoaXMsIHZhbHVlID0gaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcInNldHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbnB0LmlucHV0bWFzay5fX3ZhbHVlR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5ub1ZhbHVlUGF0Y2hpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRQcm90b3R5cGVPZiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YgPSB0eXBlb2YgXCJ0ZXN0XCIuX19wcm90b19fID09PSBcIm9iamVjdFwiID8gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX3Byb3RvX187XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZVByb3BlcnR5ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZ2V0UHJvdG90eXBlT2YobnB0KSwgXCJ2YWx1ZVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUHJvcGVydHkgJiYgdmFsdWVQcm9wZXJ0eS5nZXQgJiYgdmFsdWVQcm9wZXJ0eS5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhbHVlR2V0ID0gdmFsdWVQcm9wZXJ0eS5nZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVNldCA9IHZhbHVlUHJvcGVydHkuc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5wdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChucHQudGFnTmFtZSAhPT0gXCJJTlBVVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUdldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5wdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXyAmJiBucHQuX19sb29rdXBHZXR0ZXJfXyhcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlR2V0ID0gbnB0Ll9fbG9va3VwR2V0dGVyX18oXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQgPSBucHQuX19sb29rdXBTZXR0ZXJfXyhcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucHQuX19kZWZpbmVHZXR0ZXJfXyhcInZhbHVlXCIsIGdldHRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wdC5fX2RlZmluZVNldHRlcl9fKFwidmFsdWVcIiwgc2V0dGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnB0LmlucHV0bWFzay5fX3ZhbHVlR2V0ID0gdmFsdWVHZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnB0LmlucHV0bWFzay5fX3ZhbHVlU2V0ID0gdmFsdWVTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBucHQuaW5wdXRtYXNrLl92YWx1ZUdldCA9IGZ1bmN0aW9uKG92ZXJydWxlUlRMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzUlRMICYmIG92ZXJydWxlUlRMICE9PSB0cnVlID8gdmFsdWVHZXQuY2FsbCh0aGlzLmVsKS5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKSA6IHZhbHVlR2V0LmNhbGwodGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgbnB0LmlucHV0bWFzay5fdmFsdWVTZXQgPSBmdW5jdGlvbih2YWx1ZSwgb3ZlcnJ1bGVSVEwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVNldC5jYWxsKHRoaXMuZWwsIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBcIlwiIDogb3ZlcnJ1bGVSVEwgIT09IHRydWUgJiYgaXNSVEwgPyB2YWx1ZS5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKSA6IHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVHZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlR2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFZhbGhvb2sobnB0LnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxOYXRpdmVWYWx1ZVNldEZhbGxiYWNrKG5wdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gaW5wdXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICB2Y
46184XIgaXNTdXBwb3J0ZWQgPSBpbnB1dC50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgJC5pbkFycmF5KGVsZW1lbnRUeXBlLCBvcHRzLnN1cHBvcnRzSW5wdXRUeXBlKSAhPT0gLTEgfHwgaW5wdXQuaXNDb250ZW50RWRpdGFibGUgfHwgaW5wdXQudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiO1xuICAgICAgICAgICAgICAgIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnRhZ05hbWUgPT09IFwiSU5QVVRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBlbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1N1cHBvcnRlZCA9IGVsLnR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaXNTdXBwb3J0ZWQgPSBcInBhcnRpYWxcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFZhbHVlUHJvcGVydHkoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpbnB1dC5pbnB1dG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgRXZlbnRSdWxlci5vZmYoZWxlbSk7XG4gICAgICAgICAgICB2Y
46184XIgaXNTdXBwb3J0ZWQgPSBpc0VsZW1lbnRUeXBlU3VwcG9ydGVkKGVsZW0sIG9wdHMpO1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGVsID0gZWxlbTtcbiAgICAgICAgICAgICAgICAkZWwgPSAkKGVsKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBsYWNlaG9sZGVyID0gZWwucGxhY2Vob2xkZXI7XG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gZWwgIT09IHVuZGVmaW5lZCA/IGVsLm1heExlbmd0aCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAobWF4TGVuZ3RoID09PSAtMSkgbWF4TGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmNvbG9yTWFzayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplQ29sb3JNYXNrKGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJpbnB1dG1vZGVcIiBpbiBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtb2RlID0gb3B0cy5pbnB1dG1vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJpbnB1dG1vZGVcIiwgb3B0cy5pbnB1dG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmRpc2FibGVQcmVkaWN0aXZlVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiYXV0b2NvcnJlY3RcIiBpbiBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmF1dG9jb3JyZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmNvbG9yTWFzayAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplQ29sb3JNYXNrKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudHlwZSA9IFwicGFzc3dvcmRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNTdXBwb3J0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwiaW0taW5zZXJ0XCIsIG9wdHMuaW5zZXJ0TW9kZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwic3VibWl0XCIsIEV2ZW50SGFuZGxlcnMuc3VibWl0RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcInJlc2V0XCIsIEV2ZW50SGFuZGxlcnMucmVzZXRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiYmx1clwiLCBFdmVudEhhbmRsZXJzLmJsdXJFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiZm9jdXNcIiwgRXZlbnRIYW5kbGVycy5mb2N1c0V2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY29sb3JNYXNrICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcImNsaWNrXCIsIEV2ZW50SGFuZGxlcnMuY2xpY2tFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcIm1vdXNlbGVhdmVcIiwgRXZlbnRIYW5kbGVycy5tb3VzZWxlYXZlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihlbCwgXCJtb3VzZWVudGVyXCIsIEV2ZW50SGFuZGxlcnMubW91c2VlbnRlckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcInBhc3RlXCIsIEV2ZW50SGFuZGxlcnMucGFzdGVFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiY3V0XCIsIEV2ZW50SGFuZGxlcnMuY3V0RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcImNvbXBsZXRlXCIsIG9wdHMub25jb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiaW5jb21wbGV0ZVwiLCBvcHRzLm9uaW5jb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiY2xlYXJlZFwiLCBvcHRzLm9uY2xlYXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbW9iaWxlICYmIG9wdHMuaW5wdXRFdmVudE9ubHkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwia2V5ZG93blwiLCBFdmVudEhhbmRsZXJzLmtleWRvd25FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcImtleXByZXNzXCIsIEV2ZW50SGFuZGxlcnMua2V5cHJlc3NFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihlbCwgXCJpbnB1dFwiLCBFdmVudEhhbmRsZXJzLmlucHV0RmFsbEJhY2tFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiYmVmb3JlaW5wdXRcIiwgRXZlbnRIYW5kbGVycy5iZWZvcmVJbnB1dEV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihlbCwgXCJzZXR2YWx1ZVwiLCBFdmVudEhhbmRsZXJzLnNldFZhbHVlRXZlbnQpO1xuICAgICAgICAgICAgICAgIHVuZG9WYWx1ZSA9IGdldEJ1ZmZlclRlbXBsYXRlKCkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWwuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKSAhPT0gXCJcIiB8fCBvcHRzLmNsZWFyTWFza09uTG9zdEZvY3VzID09PSBmYWxzZSB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBlbCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW5pdGlhbFZhbHVlID0gJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVNYXNrKSA/IG9wdHMub25CZWZvcmVNYXNrLmNhbGwoaW5wdXRtYXNrLCBlbC5pbnB1dG1hc2suX3ZhbHVlR2V0KHRydWUpLCBvcHRzKSB8fCBlbC5pbnB1dG1hc2suX3ZhbHVlR2V0KHRydWUpIDogZWwuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gXCJcIikgY2hlY2tWYWwoZWwsIHRydWUsIGZhbHNlLCBpbml0aWFsVmFsdWUuc3BsaXQoXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gZ2V0QnVmZmVyKCkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdW5kb1ZhbHVlID0gYnVmZmVyLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKGJ1ZmZlcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhckluY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE1hc2tTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhck1hc2tPbkxvc3RGb2N1cyAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExhc3RWYWxpZFBvc2l0aW9uKCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3B0aW9uYWxUYWlsKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgPT09IGZhbHNlIHx8IG9wdHMuc2hvd01hc2tPbkZvY3VzICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsIHx8IGVsLmlucHV0bWFzay5fdmFsdWVHZXQodHJ1ZSkgIT09IFwiXCIpIHdyaXRlQnVmZmVyKGVsLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGVsLCBzZWVrTmV4dChnZXRMYXN0VmFsaWRQb3NpdGlvbigpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlQnVmZmVyO1xuICAgICAgICBpZiAoYWN0aW9uT2JqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uT2JqLmFjdGlvbikge1xuICAgICAgICAgICAgICBjYXNlIFwiaXNDb21wbGV0ZVwiOlxuICAgICAgICAgICAgICAgIGVsID0gYWN0aW9uT2JqLmVsO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXRlKGdldEJ1ZmZlcigpKTtcblxuICAgICAgICAgICAgICBjYXNlIFwidW5tYXNrZWR2YWx1ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkIHx8IGFjdGlvbk9iai52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQnVmZmVyID0gYWN0aW9uT2JqLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlciA9ICgkLmlzRnVuY3Rpb24ob3B0cy5vbkJlZm9yZU1hc2spID8gb3B0cy5vbkJlZm9yZU1hc2suY2FsbChpbnB1dG1hc2ssIHZhbHVlQnVmZmVyLCBvcHRzKSB8fCB2YWx1ZUJ1ZmZlciA6IHZhbHVlQnVmZmVyKS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWwuY2FsbCh0aGlzLCB1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSwgdmFsdWVCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVXcml0ZSkpIG9wdHMub25CZWZvcmVXcml0ZS5jYWxsKGlucHV0bWFzaywgdW5kZWZpbmVkLCBnZXRCdWZmZXIoKSwgMCwgb3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZHZhbHVlKGVsKTtcblxuICAgICAgICAgICAgICBjYXNlIFwibWFza1wiOlxuICAgICAgICAgICAgICAgIG1hc2soZWwpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJmb3JtYXRcIjpcbiAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlciA9ICgkLmlzRnVuY3Rpb24ob3B0cy5vbkJlZm9yZU1hc2spID8gb3B0cy5vbkJlZm9yZU1hc2suY2FsbChpbnB1dG1hc2ssIGFjdGlvbk9iai52YWx1ZSwgb3B0cykgfHwgYWN0aW9uT2JqLnZhbHVlIDogYWN0aW9uT2JqLnZhbHVlKS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICBjaGVja1ZhbC5jYWxsKHRoaXMsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UsIHZhbHVlQnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uT2JqLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXNSVEwgPyBnZXRCdWZmZXIoKS5zbGljZSgpLnJldmVyc2UoKS5qb2luKFwiXCIpIDogZ2V0QnVmZmVyKCkuam9pbihcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOi
46184BtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldG1ldGFkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG1hc2tzZXQsIG9wdHMpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc1JUTCA/IGdldEJ1ZmZlcigpLnNsaWNlKCkucmV2ZXJzZSgpLmpvaW4oXCJcIikgOiBnZXRCdWZmZXIoKS5qb2luKFwiXCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJpc1ZhbGlkXCI6XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbk9iai52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlciA9IGFjdGlvbk9iai52YWx1ZS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWwuY2FsbCh0aGlzLCB1bmRlZmluZWQsIHRydWUsIHRydWUsIHZhbHVlQnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25PYmoudmFsdWUgPSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgdmFyIHJsID0gZGV0ZXJtaW5lTGFzdFJlcXVpcmVkUG9zaXRpb24oKSwgbG1pYiA9IGJ1ZmZlci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGZvciAoO2xtaWIgPiBybDsgbG1pYi0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc01hc2sobG1pYikpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXIuc3BsaWNlKHJsLCBsbWliICsgMSAtIHJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDb21wbGV0ZShidWZmZXIpICYmIGFjdGlvbk9iai52YWx1ZSA9PT0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKTtcblxuICAgICAgICAgICAgICBjYXNlIFwiZ2V0ZW1wdHltYXNrXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ1ZmZlclRlbXBsYXRlKCkuam9pbihcIlwiKTtcblxuICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsLmlucHV0bWFzaykge1xuICAgICAgICAgICAgICAgICAgICAkLmRhdGEoZWwsIFwiX2lucHV0bWFza19vcHRzXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAkZWwgPSAkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLl92YWx1ZVNldChvcHRzLmF1dG9Vbm1hc2sgPyB1bm1hc2tlZHZhbHVlKGVsKSA6IGVsLmlucHV0bWFzay5fdmFsdWVHZXQodHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9mZihlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5pbnB1dG1hc2suY29sb3JNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hc2sgPSBlbC5pbnB1dG1hc2suY29sb3JNYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXNrLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFzay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgY29sb3JNYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFzay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbG9yTWFzayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlUHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVsKSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmlucHV0bWFzay5fX3ZhbHVlR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGVsLmlucHV0bWFzay5fX3ZhbHVlR2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBlbC5pbnB1dG1hc2suX192YWx1ZVNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXyAmJiBlbC5fX2xvb2t1cEdldHRlcl9fKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5pbnB1dG1hc2suX192YWx1ZUdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLl9fZGVmaW5lR2V0dGVyX18oXCJ2YWx1ZVwiLCBlbC5pbnB1dG1hc2suX192YWx1ZUdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuX19kZWZpbmVTZXR0ZXJfXyhcInZhbHVlXCIsIGVsLmlucHV0bWFzay5fX3ZhbHVlU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiZ2V0bWV0YWRhdGFcIjpcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0FycmF
461845KG1hc2tzZXQubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXNrVGFyZ2V0ID0gZ2V0TWFza1RlbXBsYXRlKHRydWUsIDAsIGZhbHNlKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFza3NldC5tZXRhZGF0YSwgZnVuY3Rpb24obmR4LCBtdGR0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXRkdC5tYXNrID09PSBtYXNrVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1RhcmdldCA9IG10ZHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hc2tUYXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBtYXNrc2V0Lm1ldGFkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJbnB1dG1hc2s7XG59KTsiLCIvKiFcbiogaW5wdXRtYXNrLm51bWVyaWMuZXh0ZW5zaW9ucy5qc1xuKiBodHRwczovL2dpdGh1Yi5jb20vUm9iaW5IZXJib3RzL0lucHV0bWFza1xuKiBDb3B5cmlnaHQgKGMpIDIwMTAgLSAyMDE5IFJvYmluIEhlcmJvdHNcbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocClcbiogVmVyc2lvbjogNC4wLjZcbiovXG5cbihmdW5jdGlvbihmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShbIFwiLi9pbnB1dG1hc2tcIiBdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9pbnB1dG1hc2tcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZhY3Rvcnkod2luZG93LklucHV0bWFzayk7XG4gICAgfVxufSkoZnVuY3Rpb24oSW5wdXRtYXNrKSB7XG4gICAgdmFyICQgPSBJbnB1dG1hc2suZGVwZW5kZW5jeUxpYjtcbiAgICBmdW5jdGlvbiBhdXRvRXNjYXBlKHR4dCwgb3B0cykge1xuICAgICAgICB2Y
46184XIgZXNjYXBlZFR4dCA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoSW5wdXRtYXNrLnByb3RvdHlwZS5kZWZpbml0aW9uc1t0eHQuY2hhckF0KGkpXSB8fCBvcHRzLmRlZmluaXRpb25zW3R4dC5jaGFyQXQoaSldIHx8IG9wdHMub3B0aW9uYWxtYXJrZXIuc3RhcnQgPT09IHR4dC5jaGFyQXQoaSkgfHwgb3B0cy5vcHRpb25hbG1hcmtlci5lbmQgPT09IHR4dC5jaGFyQXQoaSkgfHwgb3B0cy5xdWFudGlmaWVybWFya2VyLnN0YXJ0ID09PSB0eHQuY2hhckF0KGkpIHx8IG9wdHMucXVhbnRpZmllcm1hcmtlci5lbmQgPT09IHR4dC5jaGFyQXQoaSkgfHwgb3B0cy5ncm91cG1hcmtlci5zdGFydCA9PT0gdHh0LmNoYXJBdChpKSB8fCBvcHRzLmdyb3VwbWFya2VyLmVuZCA9PT0gdHh0LmNoYXJBdChpKSB8fCBvcHRzLmFsdGVybmF0b3JtYXJrZXIgPT09IHR4dC5jaGFyQXQoaSkpIHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVHh0ICs9IFwiXFxcXFwiICsgdHh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgIH0gZWxzZSBlc2NhcGVkVHh0ICs9IHR4dC5jaGFyQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVzY2FwZWRUeHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFsaWduRGlnaXRzKGJ1ZmZlciwgZGlnaXRzLCBvcHRzKSB7XG4gICAgICAgIGlmIChkaWdpdHMgPiAwKSB7XG4gICAgICAgICAgICB2YXIgcmFkaXhQb3NpdGlvbiA9ICQuaW5BcnJheShvcHRzLnJhZGl4UG9pbnQsIGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAocmFkaXhQb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIucHVzaChvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgIHJhZGl4UG9zaXRpb24gPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGRpZ2l0czsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW3JhZGl4UG9zaXRpb24gKyBpXSA9IGJ1ZmZlcltyYWRpeFBvc2l0aW9uICsgaV0gfHwgXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gICAgSW5wdXRtYXNrLmV4dGVuZEFsaWFzZXMoe1xuICAgICAgICBudW1lcmljOiB7XG4gICAgICAgICAgICBtYXNrOiBmdW5jdGlvbihvcHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucmVwZWF0ICE9PSAwICYmIGlzTmFOKG9wdHMuaW50ZWdlckRpZ2l0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pbnRlZ2VyRGlnaXRzID0gb3B0cy5yZXBlYXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdHMucmVwZWF0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5ncm91cFNlcGFyYXRvciA9PT0gb3B0cy5yYWRpeFBvaW50ICYmIG9wdHMuZGlnaXRzICYmIG9wdHMuZGlnaXRzICE9PSBcIjBcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yYWRpeFBvaW50ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5ncm91cFNlcGFyYXRvciA9IFwiLFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMucmFkaXhQb2ludCA9PT0gXCIsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZ3JvdXBTZXBhcmF0b3IgPSBcIi5cIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIG9wdHMuZ3JvdXBTZXBhcmF0b3IgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5ncm91cFNlcGFyYXRvciA9PT0gXCIgXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5za2lwT3B0aW9uYWxQYXJ0Q2hhcmFjdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRzLmF1dG9Hcm91cCA9IG9wdHMuYXV0b0dyb3VwICYmIG9wdHMuZ3JvdXBTZXBhcmF0b3IgIT09IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuYXV0b0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0cy5ncm91cFNpemUgPT0gXCJzdHJpbmdcIiAmJiBpc0Zpbml0ZShvcHRzLmdyb3VwU2l6ZSkpIG9wdHMuZ3JvdXBTaXplID0gcGFyc2VJbnQob3B0cy5ncm91cFNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUob3B0cy5pbnRlZ2VyRGlnaXRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcHMgPSBNYXRoLmZsb29yKG9wdHMuaW50ZWdlckRpZ2l0cyAvIG9wdHMuZ3JvdXBTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBvcHRzLmludGVnZXJEaWdpdHMgJSBvcHRzLmdyb3VwU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuaW50ZWdlckRpZ2l0cyA9IHBhcnNlSW50KG9wdHMuaW50ZWdlckRpZ2l0cykgKyAobW9kID09PSAwID8gc2VwcyAtIDEgOiBzZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmludGVnZXJEaWdpdHMgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5pbnRlZ2VyRGlnaXRzID0gXCIqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucGxhY2Vob2xkZXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRzLnBsYWNlaG9sZGVyID0gb3B0cy5wbGFjZWhvbGRlci5jaGFyQXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQ2FyZXRPbkNsaWNrID09PSBcInJhZGl4Rm9jdXNcIiAmJiAob3B0cy5wbGFjZWhvbGRlciA9PT0gXCJcIiAmJiBvcHRzLmludGVnZXJPcHRpb25hbCA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdHMucG9zaXRpb25DYXJldE9uQ2xpY2sgP
46184SBcImx2cFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRzLmRlZmluaXRpb25zW1wiO1wiXSA9IG9wdHMuZGVmaW5pdGlvbnNbXCJ+XCJdO1xuICAgICAgICAgICAgICAgIG9wdHMuZGVmaW5pdGlvbnNbXCI7XCJdLmRlZmluaXRpb25TeW1ib2wgPSBcIn5cIjtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5udW1lcmljSW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5wb3NpdGlvbkNhcmV0T25DbGljayA9IG9wdHMucG9zaXRpb25DYXJldE9uQ2xpY2sgPT09IFwicmFkaXhGb2N1c1wiID8gXCJsdnBcIiA6IG9wdHMucG9zaXRpb25DYXJldE9uQ2xpY2s7XG4gICAgICAgICAgICAgICAgICAgIG9wdHMuZGlnaXRzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG9wdHMuZGlnaXRzKSkgb3B0cy5kaWdpdHMgPSAyO1xuICAgICAgICAgICAgICAgICAgICBvcHRzLmRlY2ltYWxQcm90ZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBtYXNrID0gXCJbK11cIjtcbiAgICAgICAgICAgICAgICBtYXNrICs9IGF1dG9Fc2NhcGUob3B0cy5wcmVmaXgsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmludGVnZXJPcHRpb25hbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXNrICs9IFwifnsxLFwiICsgb3B0cy5pbnRlZ2VyRGlnaXRzICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG1hc2sgKz0gXCJ+e1wiICsgb3B0cy5pbnRlZ2VyRGlnaXRzICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZGlnaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4RGVmID0gb3B0cy5kZWNpbWFsUHJvdGVjdCA/IFwiOlwiIDogb3B0cy5yYWRpeFBvaW50O1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZHEgPSBvcHRzLmRpZ2l0cy50b1N0cmluZygpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRxWzBdKSAmJiBkcVsxXSAmJiBpc0Zpbml0ZShkcVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gcmFkaXhEZWYgKyBcIjt7XCIgKyBvcHRzLmRpZ2l0cyArIFwifVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKG9wdHMuZGlnaXRzKSB8fCBwYXJzZUludChvcHRzLmRpZ2l0cykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5kaWdpdHNPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gXCJbXCIgKyByYWRpeERlZiArIFwiO3sxLFwiICsgb3B0cy5kaWdpdHMgKyBcIn1dXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgbWFzayArPSByYWRpeERlZiArIFwiO3tcIiArIG9wdHMuZGlnaXRzICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFzayArPSBhdXRvRXNjYXBlKG9wdHMuc3VmZml4LCBvcHRzKTtcbiAgICAgICAgICAgICAgICBtYXNrICs9IFwiWy1dXCI7XG4gICAgICAgICAgICAgICAgb3B0cy5ncmVlZHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFzaztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJcIixcbiAgICAgICAgICAgIGdyZWVkeTogZmFsc2UsXG4gICAgICAgICAgICBkaWdpdHM6IFwiKlwiLFxuICAgICAgICAgICAgZGlnaXRzT3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICBlbmZvcmNlRGlnaXRzT25CbHVyOiBmYWxzZSxcbiAgICAgICAgICAgIHJhZGl4UG9pbnQ6IFwiLlwiLFxuICAgICAgICAgICAgcG9zaXRpb25DYXJldE9uQ2xpY2s6IFwicmFkaXhGb2N1c1wiLFxuICAgICAgICAgICAgZ3JvdXBTaXplOiAzLFxuICAgICAgICAgICAgZ3JvdXBTZXBhcmF0b3I6IFwiXCIsXG4gICAgICAgICAgICBhdXRvR3JvdXA6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dNaW51czogdHJ1ZSxcbiAgICAgICAgICAgIG5lZ2F0aW9uU3ltYm9sOiB7XG4gICAgICAgICAgICAgICAgZnJvbnQ6IFwiLVwiLFxuICAgICAgICAgICAgICAgIGJhY2s6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlZ2VyRGlnaXRzOiBcIitcIixcbiAgICAgICAgICAgIGludGVnZXJPcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgIHByZWZpeDogXCJcIixcbiAgICAgICAgICAgIHN1ZmZpeDogXCJcIixcbiAgICAgICAgICAgIHJpZ2h0QWxpZ246IHRydWUsXG4gICAgICAgICAgICBkZWNpbWFsUHJvdGVjdDogdHJ1ZSxcbiAgICAgICAgICAgIG1pbjogbnVsbCxcbiAgICAgICAgICAgIG1heDogbnVsbCxcbiAgICAgICAgICAgIHN0ZXA6IDEsXG4gICAgICAgICAgICBpbnNlcnRNb2RlOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1VubWFzazogZmFsc2UsXG4gICAgICAgICAgICB1bm1hc2tBc051bWJlcjogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIHByZVZhbGlkYXRpb246IGZ1bmN0aW9uKGJ1ZmZlciwgcG9zLCBjLCBpc1NlbGVjdGlvbiwgb3B0cywgbWFza3NldCkge1xuICAgICAgICAgICAgICAgIGlmIChjID09PSBcIi1cIiB8fCBjID09PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmFsbG93TWludXMgIT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pc05lZ2F0aXZlID0gb3B0cy5pc05lZ2F0aXZlID09PSB1bmRlZmluZWQgPyB0cnVlIDogIW9wdHMuaXNOZWdhdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5qb2luKFwiXCIpID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0OiBtYXNrc2V0LnZhbGlkUG9zaXRpb25zW3Bvc10gPyBwb3MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3Bvc3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0aW9uID09PSBmYWxzZSAmJiBjID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgKG9wdHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiYgKGlzTmFOKG9wdHMuZGlnaXRzKSB8fCBwYXJzZUludChvcHRzLmRpZ2l0cykgPiAwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4UG9zID0gJC5pbkFycmF5KG9wdHMucmFkaXhQb2ludCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl4UG9zICE9PSAtMSAmJiBtYXNrc2V0LnZhbGlkUG9zaXRpb25zW3JhZGl4UG9zXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5udW1lcmljSW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zID09PSByYWRpeFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IHJhZGl4UG9zICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3N0VmFsaWRhdGlvbjogZnVuY3Rpb24oYnVmZmVyLCBwb3MsIGN1cnJlbnRSZXN1bHQsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBidWlsZFBvc3RNYXNrKGJ1ZmZlciwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcG9zdE1hc2sgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWFzayArPSBcIihcIiArIG9wdHMuZ3JvdXBTZXBhcmF0b3IgKyBcIip7XCIgKyBvcHRzLmdyb3VwU2l6ZSArIFwifSl7Kn1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4U3BsaXQgPSBidWZmZXIuam9pbihcIlwiKS5zcGxpdChvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl4U3BsaXRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWFzayArPSBvcHRzLnJhZGl4UG9pbnQgKyBcIip7XCIgKyByYWRpeFNwbGl0WzFdLm1hdGNoKC9eXFxkKlxcPz9cXGQqLylbMF0ubGVuZ3RoICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3RNYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc3VmZml4ID0gb3B0cy5zdWZmaXguc3BsaXQoXCJcIiksIHByZWZpeCA9IG9wdHMucHJlZml4LnNwbGl0KFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UmVzdWx0LnBvcyA9PT0gdW5kZWZpbmVkICYmIGN1cnJlbnRSZXN1bHQuY2FyZXQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50UmVzdWx0LmRvcG9zdCAhPT0gdHJ1ZSkgcmV0dXJuIGN1cnJlbnRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgdmFyIGNhcmV0UG9zID0gY3VycmVudFJlc3VsdC5jYXJldCAhPT0gdW5kZWZpbmVkID8gY3VycmVudFJlc3VsdC5jYXJldCA6IGN1cnJlbnRSZXN1bHQucG9zO1xuICAgICAgICAgICAgICAgIHZhciBtYXNrZWRWYWx1ZSA9IGJ1ZmZlci5zbGljZSgpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLm51bWVyaWNJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBjYXJldFBvcyA9IG1hc2tlZFZhbHVlLmxlbmd0aCAtIGNhcmV0UG9zIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUgPSBtYXNrZWRWYWx1ZS5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjaGFyQXRQb3MgPSBtYXNrZWRWYWx1ZVtjYXJldFBvc107XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJBdFBvcyA9PT0gb3B0cy5ncm91cFNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICBjYXJldFBvcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBjaGFyQXRQb3MgPSBtYXNrZWRWYWx1ZVtjYXJldFBvc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjYXJldFBvcyA9PT0gbWFza2VkVmFsdWUubGVuZ3RoIC0gb3B0cy5zdWZmaXgubGVuZ3RoIC0gMSAmJiBjaGFyQXRQb3MgPT09IG9wdHMucmFkaXhQb2ludCkgcmV0dXJuIGN1cnJlbnRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJBdFBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRQb3MgIT09IG9wdHMucmFkaXhQb2ludCAmJiBjaGFyQXRQb3MgIT09IG9wdHMubmVnYXRpb25TeW1ib2wuZnJvbnQgJiYgY2hhckF0UG9zICE9PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlW2NhcmV0UG9zXSA9IFwiP1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucHJlZml4Lmxlbmd0aCA+IDAgJiYgY2FyZXRQb3MgPj0gKG9wdHMuaXNOZWdhdGl2ZSA9PT0gZmFsc2UgPyAxIDogMCkgJiYgY2FyZXRQb3MgPCBvcHRzLnByZWZpeC5sZW5ndGggLSAxICsgKG9wdHMuaXNOZWdhdGl2ZSA9PT0gZmFsc2UgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhbY2FyZXRQb3MgLSAob3B0cy5pc05lZ2F0aXZlID09PSBmYWxzZSA/IDEgOiAwKV0gPSBcIj9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0cy5zdWZmaXgubGVuZ3RoID4gMCAmJiBjYXJldFBvcyA+PSBtYXNrZWRWYWx1ZS5sZW5ndGggLSBvcHRzLnN1ZmZpeC5sZW5ndGggLSAob3B0cy5pc05lZ2F0aXZlID09PSBmYWxzZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeFtjYXJldFBvcyAtIChtYXNrZWRWYWx1ZS5sZW5ndGggLSBvcHRzLnN1ZmZpeC5sZW5ndGggLSAob3B0cy5pc05lZ2F0aXZlID09PSBmYWxzZSA/IDEgOiAwKSldID0gXCI/XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4LmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NWYWx1ZSA9IG1hc2tlZFZhbHVlLmpvaW4oXCJcIikucmVwbGFjZShwcmVmaXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5yZXBsYWNlKHN1ZmZpeCwgXCJcIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5ncm91cFNlcGFyYXRvciksIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChcIlstXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCkgKyBcIl1cIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spICsgXCIkXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ob3B0cy5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5wbGFjZWhvbGRlciksIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzVmFsdWUubGVuZ3RoID4gMSAmJiBwcm9jZXNzVmFsdWUuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRQb3MgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZSgvXlxcPy9nLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZSgvXjAvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzVmFsdWUuY2hhckF0KDApID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgb3B0cy5yYWRpeFBvaW50ICE9PSBcIlwiICYmIG9wdHMubnVtZXJpY0lucHV0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgI
46184HByb2Nlc3NWYWx1ZSA9IFwiMFwiICsgcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc1ZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghb3B0cy5kaWdpdHNPcHRpb25hbCB8fCBvcHRzLmVuZm9yY2VEaWdpdHNPbkJsdXIgJiYgY3VycmVudFJlc3VsdC5ldmVudCA9PT0gXCJibHVyXCIpICYmIGlzRmluaXRlKG9wdHMuZGlnaXRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4UG9zaXRpb24gPSAkLmluQXJyYXkob3B0cy5yYWRpeFBvaW50LCBwcm9jZXNzVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJwYiA9ICQuaW5BcnJheShvcHRzLnJhZGl4UG9pbnQsIG1hc2tlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWRpeFBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZS5wdXNoKG9wdHMucmFkaXhQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXhQb3NpdGlvbiA9IHByb2Nlc3NWYWx1ZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gb3B0cy5kaWdpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIW9wdHMuZGlnaXRzT3B0aW9uYWwgfHwgb3B0cy5lbmZvcmNlRGlnaXRzT25CbHVyICYmIGN1cnJlbnRSZXN1bHQuZXZlbnQgPT09IFwiYmx1clwiKSAmJiAocHJvY2Vzc1ZhbHVlW3JhZGl4UG9zaXRpb24gKyBpXSA9PT0gdW5kZWZpbmVkIHx8IHByb2Nlc3NWYWx1ZVtyYWRpeFBvc2l0aW9uICsgaV0gPT09IG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWVbcmFkaXhQb3NpdGlvbiArIGldID0gY3VycmVudFJlc3VsdC5wbGFjZWhvbGRlciB8fCBvcHRzLnBsYWNlaG9sZGVyLmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwYiAhPT0gLTEgJiYgbWFza2VkVmFsdWVbcnBiICsgaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWVbcmFkaXhQb3NpdGlvbiArIGldID0gcHJvY2Vzc1ZhbHVlW3JhZGl4UG9zaXRpb24gKyBpXSB8fCBtYXNrZWRWYWx1ZVtycGIgKyBpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuYXV0b0dyb3VwID09PSB0cnVlICYmIG9wdHMuZ3JvdXBTZXBhcmF0b3IgIT09IFwiXCIgJiYgKGNoYXJBdFBvcyAhPT0gb3B0cy5yYWRpeFBvaW50IHx8IGN1cnJlbnRSZXN1bHQucG9zICE9PSB1bmRlZmluZWQgfHwgY3VycmVudFJlc3VsdC5kb3Bvc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYWRkUmFkaXggPSBwcm9jZXNzVmFsdWVbcHJvY2Vzc1ZhbHVlLmxlbmd0aCAtIDFdID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgY3VycmVudFJlc3VsdC5jID09PSBvcHRzLnJhZGl4UG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBJbnB1dG1hc2soYnVpbGRQb3N0TWFzayhwcm9jZXNzVmFsdWUsIG9wdHMpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0lucHV0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdE1hc2tpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIqXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05P11cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JtYXQocHJvY2Vzc1ZhbHVlLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFJhZGl4KSBwcm9jZXNzVmFsdWUgKz0gb3B0cy5yYWRpeFBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NWYWx1ZS5jaGFyQXQoMCkgPT09IG9wdHMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmlzTmVnYXRpdmUgJiYgY3VycmVudFJlc3VsdC5ldmVudCA9PT0gXCJibHVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pc05lZ2F0aXZlID0gcHJvY2Vzc1ZhbHVlICE9PSBcIjBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJlZml4ICsgcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSArPSBzdWZmaXg7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuaXNOZWdhdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250ICsgcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgKz0gb3B0cy5uZWdhdGlvblN5bWJvbC5iYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJBdFBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRQb3MgIT09IG9wdHMucmFkaXhQb2ludCAmJiBjaGFyQXRQb3MgIT09IG9wdHMubmVnYXRpb25TeW1ib2wuZnJvbnQgJiYgY2hhckF0UG9zICE9PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0UG9zID0gJC5pbkFycmF5KFwiP1wiLCBwcm9jZXNzVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmV0UG9zID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWVbY2FyZXRQb3NdID0gY2hhckF0UG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNhcmV0UG9zID0gY3VycmVudFJlc3VsdC5jYXJldCB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJBdFBvcyA9PT0gb3B0cy5yYWRpeFBvaW50IHx8IGNoYXJBdFBvcyA9PT0gb3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCB8fCBjaGFyQXRQb3MgPT09IG9wdHMubmVnYXRpb25TeW1ib2wuYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NhcmV0UG9zID0gJC5pbkFycmF5KGNoYXJBdFBvcywgcHJvY2Vzc1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXJldFBvcyAhPT0gLTEpIGNhcmV0UG9zID0gbmV3Q2FyZXRQb3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMubnVtZXJpY0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmV0UG9zID0gcHJvY2Vzc1ZhbHVlLmxlbmd0aCAtIGNhcmV0UG9zIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJzbHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmV0OiAoY2hhckF0UG9zID09PSB1bmRlZmluZWQgfHwgY3VycmVudFJlc3VsdC5wb3MgIT09IHVuZGVmaW5lZCkgJiYgY2FyZXRQb3MgIT09IHVuZGVmaW5lZCA/IGNhcmV0UG9zICsgKG9wdHMubnVtZXJpY0lucHV0ID8gLTEgOiAxKSA6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEZyb21CdWZmZXI6IGN1cnJlbnRSZXN1bHQuZG9wb3N0IHx8IGJ1ZmZlci5qb2luKFwiXCIpICE9PSBwcm9jZXNzVmFsdWUuam9pbihcIlwiKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzbHQucmVmcmVzaEZyb21CdWZmZXIgPyByc2x0IDogY3VycmVudFJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkJlZm9yZVdyaXRlOiBmdW5jdGlvbihlLCBidWZmZXIsIGNhcmV0UG9zLCBvcHRzKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VNaW5NYXhPcHRpb25zKG9wdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucGFyc2VNaW5NYXhPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLm1pbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMubWluID0gb3B0cy5taW4udG9TdHJpbmc
46184oKS5yZXBsYWNlKG5ldyBSZWdFeHAoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMuZ3JvdXBTZXBhcmF0b3IpLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLnJhZGl4UG9pbnQgPT09IFwiLFwiKSBvcHRzLm1pbiA9IG9wdHMubWluLnJlcGxhY2Uob3B0cy5yYWRpeFBvaW50LCBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5taW4gPSBpc0Zpbml0ZShvcHRzLm1pbikgPyBwYXJzZUZsb2F0KG9wdHMubWluKSA6IE5hTjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4ob3B0cy5taW4pKSBvcHRzLm1pbiA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5tYXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLm1heCA9IG9wdHMubWF4LnRvU3RyaW5nKCkucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLmdyb3VwU2VwYXJhdG9yKSwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yYWRpeFBvaW50ID09PSBcIixcIikgb3B0cy5tYXggPSBvcHRzLm1heC5yZXBsYWNlKG9wdHMucmFkaXhQb2ludCwgXCIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMubWF4ID0gaXNGaW5pdGUob3B0cy5tYXgpID8gcGFyc2VGbG9hdChvcHRzLm1heCkgOiBOYU47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG9wdHMubWF4KSkgb3B0cy5tYXggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5wYXJzZU1pbk1heE9wdGlvbnMgPSBcImRvbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5wb3N0VmFsaWRhdGlvbihidWZmZXIsIGNhcmV0UG9zLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvcG9zdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb3B0cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja3ZhbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVubWFza2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VNaW5NYXhPcHRpb25zKG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMubWluICE9PSBudWxsIHx8IG9wdHMubWF4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSBvcHRzLm9uVW5NYXNrKGJ1ZmZlci5qb2luKFwiXCIpLCB1bmRlZmluZWQsICQuZXh0ZW5kKHt9LCBvcHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubWFza0FzTnVtYmVyOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLm1pbiAhPT0gbnVsbCAmJiB1bm1hc2tlZCA8IG9wdHMubWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuaXNOZWdhdGl2ZSA9IG9wdHMubWluIDwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMucG9zdFZhbGlkYXRpb24ob3B0cy5taW4udG9TdHJpbmcoKS5yZXBsYWNlKFwiLlwiLCBvcHRzLnJhZGl4UG9pbnQpLnNwbGl0KFwiXCIpLCBjYXJldFBvcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9wb3N0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0cy5tYXggIT09IG51bGwgJiYgdW5tYXNrZWQgPiBvcHRzLm1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmlzTmVnYXRpdmUgPSBvcHRzLm1heCA8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLnBvc3RWYWxpZGF0aW9uKG9wdHMubWF4LnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgb3B0cy5yYWRpeFBvaW50KS5zcGxpdChcIlwiKSwgY2FyZXRQb3MsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0OiBjYXJldFBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvcG9zdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5wb3N0VmFsaWRhdGlvbihidWZmZXIsIGNhcmV0UG9zLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJibHVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9wdHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIl9jaGVja3ZhbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldDogY2FyZXRQb3NcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184H07XG5cbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVnZXg6IHtcbiAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydDogZnVuY3Rpb24ob3B0cywgZW1wdHlDaGVjaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlDaGVjayA/IG5ldyBSZWdFeHAoXCJbXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCkgKyBcIitdP1wiKSA6IG5ldyBSZWdFeHAoXCJbXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCkgKyBcIitdP1xcXFxkK1wiKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGludGVnZXJOUGFydDogZnVuY3Rpb24ob3B0cykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIltcXFxcZFwiICsgSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMuZ3JvdXBTZXBhcmF0b3IpICsgSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApKSArIFwiXStcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmluaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgXCJ+XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cywgaXNTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkLCBsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocnMgPT09IFwia1wiIHx8IGNocnMgPT09IFwibVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaHJzID09PSBcImtcIiA/IDIgOiA1OyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQuaW5zZXJ0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MgKyBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZC5wb3MgPSBwb3MgKyBsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHN0cmljdCA/IG5ldyBSZWdFeHAoXCJbMC05XCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5ncm91cFNlcGFyYXRvcikgKyBcIl1cIikudGVzdChjaHJzKSA6IG5ldyBSZWdFeHAoXCJbMC05XVwiKS50ZXN0KGNocnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5udW1lcmljSW5wdXQgIT09IHRydWUgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3NdICE9PSB1bmRlZmluZWQgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3NdLm1hdGNoLmRlZiA9PT0gXCJ+XCIgJiYgIWlzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzVmFsdWUgPSBtYXNrc2V0LmJ1ZmZlci5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKFwiWy1cIiArIElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250KSArIFwiXVwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spICsgXCIkXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHB2UmFkaXhTcGxpdCA9IHByb2Nlc3NWYWx1ZS5zcGxpdChvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHZSYWRpeFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2UmFkaXhTcGxpdFsxXSA9IHB2UmFkaXhTcGxpdFsxXS5yZXBsYWNlKC8wL2csIG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHZSYWRpeFNwbGl0WzBdID09PSBcIjBcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZSYWRpeFNwbGl0WzBdID0gcHZSYWRpeFNwbGl0WzBdLnJlcGxhY2UoLzAvZywgb3B0cy5wbGFjZWhvbGRlci5jaGFyQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHB2UmFkaXhTcGxpdFswXSArIG9wdHMucmFkaXhQb2ludCArIHB2UmFkaXhTcGxpdFsxXSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyVGVtcGxhdGUgPSBtYXNrc2V0Ll9idWZmZXIuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NWYWx1ZSA9PT0gb3B0cy5yYWRpeFBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBidWZmZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJvY2Vzc1ZhbHVlLm1hdGNoKElucHV0bWFzay5lc2NhcGVSZWdleChidWZmZXJUZW1wbGF0ZSkgKyBcIiRcIikgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRlbXBsYXRlID0gYnVmZmVyVGVtcGxhdGUuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UoYnVmZmVyVGVtcGxhdGUsIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzVmFsdWVbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogcG9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IHBvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiBjaHJzID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3MgLSAxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MgKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIrXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuYWxsb3dNaW51cyAmJiAoY2hycyA9PT0gXCItXCIgfHwgY2hycyA9PT0gb3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCItXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuYWxsb3dNaW51cyAmJiBjaHJzID09PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2s7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI6XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4ID0gXCJbXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5yYWRpeFBvaW50KSArIFwiXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSBuZXcgUmVnRXhwKHJhZGl4KS50ZXN0KGNocnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3NdICYmIG1hc2tzZXQudmFsaWRQb3NpdGlvbnNbcG9zXS5tYXRjaC5wbGFjZWhvbGRlciA9PT0gb3B0cy5yYWRpeFBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IHBvcyArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogZnVuY3Rpb24ob3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMucmFkaXhQb2ludDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodW5tYXNrZWRWYWx1ZSA9PT0gXCJcIiAmJiBvcHRzLm51bGxhYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvY2Vzc1ZhbHVlID0gbWFza2VkVmFsdWUucmVwbGFjZShvcHRzLnByZWZpeCwgXCJcIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2Uob3B0cy5zdWZmaXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMuZ3JvdXBTZXBhcmF0b3IpLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLnBsYWNlaG9sZGVyLmNoYXJBdCgwKSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApLCBcImdcIiksIFwiMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMudW5tYXNrQXNOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIiAmJiBwcm9jZXNzVmFsdWUuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQpICE9PSAtMSkgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4LmNhbGwodGhpcywgb3B0cy5yYWRpeFBvaW50KSwgXCIuXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKFwiXlwiICsgSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMubmVnYXRpb25TeW1ib2wuZnJvbnQpKSwgXCItXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spICsgXCIkXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihwcm9jZXNzVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKGJ1ZmZlciwgb3B0cykge1xuICAgICAgICAgICAgICAgIHZhciBtYXNrZWRWYWx1ZSA9IChvcHRzLm51bWVyaWNJbnB1dCA/IGJ1ZmZlci5zbGljZSgpLnJldmVyc2UoKSA6IGJ1ZmZlcikuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSA9IG1hc2tlZFZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChcIl5cIiArIElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250KSksIFwiLVwiKTtcbiAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSA9IG1hc2tlZFZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5iYWNrKSArIFwiJFwiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgbWFza2VkVmFsdWUgPSBtYXNrZWRWYWx1ZS5yZXBsYWNlKG9wdHMucHJlZml4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSA9IG1hc2tlZFZhbHVlLnJlcGxhY2Uob3B0cy5zdWZmaXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlID0gbWFza2VkVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLmdyb3VwU2VwYXJhdG9yKSArIFwiKFswLTldezN9KVwiLCBcImdcIiksIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCA9PT0gXCIsXCIpIG1hc2tlZFZhbHVlID0gbWFza2VkVmFsdWUucmVwbGFjZShJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5yYWRpeFBvaW50KSwgXCIuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZShtYXNrZWRWYWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25CZWZvcmVNYXNrOiBmdW5jdGlvbihpbml0aWFsVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBvcHRzLmlzTmVnYXRpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl4UG9pbnQgPSBvcHRzLnJhZGl4UG9pbnQgfHwgXCIsXCI7XG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgaW5pdGlhbFZhbHVlID09IFwibnVtYmVyXCIgfHwgb3B0cy5pbnB1dFR5cGUgPT09IFwibnVtYmVyXCIpICYmIHJhZGl4UG9pbnQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgcmFkaXhQb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZVBhcnRzID0gaW5pdGlhbFZhbHVlLnNwbGl0KHJhZGl4UG9pbnQpLCBpbnRlZ2VyUGFydCA9IHZhbHVlUGFydHNbMF0ucmVwbGFjZSgvW15cXC0wLTldL2csIFwiXCIpLCBkZWNpbWFsUGFydCA9IHZhbHVlUGFydHMubGVuZ3RoID4gMSA/IHZhbHVlUGFydHNbMV0ucmVwbGFjZSgvW14wLTldL2csIFwiXCIpIDogXCJcIjtcbiAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbnRlZ2VyUGFydCArIChkZWNpbWFsUGFydCAhPT0gXCJcIiA/IHJhZGl4UG9pbnQgKyBkZWNpbWFsUGFydCA6IGRlY2ltYWxQYXJ0KTtcbiAgICAgICAgICAgICAgICB2Y
46184XIgZGlnaXRzID0gMDtcbiAgICAgICAgICAgICAgICBpZiAocmFkaXhQb2ludCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSBkZWNpbWFsUGFydC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNpbWFsUGFydCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZ2l0c0ZhY3RvciA9IE1hdGgucG93KDEwLCBkaWdpdHMgfHwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUob3B0cy5kaWdpdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gcGFyc2VJbnQob3B0cy5kaWdpdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0c0ZhY3RvciA9IE1hdGgucG93KDEwLCBkaWdpdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLnJlcGxhY2UoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KHJhZGl4UG9pbnQpLCBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUoaW5pdGlhbFZhbHVlKSkgaW5pdGlhbFZhbHVlID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGluaXRpYWxWYWx1ZSkgKiBkaWdpdHNGYWN0b3IpIC8gZGlnaXRzRmFjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgcmFkaXhQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZGlnaXRzID09PSAwICYmIGluaXRpYWxWYWx1ZS5pbmRleE9mKElucHV0bWFzay5lc2NhcGVSZWdleChyYWRpeFBvaW50KSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZS5zdWJzdHJpbmcoMCwgaW5pdGlhbFZhbHVlLmluZGV4T2YoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KHJhZGl4UG9pbnQpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbkRpZ2l0cyhpbml0aWFsVmFsdWUudG9TdHJpbmcoKS5zcGxpdChcIlwiKSwgZGlnaXRzLCBvcHRzKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSwgYnVmZmVyLCBjYXJldFBvcywgb3B0cykge1xuICAgICAgICAgICAgICAgIHZhciAkaW5wdXQgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIElucHV0bWFzay5rZXlDb2RlLlVQOlxuICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbChwYXJzZUZsb2F0KHRoaXMuaW5wdXRtYXNrLnVubWFza2VkdmFsdWUoKSkgKyBwYXJzZUludChvcHRzLnN0ZXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC50cmlnZ2VyKFwic2V0dmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5wdXRtYXNrLmtleUNvZGUuRE9XTjpcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC52YWwocGFyc2VGbG9hdCh0aGlzLmlucHV0bWFzay51bm1hc2tlZHZhbHVlKCkpIC0gcGFyc2VJbnQob3B0cy5zdGVwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcInNldHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGN1cnJlbmN5OiB7XG4gICAgICAgICAgICBwcmVmaXg6IFwiJCBcIixcbiAgICAgICAgICAgIGdyb3VwU2VwYXJhdG9yOiBcIixcIixcbiAgICAgICAgICAgIGFsaWFzOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIjBcIixcbiAgICAgICAgICAgIGF1dG9Hcm91cDogdHJ1ZSxcbiAgICAgICAgICAgIGRpZ2l0czogMixcbiAgICAgICAgICAgIGRpZ2l0c09wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBkZWNpbWFsOiB7XG4gICAgICAgICAgICBhbGlhczogXCJudW1lcmljXCJcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdlcjoge1xuICAgICAgICAgICAgYWxpYXM6IFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgZGlnaXRzOiAwLFxuICAgICAgICAgICAgcmFkaXhQb2ludDogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBwZXJjZW50YWdlOiB7XG4gICAgICAgICAgICBhbGlhczogXCJudW1lcmljXCIsXG4gICAgICAgICAgICBkaWdpdHM6IDIsXG4gICAgICAgICAgICBkaWdpdHNPcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgIHJhZGl4UG9pbnQ6IFwiLlwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiMFwiLFxuICAgICAgICAgICAgYXV0b0dyb3VwOiBmYWxzZSxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgICAgc3VmZml4OiBcIiAlXCIsXG4gICAgICAgICAgICBhbGxvd01pbnVzOiBmYWxzZVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIElucHV0bWFzaztcbn0pOyIsInJlcXVpcmUoXCIuL2Rpc3QvaW5wdXRtYXNrL2lucHV0bWFzay5leHRlbnNpb25zXCIpO1xyXG5yZXF1aXJlKFwiLi9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2suZGF0ZS5leHRlbnNpb25zXCIpO1xyXG5yZXF1aXJlKFwiLi9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2subnVtZXJpYy5leHRlbnNpb25zXCIpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2suanNcIik7XHJcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVud
46184HMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuICAgICAgLy8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgfTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBkb2MsIG5vZGUgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblx0XHRcdFx0aWYgKCBub2RlWyBpIF0gKSB7XG5cdFx0XHRcdFx0c2NyaXB0WyBpIF0gPSBub2RlWyBpIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjMuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2
46184VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJi
46184Bjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBBcnJheS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vI
46184HByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy82MTI1XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF
461845TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF
461845TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIH
46184doaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybi
46184BlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1
46184ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1
46184ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0Vs
46184ZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGl
46184kIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1
46184ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybi
46184B0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2
46184N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
46184BtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybi
46184BmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybi
46184BkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybi
46184BmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaG
46184Vja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybi
46184BtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5
46184hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlI
46184HJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybi
46184BzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgP
46184SBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJi
46184B0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybi
46184BtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgP
46184SAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybi
46184B0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZX
46184Zpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJpZnJhbWVcIiApICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG4gICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcbiAgICAgICAgfVxuXG4gICAgICAgI
vendor: 12,571 bytes, line 46184
46184HJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbigg
46184aSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtY
46184XhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNl
vendor: 4,913 bytes, line 46184
46184ID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlI
46184G1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9h
46184ZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBhbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUg
46184XSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvb
46184iB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybi
46184BkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF0
461847XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4I
46184F0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O
461841xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbn
46184RleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx
461845IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZF
46184R5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJi
46184BzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbW
46184UsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1l
46184U3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibG
46184U6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybi
46184B0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybi
46184B0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgZG9jLCBub2RlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybi
46184B0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6
46184IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBh
46184IHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgXCJhYnNvbHV0ZVwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0
461847XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG9cbi8vIGEgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5LlxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdO1xuXHRpZiAoICFyZXQgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz
461840gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblx0XHQpICk7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gdmFsdWVJc0JvcmRlckJveCAmJlxuXHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gKTtcblxuXHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0aWYgKCB2YWwgPT09IFwiYXV0b1wiIHx8XG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSB7XG5cblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF07XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlc1xuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlO1xuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1
46184ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybi
46184BzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgPT09IHN0eWxlcy5wb3NpdGlvbiApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS
461845zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJv
46184cEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZ
46184hbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO
461841xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O
461841xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlI
46184HF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLF
46184xuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF0
461847XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS
461845tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS
461845jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz
461840gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF
461845LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHd
46184oaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96
46184aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybi
46184BzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhV
46184HlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybi
46184B0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybi
46184B7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1
46184ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhV
46184HlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbn
46184RUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW
461841lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybi
46184BqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHI
46184oKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1
46184ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1
46184ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLm
46184NyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSF
46184IsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gP
46184SBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybi
46184Bkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybi
46184B3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybi
46184Bwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhF
46184IFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlI
46184HRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2Y
46184XIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG4
vendor: 7,481 bytes, line 46184
461847XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwi
46184LyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9tYXN0ZXIvTElDRU5TRSBmaWxlLiBBblxuICogYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluXG4gKiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW
461841teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2Y
46184XIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwucHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBnbG9iYWwucHJvY2Vzcy5kb21haW4pIHtcbiAgICAgIGludm9rZSA9IGdsb2JhbC5wcm9jZXNzLmRvbWFpbi5iaW5kKGludm9rZSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybi
46184BhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2Y
46184XIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybi
46184BDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2Y
46184XIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vI
46184HZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2Y
46184XIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2Y
46184XIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2Y
46184XIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2Y
46184XIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBBbW9uZyB0aGUgdmFyaW91cyB0cmlja3MgZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsXG4gIC8vIG9iamVjdCwgdGhpcyBzZWVtcyB0byBiZSB0aGUgbW9zdCByZWxpYWJsZSB0ZWNobmlxdWUgdGhhdCBkb2VzIG5vdFxuICAvLyB1c2UgaW5kaXJlY3QgZXZhbCAod2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kpLlxuICB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6XG4gIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHRoaXNcbik7XG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KChmdW5jdGlvbiB3ZWJwYWNrTG9hZE9wdGlvbmFsRXh0ZXJuYWxNb2R1bGUoKSB7IHRyeSB7IHJldHVybiByZXF1aXJlKFwiZnNcIik7IH0gY2F0Y2goZSkge30gfSgpKSwgcmVxdWlyZShcInBhdGhcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiZnNcIiwgXCJwYXRoXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlR3aWdcIl0gPSBmYWN0b3J5KChmdW5jdGlvbiB3ZWJwYWNrTG9hZE9wdGlvbmFsRXh0ZXJuYWxNb2R1bGUoKSB7IHRyeSB7IHJldHVybiByZXF1aXJlKFwiZnNcIik7IH0gY2F0Y2goZSkge30gfSgpKSwgcmVxdWlyZShcInBhdGhcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlR3aWdcIl0gPSBmYWN0b3J5KHJvb3RbXCJmc1wiXSwgcm9vdFtcInBhdGhcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzIwX18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybi
46184Btb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyoqXG5cdCAqIFR3aWcuanNcblx0ICpcblx0ICogQGNvcHlyaWdodCAyMDExLTIwMTYgSm9obiBSb2Vwa2UgYW5kIHRoZSBUd2lnLmpzIENvbnRyaWJ1dG9yc1xuXHQgKiBAbGljZW5zZSAgIEF2YWlsYWJsZSB1bmRlciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2Vcblx0ICogQGxpbmsgICAgICBodHRwczovL2dpdGh1Yi5jb20vdHdpZ2pzL3R3aWcuanNcblx0ICovXG5cblx0dmFyIFR3aWcgPSB7XG5cdCAgICBWRVJTSU9OOiAnMC4xMC4yJ1xuXHR9O1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMSkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMikoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMykoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNSkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNikoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNykoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcpKFR3aWcpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KShUd2lnKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMSkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjIpKFR3aWcpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKShUd2lnKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyNCkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjUpKFR3aWcpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KShUd2lnKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyNykoVHdpZyk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBUd2lnLmV4cG9ydHM7XG5cblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vICMjIHR3aWcuY29yZS5qc1xuXHQvL1xuXHQvLyBUaGlzIGZpbGUgaGFuZGxlcyB0ZW1wbGF0ZSBsZXZlbCB0b2tlbml6aW5nLCBjb21waWxpbmcgYW5kIHBhcnNpbmcuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFR3aWcpIHtcblx0ICAgIFwidXNlIHN0cmljdFwiO1xuXG5cdCAgICBUd2lnLnRyYWNlID0gZmFsc2U7XG5cdCAgICBUd2lnLmRlYnVnID0gZmFsc2U7XG5cblx0ICAgIC8vIERlZmF1bHQgY2FjaGluZyB0byB0cnVlIGZvciB0aGUgaW1wcm92ZWQgcGVyZm9ybWFuY2UgaXQgb2ZmZXJzXG5cdCAgICBUd2lnLmNhY2hlID0gdHJ1ZTtcblxuXHQgICAgVHdpZy5ub29wID0gZnVuY3Rpb24oKSB7fTtcblxuXHQgICAgVHdpZy5wbGFjZWhvbGRlcnMgPSB7XG5cdCAgICAgICAgcGFyZW50OiBcInt7fFBBUkVOVHx9fVwiXG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEZhbGxiYWNrIGZvciBBcnJheS5pbmRleE9mIGZvciBJRTggZXQgYWxcblx0ICAgICAqL1xuXHQgICAgVHdpZy5pbmRleE9mID0gZnVuY3Rpb24gKGFyciwgc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovICkge1xuXHQgICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJpbmRleE9mXCIpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBhcnIuaW5kZXhPZihzZWFyY2hFbGVtZW50KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGFyciA9PT0gdm9pZCAwIHx8IGFyciA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciB0ID0gT2JqZWN0KGFycik7XG5cdCAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXHQgICAgICAgIGlmIChsZW4gPT09IDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuIC0xO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2Y
46184XIgbiA9IDA7XG5cdCAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIG4gPSBOdW1iZXIoYXJndW1lbnRzWzFdKTtcblx0ICAgICAgICAgICAgaWYgKG4gIT09IG4pIHsgLy8gc2hvcnRjdXQgZm9yIHZlcmlmeWluZyBpZiBpdCdzIE5hTlxuXHQgICAgICAgICAgICAgICAgbiA9IDA7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSBJbmZpbml0eSAmJiBuICE9PSAtSW5maW5pdHkpIHtcblx0ICAgICAgICAgICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG4gPj0gbGVuKSB7XG5cdCAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaW5kZXhPZiBub3QgZm91bmQxIFwiLCBKU09OLnN0cmluZ2lmeShzZWFyY2hFbGVtZW50KSwgSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG5cdCAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGsgPSBuID49IDAgPyBuIDogTWF0aC5tYXgobGVuIC0gTWF0aC5hYnMobiksIDApO1xuXHQgICAgICAgIGZvciAoOyBrIDwgbGVuOyBrKyspIHtcblx0ICAgICAgICAgICAgaWYgKGsgaW4gdCAmJiB0W2tdID09PSBzZWFyY2hFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoYXJyID09IHNlYXJjaEVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaW5kZXhPZiBub3QgZm91bmQyIFwiLCBKU09OLnN0cmluZ2lmeShzZWFyY2hFbGVtZW50KSwgSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG5cblx0ICAgICAgICByZXR1cm4gLTE7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuZm9yRWFjaCA9IGZ1bmN0aW9uIChhcnIsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG5cdCAgICAgICAgaWYgKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICkge1xuXHQgICAgICAgICAgICByZXR1cm4gYXJyLmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBULCBrO1xuXG5cdCAgICAgICAgaWYgKCBhcnIgPT0gbnVsbCApIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIFwiIHRoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZFwiICk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gMS4gTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0IHBhc3NpbmcgdGhlIHx0aGlzfCB2YWx1ZSBhcyB0aGUgYXJndW1lbnQuXG5cdCAgICAgICAgdmFyIE8gPSBPYmplY3QoYXJyKTtcblxuXHQgICAgICAgIC8vIDIuIExldCBsZW5WYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEdldCBpbnRlcm5hbCBtZXRob2Qgb2YgTyB3aXRoIHRoZSBhcmd1bWVudCBcImxlbmd0aFwiLlxuXHQgICAgICAgIC8vIDMuIExldCBsZW4gYmUgVG9VaW50MzIobGVuVmFsdWUpLlxuXHQgICAgICAgIHZhciBsZW4gPSBPLmxlbmd0aCA+Pj4gMDsgLy8gSGFjayB0byBjb252ZXJ0IE8ubGVuZ3RoIHRvIGEgVUludDMyXG5cblx0ICAgICAgICAvLyA0LiBJZiBJc0NhbGxhYmxlKGNhbGxiYWNrKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuXHQgICAgICAgIC8vIFNlZTogaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS4xMVxuXHQgICAgICAgIGlmICgge30udG9TdHJpbmcuY2FsbChjYWxsYmFjaykgIT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiICkge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggY2FsbGJhY2sgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiICk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gNS4gSWYgdGhpc0FyZyB3YXMgc3VwcGxpZWQsIGxldCBUIGJlIHRoaXNBcmc7IGVsc2UgbGV0IFQgYmUgdW5kZWZpbmVkLlxuXHQgICAgICAgIGlmICggdGhpc0FyZyApIHtcblx0ICAgICAgICAgIFQgPSB0aGlzQXJnO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIDYuIExldCBrIGJlIDBcblx0ICAgICAgICBrID0gMDtcblxuXHQgICAgICAgIC8vIDcuIFJlcGVhdCwgd2hpbGUgayA8IGxlblxuXHQgICAgICAgIHdoaWxlKCBrIDwgbGVuICkge1xuXG5cdCAgICAgICAgICB2Y
46184XIga1ZhbHVlO1xuXG5cdCAgICAgICAgICAvLyBhLiBMZXQgUGsgYmUgVG9TdHJpbmcoaykuXG5cdCAgICAgICAgICAvLyAgIFRoaXMgaXMgaW1wbGljaXQgZm9yIExIUyBvcGVyYW5kcyBvZiB0aGUgaW4gb3BlcmF0b3Jcblx0ICAgICAgICAgIC8vIGIuIExldCBrUHJlc2VudCBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEhhc1Byb3BlcnR5IGludGVybmFsIG1ldGhvZCBvZiBPIHdpdGggYXJndW1lbnQgUGsuXG5cdCAgICAgICAgICAvLyAgIFRoaXMgc3RlcCBjYW4gYmUgY29tYmluZWQgd2l0aCBjXG5cdCAgICAgICAgICAvLyBjLiBJZiBrUHJlc2VudCBpcyB0cnVlLCB0aGVuXG5cdCAgICAgICAgICBpZiAoIGsgaW4gTyApIHtcblxuXHQgICAgICAgICAgICAvLyBpLiBMZXQga1ZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgR2V0IGludGVybmFsIG1ldGhvZCBvZiBPIHdpdGggYXJndW1lbnQgUGsuXG5cdCAgICAgICAgICAgIGtWYWx1ZSA9IE9bIGsgXTtcblxuXHQgICAgICAgICAgICAvLyBpaS4gQ2FsbCB0aGUgQ2FsbCBpbnRlcm5hbCBtZXRob2Qgb2YgY2FsbGJhY2sgd2l0aCBUIGFzIHRoZSB0aGlzIHZhbHVlIGFuZFxuXHQgICAgICAgICAgICAvLyBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcga1ZhbHVlLCBrLCBhbmQgTy5cblx0ICAgICAgICAgICAgY2FsbGJhY2suY2FsbCggVCwga1ZhbHVlLCBrLCBPICk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICAvLyBkLiBJbmNyZWFzZSBrIGJ5IDEuXG5cdCAgICAgICAgICBrKys7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIDguIHJldHVybiB1bmRlZmluZWRcblx0ICAgIH07XG5cblx0ICAgIFR3aWcubWVyZ2UgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgb25seUNoYW5nZWQpIHtcblx0ICAgICAgICBUd2lnLmZvckVhY2goT2JqZWN0LmtleXMoc291cmNlKSwgZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgICAgICBpZiAob25seUNoYW5nZWQgJiYgIShrZXkgaW4gdGFyZ2V0KSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgcmV0dXJuIHRhcmdldDtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogRXhjZXB0aW9uIHRocm93biBieSB0d2lnLmpzLlxuXHQgICAgICovXG5cdCAgICBUd2lnLkVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgZmlsZSkge1xuXHQgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgICAgIHRoaXMubmFtZSA9IFwiVHdpZ0V4Y2VwdGlvblwiO1xuXHQgICAgICAgdGhpcy50eXBlID0gXCJUd2lnRXhjZXB0aW9uXCI7XG5cdCAgICAgICB0aGlzLmZpbGUgPSBmaWxlO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIFR3aWcgZXJyb3IuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMubmFtZSArIFwiOiBcIiArIHRoaXMubWVzc2FnZTtcblxuXHQgICAgICAgIHJldHVybiBvdXRwdXQ7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFdyYXBwZXIgZm9yIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9nID0ge1xuXHQgICAgICAgIHRyYWNlOiBmdW5jdGlvbigpIHtpZiAoVHdpZy50cmFjZSAmJiBjb25zb2xlKSB7Y29uc29sZS5sb2coQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7fX0sXG5cdCAgICAgICAgZGVidWc6IGZ1bmN0aW9uKCkge2lmIChUd2lnLmRlYnVnICYmIGNvbnNvbGUpIHtjb25zb2xlLmxvZyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTt9fVxuXHQgICAgfTtcblxuXG5cdCAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUuZXJyb3IgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0ICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUubG9nICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdCAgICAgICAgICAgIFR3aWcubG9nLmVycm9yID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBUd2lnLmxvZy5lcnJvciA9IGZ1bmN0aW9uKCl7fTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBXcmFwcGVyIGZvciBjaGlsZCBjb250ZXh0IG9iamVjdHMgaW4gVHdpZy5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBWYWx1ZXMgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGV4dCB3aXRoLlxuXHQgICAgICovXG5cdCAgICBUd2lnLkNoaWxkQ29udGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcblx0ICAgICAgICB2Y
46184XIgQ2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gQ2hpbGRDb250ZXh0KCkge307XG5cdCAgICAgICAgQ2hpbGRDb250ZXh0LnByb3RvdHlwZSA9IGNvbnRleHQ7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBDaGlsZENvbnRleHQoKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ29udGFpbmVyIGZvciBtZXRob2RzIHJlbGF0ZWQgdG8gaGFuZGxpbmcgaGlnaCBsZXZlbCB0ZW1wbGF0ZSB0b2tlbnNcblx0ICAgICAqICAgICAgKGZvciBleGFtcGxlOiB7eyBleHByZXNzaW9uIH19LCB7JSBsb2dpYyAlfSwgeyMgY29tbWVudCAjfSwgcmF3IGRhdGEpXG5cdCAgICAgKi9cblx0ICAgIFR3aWcudG9rZW4gPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUb2tlbiB0eXBlcy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy50b2tlbi50eXBlID0ge1xuXHQgICAgICAgIG91dHB1dDogICAgICAgICAgICAgICAgICdvdXRwdXQnLFxuXHQgICAgICAgIGxvZ2ljOiAgICAgICAgICAgICAgICAgICdsb2dpYycsXG5cdCAgICAgICAgY29tbWVudDogICAgICAgICAgICAgICAgJ2NvbW1lbnQnLFxuXHQgICAgICAgIHJhdzogICAgICAgICAgICAgICAgICAgICdyYXcnLFxuXHQgICAgICAgIG91dHB1dF93aGl0ZXNwYWNlX3ByZTogICdvdXRwdXRfd2hpdGVzcGFjZV9wcmUnLFxuXHQgICAgICAgIG91dHB1dF93aGl0ZXNwYWNlX3Bvc3Q6ICdvdXRwdXRfd2hpdGVzcGFjZV9wb3N0Jyxcblx0ICAgICAgICBvdXRwdXRfd2hpdGVzcGFjZV9ib3RoOiAnb3V0cHV0X3doaXRlc3BhY2VfYm90aCcsXG5cdCAgICAgICAgbG9naWNfd2hpdGVzcGFjZV9wcmU6ICAgJ2xvZ2ljX3doaXRlc3BhY2VfcHJlJyxcblx0ICAgICAgICBsb2dpY193aGl0ZXNwYWNlX3Bvc3Q6ICAnbG9naWNfd2hpdGVzcGFjZV9wb3N0Jyxcblx0ICAgICAgICBsb2dpY193aGl0ZXNwYWNlX2JvdGg6ICAnbG9naWNfd2hpdGVzcGFjZV9ib3RoJ1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUb2tlbiBzeW50YXggZGVmaW5pdGlvbnMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcudG9rZW4uZGVmaW5pdGlvbnMgPSBbXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUucmF3LFxuXHQgICAgICAgICAgICBvcGVuOiAneyUgcmF3ICV9Jyxcblx0ICAgICAgICAgICAgY2xvc2U6ICd7JSBlbmRyYXcgJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5yYXcsXG5cdCAgICAgICAgICAgIG9wZW46ICd7JSB2ZXJiYXRpbSAlfScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAneyUgZW5kdmVyYmF0aW0gJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyAqV2hpdGVzcGFjZSB0eXBlIHRva2Vucypcblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFRoZXNlIHR5cGljYWxseSB0YWtlIHRoZSBmb3JtIGB7ey0gZXhwcmVzc2lvbiAtfX1gIG9yIGB7ey0gZXhwcmVzc2lvbiB9fWAgb3IgYHt7IGV4cHJlc3Npb24gLX19YC5cblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9wcmUsXG5cdCAgICAgICAgICAgIG9wZW46ICd7ey0nLFxuXHQgICAgICAgICAgICBjbG9zZTogJ319J1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcG9zdCxcblx0ICAgICAgICAgICAgb3BlbjogJ3t7Jyxcblx0ICAgICAgICAgICAgY2xvc2U6ICctfX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9ib3RoLFxuXHQgICAgICAgICAgICBvcGVuOiAne3stJyxcblx0ICAgICAgICAgICAgY2xvc2U6ICctfX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3ByZSxcblx0ICAgICAgICAgICAgb3BlbjogJ3slLScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3Bvc3QsXG5cdCAgICAgICAgICAgIG9wZW46ICd7JScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnLSV9J1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9ib3RoLFxuXHQgICAgICAgICAgICBvcGVuOiAneyUtJyxcblx0ICAgICAgICAgICAgY2xvc2U6ICctJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyAqT3V0cHV0IHR5cGUgdG9rZW5zKlxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gVGhlc2UgdHlwaWNhbGx5IHRha2UgdGhlIGZvcm0gYHt7IGV4cHJlc3Npb24gfX1gLlxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLm91dHB1dCxcblx0ICAgICAgICAgICAgb3BlbjogJ3t7Jyxcblx0ICAgICAgICAgICAgY2xvc2U6ICd9fSdcblx0ICAgICAgICB9LFxuXHQgICAgICAgIC8vICpMb2dpYyB0eXBlIHRva2Vucypcblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFRoZXNlIHR5cGljYWxseSB0YWtlIGEgZm9ybSBsaWtlIGB7JSBpZiBleHByZXNzaW9uICV9YCBvciBgeyUgZW5kaWYgJX1gXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUubG9naWMsXG5cdCAgICAgICAgICAgIG9wZW46ICd7JScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyAqQ29tbWVudCB0eXBlIHRva2Vucypcblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFRoZXNlIHRha2UgdGhlIGZvcm0gYHsjIGFueXRoaW5nICN9YFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLmNvbW1lbnQsXG5cdCAgICAgICAgICAgIG9wZW46ICd7IycsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnI30nXG5cdCAgICAgICAgfVxuXHQgICAgXTtcblxuXG5cdCAgICAvKipcblx0ICAgICAqIFdoYXQgY2hhcmFjdGVycyBzdGFydCBcInN0cmluZ3NcIiBpbiB0b2tlbiBkZWZpbml0aW9ucy4gV2UgbmVlZCB0aGlzIHRvIGlnbm9yZSB0b2tlbiBjbG9zZVxuXHQgICAgICogc3RyaW5ncyBpbnNpZGUgYW4gZXhwcmVzc2lvbi5cblx0ICAgICAqL1xuXHQgICAgVHdpZy50b2tlbi5zdHJpbmdzID0gW
46184ydcIicsIFwiJ1wiXTtcblxuXHQgICAgVHdpZy50b2tlbi5maW5kU3RhcnQgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcblx0ICAgICAgICB2YXIgb3V0cHV0ID0ge1xuXHQgICAgICAgICAgICAgICAgcG9zaXRpb246IG51bGwsXG5cdCAgICAgICAgICAgICAgICBjbG9zZV9wb3NpdGlvbjogbnVsbCxcblx0ICAgICAgICAgICAgICAgIGRlZjogbnVsbFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBpLFxuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgZmlyc3Rfa2V5X3Bvc2l0aW9uLFxuXHQgICAgICAgICAgICBjbG9zZV9rZXlfcG9zaXRpb247XG5cblx0ICAgICAgICBmb3IgKGk9MDtpPFR3aWcudG9rZW4uZGVmaW5pdGlvbnMubGVuZ3RoO2krKykge1xuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZSA9IFR3aWcudG9rZW4uZGVmaW5pdGlvbnNbaV07XG5cdCAgICAgICAgICAgIGZpcnN0X2tleV9wb3NpdGlvbiA9IHRlbXBsYXRlLmluZGV4T2YodG9rZW5fdGVtcGxhdGUub3Blbik7XG5cdCAgICAgICAgICAgIGNsb3NlX2tleV9wb3NpdGlvbiA9IHRlbXBsYXRlLmluZGV4T2YodG9rZW5fdGVtcGxhdGUuY2xvc2UpO1xuXG5cdCAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy50b2tlbi5maW5kU3RhcnQ6IFwiLCBcIlNlYXJjaGluZyBmb3IgXCIsIHRva2VuX3RlbXBsYXRlLm9wZW4sIFwiIGZvdW5kIGF0IFwiLCBmaXJzdF9rZXlfcG9zaXRpb24pO1xuXG5cdCAgICAgICAgICAgIC8vU3BlY2lhbCBoYW5kbGluZyBmb3IgbWlzbWF0Y2hlZCB0b2tlbnNcblx0ICAgICAgICAgICAgaWYgKGZpcnN0X2tleV9wb3NpdGlvbiA+PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAvL1RoaXMgdG9rZW4gbWF0Y2hlcyB0aGUgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbl90ZW1wbGF0ZS5vcGVuLmxlbmd0aCAhPT0gdG9rZW5fdGVtcGxhdGUuY2xvc2UubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHRva2VuIGhhcyBtaXNtYXRjaGVkIGNsb3NpbmcgYW5kIG9wZW5pbmcgdGFnc1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZV9rZXlfcG9zaXRpb24gPCAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyB0b2tlbidzIGNsb3NpbmcgdGFnIGRvZXMgbm90IG1hdGNoIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gRG9lcyB0aGlzIHRva2VuIG9jY3VyIGJlZm9yZSBhbnkgb3RoZXIgdHlwZXM/XG5cdCAgICAgICAgICAgIGlmIChmaXJzdF9rZXlfcG9zaXRpb24gPj0gMCAmJiAob3V0cHV0LnBvc2l0aW9uID09PSBudWxsIHx8IGZpcnN0X2tleV9wb3NpdGlvbiA8IG91dHB1dC5wb3NpdGlvbikpIHtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IGZpcnN0X2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5kZWYgPSB0b2tlbl90ZW1wbGF0ZTtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZV9wb3NpdGlvbiA9IGNsb3NlX2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdF9rZXlfcG9zaXRpb24gPj0gMCAmJiBvdXRwdXQucG9zaXRpb24gIT09IG51bGwgJiYgZmlyc3Rfa2V5X3Bvc2l0aW9uID09PSBvdXRwdXQucG9zaXRpb24pIHtcblx0ICAgICAgICAgICAgICAgIC8qVGhpcyB0b2tlbiBleGFjdGx5IG1hdGNoZXMgYW5vdGhlciB0b2tlbixcblx0ICAgICAgICAgICAgICAgIGdyZWVkaWx5IG1hdGNoIHRvIGNoZWNrIGlmIHRoaXMgdG9rZW4gaGFzIGEgZ3JlYXRlciBzcGVjaWZpY2l0eSovXG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW5fdGVtcGxhdGUub3Blbi5sZW5ndGggPiBvdXRwdXQuZGVmLm9wZW4ubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHRva2VuJ3Mgb3BlbmluZyB0YWcgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBwcmV2aW91cyBtYXRjaFxuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IGZpcnN0X2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZGVmID0gdG9rZW5fdGVtcGxhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlX3Bvc2l0aW9uID0gY2xvc2Vfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbl90ZW1wbGF0ZS5vcGVuLmxlbmd0aCA9PT0gb3V0cHV0LmRlZi5vcGVuLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbl90ZW1wbGF0ZS5jbG9zZS5sZW5ndGggPiBvdXRwdXQuZGVmLmNsb3NlLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgdG9rZW4ncyBvcGVuaW5nIHRhZyBpcyBhcyBzcGVjaWZpYyBhcyB0aGUgcHJldmlvdXMgbWF0Y2gsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vYnV0IHRoZSBjbG9zaW5nIHRhZyBoYXMgZ3JlYXRlciBzcGVjaWZpY2l0eVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2Vfa2V5X3Bvc2l0aW9uID49IDAgJiYgY2xvc2Vfa2V5X3Bvc2l0aW9uIDwgb3V0cHV0LmNsb3NlX3Bvc2l0aW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgdG9rZW4ncyBjbG9zaW5nIHRhZyBleGlzdHMgaW4gdGhlIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgaXQgb2NjdXJzIHNvb25lciB0aGFuIHRoZSBwcmV2aW91cyBtYXRjaFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gZmlyc3Rfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlZiA9IHRva2VuX3RlbXBsYXRlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlX3Bvc2l0aW9uID0gY2xvc2Vfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbG9zZV9rZXlfcG9zaXRpb24gPj0gMCAmJiBjbG9zZV9rZXlfcG9zaXRpb24gPCBvdXRwdXQuY2xvc2VfcG9zaXRpb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHRva2VuJ3MgY2xvc2luZyB0YWcgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgcHJldmlvdXMgbWF0Y2gsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vYnV0IGl0IG9jY3VycyBzb29uZXIgdGhhbiB0aGUgcHJldmlvdXMgbWF0Y2hcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gZmlyc3Rfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZGVmID0gdG9rZW5fdGVtcGxhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91
46184dHB1dC5jbG9zZV9wb3NpdGlvbiA9IGNsb3NlX2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBkZWxldGUgb3V0cHV0WydjbG9zZV9wb3NpdGlvbiddO1xuXG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcudG9rZW4uZmluZEVuZCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgdG9rZW5fZGVmLCBzdGFydCkge1xuXHQgICAgICAgIHZhciBlbmQgPSBudWxsLFxuXHQgICAgICAgICAgICBmb3VuZCA9IGZhbHNlLFxuXHQgICAgICAgICAgICBvZmZzZXQgPSAwLFxuXG5cdCAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbiB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgc3RyX3BvcyA9IG51bGwsXG5cdCAgICAgICAgICAgIHN0cl9mb3VuZCA9IG51bGwsXG5cdCAgICAgICAgICAgIHBvcyA9IG51bGwsXG5cdCAgICAgICAgICAgIGVuZF9vZmZzZXQgPSBudWxsLFxuXHQgICAgICAgICAgICB0aGlzX3N0cl9wb3MgPSBudWxsLFxuXHQgICAgICAgICAgICBlbmRfc3RyX3BvcyA9IG51bGwsXG5cblx0ICAgICAgICAgICAgLy8gRm9yIGxvb3AgdmFyaWFibGVzXG5cdCAgICAgICAgICAgIGksXG5cdCAgICAgICAgICAgIGw7XG5cblx0ICAgICAgICB3aGlsZSAoIWZvdW5kKSB7XG5cdCAgICAgICAgICAgIHN0cl9wb3MgPSBudWxsO1xuXHQgICAgICAgICAgICBzdHJfZm91bmQgPSBudWxsO1xuXHQgICAgICAgICAgICBwb3MgPSB0ZW1wbGF0ZS5pbmRleE9mKHRva2VuX2RlZi5jbG9zZSwgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICBpZiAocG9zID49IDApIHtcblx0ICAgICAgICAgICAgICAgIGVuZCA9IHBvcztcblx0ICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvblxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmFibGUgdG8gZmluZCBjbG9zaW5nIGJyYWNrZXQgJ1wiICsgdG9rZW5fZGVmLmNsb3NlICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIidcIiArIFwiIG9wZW5lZCBuZWFyIHRlbXBsYXRlIHBvc2l0aW9uIFwiICsgc3RhcnQpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSWdub3JlIHF1b3RlcyB3aXRoaW4gY29tbWVudHM7IGp1c3QgbG9vayBmb3IgdGhlIG5leHQgY29tbWVudCBjbG9zZSBzZXF1ZW5jZSxcblx0ICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGF0IGNvbWVzIGJlZm9yZSBpdC4gaHR0cHM6Ly9naXRodWIuY29tL2p1c3Rqb2huL3R3aWcuanMvaXNzdWVzLzk1XG5cdCAgICAgICAgICAgIGlmICh0b2tlbl9kZWYudHlwZSA9PT0gVHdpZy50b2tlbi50eXBlLmNvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBJZ25vcmUgcXVvdGVzIHdpdGhpbiByYXcgdGFnXG5cdCAgICAgICAgICAgIC8vIEZpeGVzICMyODNcblx0ICAgICAgICAgICAgaWYgKHRva2VuX2RlZi50eXBlID09PSBUd2lnLnRva2VuLnR5cGUucmF3KSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGwgPSBUd2lnLnRva2VuLnN0cmluZ3MubGVuZ3RoO1xuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzX3N0cl9wb3MgPSB0ZW1wbGF0ZS5pbmRleE9mKFR3aWcudG9rZW4uc3RyaW5nc1tpXSwgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXNfc3RyX3BvcyA+IDAgJiYgdGhpc19zdHJfcG9zIDwgcG9zICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIChzdHJfcG9zID09PSBudWxsIHx8IHRoaXNfc3RyX3BvcyA8IHN0cl9wb3MpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyX3BvcyA9IHRoaXNfc3RyX3Bvcztcblx0ICAgICAgICAgICAgICAgICAgICBzdHJfZm91bmQgPSBUd2lnLnRva2VuLnN0cmluZ3NbaV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIHN0cmluZyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgdG9rZW4sIG5vdyBmaW5kIHRoZSBzdHJpbmcncyBlbmQgYW5kIHNldCB0aGUgc2VhcmNoIG9mZnNldCB0byBpdFxuXHQgICAgICAgICAgICBpZiAoc3RyX3BvcyAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgZW5kX29mZnNldCA9IHN0cl9wb3MgKyAxO1xuXHQgICAgICAgICAgICAgICAgZW5kID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuZF9zdHJfcG9zID0gdGVtcGxhdGUuaW5kZXhPZihzdHJfZm91bmQsIGVuZF9vZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChlbmRfc3RyX3BvcyA8IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJVbmNsb3NlZCBzdHJpbmcgaW4gdGVtcGxhdGVcIjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVzY2FwZWQgcXVvdGVzXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlLnN1YnN0cihlbmRfc3RyX3BvcyAtIDEsIDEpICE9PSBcIlxcXFxcIikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBlbmRfc3RyX3BvcyArIDE7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZmZzZXQgPSBlbmRfc3RyX3BvcyArIDE7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBlbmQ7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIENvbnZlcnQgYSB0ZW1wbGF0ZSBpbnRvIGhpZ2gtbGV2ZWwgdG9rZW5zLlxuXHQgICAgICovXG5cdCAgICBUd2lnLnRva2VuaXplID0gZnVuY3Rpb24gKHRlbXBsYXRlKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IFtdLFxuXHQgICAgICAgICAgICAvLyBBbiBvZmZzZXQgZm9yIHJlcG9ydGluZyBlcnJvcnMgbG9jYXRpb25zIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICAgICAgICAgICAgZXJyb3Jfb2Zmc2V0ID0gMCxcblxuXHQgICAgICAgICAgICAvLyBUaGUgc3RhcnQgYW5kIHR5cGUgb2YgdGhlIGZpcnN0IHRva2VuIGZvdW5kIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICAgICAgICAgICAgZm91bmRfdG9rZW4gPSBudWxsLFxuXHQgICAgICAgICAgICAvLyBUaGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBtYXRjaGVkIHRva2VuLlxuXHQgICAgICAgICAgICBlbmQgPSBudWxsO1xuXG5cdCAgICAgICAgd2hpbGUgKHRlbXBsYXRlLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGFueSB0b2tlbiB0eXBlIGluIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICBmb3VuZF90b2tlbiA9IFR3aWcudG9rZW4uZmluZFN0YXJ0KHRlbXBsYXRlKTtcblxuXHQgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcudG9rZW5pemU6IFwiLCBcIkZvdW5kIHRva2VuOiBcIiwgZm91bmRfdG9rZW4pO1xuXG5cdCAgICAgICAgICAgIGlmIChmb3VuZF90b2tlbi5wb3NpdGlvbiAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgLy8gQWRkIGEgcmF3IHR5cGUgdG9rZW4gZm9yIGFueXRoaW5nIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHRva2VuXG5cdCAgICAgICAgICAgICAgICBpZiAoZm91bmRfdG9rZW4ucG9zaXRpb24gPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goe1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eX
46184BlOiBUd2lnLnRva2VuLnR5cGUucmF3LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGVtcGxhdGUuc3Vic3RyaW5nKDAsIGZvdW5kX3Rva2VuLnBvc2l0aW9uKVxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5zdWJzdHIoZm91bmRfdG9rZW4ucG9zaXRpb24gKyBmb3VuZF90b2tlbi5kZWYub3Blbi5sZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgZXJyb3Jfb2Zmc2V0ICs9IGZvdW5kX3Rva2VuLnBvc2l0aW9uICsgZm91bmRfdG9rZW4uZGVmLm9wZW4ubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIHRva2VuXG5cdCAgICAgICAgICAgICAgICBlbmQgPSBUd2lnLnRva2VuLmZpbmRFbmQodGVtcGxhdGUsIGZvdW5kX3Rva2VuLmRlZiwgZXJyb3Jfb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLnRva2VuaXplOiBcIiwgXCJUb2tlbiBlbmRzIGF0IFwiLCBlbmQpO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogIGZvdW5kX3Rva2VuLmRlZi50eXBlLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0ZW1wbGF0ZS5zdWJzdHJpbmcoMCwgZW5kKS50cmltKClcblx0ICAgICAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuc3Vic3RyKCBlbmQgKyBmb3VuZF90b2tlbi5kZWYuY2xvc2UubGVuZ3RoLCAxICkgPT09IFwiXFxuXCIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kX3Rva2VuLmRlZi50eXBlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsb2dpY193aGl0ZXNwYWNlX3ByZVwiOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibG9naWNfd2hpdGVzcGFjZV9wb3N0XCI6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsb2dpY193aGl0ZXNwYWNlX2JvdGhcIjpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxvZ2ljXCI6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXdsaW5lcyBkaXJlY3RseSBhZnRlciBsb2dpYyB0b2tlbnMgYXJlIGlnbm9yZWRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCArPSAxO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnN1YnN0cihlbmQgKyBmb3VuZF90b2tlbi5kZWYuY2xvc2UubGVuZ3RoKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBwb3NpdGlvbiBpbiB0aGUgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIGVycm9yX29mZnNldCArPSBlbmQgKyBmb3VuZF90b2tlbi5kZWYuY2xvc2UubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBObyBtb3JlIHRva2VucyAtPiBhZGQgdGhlIHJlc3Qgb2YgdGhlIHRlbXBsYXRlIGFzIGEgcmF3LXR5cGUgdG9rZW5cblx0ICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHtcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUucmF3LFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHRva2Vucztcblx0ICAgIH07XG5cblxuXHQgICAgVHdpZy5jb21waWxlID0gZnVuY3Rpb24gKHRva2Vucykge1xuXHQgICAgICAgIHRyeSB7XG5cblx0ICAgICAgICAgICAgLy8gT3V0cHV0IGFuZCBpbnRlcm1lZGlhdGUgc3RhY2tzXG5cdCAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXSxcblx0ICAgICAgICAgICAgICAgIHN0YWNrID0gW10sXG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgdG9rZW5zIGJldHdlZW4gb3BlbiBhbmQgY2xvc2UgdGFnc1xuXHQgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dCA9IFtdLFxuXG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICBsb2dpY190b2tlbiA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICB1bmNsb3NlZF90b2tlbiA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgcHJldmlvdXMgdG9rZW4uXG5cdCAgICAgICAgICAgICAgICBwcmV2X3Rva2VuID0gbnVsbCxcblx0ICAgICAgICAgICAgICAgIC8vIFRlbXBvcmFyeSBwcmV2aW91cyBvdXRwdXQuXG5cdCAgICAgICAgICAgICAgICBwcmV2X291dHB1dCA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgcHJldmlvdXMgaW50ZXJtZWRpYXRlIG91dHB1dC5cblx0ICAgICAgICAgICAgICAgIHByZXZfaW50ZXJtZWRpYXRlX291dHB1dCA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgdG9rZW4ncyB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgcHJldl90ZW1wbGF0ZSA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUb2tlbiBsb29rYWhlYWRcblx0ICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSBudWxsLFxuXHQgICAgICAgICAgICAgICAgLy8gVGhlIG91dHB1dCB0b2tlblxuXHQgICAgICAgICAgICAgICAgdG9rX291dHB1dCA9IG51bGwsXG5cblx0ICAgICAgICAgICAgICAgIC8vIExvZ2ljIFRva2VuIHZhbHVlc1xuXHQgICAgICAgICAgICAgICAgdHlwZSA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICBvcGVuID0gbnVsbCxcblx0ICAgICAgICAgICAgICAgIG5leHQgPSBudWxsO1xuXG5cdCAgICAgICAgICAgIHZhciBjb21waWxlX291dHB1dCA9IGZ1bmN0aW9uKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbdG9rZW5dKTtcblx0ICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgIHZhciBjb21waWxlX2xvZ2ljID0gZnVuY3Rpb24odG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGxvZ2ljIHRva2VuXG5cdCAgICAgICAgICAgICAgICBsb2dpY190b2tlbiA9IFR3aWcubG9naWMuY29tcGlsZS5hcHBseSh0aGlzLCBbdG9rZW5dKTtcblxuXHQgICAgICAgICAgICAgICAgdHlwZSA9IGxvZ2ljX3Rva2VuLnR5cGU7XG5cdCAgICAgICAgICAgICAgICBvcGVuID0gVHdpZy5sb2dpYy5oYW5kbGVyW3R5cGVdLm9wZW47XG5cdCAgICAgICAgICAgICAgICBuZXh0ID0gVHdpZy5sb2dpYy5oYW5kbGVyW3R5cGVdLm5leHQ7XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5jb21waWxlOiBcIiwgXCJDb21waWxlZCBsb2dpYyB0b2tlbiB0byBcIiwgbG9naWNfdG9rZW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBuZXh0IGlzOiBcIiwgbmV4dCwgXCIgb3BlbiBpcyA6IFwiLCBvcGVuKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gTm90IGEgc3RhbmRhbG9uZSB0b2tlbiwgY2hlY2sgbG9naWMgc3RhY2sgdG8gc2VlIGlmIHRoaXMgaXMgZXhwZWN0ZWRcblx0ICAgICAgICAgICAgICAgIGlmIChvcGVuICE9PSB1bmRlZmluZWQgJiYgIW9wZW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJldl90ZW1wbGF0ZSA9IFR3aWcubG9naWMuaGFuZGxlcltwcmV2X3Rva2VuLnR5cGVdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFR3aWcuaW5kZXhPZihwcmV2X3RlbXBsYXRlLm5leHQsIHR5cGUpIDwgMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIG5vdCBleHBlY3RlZCBhZnRlciBhIFwiICsgcHJldl90b2tlbi50eXBlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuLm91dHB1dCA9IHByZXZfdG9rZW4ub3V0cHV0IHx8IFtdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcHJldl90b2tlbi5vdXRwdXQgPSBwcmV2X3Rva2VuLm91dHB1dC5jb25jYXQoaW50ZXJtZWRpYXRlX291dHB1dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dCA9IFtdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgdG9rX291dHB1dCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLmxvZ2ljLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogcHJldl90b2tlblxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dC5wdXNoKHRva19vdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva19vdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gVGhpcyB0b2tlbiByZXF1aXJlcyBhZGRpdGlvbmFsIHRva2VucyB0byBjb21wbGV0ZSB0aGUgbG9naWMgc3RydWN0dXJlLlxuXHQgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiBuZXh0Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuY29tcGlsZTogXCIsIFwiUHVzaGluZyBcIiwgbG9naWNfdG9rZW4sIFwiIHRvIGxvZ2ljIHN0YWNrLlwiKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1dCBhbnkgY3VycmVudGx5IGhlbGQgb3V0cHV0IGludG8gdGhlIG91dHB1dCBsaXN0IG9mIHRoZSBsb2dpYyBvcGVyYXRvclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgYXQgdGhlIGhlYWQgb2YgdGhlIHN0YWNrIGJlZm9yZSB3ZSBwdXNoIGEgbmV3IG9uZSBvbi5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJldl90b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuLm91dHB1dCA9IHByZXZfdG9rZW4ub3V0cHV0IHx8IFtdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuLm91dHB1dCA9IHByZXZfdG9rZW4ub3V0cHV0LmNvbmNhdChpbnRlcm1lZGlhdGVfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChwcmV2X3Rva2VuKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dCA9IFtdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFB1c2ggdGhlIG5ldyBsb2dpYyB0b2tlbiBvbnRvIHRoZSBsb2dpYyBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobG9naWNfdG9rZW4pO1xuXG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wZW4gIT09IHVuZGVmaW5lZCAmJiBvcGVuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rX291dHB1dCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLmxvZ2ljLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogbG9naWNfdG9rZW5cblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFN0YW5kYWxvbmUgdG9rZW4gKGxpa2UgeyUgc2V0IC4uLiAlfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9vdXRwdXQucHVzaCh0b2tfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgI
46184H07XG5cblx0ICAgICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHQgICAgICAgICAgICAgICAgcHJldl9vdXRwdXQgPSBvdXRwdXRbb3V0cHV0Lmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICAgICAgcHJldl9pbnRlcm1lZGlhdGVfb3V0cHV0ID0gaW50ZXJtZWRpYXRlX291dHB1dFtpbnRlcm1lZGlhdGVfb3V0cHV0Lmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICAgICAgbmV4dF90b2tlbiA9IHRva2Vuc1swXTtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiQ29tcGlsaW5nIHRva2VuIFwiLCB0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5yYXc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWM6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfbG9naWMuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZywgY29tbWVudHMgc2hvdWxkIGJlIGlnbm9yZWRcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5jb21tZW50OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9vdXRwdXQuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy9LaWxsIHdoaXRlc3BhY2UgYWhlYWQgYW5kIGJlaGluZCB0aGlzIHRva2VuXG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9wcmU6XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9wb3N0OlxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLmxvZ2ljX3doaXRlc3BhY2VfYm90aDpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9wcmU6XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcG9zdDpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9ib3RoOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX3Bvc3QgJiYgdG9rZW4udHlwZSAhPT0gVHdpZy50b2tlbi50eXBlLmxvZ2ljX3doaXRlc3BhY2VfcG9zdCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgcHJldmlvdXMgb3V0cHV0IGlzIHJhdywgcG9wIGl0IG9mZlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2X291dHB1dC50eXBlID09PSBUd2lnLnRva2VuLnR5cGUucmF3KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wb3AoKTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBwcmV2aW91cyBvdXRwdXQgaXMgbm90IGp1c3Qgd2hpdGVzcGFjZSwgdHJpbSBpdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldl9vdXRwdXQudmFsdWUubWF0Y2goL15cXHMqJC8pID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X291dHB1dC52YWx1ZSA9IHByZXZfb3V0cHV0LnZhbHVlLnRyaW0oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVwdXNoIHRoZSBwcmV2aW91cyBvdXRwdXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHByZXZfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIHByZXZpb3VzIGludGVybWVkaWF0ZSBvdXRwdXQgaXMgcmF3LCBwb3AgaXQgb2ZmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dC50eXBlID09PSBUd2lnLnRva2VuLnR5cGUucmF3KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9vdXRwdXQucG9wKCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgcHJldmlvdXMgb3V0cHV0IGlzIG5vdCBqdXN0IHdoaXRlc3BhY2UsIHRyaW0gaXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dC52YWx1ZS5tYXRjaCgvXlxccyokLykgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HByZXZfaW50ZXJtZWRpYXRlX291dHB1dC52YWx1ZSA9IHByZXZfaW50ZXJtZWRpYXRlX291dHB1dC52YWx1ZS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlcHVzaCB0aGUgcHJldmlvdXMgaW50ZXJtZWRpYXRlIG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dC5wdXNoKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL0NvbXBpbGUgdGhpcyB0b2tlblxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX3ByZTpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX3Bvc3Q6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9ib3RoOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfb3V0cHV0LmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9wcmU6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3Bvc3Q6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX2JvdGg6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9sb2dpYy5jYWxsKHRoaXMsIHRva2VuKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcHJlICYmIHRva2VuLnR5cGUgIT09IFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3ByZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBuZXh0IHRva2VuIGlzIHJhdywgc2hpZnQgaXQgb3V0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4udHlwZSA9PT0gVHdpZy50b2tlbi50eXBlLnJhdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBqdXN0IHdoaXRlc3BhY2UsIHRyaW0gaXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4udmFsdWUubWF0Y2goL15cXHMqJC8pID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3Rva2VuLnZhbHVlID0gbmV4dF90b2tlbi52YWx1ZS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vuc2hpZnQgdGhlIG5leHQgdG9rZW5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy51bnNoaWZ0KG5leHRfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5jb21waWxlOiBcIiwgXCIgT3V0cHV0OiBcIiwgb3V0cHV0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTG9naWMgU3RhY2s6IFwiLCBzdGFjayxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFBlbmRpbmcgT3V0cHV0OiBcIiwgaW50ZXJtZWRpYXRlX291dHB1dCApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGxvZ2ljIHRva2VucyBsZWZ0IGluIHRoZSBzdGFjay5cblx0ICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgIHVuY2xvc2VkX3Rva2VuID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBhbiBlbmQgdGFnIGZvciBcIiArIHVuY2xvc2VkX3Rva2VuLnR5cGUgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLCBleHBlY3Rpbmcgb25lIG9mIFwiICsgdW5jbG9zZWRfdG9rZW4ubmV4dCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgICAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJldGhyb3cpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChleC50eXBlID09ICdUd2lnRXhjZXB0aW9uJyAmJiAhZXguZmlsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4LmZpbGUgPSB0aGlzLmlkO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB0aHJvdyBleFxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IoXCJFcnJvciBjb21waWxpbmcgdHdpZyB0ZW1wbGF0ZSBcIiArIHRoaXMuaWQgKyBcIjogXCIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGV4LnN0YWNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IoZXguc3RhY2spO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy5lcnJvcihleC50b1N0cmluZygpKTtcblx0ICAgICAgICAgICAgICAgI
46184H1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUGFyc2UgYSBjb21waWxlZCB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgVGhlIGNvbXBpbGVkIHRva2Vucy5cblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IFRoZSByZW5kZXIgY29udGV4dC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXJzZWQgdGVtcGxhdGUuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcucGFyc2UgPSBmdW5jdGlvbiAodG9rZW5zLCBjb250ZXh0LCBhbGxvd19hc3luYykge1xuXHQgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgb3V0cHV0ID0gW10sXG5cblx0ICAgICAgICAgICAgLy8gU3RvcmUgYW55IGVycm9yIHRoYXQgbWlnaHQgYmUgdGhyb3duIGJ5IHRoZSBwcm9taXNlIGNoYWluLlxuXHQgICAgICAgICAgICBlcnIgPSBudWxsLFxuXG5cdCAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBzZXQgdG8gaXNfYXN5bmMgaWYgdGVtcGxhdGUgcmVuZGVycyBzeW5jaHJvbm91c2x5XG5cdCAgICAgICAgICAgIGlzX2FzeW5jID0gdHJ1ZSxcblx0ICAgICAgICAgICAgcHJvbWlzZSA9IG51bGwsXG5cblx0ICAgICAgICAgICAgLy8gVHJhY2sgbG9naWMgY2hhaW5zXG5cdCAgICAgICAgICAgIGNoYWluID0gdHJ1ZTtcblxuXG5cdCAgICAgICAgZnVuY3Rpb24gaGFuZGxlRXhjZXB0aW9uKGV4KSB7XG5cdCAgICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMucmV0aHJvdykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleCA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleCA9IG5ldyBUd2lnLkVycm9yKGV4KVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAoZXgudHlwZSA9PSAnVHdpZ0V4Y2VwdGlvbicgJiYgIWV4LmZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleC5maWxlID0gdGhhdC5pZDtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBUd2lnLmxvZy5lcnJvcihcIkVycm9yIHBhcnNpbmcgdHdpZyB0ZW1wbGF0ZSBcIiArIHRoYXQuaWQgKyBcIjogXCIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGV4LnN0YWNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IoZXguc3RhY2spO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy5lcnJvcihleC50b1N0cmluZygpKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgaWYgKFR3aWcuZGVidWcpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXgudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHByb21pc2UgPSBUd2lnLmFzeW5jLmZvckVhY2godG9rZW5zLCBmdW5jdGlvbiBwYXJzZVRva2VuKHRva2VuKSB7XG5cdCAgICAgICAgICAgIFR3aWcubG9nLmRlYnVnKFwiVHdpZy5wYXJzZTogXCIsIFwiUGFyc2luZyB0b2tlbjogXCIsIHRva2VuKTtcblxuXHQgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLnJhdzpcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChUd2lnLmZpbHRlcnMucmF3KHRva2VuLnZhbHVlKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLmxvZ2ljOlxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBsb2dpY190b2tlbiA9IHRva2VuLnRva2VuO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcubG9naWMucGFyc2VBc3luYy5hcHBseSh0aGF0LCBbbG9naWNfdG9rZW4sIGNvbnRleHQsIGNoYWluXSlcblx0ICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihsb2dpYykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9naWMuY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSBsb2dpYy5jaGFpbjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9naWMuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gbG9naWMuY29udGV4dDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9naWMub3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGxvZ2ljLm91dHB1dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUuY29tbWVudDpcblx0ICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLCBjb21tZW50cyBzaG91bGQgYmUgaWdub3JlZFxuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAvL0ZhbGwgdGhyb3VnaCB3aGl0ZXNwYWNlIHRvIG91dHB1dFxuXHQgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcHJlOlxuXHQgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcG9zdDpcblx0ICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX2JvdGg6XG5cdCAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXQ6XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cuZGVidWcoXCJUd2lnLnBhcnNlOiBcIiwgXCJPdXRwdXQgdG9rZW46IFwiLCB0b2tlbi5zdGFjayk7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGdpdmVuIGV4cHJlc3Npb24gaW4gdGhlIGdpdmVuIGNvbnRleHRcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhhdCwgW3Rva2VuLnN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihvKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91
46184dHB1dC5wdXNoKG8pO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSlcblx0ICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgb3V0cHV0ID0gVHdpZy5vdXRwdXQuYXBwbHkodGhhdCwgW291dHB1dF0pO1xuXHQgICAgICAgICAgICBpc19hc3luYyA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgIH0pXG5cdCAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGUpIHtcblx0ICAgICAgICAgICAgaWYgKGFsbG93X2FzeW5jKVxuXHQgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpO1xuXG5cdCAgICAgICAgICAgIGVyciA9IGU7XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICAvLyBJZiBgYWxsb3dfYXN5bmNgIHdlIHdpbGwgYWx3YXlzIHJldHVybiBhIHByb21pc2Ugc2luY2Ugd2UgZG8gbm90XG5cdCAgICAgICAgLy8ga25vdyBpbiBhZHZhbmNlIGlmIHdlIGFyZSBnb2luZyB0byBydW4gYXN5bmNocm9ub3VzbHkgb3Igbm90LlxuXHQgICAgICAgIGlmIChhbGxvd19hc3luYylcblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG5cblx0ICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIGhlcmUgaWYgd2UgZmFpbCBzeW5jaHJvbm91c2x5LlxuXHQgICAgICAgIGlmIChlcnIgIT09IG51bGwpXG5cdCAgICAgICAgICAgIHJldHVybiBoYW5kbGVFeGNlcHRpb24oZXJyKTtcblxuXHQgICAgICAgIC8vIElmIGBhbGxvd19hc3luY2AgaXMgbm90IHRydWUgd2Ugc2hvdWxkIG5vdCBhbGxvdyB0aGUgdXNlclxuXHQgICAgICAgIC8vIHRvIHVzZSBhc3luY2hyb25vdXMgZnVuY3Rpb25zIG9yIGZpbHRlcnMuXG5cdCAgICAgICAgaWYgKGlzX2FzeW5jKVxuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignWW91IGFyZSB1c2luZyBUd2lnLmpzIGluIHN5bmMgbW9kZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFzeW5jIGV4dGVuc2lvbnMuJyk7XG5cblx0ICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUb2tlbml6ZSBhbmQgY29tcGlsZSBhIHN0cmluZyB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBjb21waWxlZCB0b2tlbnMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcucHJlcGFyZSA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0ICAgICAgICB2Y
46184XIgdG9rZW5zLCByYXdfdG9rZW5zO1xuXG5cdCAgICAgICAgLy8gVG9rZW5pemVcblx0ICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIlR3aWcucHJlcGFyZTogXCIsIFwiVG9rZW5pemluZyBcIiwgZGF0YSk7XG5cdCAgICAgICAgcmF3X3Rva2VucyA9IFR3aWcudG9rZW5pemUuYXBwbHkodGhpcywgW2RhdGFdKTtcblxuXHQgICAgICAgIC8vIENvbXBpbGVcblx0ICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIlR3aWcucHJlcGFyZTogXCIsIFwiQ29tcGlsaW5nIFwiLCByYXdfdG9rZW5zKTtcblx0ICAgICAgICB0b2tlbnMgPSBUd2lnLmNvbXBpbGUuYXBwbHkodGhpcywgW3Jhd190b2tlbnNdKTtcblxuXHQgICAgICAgIFR3aWcubG9nLmRlYnVnKFwiVHdpZy5wcmVwYXJlOiBcIiwgXCJDb21waWxlZCBcIiwgdG9rZW5zKTtcblxuXHQgICAgICAgIHJldHVybiB0b2tlbnM7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEpvaW4gdGhlIG91dHB1dCB0b2tlbidzIHN0YWNrIGFuZCBlc2NhcGUgaXQgaWYgbmVlZGVkXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtBcnJheX0gT3V0cHV0IHRva2VuJ3Mgc3RhY2tcblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd8U3RyaW5nfSBBdXRvZXNjYXBlZCBvdXRwdXRcblx0ICAgICAqL1xuXHQgICAgVHdpZy5vdXRwdXQgPSBmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdXRvZXNjYXBlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2Y
46184XIgc3RyYXRlZ3kgPSAnaHRtbCc7XG5cdCAgICAgICAgaWYodHlwZW9mIHRoaXMub3B0aW9ucy5hdXRvZXNjYXBlID09ICdzdHJpbmcnKVxuXHQgICAgICAgICAgICBzdHJhdGVneSA9IHRoaXMub3B0aW9ucy5hdXRvZXNjYXBlO1xuXG5cdCAgICAgICAgLy8gW10ubWFwIHdvdWxkIGJlIGJldHRlciBidXQgaXQncyBub3Qgc3VwcG9ydGVkIGJ5IElFOC1cblx0ICAgICAgICB2YXIgZXNjYXBlZF9vdXRwdXQgPSBbXTtcblx0ICAgICAgICBUd2lnLmZvckVhY2gob3V0cHV0LCBmdW5jdGlvbiAoc3RyKSB7XG5cdCAgICAgICAgICAgIGlmIChzdHIgJiYgKHN0ci50d2lnX21hcmt1cCAhPT0gdHJ1ZSAmJiBzdHIudHdpZ19tYXJrdXAgIT0gc3RyYXRlZ3kpKSB7XG5cdCAgICAgICAgICAgICAgICBzdHIgPSBUd2lnLmZpbHRlcnMuZXNjYXBlKHN0ciwgWyBzdHJhdGVneSBdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlc2NhcGVkX291dHB1dC5wdXNoKHN0cik7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIFR3aWcuTWFya3VwKGVzY2FwZWRfb3V0cHV0LmpvaW4oXCJcIikpO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYW1lc3BhY2UgZm9yIHRlbXBsYXRlIHN0b3JhZ2UgYW5kIHJldHJpZXZhbFxuXHQgICAgVHdpZy5UZW1wbGF0ZXMgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVnaXN0ZXJlZCB0ZW1wbGF0ZSBsb2FkZXJzIC0gdXNlIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyTG9hZGVyIHRvIGFkZCBzdXBwb3J0ZWQgbG9hZGVyc1xuXHQgICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgbG9hZGVyczoge30sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZWdpc3RlcmVkIHRlbXBsYXRlIHBhcnNlcnMgLSB1c2UgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJQYXJzZXIgdG8gYWRkIHN1cHBvcnRlZCBwYXJzZXJzXG5cdCAgICAgICAgICogQHR5cGUge09iamVjdH1cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZXJzOiB7fSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENhY2hlZCAvIGxvYWRlZCB0ZW1wbGF0ZXNcblx0ICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlZ2lzdHJ5OiB7fVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBJcyB0aGlzIGlkIHZhbGlkIGZvciBhIHR3aWcgdGVtcGxhdGU/XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCB0byBjaGVjay5cblx0ICAgICAqXG5cdCAgICAgKiBAdGhyb3dzIHtUd2lnLkVycm9yfSBJZiB0aGUgSUQgaXMgaW52YWxpZCBvciB1c2VkLlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgSUQgaXMgdmFsaWQuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcudmFsaWRhdGVJZCA9IGZ1bmN0aW9uKGlkKSB7XG5cdCAgICAgICAgaWYgKGlkID09PSBcInByb3RvdHlwZVwiKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKGlkICsgXCIgaXMgbm90IGEgdmFsaWQgdHdpZyBpZGVudGlmaWVyXCIpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoVHdpZy5jYWNoZSAmJiBUd2lnLlRlbXBsYXRlcy5yZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJUaGVyZSBpcyBhbHJlYWR5IGEgdGVtcGxhdGUgd2l0aCB0aGUgSUQgXCIgKyBpZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFJlZ2lzdGVyIGEgdGVtcGxhdGUgbG9hZGVyXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqIFR3aWcuZXh0ZW5kKGZ1bmN0aW9uKFR3aWcpIHtcblx0ICAgICAqICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyTG9hZGVyKCdjdXN0b21fbG9hZGVyJywgZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgKiAgICAgICAgLy8gLi4uIGxvYWQgdGhlIHRlbXBsYXRlIC4uLlxuXHQgICAgICogICAgICAgIHBhcmFtcy5kYXRhID0gbG9hZGVkVGVtcGxhdGVEYXRhO1xuXHQgICAgICogICAgICAgIC8vIGNyZWF0ZSBhbmQgcmV0dXJuIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICogICAgICAgIHZhciB0ZW1wbGF0ZSA9IG5ldyBUd2lnLlRlbXBsYXRlKHBhcmFtcyk7XG5cdCAgICAgKiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICogICAgICAgICAgICBjYWxsYmFjayh0ZW1wbGF0ZSk7XG5cdCAgICAgKiAgICAgICAgfVxuXHQgICAgICogICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcblx0ICAgICAqICAgIH0pO1xuXHQgICAgICogfSk7XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZF9uYW1lIFRoZSBtZXRob2QgdGhpcyBsb2FkZXIgaXMgaW50ZW5kZWQgZm9yIChhamF4LCBmcylcblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiBsb2FkaW5nIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICogQHBhcmFtIHtPYmplY3R8dW5kZWZpbmVkfSBzY29wZSBPcHRpb25hbCBzY29wZSBwYXJhbWV0ZXIgdG8gYmluZCBmdW5jIHRvXG5cdCAgICAgKlxuXHQgICAgICogQHRocm93cyBUd2lnLkVycm9yXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7dm9pZH1cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJMb2FkZXIgPSBmdW5jdGlvbihtZXRob2RfbmFtZSwgZnVuYywgc2NvcGUpIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoJ1VuYWJsZSB0byBhZGQgbG9hZGVyIGZvciAnICsgbWV0aG9kX25hbWUgKyAnOiBJbnZhbGlkIGZ1bmN0aW9uIHJlZmVyZW5jZSBnaXZlbi4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHNjb3BlKSB7XG5cdCAgICAgICAgICAgIGZ1bmMgPSBmdW5jLmJpbmQoc2NvcGUpO1xuXHQgICAgICAgI
46184H1cblx0ICAgICAgICB0aGlzLmxvYWRlcnNbbWV0aG9kX25hbWVdID0gZnVuYztcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUmVtb3ZlIGEgcmVnaXN0ZXJlZCBsb2FkZXJcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgbG9hZGVyIHlvdSB3aXNoIHRvIHJlbW92ZVxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge3ZvaWR9XG5cdCAgICAgKi9cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnVuUmVnaXN0ZXJMb2FkZXIgPSBmdW5jdGlvbihtZXRob2RfbmFtZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzUmVnaXN0ZXJlZExvYWRlcihtZXRob2RfbmFtZSkpIHtcblx0ICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9hZGVyc1ttZXRob2RfbmFtZV07XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTZWUgaWYgYSBsb2FkZXIgaXMgcmVnaXN0ZXJlZCBieSBpdHMgbWV0aG9kIG5hbWVcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG5hbWUgb2YgdGhlIGxvYWRlciB5b3UgYXJlIGxvb2tpbmcgZm9yXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMuaXNSZWdpc3RlcmVkTG9hZGVyID0gZnVuY3Rpb24obWV0aG9kX25hbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXJzLmhhc093blByb3BlcnR5KG1ldGhvZF9uYW1lKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUmVnaXN0ZXIgYSB0ZW1wbGF0ZSBwYXJzZXJcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICogVHdpZy5leHRlbmQoZnVuY3Rpb24oVHdpZykge1xuXHQgICAgICogICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJQYXJzZXIoJ2N1c3RvbV9wYXJzZXInLCBmdW5jdGlvbihwYXJhbXMpIHtcblx0ICAgICAqICAgICAgICAvLyB0aGlzIHRlbXBsYXRlIHNvdXJjZSBjYW4gYmUgYWNjZXNzZWQgaW4gcGFyYW1zLmRhdGFcblx0ICAgICAqICAgICAgICB2Y
46184XIgdGVtcGxhdGUgPSBwYXJhbXMuZGF0YVxuXHQgICAgICpcblx0ICAgICAqICAgICAgICAvLyAuLi4gY3VzdG9tIHByb2Nlc3MgdGhhdCBtb2RpZmllcyB0aGUgdGVtcGxhdGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgICAgLy8gcmV0dXJuIHRoZSBwYXJzZWQgdGVtcGxhdGVcblx0ICAgICAqICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG5cdCAgICAgKiAgICB9KTtcblx0ICAgICAqIH0pO1xuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RfbmFtZSBUaGUgbWV0aG9kIHRoaXMgcGFyc2VyIGlzIGludGVuZGVkIGZvciAodHdpZywgc291cmNlKVxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHBhcnNpbmcgdGhlIHRlbXBsYXRlXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IHNjb3BlIE9wdGlvbmFsIHNjb3BlIHBhcmFtZXRlciB0byBiaW5kIGZ1bmMgdG9cblx0ICAgICAqXG5cdCAgICAgKiBAdGhyb3dzIFR3aWcuRXJyb3Jcblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHt2b2lkfVxuXHQgICAgICovXG5cdCAgICBUd2lnLlRlbXBsYXRlcy5yZWdpc3RlclBhcnNlciA9IGZ1bmN0aW9uKG1ldGhvZF9uYW1lLCBmdW5jLCBzY29wZSkge1xuXHQgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignVW5hYmxlIHRvIGFkZCBwYXJzZXIgZm9yICcgKyBtZXRob2RfbmFtZSArICc6IEludmFsaWQgZnVuY3Rpb24gcmVnZXJlbmNlIGdpdmVuLicpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChzY29wZSkge1xuXHQgICAgICAgICAgICBmdW5jID0gZnVuYy5iaW5kKHNjb3BlKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB0aGlzLnBhcnNlcnNbbWV0aG9kX25hbWVdID0gZnVuYztcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUmVtb3ZlIGEgcmVnaXN0ZXJlZCBwYXJzZXJcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgcGFyc2VyIHlvdSB3aXNoIHRvIHJlbW92ZVxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge3ZvaWR9XG5cdCAgICAgKi9cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnVuUmVnaXN0ZXJQYXJzZXIgPSBmdW5jdGlvbihtZXRob2RfbmFtZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzUmVnaXN0ZXJlZFBhcnNlcihtZXRob2RfbmFtZSkpIHtcblx0ICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyc2Vyc1ttZXRob2RfbmFtZV07XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTZWUgaWYgYSBwYXJzZXIgaXMgcmVnaXN0ZXJlZCBieSBpdHMgbWV0aG9kIG5hbWVcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG5hbWUgb2YgdGhlIHBhcnNlciB5b3UgYXJlIGxvb2tpbmcgZm9yXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMuaXNSZWdpc3RlcmVkUGFyc2VyID0gZnVuY3Rpb24obWV0aG9kX25hbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXJzZXJzLmhhc093blByb3BlcnR5KG1ldGhvZF9uYW1lKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2F2ZSBhIHRlbXBsYXRlIG9iamVjdCB0byB0aGUgc3RvcmUuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtUd2lnLlRlbXBsYXRlfSB0ZW1wbGF0ZSAgIFRoZSB0d2lnLmpzIHRlbXBsYXRlIHRvIHN0b3JlLlxuXHQgICAgICovXG5cdCAgICBUd2lnLlRlbXBsYXRlcy5zYXZlID0gZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICBpZiAodGVtcGxhdGUuaWQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBzYXZlIHRlbXBsYXRlIHdpdGggbm8gaWRcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdHJ5W3RlbXBsYXRlLmlkXSA9IHRlbXBsYXRlO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMb2FkIGEgcHJldmlvdXNseSBzYXZlZCB0ZW1wbGF0ZSBmcm9tIHRoZSBzdG9yZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgICBUaGUgSUQgb2YgdGhlIHRlbXBsYXRlIHRvIGxvYWQuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7VHdpZy5UZW1wbGF0ZX0gQSB0d2lnLmpzIHRlbXBsYXRlIHN0b3JlZCB3aXRoIHRoZSBwcm92aWRlZCBJRC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMubG9hZCA9IGZ1bmN0aW9uKGlkKSB7XG5cdCAgICAgICAgaWYgKCFUd2lnLlRlbXBsYXRlcy5yZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUd2lnLlRlbXBsYXRlcy5yZWdpc3RyeVtpZF07XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExvYWQgYSB0ZW1wbGF0ZSBmcm9tIGEgcmVtb3RlIGxvY2F0aW9uIHVzaW5nIEFKQVggYW5kIHNhdmVzIGluIHdpdGggdGhlIGdpdmVuIElELlxuXHQgICAgICpcblx0ICAgICAqIEF2YWlsYWJsZSBwYXJhbWV0ZXJzOlxuXHQgICAgICpcblx0ICAgICAqICAgICAgYXN5bmM6ICAgICAgIFNob3VsZCB0aGUgSFRUUCByZXF1ZXN0IGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cblx0ICAgICAqICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRydWUuXG5cdCAgICAgKiAgICAgIG1ldGhvZDogICAgICBXaGF0IG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBsb2FkIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICogICAgICAgICAgICAgICAgICAgICAgKGZzIG9yIGFqYXgpXG5cdCAgICAgKiAgICAgIHBhcnNlcjogICAgICBXaGF0IG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBwYXJzZSB0aGUgdGVtcGxhdGVcblx0ICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0d2lnIG9yIHNvdXJjZSlcblx0ICAgICAqICAgICAgcHJlY29tcGlsZWQ6IEhhcyB0aGUgdGVtcGxhdGUgYWxyZWFkeSBiZWVuIGNvbXBpbGVkLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiAgVGhlIHJlbW90ZSBVUkwgdG8gbG9hZCBhcyBh
46184IHRlbXBsYXRlLlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycy5cblx0ICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrICBBIGNhbGxiYWNrIHRyaWdnZXJlZCB3aGVuIHRoZSB0ZW1wbGF0ZSBmaW5pc2hlcyBsb2FkaW5nLlxuXHQgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3JfY2FsbGJhY2sgIEEgY2FsbGJhY2sgdHJpZ2dlcmVkIGlmIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIHRoZSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKlxuXHQgICAgICovXG5cdCAgICBUd2lnLlRlbXBsYXRlcy5sb2FkUmVtb3RlID0gZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIGxvYWRlcjtcblxuXHQgICAgICAgIC8vIERlZmF1bHQgdG8gYXN5bmNcblx0ICAgICAgICBpZiAocGFyYW1zLmFzeW5jID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcGFyYW1zLmFzeW5jID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBEZWZhdWx0IHRvIHRoZSBVUkwgc28gdGhlIHRlbXBsYXRlIGlzIGNhY2hlZC5cblx0ICAgICAgICBpZiAocGFyYW1zLmlkID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcGFyYW1zLmlkID0gbG9jYXRpb247XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHRlbXBsYXRlXG5cdCAgICAgICAgaWYgKFR3aWcuY2FjaGUgJiYgVHdpZy5UZW1wbGF0ZXMucmVnaXN0cnkuaGFzT3duUHJvcGVydHkocGFyYW1zLmlkKSkge1xuXHQgICAgICAgICAgICAvLyBBIHRlbXBsYXRlIGlzIGFscmVhZHkgc2F2ZWQgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrKFR3aWcuVGVtcGxhdGVzLnJlZ2lzdHJ5W3BhcmFtcy5pZF0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vIFRPRE86IGlmIGFzeW5jLCByZXR1cm4gZGVmZXJyZWQgcHJvbWlzZVxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMucmVnaXN0cnlbcGFyYW1zLmlkXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvL2lmIHRoZSBwYXJzZXIgbmFtZSBoYXNuJ3QgYmVlbiBzZXQsIGRlZmF1bHQgaXQgdG8gdHdpZ1xuXHQgICAgICAgIHBhcmFtcy5wYXJzZXIgPSBwYXJhbXMucGFyc2VyIHx8ICd0d2lnJztcblxuXHQgICAgICAgIC8vIEFzc3VtZSAnZnMnIGlmIHRoZSBsb2FkZXIgaXMgbm90IGRlZmluZWRcblx0ICAgICAgICBsb2FkZXIgPSB0aGlzLmxvYWRlcnNbcGFyYW1zLm1ldGhvZF0gfHwgdGhpcy5sb2FkZXJzLmZzO1xuXHQgICAgICAgIHJldHVybiBsb2FkZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIERldGVybWluZSBvYmplY3QgdHlwZVxuXHQgICAgZnVuY3Rpb24gaXModHlwZSwgb2JqKSB7XG5cdCAgICAgICAgdmFyIGNsYXMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cdCAgICAgICAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiBjbGFzID09PSB0eXBlO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZSBhIG5ldyB0d2lnLmpzIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIFBhcmFtZXRlcnM6IHtcblx0ICAgICAqICAgICAgZGF0YTogICBUaGUgdGVtcGxhdGUsIGVpdGhlciBwcmUtY29tcGlsZWQgdG9rZW5zIG9yIGEgc3RyaW5nIHRlbXBsYXRlXG5cdCAgICAgKiAgICAgIGlkOiAgICAgVGhlIG5hbWUgb2YgdGhpcyB0ZW1wbGF0ZVxuXHQgICAgICogICAgICBibG9ja3M6IEFueSBwcmUtZXhpc3RpbmcgYmxvY2sgZnJvbSBhIGNoaWxkIHRlbXBsYXRlXG5cdCAgICAgKiB9XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZSA9IGZ1bmN0aW9uICggcGFyYW1zICkge1xuXHQgICAgICAgIHZhciBkYXRhID0gcGFyYW1zLmRhdGEsXG5cdCAgICAgICAgICAgIGlkID0gcGFyYW1zLmlkLFxuXHQgICAgICAgICAgICBibG9ja3MgPSBwYXJhbXMuYmxvY2tzLFxuXHQgICAgICAgICAgICBtYWNyb3MgPSBwYXJhbXMubWFjcm9zIHx8IHt9LFxuXHQgICAgICAgICAgICBiYXNlID0gcGFyYW1zLmJhc2UsXG5cdCAgICAgICAgICAgIHBhdGggPSBwYXJhbXMucGF0aCxcblx0ICAgICAgICAgICAgdXJsID0gcGFyYW1zLnVybCxcblx0ICAgICAgICAgICAgbmFtZSA9IHBhcmFtcy5uYW1lLFxuXHQgICAgICAgICAgICBtZXRob2QgPSBwYXJhbXMubWV0aG9kLFxuXHQgICAgICAgICAgICAvLyBwYXJzZXIgb3B0aW9uc1xuXHQgICAgICAgICAgICBvcHRpb25zID0gcGFyYW1zLm9wdGlvbnM7XG5cblx0ICAgICAgICAvLyAjIFdoYXQgaXMgc3RvcmVkIGluIGEgVHdpZy5UZW1wbGF0ZVxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gVGhlIFR3aWcgVGVtcGxhdGUgaG9sZCBzZXZlcmFsIGNodWNrcyBvZiBkYXRhLlxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gICAgIHtcblx0ICAgICAgICAvLyAgICAgICAgICBpZDogICAgIFRoZSB0b2tlbiBJRCAoaWYgYW55KVxuXHQgICAgICAgIC8vICAgICAgICAgIHRva2VuczogVGhlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgbWFrZXMgdXAgdGhpcyB0ZW1wbGF0ZS5cblx0ICAgICAgICAvLyAgICAgICAgICBibG9ja3M6IFRoZSBsaXN0IG9mIGJsb2NrIHRoaXMgdGVtcGxhdGUgY29udGFpbnMuXG5cdCAgICAgICAgLy8gICAgICAgICAgYmFzZTogICBUaGUgYmFzZSB0ZW1wbGF0ZSAoaWYgYW55KVxuXHQgICAgICAgIC8vICAgICAgICAgICAgb3B0aW9uczogIHtcblx0ICAgICAgICAvLyAgICAgICAgICAgICAgICBDb21waWxlci9wYXJzZXIgb3B0aW9uc1xuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gICAgICAgICAgICAgICAgc3RyaWN0X3ZhcmlhYmxlczogdHJ1ZS9mYWxzZVxuXHQgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBTaG91bGQgbWlzc2luZyB2YXJpYWJsZS9rZXlzIGVtaXQgYW4gZXJyb3IgbWVzc2FnZS4gSWYgZmFsc2UsIHRoZXkgZGVmYXVsdCB0byBudWxsLlxuXHQgICAgICAgIC8vICAgICAgICAgICAgfVxuXHQgICAgICAgIC8vICAgICB9XG5cdCAgICAgICAgLy9cblxuXHQgICAgICAgI
46184HRoaXMuaWQgICAgID0gaWQ7XG5cdCAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG5cdCAgICAgICAgdGhpcy5iYXNlICAgPSBiYXNlO1xuXHQgICAgICAgIHRoaXMucGF0aCAgID0gcGF0aDtcblx0ICAgICAgICB0aGlzLnVybCAgICA9IHVybDtcblx0ICAgICAgICB0aGlzLm5hbWUgICA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy5tYWNyb3MgPSBtYWNyb3M7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHQgICAgICAgIHRoaXMucmVzZXQoYmxvY2tzKTtcblxuXHQgICAgICAgIGlmIChpcygnU3RyaW5nJywgZGF0YSkpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMgPSBUd2lnLnByZXBhcmUuYXBwbHkodGhpcywgW2RhdGFdKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLnRva2VucyA9IGRhdGE7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgVHdpZy5UZW1wbGF0ZXMuc2F2ZSh0aGlzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLlRlbXBsYXRlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKGJsb2Nrcykge1xuXHQgICAgICAgIFR3aWcubG9nLmRlYnVnKFwiVHdpZy5UZW1wbGF0ZS5yZXNldFwiLCBcIlJlc2V0aW5nIHRlbXBsYXRlIFwiICsgdGhpcy5pZCk7XG5cdCAgICAgICAgdGhpcy5ibG9ja3MgPSB7fTtcblx0ICAgICAgICB0aGlzLmltcG9ydGVkQmxvY2tzID0gW107XG5cdCAgICAgICAgdGhpcy5vcmlnaW5hbEJsb2NrVG9rZW5zID0ge307XG5cdCAgICAgICAgdGhpcy5jaGlsZCA9IHtcblx0ICAgICAgICAgICAgYmxvY2tzOiBibG9ja3MgfHwge31cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuZXh0ZW5kID0gbnVsbDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJhbXMsIGFsbG93X2FzeW5jKSB7XG5cdCAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG5cdCAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXG5cdCAgICAgICAgICAgIC8vIFN0b3JlIGFueSBlcnJvciB0aGF0IG1pZ2h0IGJlIHRocm93biBieSB0aGUgcHJvbWlzZSBjaGFpbi5cblx0ICAgICAgICAgICAgZXJyID0gbnVsbCxcblxuXHQgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgc2V0IHRvIGlzX2FzeW5jIGlmIHRlbXBsYXRlIHJlbmRlcnMgc3luY2hyb25vdXNseVxuXHQgICAgICAgICAgICBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHByb21pc2UgPSBudWxsLFxuXG5cdCAgICAgICAgICAgIHJlc3VsdCxcblx0ICAgICAgICAgICAgdXJsO1xuXG5cdCAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblxuXHQgICAgICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBzdGF0ZVxuXHQgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICBpZiAocGFyYW1zLmJsb2Nrcykge1xuXHQgICAgICAgICAgICB0aGlzLmJsb2NrcyA9IHBhcmFtcy5ibG9ja3M7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChwYXJhbXMubWFjcm9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMubWFjcm9zID0gcGFyYW1zLm1hY3Jvcztcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2Y
46184XIgY2IgPSBmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICAgICAgLy8gRG9lcyB0aGlzIHRlbXBsYXRlIGV4dGVuZCBhbm90aGVyXG5cdCAgICAgICAgICAgIGlmICh0aGF0LmV4dGVuZCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV4dF90ZW1wbGF0ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRlbXBsYXRlIGlzIHByb3ZpZGVkIGlubGluZVxuXHQgICAgICAgICAgICAgICAgaWYgKCB0aGF0Lm9wdGlvbnMuYWxsb3dJbmxpbmVJbmNsdWRlcyApIHtcblx0ICAgICAgICAgICAgICAgICAgICBleHRfdGVtcGxhdGUgPSBUd2lnLlRlbXBsYXRlcy5sb2FkKHRoYXQuZXh0ZW5kKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dF90ZW1wbGF0ZSApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3RlbXBsYXRlLm9wdGlvbnMgPSB0aGF0Lm9wdGlvbnM7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHRlbXBsYXRlIGZpbGUgdmlhIGluY2x1ZGVcblx0ICAgICAgICAgICAgICAgIGlmICghZXh0X3RlbXBsYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdXJsID0gVHdpZy5wYXRoLnBhcnNlUGF0aCh0aGF0LCB0aGF0LmV4dGVuZCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBleHRfdGVtcGxhdGUgPSBUd2lnLlRlbXBsYXRlcy5sb2FkUmVtb3RlKHVybCwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoYXQuZ2V0TG9hZGVyTWV0aG9kKCksXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6IHRoYXQuYmFzZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6ICBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICAgICB1cmwsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoYXQub3B0aW9uc1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB0aGF0LnBhcmVudCA9IGV4dF90ZW1wbGF0ZTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucGFyZW50LnJlbmRlckFzeW5jKHRoYXQuY29udGV4dCwge1xuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrczogdGhhdC5ibG9ja3Ncblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKHBhcmFtcy5vdXRwdXQgPT0gJ2Jsb2NrcycpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LmJsb2Nrcztcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMub3V0cHV0ID09ICdtYWNyb3MnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5tYWNyb3M7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblxuXHQgICAgICAgIHByb21pc2UgPSBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3RoaXMudG9rZW5zLCB0aGlzLmNvbnRleHRdKVxuXHQgICAgICAgIC50aGVuKGNiKVxuXHQgICAgICAgIC50aGVuKGZ1bmN0aW9uKHYpIHtcblx0ICAgICAgICAgICAgaXNfYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICAgICAgcmVzdWx0ID0gdjtcblx0ICAgICAgICAgICAgcmV0dXJuIHY7XG5cdCAgICAgICAgfSlcblx0ICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZSkge1xuXHQgICAgICAgICAgICBpZiAoYWxsb3dfYXN5bmMpXG5cdCAgICAgICAgICAgICAgICB0aHJvdyBlO1xuXG5cdCAgICAgICAgICAgIGVyciA9IGU7XG5cdCAgICAgICAgfSlcblxuXHQgICAgICAgIC8vIElmIGBhbGxvd19hc3luY2Agd2Ugd2lsbCBhbHdheXMgcmV0dXJuIGEgcHJvbWlzZSBzaW5jZSB3ZSBkbyBub3Rcblx0ICAgICAgICAvLyBrbm93IGluIGFkdmFuY2UgaWYgd2UgYXJlIGdvaW5nIHRvIHJ1biBhc3luY2hyb25vdXNseSBvciBub3QuXG5cdCAgICAgICAgaWYgKGFsbG93X2FzeW5jKVxuXHQgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblxuXHQgICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgaGVyZSBpZiB3ZSBmYWlsIHN5bmNocm9ub3VzbHkuXG5cdCAgICAgICAgaWYgKGVyciAhPT0gbnVsbClcblx0ICAgICAgICAgICAgdGhyb3cgZXJyO1xuXG5cdCAgICAgICAgLy8gSWYgYGFsbG93X2FzeW5jYCBpcyBub3QgdHJ1ZSB3ZSBzaG91bGQgbm90IGFsbG93IHRoZSB1c2VyXG5cdCAgICAgICAgLy8gdG8gdXNlIGFzeW5jaHJvbm91cyBmdW5jdGlvbnMgb3IgZmlsdGVycy5cblx0ICAgICAgICBpZiAoaXNfYXN5bmMpXG5cdCAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdZb3UgYXJlIHVzaW5nIFR3aWcuanMgaW4gc3luYyBtb2RlIGluIGNvbWJpbmF0aW9uIHdpdGggYXN5bmMgZXh0ZW5zaW9ucy4nKTtcblxuXHQgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLlRlbXBsYXRlLnByb3RvdHlwZS5pbXBvcnRGaWxlID0gZnVuY3Rpb24oZmlsZSkge1xuXHQgICAgICAgIHZhciB1cmwsIHN1Yl90ZW1wbGF0ZTtcblx0ICAgICAgICBpZiAoIXRoaXMudXJsICYmIHRoaXMub3B0aW9ucy5hbGxvd0lubGluZUluY2x1ZGVzKSB7XG5cdCAgICAgICAgICAgIGZpbGUgPSB0aGlzLnBhdGggPyBUd2lnLnBhdGgucGFyc2VQYXRoKHRoaXMsIGZpbGUpIDogZmlsZTtcblx0ICAgICAgICAgICAgc3ViX3RlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZChmaWxlKTtcblxuXHQgICAgICAgICAgICBpZiAoIXN1Yl90ZW1wbGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgc3ViX3RlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZSh1cmwsIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZDogZmlsZSxcblx0ICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMuZ2V0TG9hZGVyTWV0aG9kKCksXG5cdCAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGUsXG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zXG5cdCAgICAgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKCFzdWJfdGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBmaW5kIHRoZSB0ZW1wbGF0ZSBcIiArIGZpbGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgc3ViX3RlbXBsYXRlLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHN1Yl90ZW1wbGF0ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB1cmwgPSBUd2lnLnBhdGgucGFyc2VQYXRoKHRoaXMsIGZpbGUpO1xuXG5cdCAgICAgICAgLy8gTG9hZCBibG9ja3MgZnJvbSBhbiBleHRlcm5hbCBmaWxlXG5cdCAgICAgICAgc3ViX3RlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZSh1cmwsIHtcblx0ICAgICAgICAgICAgbWV0aG9kOiB0aGlzLmdldExvYWRlck1ldGhvZCgpLFxuXHQgICAgICAgICAgICBiYXNlOiB0aGlzLmJhc2UsXG5cdCAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcblx0ICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuXHQgICAgICAgICAgICBpZDogdXJsXG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICByZXR1cm4gc3ViX3RlbXBsYXRlO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5UZW1wbGF0ZS5wcm90b3R5cGUuaW1wb3J0QmxvY2tzID0gZnVuY3Rpb24oZmlsZSwgb3ZlcnJpZGUpIHtcblx0ICAgICAgICB2Y
46184XIgc3ViX3RlbXBsYXRlID0gdGhpcy5pbXBvcnRGaWxlKGZpbGUpLFxuXHQgICAgICAgICAgICBjb250ZXh0ID0gdGhpcy5jb250ZXh0LFxuXHQgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAga2V5O1xuXG5cdCAgICAgICAgb3ZlcnJpZGUgPSBvdmVycmlkZSB8fCBmYWxzZTtcblxuXHQgICAgICAgIHN1Yl90ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7XG5cblx0ICAgICAgICAvLyBNaXhpbiBibG9ja3Ncblx0ICAgICAgICBUd2lnLmZvckVhY2goT2JqZWN0LmtleXMoc3ViX3RlbXBsYXRlLmJsb2NrcyksIGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICBpZiAob3ZlcnJpZGUgfHwgdGhhdC5ibG9ja3Nba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGF0LmJsb2Nrc1trZXldID0gc3ViX3RlbXBsYXRlLmJsb2Nrc1trZXldO1xuXHQgICAgICAgICAgICAgICAgdGhhdC5pbXBvcnRlZEJsb2Nrcy5wdXNoKGtleSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLmltcG9ydE1hY3JvcyA9IGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICB2YXIgdXJsID0gVHdpZy5wYXRoLnBhcnNlUGF0aCh0aGlzLCBmaWxlKTtcblxuXHQgICAgICAgIC8vIGxvYWQgcmVtb3RlIHRlbXBsYXRlXG5cdCAgICAgICAgdmFyIHJlbW90ZVRlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZSh1cmwsIHtcblx0ICAgICAgICAgICAgbWV0aG9kOiB0aGlzLmdldExvYWRlck1ldGhvZCgpLFxuXHQgICAgICAgICAgICBhc3luYzogZmFsc2UsXG5cdCAgICAgICAgICAgIGlkOiB1cmxcblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIHJldHVybiByZW1vdGVUZW1wbGF0ZTtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLmdldExvYWRlck1ldGhvZCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnBhdGgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICdmcyc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnVybCkge1xuXHQgICAgICAgICAgICByZXR1cm4gJ2FqYXgnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QgfHwgJ2ZzJztcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cdCAgICAgICAgLy8gY29tcGlsZSB0aGUgdGVtcGxhdGUgaW50byByYXcgSlNcblx0ICAgICAgICByZXR1cm4gVHdpZy5jb21waWxlci5jb21waWxlKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGUgc2FmZSBvdXRwdXRcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gQ29udGVudCBzYWZlIHRvIG91dHB1dFxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29udGVudCB3cmFwcGVkIGludG8gYSBTdHJpbmdcblx0ICAgICAqL1xuXG5cdCAgICBUd2lnLk1hcmt1cCA9IGZ1bmN0aW9uKGNvbnRlbnQsIHN0cmF0ZWd5KSB7XG5cdCAgICAgICAgaWYodHlwZW9mIHN0cmF0ZWd5ID09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgIHN0cmF0ZWd5ID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBjb250ZW50ID0gbmV3IFN0cmluZyhjb250ZW50KTtcblx0ICAgICAgICAgICAgY29udGVudC50d2lnX21hcmt1cCA9IHN0cmF0ZWd5O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29udGVudDtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vICMjIHR3aWcuY29tcGlsZXIuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgY29tcGlsaW5nIHRlbXBsYXRlcyBpbnRvIEpTXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFR3aWcpIHtcblx0ICAgIC8qKlxuXHQgICAgICogTmFtZXNwYWNlIGZvciBjb21waWxhdGlvbi5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5jb21waWxlciA9IHtcblx0ICAgICAgICBtb2R1bGU6IHt9XG5cdCAgICB9O1xuXG5cdCAgICAvLyBDb21waWxlIGEgVHdpZyBUZW1wbGF0ZSB0byBvdXRwdXQuXG5cdCAgICBUd2lnLmNvbXBpbGVyLmNvbXBpbGUgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykge1xuXHQgICAgICAgIC8vIEdldCB0b2tlbnNcblx0ICAgICAgICB2Y
46184XIgdG9rZW5zID0gSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUudG9rZW5zKVxuXHQgICAgICAgICAgICAsIGlkID0gdGVtcGxhdGUuaWRcblx0ICAgICAgICAgICAgLCBvdXRwdXQ7XG5cblx0ICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGUpIHtcblx0ICAgICAgICAgICAgaWYgKFR3aWcuY29tcGlsZXIubW9kdWxlW29wdGlvbnMubW9kdWxlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBmaW5kIG1vZHVsZSB0eXBlIFwiICsgb3B0aW9ucy5tb2R1bGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG91dHB1dCA9IFR3aWcuY29tcGlsZXIubW9kdWxlW29wdGlvbnMubW9kdWxlXShpZCwgdG9rZW5zLCBvcHRpb25zLnR3aWcpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIG91dHB1dCA9IFR3aWcuY29tcGlsZXIud3JhcChpZCwgdG9rZW5zKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuY29tcGlsZXIubW9kdWxlID0ge1xuXHQgICAgICAgIGFtZDogZnVuY3Rpb24oaWQsIHRva2VucywgcGF0aFRvVHdpZykge1xuXHQgICAgICAgICAgICByZXR1cm4gJ2RlZmluZShbXCInICsgcGF0aFRvVHdpZyArICdcIl0sIGZ1bmN0aW9uIChUd2lnKSB7XFxuXFx0dmFyIHR3aWcsIHRlbXBsYXRlcztcXG50d2lnID0gVHdpZy50d2lnO1xcbnRlbXBsYXRlcyA9ICcgKyBUd2lnLmNvbXBpbGVyLndyYXAoaWQsIHRva2VucykgKyAnXFxuXFx0cmV0dXJuIHRlbXBsYXRlcztcXG59KTsnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAsIG5vZGU6IGZ1bmN0aW9uKGlkLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICd2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWc7XFxuJ1xuXHQgICAgICAgICAgICAgICAgKyAnZXhwb3J0cy50ZW1wbGF0ZSA9ICcgKyBUd2lnLmNvbXBpbGVyLndyYXAoaWQsIHRva2Vucylcblx0ICAgICAgICB9XG5cdCAgICAgICAgLCBjanMyOiBmdW5jdGlvbihpZCwgdG9rZW5zLCBwYXRoVG9Ud2lnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAnbW9kdWxlLmRlY2xhcmUoW3sgdHdpZzogXCInICsgcGF0aFRvVHdpZyArICdcIiB9XSwgZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xcbidcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyAnXFx0dmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnO1xcbidcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyAnXFx0ZXhwb3J0cy50ZW1wbGF0ZSA9ICcgKyBUd2lnLmNvbXBpbGVyLndyYXAoaWQsIHRva2Vucylcblx0ICAgICAgICAgICAgICAgICAgICArICdcXG59KTsnXG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgVHdpZy5jb21waWxlci53cmFwID0gZnVuY3Rpb24oaWQsIHRva2Vucykge1xuXHQgICAgICAgIHJldHVybiAndHdpZyh7aWQ6XCInK2lkLnJlcGxhY2UoJ1wiJywgJ1xcXFxcIicpKydcIiwgZGF0YTonK3Rva2VucysnLCBwcmVjb21waWxlZDogdHJ1ZX0pO1xcbic7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gIyMgdHdpZy5leHByZXNzaW9uLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIHRva2VuaXppbmcsIGNvbXBpbGluZyBhbmQgcGFyc2luZyBleHByZXNzaW9ucy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW1zKHRoaXNBcmcsIHBhcmFtcywgY29udGV4dCkge1xuXHQgICAgICAgIGlmIChwYXJhbXMpXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzQXJnLCBbcGFyYW1zLCBjb250ZXh0XSk7XG5cblx0ICAgICAgICByZXR1cm4gVHdpZy5Qcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIE5hbWVzcGFjZSBmb3IgZXhwcmVzc2lvbiBoYW5kbGluZy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uID0geyB9O1xuXG5cdCAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpKFR3aWcpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFJlc2VydmVkIHdvcmQgdGhhdCBjYW4ndCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVzLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24ucmVzZXJ2ZWRXb3JkcyA9IFtcblx0ICAgICAgICBcInRydWVcIiwgXCJmYWxzZVwiLCBcIm51bGxcIiwgXCJUUlVFXCIsIFwiRkFMU0VcIiwgXCJOVUxMXCIsIFwiX2NvbnRleHRcIiwgXCJhbmRcIiwgXCJiLWFuZFwiLCBcIm9yXCIsIFwiYi1vclwiLCBcImIteG9yXCIsIFwiaW5cIiwgXCJub3QgaW5cIiwgXCJpZlwiXG5cdCAgICBdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFRoZSB0eXBlIG9mIHRva2VucyB1c2VkIGluIGV4cHJlc3Npb25zLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24udHlwZSA9IHtcblx0ICAgICAgICBjb21tYTogICAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUuY29tbWEnLFxuXHQgICAgICAgIG9wZXJhdG9yOiB7XG5cdCAgICAgICAgICAgIHVuYXJ5OiAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLm9wZXJhdG9yLnVuYXJ5Jyxcblx0ICAgICAgICAgICAgYmluYXJ5OiAnVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IuYmluYXJ5J1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc3RyaW5nOiAgICAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZycsXG5cdCAgICAgICAgYm9vbDogICAgICAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLmJvb2wnLFxuXHQgICAgICAgIHNsaWNlOiAgICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5zbGljZScsXG5cdCAgICAgICAgYXJyYXk6IHtcblx0ICAgICAgICAgICAgc3RhcnQ6ICAnVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQnLFxuXHQgICAgICAgICAgICBlbmQ6ICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5hcnJheS5lbmQnXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBvYmplY3Q6IHtcblx0ICAgICAgICAgICAgc3RhcnQ6ICAnVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0Jyxcblx0ICAgICAgICAgICAgZW5kOiAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LmVuZCdcblx0ICAgICAgICB9LFxuXHQgICAgICAgI
46184HBhcmFtZXRlcjoge1xuXHQgICAgICAgICAgICBzdGFydDogICdUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuc3RhcnQnLFxuXHQgICAgICAgICAgICBlbmQ6ICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kJ1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc3ViZXhwcmVzc2lvbjoge1xuXHQgICAgICAgICAgICBzdGFydDogICdUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLnN0YXJ0Jyxcblx0ICAgICAgICAgICAgZW5kOiAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5lbmQnXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBrZXk6IHtcblx0ICAgICAgICAgICAgcGVyaW9kOiAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkucGVyaW9kJyxcblx0ICAgICAgICAgICAgYnJhY2tldHM6ICdUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkuYnJhY2tldHMnXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBmaWx0ZXI6ICAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUuZmlsdGVyJyxcblx0ICAgICAgICBfZnVuY3Rpb246ICAnVHdpZy5leHByZXNzaW9uLnR5cGUuX2Z1bmN0aW9uJyxcblx0ICAgICAgICB2YXJpYWJsZTogICAnVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGUnLFxuXHQgICAgICAgIG51bWJlcjogICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5udW1iZXInLFxuXHQgICAgICAgIF9udWxsOiAgICAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLm51bGwnLFxuXHQgICAgICAgIGNvbnRleHQ6ICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5jb250ZXh0Jyxcblx0ICAgICAgICB0ZXN0OiAgICAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUudGVzdCdcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5zZXQgPSB7XG5cdCAgICAgICAgLy8gV2hhdCBjYW4gZm9sbG93IGFuIGV4cHJlc3Npb24gKGluIGdlbmVyYWwpXG5cdCAgICAgICAgb3BlcmF0aW9uczogW1xuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXIsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLm9wZXJhdG9yLnVuYXJ5LFxuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnksXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmFycmF5LmVuZCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LmVuZCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5lbmQsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbW1hLFxuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS50ZXN0XG5cdCAgICAgICAgXSxcblx0ICAgICAgICBleHByZXNzaW9uczogW1xuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5fZnVuY3Rpb24sXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmJvb2wsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZyxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGUsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLm51bWJlcixcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuX251bGwsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbnRleHQsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLm9iamVjdC5zdGFydCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5zdGFydCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IudW5hcnlcblx0ICAgICAgICBdXG5cdCAgICB9O1xuXG5cdCAgICAvLyBNb3N0IGV4cHJlc3Npb25zIGFsbG93IGEgJy4nIG9yICdbJyBhZnRlciB0aGVtLCBzbyB3ZSBwcm92aWRlIGEgY29udmVuaWVuY2Ugc2V0XG5cdCAgICBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnNfZXh0ZW5kZWQgPSBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMuY29uY2F0KFtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkucGVyaW9kLFxuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmtleS5icmFja2V0cyxcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5zbGljZV0pO1xuXG5cdCAgICAvLyBTb21lIGNvbW1vbmx5IHVzZWQgY29tcGlsZSBhbmQgcGFyc2UgZnVuY3Rpb25zLlxuXHQgICAgVHdpZy5leHByZXNzaW9uLmZuID0ge1xuXHQgICAgICAgIGNvbXBpbGU6IHtcblx0ICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcHVzaF9ib3RoOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHBhcnNlOiB7XG5cdCAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHB1c2hfdmFsdWU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9ucyBhbmQgY29tcGlsZS9wYXJzZSBsb2dpYyB1c2VkIHRvIG1hdGNoIHRva2VucyBpbiBleHByZXNzaW9ucy5cblx0ICAgIC8vXG5cdCAgICAvLyBQcm9wZXJ0aWVzOlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgdHlwZTogIFRoZSB0eXBlIG9mIGV4cHJlc3Npb24gdGhpcyBtYXRjaGVzXG5cdCAgICAvL1xuXHQgICAgLy8gICAgICByZWdleDogT25lIG9yIG1vcmUgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoZSB0aGUgZm9ybWF0IG9mIHRoZSB0b2tlbi5cblx0ICAgIC8vXG5cdCAgICAvLyAgICAgIG5leHQ6ICBWYWxpZCB0b2tlbnMgdGhhdCBjYW4gb2NjdXIgbmV4dCBpbiB0aGUgZXhwcmVzc2lvbi5cblx0ICAgIC8vXG5cdCAgICAvLyBGdW5jdGlvbnM6XG5cdCAgICAvL1xuXHQgICAgLy8gICAgICBjb21waWxlOiBBIGZ1bmN0aW9uIHRoYXQgY29tcGlsZXMgdGhlIHJhdyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaW50byBhIHRva2VuLlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgcGFyc2U6ICAgQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyB0aGUgY29tcGlsZWQgdG9rZW4gaW50byBvdXRwdXQuXG5cdCAgICAvL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLmRlZmluaXRpb25zID0gW1xuXHQgICAgICAgI
46184Htcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUudGVzdCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaXNcXHMrKG5vdCk/XFxzKihbYS16QS1aX11bYS16QS1aMC05X10qKFxccz9hcyk/KS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9ucy5jb25jYXQoW1R3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uZmlsdGVyICAgPSB0b2tlbi5tYXRjaFsyXTtcblx0ICAgICAgICAgICAgICAgIHRva2VuLm1vZGlmaWVyID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbXModGhpcywgdG9rZW4ucGFyYW1zLCBjb250ZXh0KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocGFyYW1zKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFR3aWcudGVzdCh0b2tlbi5maWx0ZXIsIHZhbHVlLCBwYXJhbXMpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLm1vZGlmaWVyID09ICdub3QnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIXJlc3VsdCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbW1hLFxuXHQgICAgICAgICAgICAvLyBNYXRjaCBhIGNvbW1hXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXiwvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0LmV4cHJlc3Npb25zLmNvbmNhdChbVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuZW5kLCBUd2lnLmV4cHJlc3Npb24udHlwZS5vYmplY3QuZW5kXSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgaSA9IHN0YWNrLmxlbmd0aCAtIDEsXG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW47XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi52YWx1ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gcG9wIHRva2VucyBvZmYgdGhlIHN0YWNrIHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBmb3IoO2kgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGFja190b2tlbi50eXBlID09PSBUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuc3RhcnRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0YWNrX3Rva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLmFycmF5LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RhY2tfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goc3RhY2tfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIG51bWJlciAoaW50ZWdlciBvciBkZWNpbWFsKVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUubnVtYmVyLFxuXHQgICAgICAgICAgICAvLyBtYXRjaCBhIG51bWJlclxuXHQgICAgICAgICAgICByZWdleDogL15cXC0/XFxkKyhcXC5cXGQrKT8vLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IE51bWJlcih0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBUd2lnLmV4cHJlc3Npb24uZm4ucGFyc2UucHVzaF92YWx1ZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnksXG5cdCAgICAgICAgICAgIC8vIE1hdGNoIGFueSBvZiA/OiwgKywgKiwgLywgLSwgJSwgfiwgPCwgPD0sID4sID49LCAhPSwgPT0sICoqLCA/LCA6LCBhbmQsIGItYW5kLCBvciwgYi1vciwgYi14b3IsIGluLCBub3QgaW5cblx0ICAgICAgICAgICAgLy8gYW5kLCBvciwgaW4sIG5vdCBpbiBjYW4gYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSBvciBwYXJlbnRoZXNpc1xuXHQgICAgICAgICAgICByZWdleDogLyheXFw/XFw6fF4oYlxcLWFuZCl8XihiXFwtb3IpfF4oYlxcLXhvcil8XltcXCtcXC1+JVxcP118XltcXDpdKD8hXFxkXFxdKXxeWyE9XT09P3xeWyE8Pl09P3xeXFwqXFwqP3xeXFwvXFwvP3xeKGFuZClbXFwofFxccytdfF4ob3IpW1xcKHxcXHMrXXxeKGluKVtcXCh8XFxzK118Xihub3QgaW4pW1xcKHxcXHMrXXxeXFwuXFwuKS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMsXG5cdCAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24obWF0Y2gsIHRva2Vucykge1xuXHQgICAgICAgICAgICAgICAgc3dpdGNoKG1hdGNoWzBdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnYW5kKCc6XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3IoJzpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdpbignOlxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdCBpbignOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmlwIG9mZiB0aGUgKCBpZiBpdCBleGlzdHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IG1hdGNoWzJdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0b2tlbi52YWx1ZS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdmFsdWUgPSB0b2tlbi52YWx1ZSxcblx0ICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sb29rdXAodmFsdWUsIHRva2VuKTtcblxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiT3BlcmF0b3I6IFwiLCBvcGVyYXRvciwgXCIgZnJvbSBcIiwgdmFsdWUpO1xuXG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgIChzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci51bmFyeSB8fCBzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnkpICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID49IHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKSB8fFxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5yaWdodFRvTGVmdCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID4gIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICkge1xuXHQgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgdGVtcCA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0ZW1wKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIjpcIikge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB0ZXJuYXJ5IG9yIG9iamVjdCBrZXkgYmVpbmcgc2V0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICYmIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS52YWx1ZSA9PT0gXCI/XCIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgYXMgbm9ybWFsIGZvciBhIHRlcm5hcnlcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRlcm5hcnkgc28gd2UgcHVzaCB0aGUgdG9rZW4gdG8gdGhlIG91dHB1dCB3aGVyZSBpdCBjYW4gYmUgaGFuZGxlZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdoZW4gdGhlIGFzc29jYXRlZCBvYmplY3QgaXMgY2xvc2VkLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5X3Rva2VuID0gb3V0cHV0LnBvcCgpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3Rva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5rZXkgPSBrZXlfdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5X3Rva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLm51bWJlcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBpbnRlZ2VyIGtleXMgaW50byBzdHJpbmcga2V5c1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4ua2V5ID0ga2V5X3Rva2VuLnZhbHVlLnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5X3Rva2VuLmV4cHJlc3Npb24gJiZcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3Rva2VuLnR5cGUgPT0gVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5lbmQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5wYXJhbXMgPSBrZXlfdG9rZW4ucGFyYW1zO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlIGJlZm9yZSAnOicgb2YgXCIgKyBrZXlfdG9rZW4udHlwZSArIFwiID0gXCIgKyBrZXlfdG9rZW4udmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG9wZXJhdG9yKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0ZXJuYXJ5ICc6JyBvcGVyYXRvclxuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5wYXJhbXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgXCJ7KGV4cHJlc3Npb24pOnZhbHVlfVwiXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5wYXJhbXMsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5rZXkgPSBrZXk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godG9rZW4pO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgd2UncmUgaW4gYSBsb29wLCB3ZSBtaWdodCBuZWVkIHRva2VuLnBhcmFtcyBsYXRlciwgZXNwZWNpYWxseSBpbiB0aGlzIGZvcm0gb2YgXCIoZXhwcmVzc2lvbik6dmFsdWVcIlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQubG9vcCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKHRva2VuLnBhcmFtcyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLnBhcnNlKHRva2VuLnZhbHVlLCBzdGFjayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IudW5hcnksXG5cdCAgICAgICAgICAgIC8vIE1hdGNoIGFueSBvZiBub3Rcblx0ICAgICAgICAgICAgcmVnZXg6IC8oXm5vdFxccyspLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5leHByZXNzaW9ucyxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0b2tlbi52YWx1ZS
4618450cmltKCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZSxcblx0ICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sb29rdXAodmFsdWUsIHRva2VuKTtcblxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiT3BlcmF0b3I6IFwiLCBvcGVyYXRvciwgXCIgZnJvbSBcIiwgdmFsdWUpO1xuXG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgIChzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci51bmFyeSB8fCBzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnkpICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID49IHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKSB8fFxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5yaWdodFRvTGVmdCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID4gIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICkge1xuXHQgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgdGVtcCA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0ZW1wKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5wYXJzZSh0b2tlbi52YWx1ZSwgc3RhY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIHN0cmluZy4gVGhpcyBpcyBhbnl0aGluZyBiZXR3ZWVuIGEgcGFpciBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZyxcblx0ICAgICAgICAgICAgLy8gU2VlOiBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvbWF0Y2gtcXVvdGVkLXN0cmluZ1xuXHQgICAgICAgICAgICByZWdleDogL14oW1wiJ10pKD86KD89KFxcXFw/KSlcXDJbXFxzXFxTXSkqP1xcMS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9uc19leHRlbmRlZCxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoXG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHN0cmluZ1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cmluZygwLCAxKSA9PT0gJ1wiJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXFwiJywgJ1wiJyk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcIlxcXFwnXCIsIFwiJ1wiKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aC0xKS5yZXBsYWNlKCAvXFxcXG4vZywgXCJcXG5cIiApLnJlcGxhY2UoIC9cXFxcci9nLCBcIlxcclwiICk7XG5cdCAgICAgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuZXhwcmVzc2lvbi5jb21waWxlOiBcIiwgXCJTdHJpbmcgdmFsdWU6IFwiLCB0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBUd2lnLmV4cHJlc3Npb24uZm4ucGFyc2UucHVzaF92YWx1ZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogTWF0Y2ggYSBzdWJleHByZXNzaW9uIHNldCBzdGFydC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uc3RhcnQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcKC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMuY29uY2F0KFtUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLmVuZF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSAnKCc7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IFR3aWcuZXhwcmVzc2lvbi5mbi5wYXJzZS5wdXNoXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIHN1YmV4cHJlc3Npb24gc2V0IGVuZC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uZW5kLFxuXHQgICAgICAgICAgICByZWdleDogL15cXCkvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnNfZXh0ZW5kZWQsXG5cdCAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbihtYXRjaCwgdG9rZW5zKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIGJhY2sgdGhyb3VnaCBwcmV2aW91cyB0b2tlbnMgdG8gZW5zdXJlIHdlIGZvbGxvdyBhIHN1YmV4cHJlc3Npb24gc3RhcnRcblx0ICAgICAgICAgICAgICAgIHZhciBpID0gdG9rZW5zLmxlbmd0aCAtIDEsXG5cdCAgICAgICAgICAgICAgICAgICAgZm91bmRfc3ViZXhwcmVzc2lvbl9zdGFydCA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIG5leHRfc3ViZXhwcmVzc2lvbl9zdGFydF9pbnZhbGlkID0gZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgdW5jbG9zZWRfcGFyYW1ldGVyX2NvdW50ID0gMDtcblxuXHQgICAgICAgICAgICAgICAgd2hpbGUoIWZvdW5kX3N1YmV4cHJlc3Npb25fc3RhcnQgJiYgaSA+PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgZm91bmRfc3ViZXhwcmVzc2lvbl9zdGFydCA9IHRva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uc3RhcnQ7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzbHkgZm91bmQgYSBzdWJleHByZXNzaW9uIGVuZCwgdGhlbiB0aGlzIHN1YmV4cHJlc3Npb24gc3RhcnQgaXMgdGhlIHN0YXJ0IG9mXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBzdWJleHByZXNzaW9uLCBub3QgdGhlI
46184HN1YmV4cHJlc3Npb24gd2UgYXJlIHNlYXJjaGluZyBmb3Jcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRfc3ViZXhwcmVzc2lvbl9zdGFydCAmJiBuZXh0X3N1YmV4cHJlc3Npb25fc3RhcnRfaW52YWxpZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3N1YmV4cHJlc3Npb25fc3RhcnRfaW52YWxpZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9zdWJleHByZXNzaW9uX3N0YXJ0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgcGFyYW1ldGVyIHRva2VucyB0byBlbnN1cmUgd2UgZG9udCByZXR1cm4gdHJ1dGh5IGZvciBhIHBhcmFtZXRlciBvcGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHVuY2xvc2VkX3BhcmFtZXRlcl9jb3VudCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNsb3NlZF9wYXJhbWV0ZXJfY291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uZW5kKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfc3ViZXhwcmVzc2lvbl9zdGFydF9pbnZhbGlkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBpLS07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIHVuY2xvc2VkIHBhcmFtZXRlcnMsIHJldHVybiBmYWxzZVxuXHQgICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbnQgZmluZCBzdWJleHByZXNzaW9uIHN0YXJ0LCByZXR1cm4gZmFsc2Vcblx0ICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4gdHJ1ZVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGZvdW5kX3N1YmV4cHJlc3Npb25fc3RhcnQgJiYgKHVuY2xvc2VkX3BhcmFtZXRlcl9jb3VudCA9PT0gMCkpO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBjb3B5IG9mIHBhcmFtZXRlciBlbmQgY29tcGlsYXRpb25cblx0ICAgICAgICAgICAgICAgIHZhciBzdGFja190b2tlbixcblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4gPSB0b2tlbjtcblxuXHQgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgIHdoaWxlKHN0YWNrLmxlbmd0aCA+IDAgJiYgc3RhY2tfdG9rZW4udHlwZSAhPSBUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goc3RhY2tfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrX3Rva2VuID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIE1vdmUgY29udGVudHMgb2YgcGFyZW5zIGludG8gcHJlY2VkaW5nIGZpbHRlclxuXHQgICAgICAgICAgICAgICAgdmFyIHBhcmFtX3N0YWNrID0gW107XG5cdCAgICAgICAgICAgICAgICB3aGlsZSh0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRva2VuIHRvIGFyZ3VtZW50cyBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnVuc2hpZnQodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuID0gb3V0cHV0LnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBwYXJhbV9zdGFjay51bnNoaWZ0KHRva2VuKTtcblxuXHQgICAgICAgICAgICAgICAgdmFyIGlzX2V4cHJlc3Npb24gPSBmYWxzZTtcblxuXHQgICAgICAgICAgICAgICAgLy9JZiB0aGUgdG9rZW4gYXQgdGhlIHRvcCBvZiB0aGUgKnN0YWNrKiBpcyBhIGZ1bmN0aW9uIHRva2VuLCBwb3AgaXQgb250byB0aGUgb3V0cHV0IHF1ZXVlLlxuXHQgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0b2tlbiBwcmVjZWRpbmcgdGhlIHBhcmFtZXRlcnNcblx0ICAgICAgICAgICAgICAgIHN0YWNrX3Rva2VuID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4gPT09IHVuZGVmaW5lZCB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChzdGFja190b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5fZnVuY3Rpb24gJiZcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXIgJiZcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS50ZXN0ICYmXG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4udHlwZSAhPT0gVHdpZy5leHByZXNzaW9uLnR5cGUua2V5LmJyYWNrZXRzKSkge1xuXG5cdCAgICAgICAgICAgICAgICAgICAgZW5kX3Rva2VuLmV4cHJlc3Npb24gPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YXJ0IGFuZCBlbmQgdG9rZW4gZnJvbSBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnNoaWZ0KCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4ucGFyYW1zID0gcGFyYW1fc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChlbmRfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBoaXRcblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4uZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgI
46184HN0YWNrX3Rva2VuLnBhcmFtcyA9IHBhcmFtX3N0YWNrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbmV3X2FycmF5ID0gW10sXG5cdCAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kZWQgPSBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi5leHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5wYXJhbXMsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuZXhwZWN0ZWQgc3ViZXhwcmVzc2lvbiBlbmQgd2hlbiB0b2tlbiBpcyBub3QgbWFya2VkIGFzIGFuIGV4cHJlc3Npb25cIik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGEgcGFyYW1ldGVyIHNldCBzdGFydC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFwoLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5leHByZXNzaW9ucy5jb25jYXQoW1R3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5lbmRdKSxcblx0ICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKG1hdGNoLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBsYXN0X3Rva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcblx0ICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgcmVnZXggdG8gdGVzdCBpZiB3ZSBmb2xsb3cgYSBzcGFjZSBiZWNhdXNlIGV4cHJlc3Npb24gaXMgdHJpbW1lZFxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RfdG9rZW4gJiYgKFR3aWcuaW5kZXhPZihUd2lnLmV4cHJlc3Npb24ucmVzZXJ2ZWRXb3JkcywgbGFzdF90b2tlbi52YWx1ZS50cmltKCkpIDwgMCk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IFR3aWcuZXhwcmVzc2lvbi5mbi5jb21waWxlLnB1c2hfYm90aCxcblx0ICAgICAgICAgICAgcGFyc2U6IFR3aWcuZXhwcmVzc2lvbi5mbi5wYXJzZS5wdXNoXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIHBhcmFtZXRlciBzZXQgZW5kLlxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFwpLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHN0YWNrX3Rva2VuLFxuXHQgICAgICAgICAgICAgICAgICAgIGVuZF90b2tlbiA9IHRva2VuO1xuXG5cdCAgICAgICAgICAgICAgICBzdGFja190b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgd2hpbGUoc3RhY2subGVuZ3RoID4gMCAmJiBzdGFja190b2tlbi50eXBlICE9IFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCkge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHN0YWNrX3Rva2VuKTtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBNb3ZlIGNvbnRlbnRzIG9mIHBhcmVucyBpbnRvIHByZWNlZGluZyBmaWx0ZXJcblx0ICAgICAgICAgICAgICAgIHZhciBwYXJhbV9zdGFjayA9IFtdO1xuXHQgICAgICAgICAgICAgICAgd2hpbGUodG9rZW4udHlwZSAhPT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRva2VuIHRvIGFyZ3VtZW50cyBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnVuc2hpZnQodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuID0gb3V0cHV0LnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcGFyYW1fc3RhY2sudW5zaGlmdCh0b2tlbik7XG5cblx0ICAgICAgICAgICAgICAgIHZhciBpc19leHByZXNzaW9uID0gZmFsc2U7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdG9rZW4gcHJlY2VkaW5nIHRoZSBwYXJhbWV0ZXJzXG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IG91dHB1dFtvdXRwdXQubGVuZ3RoLTFdO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5fZnVuY3Rpb24gJiZcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXIgJiZcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS50ZXN0ICYmXG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSAhPT0gVHdpZy5leHByZXNzaW9uLnR5cGUua2V5LmJyYWNrZXRzKSkge1xuXG5cdCAgICAgICAgICAgICAgICAgICAgZW5kX3Rva2VuLmV4cHJlc3Npb24gPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YXJ0IGFuZCBlbmQgdG9rZW4gZnJvbSBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgI
46184HBhcmFtX3N0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnNoaWZ0KCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4ucGFyYW1zID0gcGFyYW1fc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChlbmRfdG9rZW4pO1xuXG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuZF90b2tlbi5leHByZXNzaW9uID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4ucGFyYW1zID0gcGFyYW1fc3RhY2s7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBuZXdfYXJyYXkgPSBbXSxcblx0ICAgICAgICAgICAgICAgICAgICBhcnJheV9lbmRlZCA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLnBhcmFtcywgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG5cdCAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCB2YWx1ZXMgaW50byB0aGUgYXJyYXkgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBhcnJheVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHlwZSAmJiB2YWx1ZS50eXBlID09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FycmF5LnVuc2hpZnQodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXlfZW5kZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJFeHBlY3RlZCBlbmQgb2YgcGFyYW1ldGVyIHNldC5cIik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdfYXJyYXkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnNsaWNlLFxuXHQgICAgICAgICAgICByZWdleDogL15cXFsoXFxkKlxcOlxcZCopXFxdLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHNsaWNlUmFuZ2UgPSB0b2tlbi5tYXRjaFsxXS5zcGxpdCgnOicpO1xuXG5cdCAgICAgICAgICAgICAgICAvL3NsaWNlU3RhcnQgY2FuIGJlIHVuZGVmaW5lZCB3aGVuIHdlIHBhc3MgcGFyYW1ldGVycyB0byB0aGUgc2xpY2UgZmlsdGVyIGxhdGVyXG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgc2xpY2VTdGFydCA9IChzbGljZVJhbmdlWzBdKSA/IHBhcnNlSW50KHNsaWNlUmFuZ2VbMF0pIDogdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNsaWNlRW5kID0gKHNsaWNlUmFuZ2VbMV0pID8gcGFyc2VJbnQoc2xpY2VSYW5nZVsxXSkgOiB1bmRlZmluZWQ7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gJ3NsaWNlJztcblx0ICAgICAgICAgICAgICAgIHRva2VuLnBhcmFtcyA9IFtzbGljZVN0YXJ0LCBzbGljZUVuZF07XG5cblx0ICAgICAgICAgICAgICAgIC8vc2xpY2VFbmQgY2FuJ3QgYmUgdW5kZWZpbmVkIGFzIHRoZSBzbGljZSBmaWx0ZXIgZG9lc24ndCBjaGVjayBmb3IgdGhpcywgYnV0IGl0IGRvZXMgY2hlY2sgdGhlIGxlbmd0aFxuXHQgICAgICAgICAgICAgICAgLy9vZiB0aGUgcGFyYW1zIGFycmF5LCBzbyBqdXN0IHNob3J0ZW4gaXQuXG5cdCAgICAgICAgICAgICAgICBpZiAoIXNsaWNlRW5kKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4ucGFyYW1zID0gW3NsaWNlU3RhcnRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHN0YWNrLnBvcCgpLFxuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRva2VuLnBhcmFtcztcblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChUd2lnLmZpbHRlci5hcHBseSh0aGlzLCBbdG9rZW4udmFsdWUsIGlucHV0LCBwYXJhbXNdKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGFuIGFycmF5IHN0YXJ0LlxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcWy8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMuY29uY2F0KFtUd2lnLmV4cHJlc3Npb24udHlwZS5hcnJheS5lbmRdKSxcblx0ICAgICAgICAgICAgY29tcGlsZTogVHdpZy5leHByZXNzaW9uLmZuLmNvbXBpbGUucHVzaF9ib3RoLFxuXHQgICAgICAgICAgICBwYXJzZTogVHdpZy5leHByZXNzaW9uLmZuLnBhcnNlLnB1c2hcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGFuIGFycmF5IGVuZC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmFycmF5LmVuZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFxdLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxLFxuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrX3Rva2VuO1xuXHQgICAgICAgICAgICAgICAgLy8gcG9wIHRva2VucyBvZmYgdGhlIHN0YWNrIHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBmb3IoO2kgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHN0YWNrX3Rva2VuKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG5ld19hcnJheSA9IFtdLFxuXHQgICAgICAgICAgICAgICAgICAgIGFycmF5X2VuZGVkI
46184D0gZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuXG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCB2YWx1ZXMgaW50byB0aGUgYXJyYXkgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBhcnJheVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlICYmIHZhbHVlLnR5cGUgPT0gVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3X2FycmF5LnVuc2hpZnQodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCFhcnJheV9lbmRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiRXhwZWN0ZWQgZW5kIG9mIGFycmF5LlwiKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdfYXJyYXkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyBUb2tlbiB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgaGFzaCBtYXAgJ30nXG5cdCAgICAgICAgLy9cblx0ICAgICAgICAvLyBIYXNoIG1hcHMgdGFrZSB0aGUgZm9ybTpcblx0ICAgICAgICAvLyAgICB7IFwia2V5XCI6ICd2YWx1ZScsIFwiYW5vdGhlcl9rZXlcIjogaXRlbSB9XG5cdCAgICAgICAgLy9cblx0ICAgICAgICAvLyBLZXlzIG11c3QgYmUgcXVvdGVkIChlaXRoZXIgc2luZ2xlIG9yIGRvdWJsZSkgYW5kIHZhbHVlcyBjYW4gYmUgYW55IGV4cHJlc3Npb24uXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS5vYmplY3Quc3RhcnQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcey8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMuY29uY2F0KFtUd2lnLmV4cHJlc3Npb24udHlwZS5vYmplY3QuZW5kXSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IFR3aWcuZXhwcmVzc2lvbi5mbi5jb21waWxlLnB1c2hfYm90aCxcblx0ICAgICAgICAgICAgcGFyc2U6IFR3aWcuZXhwcmVzc2lvbi5mbi5wYXJzZS5wdXNoXG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIFRva2VuIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIGEgSGFzaCBNYXAgJ30nXG5cdCAgICAgICAgLy9cblx0ICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBsb2dpYyBmb3IgYnVpbGRpbmcgdGhlIGludGVybmFsXG5cdCAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBoYXNoIG1hcCBpcyBkZWZpbmVkLlxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LmVuZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFx9Lyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGgtMSxcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbjtcblxuXHQgICAgICAgICAgICAgICAgLy8gcG9wIHRva2VucyBvZmYgdGhlIHN0YWNrIHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBmb3IoO2kgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4gJiYgc3RhY2tfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChzdGFja190b2tlbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbihlbmRfdG9rZW4sIHN0YWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgbmV3X29iamVjdCA9IHt9LFxuXHQgICAgICAgICAgICAgICAgICAgIG9iamVjdF9lbmRlZCA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuID0gbnVsbCxcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbl9rZXkgPSBudWxsLFxuXHQgICAgICAgICAgICAgICAgICAgIGhhc192YWx1ZSA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcblxuXHQgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFB1c2ggdmFsdWVzIGludG8gdGhlIGFycmF5IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgJiYgdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9lbmRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSAmJiAodG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IuYmluYXJ5IHx8IHRva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLm9wZXJhdG9yLnVuYXJ5KSAmJiB0b2tlbi5rZXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNfdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiTWlzc2luZyB2YWx1ZSBmb3Iga2V5ICdcIiArIHRva2VuLmtleSArIFwiJyBpbiBvYmplY3QgZGVmaW5pdGlvbi5cIik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29iamVjdFt0b2tlbi5rZXldID0gdmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIG9yZGVyIHRoYXQgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBtYXBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgSmF2YVNjcmlwdCBvYmplY3RzIGRvbid0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Yga2V5c1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3X29iamVjdC5fa2V5cyA9PT0gdW5kZWZpbmVkKSBuZXdfb2JqZWN0Ll9rZXlzID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vYmplY3QuX2tleXMudW5zaGlmdCh0b2tlbi5rZXkpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHZhbHVlIGNoZWNrXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaGFzX3ZhbHVlID0gZmFsc2U7XG5cblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBoYXNfdmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghb2JqZWN0X2VuZGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmV4cGVjdGVkIGVuZCBvZiBvYmplY3QuXCIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld19vYmplY3QpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIFRva2VuIHJlcHJlc2VudGluZyBhIGZpbHRlclxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gRmlsdGVycyBjYW4gZm9sbG93IGFueSBleHByZXNzaW9uIGFuZCB0YWtlIHRoZSBmb3JtOlxuXHQgICAgICAgIC8vICAgIGV4cHJlc3Npb258ZmlsdGVyKG9wdGlvbmFsLCBhcmdzKVxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gRmlsdGVyIHBhcnNpbmcgaXMgZG9uZSBpbiB0aGUgVHdpZy5maWx0ZXJzIG5hbWVzcGFjZS5cblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmZpbHRlcixcblx0ICAgICAgICAgICAgLy8gbWF0Y2ggYSB8IHRoZW4gYSBsZXR0ZXIgb3IgXywgdGhlbiBhbnkgbnVtYmVyIG9mIGxldHRlcnMsIG51bWJlcnMsIF8gb3IgLVxuXHQgICAgICAgICAgICByZWdleDogL15cXHxcXHM/KFthLXpBLVpfXVthLXpBLVowLTlfXFwtXSopLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLmNvbmNhdChbXG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0XSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLm1hdGNoWzFdO1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBzdGFjay5wb3AoKTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW1zKHRoaXMsIHRva2VuLnBhcmFtcywgY29udGV4dClcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmZpbHRlci5hcHBseSh0aGF0LCBbdG9rZW4udmFsdWUsIGlucHV0LCBwYXJhbXNdKTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuX2Z1bmN0aW9uLFxuXHQgICAgICAgICAgICAvLyBtYXRjaCBhbnkgbGV0dGVyIG9yIF8sIHRoZW4gYW55IG51bWJlciBvZiBsZXR0ZXJzLCBudW1iZXJzLCBfIG9yIC0gZm9sbG93ZWQgYnkgKFxuXHQgICAgICAgICAgICByZWdleDogL14oW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXHMqXFwoLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0LFxuXHQgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24obWF0Y2gsIHRva2Vucykge1xuXHQgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gaXMgbm90IGEgcmVzZXJ2ZWQgd29yZFxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdICYmIChUd2lnLmluZGV4T2YoVHdpZy5leHByZXNzaW9uLnJlc2VydmVkV29yZHMsIG1hdGNoWzFdKSA8IDApO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uKG1hdGNoLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAnKCc7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgZm4gPSB0b2tlbi5tYXRjaFsxXTtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmZuID0gZm47XG5cdCAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIHRva2VuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgZm4gPSB0b2tlbi5mbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW1zKHRoaXMsIHRva2VuLnBhcmFtcywgY29udGV4dClcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChUd2lnLmZ1bmN0aW9uc1tmbl0pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBmcm9tIHRoZSBidWlsdC1pbiBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUd2lnLmZ1bmN0aW9uc1tmbl0uYXBwbHkodGhhdCwgcGFyYW1zKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRbZm5dID09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBmcm9tIHRoZSB1c2VyL2NvbnRleHQgZGVmaW5lZCBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb250ZXh0W2ZuXS5hcHBseShjb250ZXh0LCBwYXJhbXMpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoZm4gKyAnIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IGFuZCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29udGV4dCcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHJlc3VsdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvLyBUb2tlbiByZXByZXNlbnRpbmcgYSB2YXJpYWJsZS5cblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFZhcmlhYmxlcyBjYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyBhbmRcblx0ICAgICAgICAvLyBkYXNoZXMsIGJ1dCBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgb3IgdW5kZXJzY29yZS5cblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFZhcmlhYmxlcyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIHJlbmRlciBjb250ZXh0IGFuZCB0YWtlXG5cdCAgICAgICAgLy8gdGhlIHZhbHVlIG9mICd1bmRlZmluZWQnIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBkb2Vzbid0XG5cdCAgICAgICAgLy8gZXhpc3QgaW4gdGhlIGNvbnRleHQuXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZSxcblx0ICAgICAgICAgICAgLy8gbWF0Y2ggYW55IGxldHRlciBvciBfLCB0aGVuIGFueSBudW1iZXIgb2YgbGV0dGVycywgbnVtYmVycywgXyBvciAtXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlthLXpBLVpfXVthLXpBLVowLTlfXSovLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnNfZXh0ZW5kZWQuY29uY2F0KFtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuc3RhcnRdKSxcblx0ICAgICAgICAgICAgY29tcGlsZTogVHdpZy5leHByZXNzaW9uLmZuLmNvbXBpbGUucHVzaCxcblx0ICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKG1hdGNoLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoVHdpZy5pbmRleE9mKFR3aWcuZXhwcmVzc2lvbi5yZXNlcnZlZFdvcmRzLCBtYXRjaFswXSkgPCAwKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnJlc29sdmVBc3luYy5hcHBseSh0aGlzLCBbY29udGV4dFt0b2tlbi52YWx1ZV0sIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmtleS5wZXJpb2QsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcLihbYS16QS1aMC05X10rKS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9uc19leHRlbmRlZC5jb25jYXQoW1xuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4ua2V5ID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCwgbmV4dF90b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRva2VuLmtleSxcblx0ICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBzdGFjay5wb3AoKSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW1zKHRoaXMsIHRva2VuLnBhcmFtcywgY29udGV4dClcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5zdHJpY3RfdmFyaWFibGVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIkNhbid0IGFjY2VzcyBhIGtleSBcIiArIGtleSArIFwiIG9uIGFuIG51bGwgb3IgdW5kZWZpbmVkIG9iamVjdC5cIik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHIoMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBrZXkgaW4gb2JqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdFtcImdldFwiICsgY2FwaXRhbGl6ZShrZXkpXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtcImdldFwiICsgY2FwaXRhbGl6ZShrZXkpXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RbXCJpc1wiICsgY2FwaXRhbGl6ZShrZXkpXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtcImlzXCIgKyBjYXBpdGFsaXplKGtleSldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHJlc29sdmluZyBhbiBleHByZXNzaW9uIHdlIG5lZWQgdG8gcGFzcyBuZXh0X3Rva2VuIGluIGNhc2UgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucmVzb2x2ZUFzeW5jLmFwcGx5KHRoYXQsIFt2YWx1ZSwgY29udGV4dCwgcGFyYW1zLCBuZXh0X3Rva2VuLCBvYmplY3RdKTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHJlc3VsdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkuYnJhY2tldHMsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcWyhbXlxcXVxcOl0qKVxcXS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9uc19leHRlbmRlZC5jb25jYXQoW1xuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFRoZSBleHByZXNzaW9uIHN0YWNrIGZvciB0aGUga2V5XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlKHtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hcblx0ICAgICAgICAgICAgICAgIH0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQsIG5leHRfdG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIEV2YWx1YXRlIGtleVxuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAgICAgb2JqZWN0LFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbXModGhpcywgdG9rZW4ucGFyYW1zLCBjb250ZXh0KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtZXRlcnM7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt0b2tlbi5zdGFjaywgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHN0YWNrLnBvcCgpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnN0cmljdF92YXJpYWJsZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiQ2FuJ3QgYWNjZXNzIGEga2V5IFwiICsga2V5ICsgXCIgb24gYW4gbnVsbCBvciB1bmRlZmluZWQgb2JqZWN0LlwiKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIGtleSBpbiBvYmplY3QpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiByZXNvbHZpbmcgYW4gZXhwcmVzc2lvbiB3ZSBuZWVkIHRvIHBhc3MgbmV4dF90b2tlbiBpbiBjYXNlIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb25cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnJlc29sdmVBc3luYy5hcHBseSh0aGF0LCBbdmFsdWUsIG9iamVjdCwgcGFyYW1zLCBuZXh0X3Rva2VuXSk7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgI
46184H1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGEgbnVsbCB2YWx1ZS5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLl9udWxsLFxuXHQgICAgICAgICAgICAvLyBtYXRjaCBhIG51bWJlclxuXHQgICAgICAgICAgICByZWdleDogL14obnVsbHxOVUxMfG5vbmV8Tk9ORSkvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBUd2lnLmV4cHJlc3Npb24uZm4ucGFyc2UucHVzaF92YWx1ZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogTWF0Y2ggdGhlIGNvbnRleHRcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbnRleHQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXl9jb250ZXh0Lyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLmNvbmNhdChbXG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0XSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IFR3aWcuZXhwcmVzc2lvbi5mbi5jb21waWxlLnB1c2gsXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goY29udGV4dCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGEgYm9vbGVhblxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuYm9vbCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eKHRydWV8VFJVRXxmYWxzZXxGQUxTRSkvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICh0b2tlbi5tYXRjaFswXS50b0xvd2VyQ2FzZSggKSA9PT0gXCJ0cnVlXCIpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogVHdpZy5leHByZXNzaW9uLmZuLnBhcnNlLnB1c2hfdmFsdWVcblx0ICAgICAgICB9XG5cdCAgICBdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFJlc29sdmUgYSBjb250ZXh0IHZhbHVlLlxuXHQgICAgICpcblx0ICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCBpcyBleGVjdXRlZCB3aXRoIGEgY29udGV4dCBwYXJhbWV0ZXIuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgY29udGV4dCBvYmplY3Qga2V5LlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgVGhlIHJlbmRlciBjb250ZXh0LlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24ucmVzb2x2ZUFzeW5jID0gZnVuY3Rpb24odmFsdWUsIGNvbnRleHQsIHBhcmFtcywgbmV4dF90b2tlbiwgb2JqZWN0KSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIHZhciBwcm9taXNlID0gVHdpZy5Qcm9taXNlLnJlc29sdmUocGFyYW1zKTtcblxuXHQgICAgICAgICAgICAvKlxuXHQgICAgICAgICAgICBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGhhdmUgYmVlbiBpbXBvc3NpYmxlIGR1cmluZyB0aGUgY29tcGlsZSBzdGFnZSB0byBkZXRlcm1pbmUgdGhhdCBhIGZvbGxvd2luZ1xuXHQgICAgICAgICAgICBzZXQgb2YgcGFyZW50aGVzZXMgd2VyZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZ1bmN0aW9uLlxuXG5cdCAgICAgICAgICAgIFRob3NlIHBhcmVudGhlc2VzIHdpbGwgaGF2ZSB0aGVyZWZvcmUgYmVlbiBtYXJrZWQgYXMgYW4gZXhwcmVzc2lvbiwgd2l0aCB0aGVpciBvd24gcGFyYW1ldGVycywgd2hpY2ggcmVhbGx5XG5cdCAgICAgICAgICAgIGJlbG9uZyB0byB0aGlzIGZ1bmN0aW9uLlxuXG5cdCAgICAgICAgICAgIFRob3NlIHBhcmFtZXRlcnMgd2lsbCBhbHNvIG5lZWQgcGFyc2luZyBpbiBjYXNlIHRoZXkgYXJlIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gdG8gcGFzcyBhcyBwYXJhbWV0ZXJzLlxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4gJiYgbmV4dF90b2tlbi50eXBlID09PSBUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kKSB7XG5cdCAgICAgICAgICAgICAgICAvL1doZW4gcGFyc2luZyB0aGVzZSBwYXJhbWV0ZXJzLCB3ZSBuZWVkIHRvIGdldCB0aGVtIGFsbCBiYWNrLCBub3QganVzdCB0aGUgbGFzdCBpdGVtIG9uIHRoZSBzdGFjay5cblx0ICAgICAgICAgICAgICAgIHZhciB0b2tlbnNfYXJlX3BhcmFtZXRlcnMgPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0X3Rva2VuLnBhcmFtcyAmJiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbbmV4dF90b2tlbi5wYXJhbXMsIGNvbnRleHQsIHRva2Vuc19hcmVfcGFyYW1ldGVyc10pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHApIHtcblx0ICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHVwIHRoZSBwYXJlbnRoZXNlcyB0b2tlbnMgb24gdGhlIG5leHQgbG9vcFxuXHQgICAgICAgICAgICAgICAgICAgIG5leHRfdG9rZW4uY2xlYW51cCA9IHRydWU7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDtcblx0ICAgICAgICAgICAgICAgI
46184H0pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbihwYXJhbXMpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmplY3QgfHwgY29udGV4dCwgcGFyYW1zIHx8IFtdKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLmV4cHJlc3Npb24ucmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0LCBwYXJhbXMsIG5leHRfdG9rZW4sIG9iamVjdCkge1xuXHQgICAgICAgIHZhciBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHJlc3VsdDtcblxuXHQgICAgICAgIFR3aWcuZXhwcmVzc2lvbi5yZXNvbHZlQXN5bmMuYXBwbHkodGhpcywgW3ZhbHVlLCBjb250ZXh0LCBwYXJhbXMsIG5leHRfdG9rZW4sIG9iamVjdF0pXG5cdCAgICAgICAgLnRoZW4oZnVuY3Rpb24ocikge1xuXHQgICAgICAgICAgICBpc19hc3luYyA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXN1bHQgPSByO1xuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgaWYgKGlzX2FzeW5jKVxuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignWW91IGFyZSB1c2luZyBUd2lnLmpzIGluIHN5bmMgbW9kZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFzeW5jIGV4dGVuc2lvbnMuJyk7XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0O1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFJlZ2lzdHJ5IGZvciBsb2dpYyBoYW5kbGVycy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLmhhbmRsZXIgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBEZWZpbmUgYSBuZXcgZXhwcmVzc2lvbiB0eXBlLCBhdmFpbGFibGUgYXQgVHdpZy5sb2dpYy50eXBlLnt0eXBlfVxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBuYW1lIG9mIHRoZSBuZXcgdHlwZS5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLmV4dGVuZFR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlW3R5cGVdID0gXCJUd2lnLmV4cHJlc3Npb24udHlwZS5cIiArIHR5cGU7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEV4dGVuZCB0aGUgZXhwcmVzc2lvbiBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIG5ldyBkZWZpbml0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIFRva2VuIGRlZmluaXRpb25zIGZvbGxvdyB0aGlzIGZvcm1hdDpcblx0ICAgICAqICB7XG5cdCAgICAgKiAgICAgIHR5cGU6ICAgICBPbmUgb2YgVHdpZy5leHByZXNzaW9uLnR5cGUuW3R5cGVdLCBlaXRoZXIgcHJlLWRlZmluZWQgb3IgYWRkZWQgdXNpbmdcblx0ICAgICAqICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24uZXh0ZW5kVHlwZVxuXHQgICAgICpcblx0ICAgICAqICAgICAgbmV4dDogICAgIEFycmF5IG9mIHR5cGVzIGZyb20gVHdpZy5leHByZXNzaW9uLnR5cGUgdGhhdCBjYW4gZm9sbG93IHRoaXMgdG9rZW4sXG5cdCAgICAgKlxuXHQgICAgICogICAgICByZWdleDogICAgQSByZWdleCBvciBhcnJheSBvZiByZWdleCdzIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0b2tlbi5cblx0ICAgICAqXG5cdCAgICAgKiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSBjYWxsZWQgd2hlbiB0aGlzIHRva2VuIGlzIGJlaW5nIGNvbXBpbGVkLlxuXHQgICAgICogICAgICAgICAgICAgICAgICAgU2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aCBzdGFjayBhbmQgb3V0cHV0IHNldC5cblx0ICAgICAqXG5cdCAgICAgKiAgICAgIHBhcnNlOiAgIGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkgY2FsbGVkIHdoZW4gdGhpcyB0b2tlbiBpcyBiZWluZyBwYXJzZWQuXG5cdCAgICAgKiAgICAgICAgICAgICAgICAgICBTaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHN0YWNrIGFuZCBjb250ZXh0IHNldC5cblx0ICAgICAqICB9XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24gQSB0b2tlbiBkZWZpbml0aW9uLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24uZXh0ZW5kID0gZnVuY3Rpb24gKGRlZmluaXRpb24pIHtcblx0ICAgICAgICBpZiAoIWRlZmluaXRpb24udHlwZSkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBleHRlbmQgbG9naWMgZGVmaW5pdGlvbi4gTm8gdHlwZSBwcm92aWRlZCBmb3IgXCIgKyBkZWZpbml0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgVHdpZy5leHByZXNzaW9uLmhhbmRsZXJbZGVmaW5pdGlvbi50eXBlXSA9IGRlZmluaXRpb247XG5cdCAgICB9O1xuXG5cdCAgICAvLyBFeHRlbmQgd2l0aCBidWlsdC1pbiBleHByZXNzaW9uc1xuXHQgICAgd2hpbGUgKFR3aWcuZXhwcmVzc2lvbi5kZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgVHdpZy5leHByZXNzaW9uLmV4dGVuZChUd2lnLmV4cHJlc3Npb24uZGVmaW5pdGlvbnMuc2hpZnQoKSk7XG5cdCAgICB9XG5cblx0ICAgIC8qKlxuXHQgICAgICogQnJlYWsgYW4gZXhwcmVzc2lvbiBpbnRvIHRva2VucyBkZWZpbmVkIGluIFR3aWcuZXhwcmVzc2lvbi5kZWZpbml0aW9ucy5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBUaGUgc3RyaW5nIHRvIHRva2VuaXplLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0b2tlbnMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi50b2tlbml6ZSA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IFtdLFxuXHQgICAgICAgICAgICAvLyBLZWVwIGFuIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gaW4gdGhlIGV4cHJlc3Npb24gZm9yIGVycm9yIG1lc3NhZ2VzLlxuXHQgICAgICAgICAgICBleHBfb2Zmc2V0ID0gMCxcblx0ICAgICAgICAgICAgLy8gVGhlIHZhbGlkIG5leHQgdG9rZW5zIG9mIHRoZSBwcmV2aW91cyB0b2tlblxuXHQgICAgICAgICAgICBuZXh0ID0gbnVsbCxcblx0ICAgICAgICAgICAgLy8gTWF0Y2ggaW5mb3JtYXRpb25cblx0ICAgICAgICAgICAgdHlwZSwgcmVnZXgsIHJlZ2V4X2FycmF5LFxuXHQgICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgbmV4dCB0b2tlbiBmb3IgdGhlIG1hdGNoXG5cdCAgICAgICAgICAgI
46184HRva2VuX25leHQsXG5cdCAgICAgICAgICAgIC8vIEhhcyBhIG1hdGNoIGJlZW4gZm91bmQgZnJvbSB0aGUgZGVmaW5pdGlvbnNcblx0ICAgICAgICAgICAgbWF0Y2hfZm91bmQsIGludmFsaWRfbWF0Y2hlcyA9IFtdLCBtYXRjaF9mdW5jdGlvbjtcblxuXHQgICAgICAgIG1hdGNoX2Z1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgbWF0Y2ggPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSxcblx0ICAgICAgICAgICAgICAgIHN0cmluZyA9IG1hdGNoLnBvcCgpLFxuXHQgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbWF0Y2gucG9wKCk7XG5cblx0ICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24udG9rZW5pemVcIixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJNYXRjaGVkIGEgXCIsIHR5cGUsIFwiIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBcIiwgbWF0Y2gpO1xuXG5cdCAgICAgICAgICAgIGlmIChuZXh0ICYmIFR3aWcuaW5kZXhPZihuZXh0LCB0eXBlKSA8IDApIHtcblx0ICAgICAgICAgICAgICAgIGludmFsaWRfbWF0Y2hlcy5wdXNoKFxuXHQgICAgICAgICAgICAgICAgICAgIHR5cGUgKyBcIiBjYW5ub3QgZm9sbG93IGEgXCIgKyB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBhdCB0ZW1wbGF0ZTpcIiArIGV4cF9vZmZzZXQgKyBcIiBuZWFyICdcIiArIG1hdGNoWzBdLnN1YnN0cmluZygwLCAyMCkgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi4uLidcIlxuXHQgICAgICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgICAgIC8vIE5vdCBhIG1hdGNoLCBkb24ndCBjaGFuZ2UgdGhlIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFswXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSB0b2tlbiBpZiBhIHZhbGlkYXRpb24gZnVuY3Rpb24gaXMgcHJvdmlkZWRcblx0ICAgICAgICAgICAgaWYgKFR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyW3R5cGVdLnZhbGlkYXRlICYmXG5cdCAgICAgICAgICAgICAgICAgICAgIVR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyW3R5cGVdLnZhbGlkYXRlKG1hdGNoLCB0b2tlbnMpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpbnZhbGlkX21hdGNoZXMgPSBbXTtcblxuXHQgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAgdHlwZSxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFswXSxcblx0ICAgICAgICAgICAgICAgIG1hdGNoOiBtYXRjaFxuXHQgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICBtYXRjaF9mb3VuZCA9IHRydWU7XG5cdCAgICAgICAgICAgIG5leHQgPSB0b2tlbl9uZXh0O1xuXHQgICAgICAgICAgICBleHBfb2Zmc2V0ICs9IG1hdGNoWzBdLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBEb2VzIHRoZSB0b2tlbiBuZWVkIHRvIHJldHVybiBvdXRwdXQgYmFjayB0byB0aGUgZXhwcmVzc2lvbiBzdHJpbmdcblx0ICAgICAgICAgICAgLy8gZS5nLiBhIGZ1bmN0aW9uIG1hdGNoIG9mIGN5Y2xlKCBtaWdodCByZXR1cm4gdGhlICcoJyBiYWNrIHRvIHRoZSBleHByZXNzaW9uXG5cdCAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGxvb2stYWhlYWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRva2VuIHR5cGVzIChlLmcuIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGUgbmFtZXMpXG5cdCAgICAgICAgICAgIGlmIChUd2lnLmV4cHJlc3Npb24uaGFuZGxlclt0eXBlXS50cmFuc2Zvcm0pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24uaGFuZGxlclt0eXBlXS50cmFuc2Zvcm0obWF0Y2gsIHRva2Vucyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuICcnO1xuXHQgICAgICAgIH07XG5cblx0ICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIlR3aWcuZXhwcmVzc2lvbi50b2tlbml6ZVwiLCBcIlRva2VuaXppbmcgZXhwcmVzc2lvbiBcIiwgZXhwcmVzc2lvbik7XG5cblx0ICAgICAgICB3aGlsZSAoZXhwcmVzc2lvbi5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnRyaW0oKTtcblx0ICAgICAgICAgICAgZm9yICh0eXBlIGluIFR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVHdpZy5leHByZXNzaW9uLmhhbmRsZXIuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbl9uZXh0ID0gVHdpZy5leHByZXNzaW9uLmhhbmRsZXJbdHlwZV0ubmV4dDtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleCA9IFR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyW3R5cGVdLnJlZ2V4O1xuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiQ2hlY2tpbmcgdHlwZSBcIiwgdHlwZSwgXCIgb24gXCIsIGV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChyZWdleCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2FycmF5ID0gcmVnZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfYXJyYXkgPSBbcmVnZXhdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIG1hdGNoX2ZvdW5kID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZ2V4X2FycmF5Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXggPSByZWdleF9hcnJheS5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZShyZWdleCwgbWF0Y2hfZnVuY3Rpb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyBBbiBleHByZXNzaW9uIHRva2VuIGhhcyBiZWVuIG1hdGNoZWQuIEJyZWFrIHRoZSBmb3IgbG9vcCBhbmQgc3RhcnQgdHJ5aW5nIHRvXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gIG1hdGNoIHRoZSBuZXh0IHRlbXBsYXRlIChpZiBleHByZXNzaW9uIGlzbid0IGVtcHR5Lilcblx0ICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hfZm91bmQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghbWF0Y2hfZm91bmQpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkX21hdGNoZXMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgI
46184HRocm93IG5ldyBUd2lnLkVycm9yKGludmFsaWRfbWF0Y2hlcy5qb2luKFwiIE9SIFwiKSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiVW5hYmxlIHRvIHBhcnNlICdcIiArIGV4cHJlc3Npb24gKyBcIicgYXQgdGVtcGxhdGUgcG9zaXRpb25cIiArIGV4cF9vZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24udG9rZW5pemVcIiwgXCJUb2tlbml6ZWQgdG8gXCIsIHRva2Vucyk7XG5cdCAgICAgICAgcmV0dXJuIHRva2Vucztcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ29tcGlsZSBhbiBleHByZXNzaW9uIHRva2VuLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSByYXdfdG9rZW4gVGhlIHVuY29tcGlsZWQgdG9rZW4uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY29tcGlsZWQgdG9rZW4uXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5jb21waWxlID0gZnVuY3Rpb24gKHJhd190b2tlbikge1xuXHQgICAgICAgIHZhciBleHByZXNzaW9uID0gcmF3X3Rva2VuLnZhbHVlLFxuXHQgICAgICAgICAgICAvLyBUb2tlbml6ZSBleHByZXNzaW9uXG5cdCAgICAgICAgICAgIHRva2VucyA9IFR3aWcuZXhwcmVzc2lvbi50b2tlbml6ZShleHByZXNzaW9uKSxcblx0ICAgICAgICAgICAgdG9rZW4gPSBudWxsLFxuXHQgICAgICAgICAgICBvdXRwdXQgPSBbXSxcblx0ICAgICAgICAgICAgc3RhY2sgPSBbXSxcblx0ICAgICAgICAgICAgdG9rZW5fdGVtcGxhdGUgPSBudWxsO1xuXG5cdCAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiQ29tcGlsaW5nIFwiLCBleHByZXNzaW9uKTtcblxuXHQgICAgICAgIC8vIFB1c2ggdG9rZW5zIGludG8gUlBOIHN0YWNrIHVzaW5nIHRoZSBTaHVudGluZy15YXJkIGFsZ29yaXRobVxuXHQgICAgICAgIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NodW50aW5nX3lhcmRfYWxnb3JpdGhtXG5cblx0ICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0ICAgICAgICAgICAgdG9rZW5fdGVtcGxhdGUgPSBUd2lnLmV4cHJlc3Npb24uaGFuZGxlclt0b2tlbi50eXBlXTtcblxuXHQgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuZXhwcmVzc2lvbi5jb21waWxlOiBcIiwgXCJDb21waWxpbmcgXCIsIHRva2VuKTtcblxuXHQgICAgICAgICAgICAvLyBDb21waWxlIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZS5jb21waWxlICYmIHRva2VuX3RlbXBsYXRlLmNvbXBpbGUodG9rZW4sIHN0YWNrLCBvdXRwdXQpO1xuXG5cdCAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5leHByZXNzaW9uLmNvbXBpbGU6IFwiLCBcIlN0YWNrIGlzXCIsIHN0YWNrKTtcblx0ICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiT3V0cHV0IGlzXCIsIG91dHB1dCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgd2hpbGUoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBvdXRwdXQucHVzaChzdGFjay5wb3AoKSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiRmluYWwgb3V0cHV0IGlzXCIsIG91dHB1dCk7XG5cblx0ICAgICAgICByYXdfdG9rZW4uc3RhY2sgPSBvdXRwdXQ7XG5cdCAgICAgICAgZGVsZXRlIHJhd190b2tlbi52YWx1ZTtcblxuXHQgICAgICAgIHJldHVybiByYXdfdG9rZW47XG5cdCAgICB9O1xuXG5cblx0ICAgIC8qKlxuXHQgICAgICogUGFyc2UgYW4gUlBOIGV4cHJlc3Npb24gc3RhY2sgd2l0aGluIGEgY29udGV4dC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgQW4gYXJyYXkgb2YgY29tcGlsZWQgZXhwcmVzc2lvbiB0b2tlbnMuXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgcmVuZGVyIGNvbnRleHQgdG8gcGFyc2UgdGhlIHRva2VucyB3aXRoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGFsbCB0aGUgdG9rZW5zLiBUaGUgcmVzdWx0XG5cdCAgICAgKiAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbnl0aGluZywgU3RyaW5nLCBBcnJheSwgT2JqZWN0LCBldGMuLi4gYmFzZWQgb25cblx0ICAgICAqICAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIGV4cHJlc3Npb24uXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5wYXJzZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGNvbnRleHQsIHRva2Vuc19hcmVfcGFyYW1ldGVycywgYWxsb3dfYXN5bmMpIHtcblx0ICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG5cblx0ICAgICAgICAvLyBJZiB0aGUgdG9rZW4gaXNuJ3QgYW4gYXJyYXksIG1ha2UgaXQgb25lLlxuXHQgICAgICAgIGlmICghKHRva2VucyBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgICAgICB0b2tlbnMgPSBbdG9rZW5zXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBUaGUgb3V0cHV0IHN0YWNrXG5cdCAgICAgICAgdmFyIHN0YWNrID0gW10sXG5cdCAgICAgICAgICAgIG5leHRfdG9rZW4sXG5cdCAgICAgICAgICAgIG91dHB1dCA9IG51bGwsXG5cdCAgICAgICAgICAgIHByb21pc2UgPSBudWxsLFxuXHQgICAgICAgICAgICBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlID0gbnVsbCxcblx0ICAgICAgICAgICAgbG9vcF90b2tlbl9maXh1cHMgPSBbXTtcblxuXHQgICAgICAgIHByb21pc2UgPSBUd2lnLmFzeW5jLmZvckVhY2godG9rZW5zLCBmdW5jdGlvbiAodG9rZW4sIGluZGV4KSB7XG5cdCAgICAgICAgICAgIC8vSWYgdGhlIHRva2VuIGlzIG1hcmtlZCBmb3IgY2xlYW51cCwgd2UgZG9uJ3QgbmVlZCB0byBwYXJzZSBpdFxuXHQgICAgICAgICAgICBpZiAodG9rZW4uY2xlYW51cCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cblx0ICAgICAgICAgICAgLy9EZXRlcm1pbmUgdGhlIHRva2VuIHRoYXQgZm9sbG93cyB0aGlzIG9uZSBzbyB0aGF0IHdlIGNhbiBwYXNzIGl0IHRvIHRoZSBwYXJzZXJcblx0ICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBpbmRleCArIDEpIHtcblx0ICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSB0b2tlbnNbaW5kZXggKyAxXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlID0gVHdpZy5leHByZXNzaW9uLmhhbmRsZXJbdG9rZW4udHlwZV07XG5cblx0ICAgICAgICAgICAgaWYgKHRva2VuX3RlbXBsYXRlLnBhcnNlKVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0ID0gdG9rZW5fdGVtcGxhdGUucGFyc2UuYXBwbHkodGhhdCwgW3Rva2VuLCBzdGFjaywgY29udGV4dCwgbmV4dF90b2tlbl0pO1xuXG5cdCAgICAgICAgICAgIC8vU3RvcmUgYW55IGJpbmFyeSB0b2tlbnMgZm9yIGxhdGVyIGlmIHdlIGFyZSBpbiBhIGxvb3AuXG5cdCAgICAgICAgICAgIGlmIChjb250ZXh0Lmxvb3AgJiYgdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IuYmluYXJ5KSB7XG5cdCAgICAgICAgICAgICAgICBsb29wX3Rva2VuX2ZpeHVwcy5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICAgICAgfSlcblx0ICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgLy9DaGVjayBldmVyeSBmaXh1cCBhbmQgcmVtb3ZlIFwia2V5XCIgYXMgbG9uZyBhcyB0aGV5IHN0aWxsIGhhdmUgXCJwYXJhbXNcIi4gVGhpcyBjb3ZlcnMgdGhlIHVzZSBjYXNlIHdoZXJlXG5cdCAgICAgICAgICAgIC8vYSBcIjpcIiBvcGVyYXRvciBpcyB1c2VkIGluIGEgbG9vcCB3aXRoIGEgXCIoZXhwcmVzc2lvbik6XCIgc3RhdGVtZW50LiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgVHdpZy5mb3JFYWNoKGxvb3BfdG9rZW5fZml4dXBzLCBmdW5jdGlvbiAobG9vcF90b2tlbl9maXh1cCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGxvb3BfdG9rZW5fZml4dXAucGFyYW1zICYmIGxvb3BfdG9rZW5fZml4dXAua2V5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvb3BfdG9rZW5fZml4dXBbXCJrZXlcIl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgICAgIC8vSWYgcGFyc2UgaGFzIGJlZW4gY2FsbGVkIHdpdGggYSBzZXQgb2YgdG9rZW5zIHRoYXQgYXJlIHBhcmFtZXRlcnMsIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSB3aG9sZSBzdGFjayxcblx0ICAgICAgICAgICAgLy93cmFwcGVkIGluIGFuIEFycmF5LlxuXHQgICAgICAgICAgICBpZiAodG9rZW5zX2FyZV9wYXJhbWV0ZXJzKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgcGFyYW1zID0gW107XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51bnNoaWZ0KHN0YWNrLnBvcCgpKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChwYXJhbXMpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKGFsbG93X2FzeW5jKVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuUHJvbWlzZS5yZXNvbHZlKHN0YWNrLnBvcCgpKTtcblx0ICAgICAgICB9KVxuXHQgICAgICAgIC50aGVuKGZ1bmN0aW9uKHYpIHtcblx0ICAgICAgICAgICAgaXNfYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICAgICAgcmV0dXJuIHY7XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBpZiAoYWxsb3dfYXN5bmMpXG5cdCAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXG5cdCAgICAgICAgaWYgKGlzX2FzeW5jKVxuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignWW91IGFyZSB1c2luZyBUd2lnLmpzIGluIHN5bmMgbW9kZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFzeW5jIGV4dGVuc2lvbnMuJyk7XG5cblx0ICAgICAgICAvLyBQb3AgdGhlIGZpbmFsIHZhbHVlIG9mZiB0aGUgc3RhY2tcblx0ICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblxuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyAjIyB0d2lnLmV4cHJlc3Npb24ub3BlcmF0b3IuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgb3BlcmF0b3IgbG9va3VwcyBhbmQgcGFyc2luZy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIC8qKlxuXHQgICAgICogT3BlcmF0b3IgYXNzb2NpYXRpdml0eSBjb25zdGFudHMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvciA9IHtcblx0ICAgICAgICBsZWZ0VG9SaWdodDogJ2xlZnRUb1JpZ2h0Jyxcblx0ICAgICAgICByaWdodFRvTGVmdDogJ3JpZ2h0VG9MZWZ0J1xuXHQgICAgfTtcblxuXHQgICAgdmFyIGNvbnRhaW5tZW50ID0gZnVuY3Rpb24oYSwgYikge1xuXHQgICAgICAgIGlmIChiID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9IGVsc2UgaWYgKGIuaW5kZXhPZiAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIC8vIFN0cmluZ1xuXHQgICAgICAgICAgICByZXR1cm4gYSA9PT0gYiB8fCBhICE9PSAnJyAmJiBiLmluZGV4T2YoYSkgPiAtMTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2Y
46184XIgZWw7XG5cdCAgICAgICAgICAgIGZvciAoZWwgaW4gYikge1xuXHQgICAgICAgICAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoZWwpICYmIGJbZWxdID09PSBhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogR2V0IHRoZSBwcmVjaWRlbmNlIGFuZCBhc3NvY2lhdGl2aXR5IG9mIGFuIG9wZXJhdG9yLiBUaGVzZSBmb2xsb3cgdGhlIG9yZGVyIHRoYXQgQy9DKysgdXNlLlxuXHQgICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3BlcmF0b3JzX2luX0NfYW5kX0MrKyBmb3IgdGhlIHRhYmxlIG9mIHZhbHVlcy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLmxvb2t1cCA9IGZ1bmN0aW9uIChvcGVyYXRvciwgdG9rZW4pIHtcblx0ICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIGNhc2UgXCIuLlwiOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDIwO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJywnOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDE4O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIC8vIFRlcm5hcnlcblx0ICAgICAgICAgICAgY2FzZSAnPzonOlxuXHQgICAgICAgICAgICBjYXNlICc/Jzpcblx0ICAgICAgICAgICAgY2FzZSAnOic6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMTY7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5hc3NvY2lhdGl2aXR5ID0gVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLnJpZ2h0VG9MZWZ0O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnb3InOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDE0O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2FuZCc6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMTM7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5hc3NvY2lhdGl2aXR5ID0gVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLmxlZnRUb1JpZ2h0O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYi1vcic6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMTI7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5hc3NvY2lhdGl2aXR5ID0gVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLmxlZnRUb1JpZ2h0O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYi14b3InOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDExO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2ItYW5kJzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSAxMDtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmFzc29jaWF0aXZpdHkgPSBUd2lnLmV4cHJlc3Npb24ub3BlcmF0b3IubGVmdFRvUmlnaHQ7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc9PSc6XG5cdCAgICAgICAgICAgIGNhc2UgJyE9Jzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSA5O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJzwnOlxuXHQgICAgICAgICAgICBjYXNlICc8PSc6XG5cdCAgICAgICAgICAgIGNhc2UgJz4nOlxuXHQgICAgICAgICAgICBjYXNlICc+PSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ25vdCBpbic6XG5cdCAgICAgICAgICAgIGNhc2UgJ2luJzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSA4O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ34nOiAvLyBTdHJpbmcgY29uY2F0aW5hdGlvblxuXHQgICAgICAgICAgICBjYXNlICcrJzpcblx0ICAgICAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gNjtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmFzc29jaWF0aXZpdHkgPSBUd2lnLmV4cHJlc3Npb24ub3BlcmF0b3IubGVmdFRvUmlnaHQ7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICcvLyc6XG5cdCAgICAgICAgICAgIGNhc2UgJyoqJzpcblx0ICAgICAgICAgICAgY2FzZSAnKic6XG5cdCAgICAgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgICBjYXNlICclJzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSA1O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ25vdCc6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMztcblx0ICAgICAgICAgICAgICAgI
46184HRva2VuLmFzc29jaWF0aXZpdHkgPSBUd2lnLmV4cHJlc3Npb24ub3BlcmF0b3IucmlnaHRUb0xlZnQ7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJGYWlsZWQgdG8gbG9va3VwIG9wZXJhdG9yOiBcIiArIG9wZXJhdG9yICsgXCIgaXMgYW4gdW5rbm93biBvcGVyYXRvci5cIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRva2VuLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBIYW5kbGUgb3BlcmF0aW9ucyBvbiB0aGUgUlBOIHN0YWNrLlxuXHQgICAgICpcblx0ICAgICAqIFJldHVybnMgdGhlIHVwZGF0ZWQgc3RhY2suXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5wYXJzZSA9IGZ1bmN0aW9uIChvcGVyYXRvciwgc3RhY2spIHtcblx0ICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5wYXJzZTogXCIsIFwiSGFuZGxpbmcgXCIsIG9wZXJhdG9yKTtcblx0ICAgICAgICB2YXIgYSwgYiwgYztcblxuXHQgICAgICAgIGlmIChvcGVyYXRvciA9PT0gJz8nKSB7XG5cdCAgICAgICAgICAgIGMgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBiID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgaWYgKG9wZXJhdG9yICE9PSAnbm90Jykge1xuXHQgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKG9wZXJhdG9yICE9PSAnaW4nICYmIG9wZXJhdG9yICE9PSAnbm90IGluJykge1xuXHQgICAgICAgICAgICBpZiAoYSAmJiBBcnJheS5pc0FycmF5KGEpKSB7XG5cdCAgICAgICAgICAgICAgICBhID0gYS5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoYiAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG5cdCAgICAgICAgICAgICAgICBiID0gYi5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJzonOlxuXHQgICAgICAgICAgICAgICAgLy8gSWdub3JlXG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc/Oic6XG5cdCAgICAgICAgICAgICAgICBpZiAoVHdpZy5saWIuYm9vbHZhbChhKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnPyc6XG5cdCAgICAgICAgICAgICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9BbiBleHRlbmRlZCB0ZXJuYXJ5LlxuXHQgICAgICAgICAgICAgICAgICAgIGEgPSBiO1xuXHQgICAgICAgICAgICAgICAgICAgIGIgPSBjO1xuXHQgICAgICAgICAgICAgICAgICAgIGMgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmIChUd2lnLmxpYi5ib29sdmFsKGEpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChiKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChjKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJysnOlxuXHQgICAgICAgICAgICAgICAgYiA9IHBhcnNlRmxvYXQoYik7XG5cdCAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSArIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICAgICAgICBiID0gcGFyc2VGbG9hdChiKTtcblx0ICAgICAgICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIC0gYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICcqJzpcblx0ICAgICAgICAgICAgICAgIGIgPSBwYXJzZUZsb2F0KGIpO1xuXHQgICAgICAgICAgICAgICAgYSA9IHBhcnNlRmxvYXQoYSk7XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgKiBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgICAgICAgYiA9IHBhcnNlRmxvYXQoYik7XG5cdCAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnLy8nOlxuXHQgICAgICAgICAgICAgICAgYiA9IHBhcnNlRmxvYXQoYik7XG5cdCAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhIC8gYikpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnJSc6XG5cdCAgICAgICAgICAgICAgICBiID0gcGFyc2VGbG9hdChiKTtcblx0ICAgICAgICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICUgYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICd+Jzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIChhICE9IG51bGwgPyBhLnRvU3RyaW5nKCkgOiBcIlwiKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGIgIT0gbnVsbCA/IGIudG9TdHJpbmcoKSA6IFwiXCIpICk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICdub3QnOlxuXHQgICAgICAgICAgICBjYXNlICchJzpcblx0ICAgICAgICAgICAgICAgI
46184HN0YWNrLnB1c2goIVR3aWcubGliLmJvb2x2YWwoYikpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnPCc6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgPCBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJzw9Jzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8PSBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJz4nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhID4gYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc+PSc6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc9PT0nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhID09PSBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJz09Jzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA9PSBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJyE9PSc6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnIT0nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICE9IGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnb3InOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIHx8IGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYi1vcic6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfCBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2IteG9yJzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSBeIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYW5kJzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmJiBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2ItYW5kJzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnKionOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnBvdyhhLCBiKSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICdub3QgaW4nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggIWNvbnRhaW5tZW50KGEsIGIpICk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICdpbic6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBjb250YWlubWVudChhLCBiKSApO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnLi4nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggVHdpZy5mdW5jdGlvbnMucmFuZ2UoYSwgYikgKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIG9wZXJhdG9yOiBcIiArIG9wZXJhdG9yICsgXCIgaXMgYW4gdW5rbm93biBvcGVyYXRvci5cIik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgcmV0dXJuIFR3aWc7XG5cblx0fTtcblxuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gIyMgdHdpZy5maWx0ZXJzLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZmlsdGVycy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXG5cdCAgICAvLyBEZXRlcm1pbmUgb2JqZWN0IHR5cGVcblx0ICAgIGZ1bmN0aW9uIGlzKHR5cGUsIG9iaikge1xuXHQgICAgICAgIHZhciBjbGFzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpO1xuXHQgICAgICAgIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgY2xhcyA9PT0gdHlwZTtcblx0ICAgIH1cblxuXHQgICAgVHdpZy5maWx0ZXJzID0ge1xuXHQgICAgICAgIC8vIFN0cmluZyBGaWx0ZXJzXG5cdCAgICAgICAgdXBwZXI6ICBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0ICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBsb3dlcjogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgY2FwaXRhbGl6ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUudG9Mb3dlckNhc2UoKS5zdWJzdHIoMSk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB0aXRsZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgI
46184HJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIC8oXnxcXHMpKFthLXpdKS9nICwgZnVuY3Rpb24obSwgcDEsIHAyKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBwMSArIHAyLnRvVXBwZXJDYXNlKCk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlLl9rZXlzID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl9rZXlzLmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIEFycmF5L09iamVjdCBGaWx0ZXJzXG5cdCAgICAgICAgcmV2ZXJzZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKGlzKFwiQXJyYXlcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUucmV2ZXJzZSgpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleXMgPSB2YWx1ZS5fa2V5cyB8fCBPYmplY3Qua2V5cyh2YWx1ZSkucmV2ZXJzZSgpO1xuXHQgICAgICAgICAgICAgICAgdmFsdWUuX2tleXMgPSBrZXlzO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzb3J0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zb3J0KCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMoJ09iamVjdCcsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gU29ydGluZyBvYmplY3RzIGlzbid0IG9idmlvdXMgc2luY2UgdGhlIG9yZGVyIG9mXG5cdCAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBrZXlzIGlzbid0IGd1YXJhbnRlZWQgaW4gSmF2YVNjcmlwdC5cblx0ICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhpcyB3ZSB1c2UgYSBcImhpZGRlblwiIGtleSBjYWxsZWQgX2tleXMgdG9cblx0ICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBrZXlzIGluIHRoZSBvcmRlciB3ZSB3YW50IHRvIHJldHVybiB0aGVtLlxuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUuX2tleXM7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKSxcblx0ICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfa2V5cyA9IGtleXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhMSwgYTI7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBhbmQgYiBhcmUgY29tcGFyYWJsZSwgd2UncmUgZmluZSA6LSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHZhbHVlW2FdID4gdmFsdWVbYl0pID09ICEodmFsdWVbYV0gPD0gdmFsdWVbYl0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbYV0gPiB2YWx1ZVtiXSA/IDEgOlxuXHRcdFx0XHQgICAgICAgICAgIHZhbHVlW2FdIDwgdmFsdWVbYl0gPyAtMSA6XG5cdFx0XHRcdFx0ICAgMDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGFuZCBiIGNhbiBiZSBwYXJzZWQgYXMgbnVtYmVycywgd2UgY2FuIGNvbXBhcmVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlaXIgbnVtZXJpYyB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc05hTihhMSA9IHBhcnNlRmxvYXQodmFsdWVbYV0pKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc05hTihiMSA9IHBhcnNlRmxvYXQodmFsdWVbYl0pKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGExID4gYjEgPyAxIDpcblx0XHRcdFx0ICAgICAgICAgICBhMSA8IGIxID8gLTEgOlxuXHRcdFx0XHRcdCAgIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgYSBzdHJpbmcsIHdlIGNvbnZlcnQgdGhlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIHZhbHVlIHRvIHN0cmluZyBhcyB3ZWxsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodHlwZW9mIHZhbHVlW2FdID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbYV0gPiB2YWx1ZVtiXS50b1N0cmluZygpID8gMSA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbYV0gPCB2YWx1ZVtiXS50b1N0cmluZygpID8gLTEgOlxuXHRcdFx0XHRcdCAgIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0eXBlb2YgdmFsdWVbYl0gPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVthXS50b1N0cmluZygpID4gdmFsdWVbYl0gPyAxIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVthXS50b1N0cmluZygpIDwgdmFsdWVbYl0gPyAtMSA6XG5cdFx0XHRcdFx0ICAgMDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGZhaWxlZCAtIHJldHVybiAnbnVsbCcgYXMgc2lnbiwgdGhhdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWVzIGFyZSBub3QgY29tcGFyYWJsZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZS5fa2V5cyA9IHNvcnRlZF9rZXlzO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBrZXlzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCl7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHZhciBrZXlzZXQgPSB2YWx1ZS5fa2V5cyB8fCBPYmplY3Qua2V5cyh2YWx1ZSksXG5cdCAgICAgICAgICAgICAgICBvdXRwdXQgPSBbXTtcblxuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2goa2V5c2V0LCBmdW5jdGlvbihrZXkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiX2tleXNcIikgcmV0dXJuOyAvLyBJZ25vcmUgdGhlIF9rZXlzIHByb3BlcnR5XG5cdCAgICAgICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgdXJsX2VuY29kZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFwiJ1wiLCBcIiUyN1wiKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGpvaW46IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIGpvaW5fc3RyID0gXCJcIixcblx0ICAgICAgICAgICAgICAgIG91dHB1dCA9IFtdLFxuXHQgICAgICAgICAgICAgICAga2V5c2V0ID0gbnVsbDtcblxuXHQgICAgICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtc1swXSkge1xuXHQgICAgICAgICAgICAgICAgam9pbl9zdHIgPSBwYXJhbXNbMF07XG5cdCAgICAgICAgICAgI
46184H1cblx0ICAgICAgICAgICAgaWYgKGlzKFwiQXJyYXlcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGtleXNldCA9IHZhbHVlLl9rZXlzIHx8IE9iamVjdC5rZXlzKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaChrZXlzZXQsIGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiX2tleXNcIikgcmV0dXJuOyAvLyBJZ25vcmUgdGhlIF9rZXlzIHByb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godmFsdWVba2V5XSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKGpvaW5fc3RyKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwiZGVmYXVsdFwiOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJkZWZhdWx0IGZpbHRlciBleHBlY3RzIG9uZSBhcmd1bWVudFwiKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXNbMF07XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIGpzb25fZW5jb2RlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JykgJiYgKGlzKFwiQXJyYXlcIiwgdmFsdWUpKSkge1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0ID0gW107XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24odikge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKFR3aWcuZmlsdGVycy5qc29uX2VuY29kZSh2KSk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1wiICsgb3V0cHV0LmpvaW4oXCIsXCIpICsgXCJdXCI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5c2V0ID0gdmFsdWUuX2tleXMgfHwgT2JqZWN0LmtleXModmFsdWUpLFxuXHQgICAgICAgICAgICAgICAgb3V0cHV0ID0gW107XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaChrZXlzZXQsIGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKEpTT04uc3RyaW5naWZ5KGtleSkgKyBcIjpcIiArIFR3aWcuZmlsdGVycy5qc29uX2VuY29kZSh2YWx1ZVtrZXldKSk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFwie1wiICsgb3V0cHV0LmpvaW4oXCIsXCIpICsgXCJ9XCI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBtZXJnZTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2YXIgb2JqID0gW10sXG5cdCAgICAgICAgICAgICAgICBhcnJfaW5kZXggPSAwLFxuXHQgICAgICAgICAgICAgICAga2V5c2V0ID0gW107XG5cblx0ICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsbCB0aGUgb2JqZWN0cyBiZWluZyBtZXJnZWQgYXJlIGFycmF5c1xuXHQgICAgICAgICAgICBpZiAoIWlzKFwiQXJyYXlcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb2JqIGFzIGFuIE9iamVjdFxuXHQgICAgICAgICAgICAgICAgb2JqID0geyB9O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24ocGFyYW0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzKFwiQXJyYXlcIiwgcGFyYW0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IHsgfTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWlzKFwiQXJyYXlcIiwgb2JqKSkge1xuXHQgICAgICAgICAgICAgICAgb2JqLl9rZXlzID0gW107XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24odmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fa2V5cykgb2JqLl9rZXlzLnB1c2goYXJyX2luZGV4KTtcblx0ICAgICAgICAgICAgICAgICAgICBvYmpbYXJyX2luZGV4XSA9IHZhbDtcblx0ICAgICAgICAgICAgICAgICAgICBhcnJfaW5kZXgrKztcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAga2V5c2V0ID0gdmFsdWUuX2tleXMgfHwgT2JqZWN0LmtleXModmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKGtleXNldCwgZnVuY3Rpb24oa2V5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVtrZXldO1xuXHQgICAgICAgICAgICAgICAgICAgIG9iai5fa2V5cy5wdXNoKGtleSk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZWRnZSBjYXNlIHdoZXJlIGEgbnVtYmVyIGluZGV4IGluIGFuIG9iamVjdCBpcyBncmVhdGVyIHRoYW5cblx0ICAgICAgICAgICAgICAgICAgICAvLyAgIHRoZSBhcnJheSBjb3VudGVyLiBJbiBzdWNoIGEgY2FzZSwgdGhlIGFycmF5IGNvdW50ZXIgaXMgaW5jcmVhc2VkXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gICBvbmUgcGFzdCB0aGUgaW5kZXguXG5cdCAgICAgICAgICAgICAgICAgICAgLy9cblx0ICAgICAgICAgICAgICAgICAgICAvLyBFeGFtcGxlIHt7IFtcImFcIiwgXCJiXCJdfG1lcmdlKHtcIjRcIjpcInZhbHVlXCJ9LCBbXCJjXCIsIFwiZFwiXSlcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGQgd291bGQgaGF2ZSBhbiBpbmRleCBvZiBcIjRcIiBhbmQgb3ZlcndyaXRlIHRoZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgIC8vICAgb2YgXCJ2YWx1ZVwiXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGludF9rZXkgPSBwYXJzZUludChrZXksIDEwKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGludF9rZXkpICYmIGludF9rZXkgPj0gYXJyX2luZGV4KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGFycl9pbmRleCA9IGludF9rZXkgKyAxO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gbWl4aW4gdGhlIG1lcmdlIGFycmF5c1xuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbihwYXJhbSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGlzKFwiQXJyYXlcIiwgcGFyYW0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKHBhcmFtLCBmdW5jdGlvbih2YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fa2V5cykgb2JqLl9rZXlzLnB1c2goYXJyX2luZGV4KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2Fycl9pbmRleF0gPSB2YWw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGFycl9pbmRleCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBrZXlzZXQgPSBwYXJhbS5fa2V5cyB8fCBPYmplY3Qua2V5cyhwYXJhbSk7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKGtleXNldCwgZnVuY3Rpb24oa2V5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqW2tleV0pIG9iai5fa2V5cy5wdXNoKGtleSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gcGFyYW1ba2V5XTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW50X2tleSA9IHBhcnNlSW50KGtleSwgMTApO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGludF9rZXkpICYmIGludF9rZXkgPj0gYXJyX2luZGV4KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJfaW5kZXggPSBpbnRfa2V5ICsgMTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiRmlsdGVyIG1lcmdlIGV4cGVjdHMgYXQgbGVhc3Qgb25lIHBhcmFtZXRlclwiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBvYmo7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkYXRlOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHZhciBkYXRlID0gVHdpZy5mdW5jdGlvbnMuZGF0ZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgIHZhciBmb3JtYXQgPSBwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA/IHBhcmFtc1swXSA6ICdGIGosIFkgSDppJztcblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcubGliLmRhdGUoZm9ybWF0LCBkYXRlKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGF0ZV9tb2RpZnk6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmxlbmd0aCAhPT0gMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJkYXRlX21vZGlmeSBmaWx0ZXIgZXhwZWN0cyAxIGFyZ3VtZW50XCIpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIG1vZGlmeVRleHQgPSBwYXJhbXNbMF0sIHRpbWU7XG5cblx0ICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKFwiRGF0ZVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRpbWUgPSBUd2lnLmxpYi5zdHJ0b3RpbWUobW9kaWZ5VGV4dCwgdmFsdWUuZ2V0VGltZSgpIC8gMTAwMCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdGltZSA9IFR3aWcubGliLnN0cnRvdGltZShtb2RpZnlUZXh0LCBUd2lnLmxpYi5zdHJ0b3RpbWUodmFsdWUpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoXCJOdW1iZXJcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aW1lID0gVHdpZy5saWIuc3RydG90aW1lKG1vZGlmeVRleHQsIHZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lICogMTAwMCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIHJlcGxhY2U6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWR8fHZhbHVlID09PSBudWxsKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHZhciBwYWlycyA9IHBhcmFtc1swXSxcblx0ICAgICAgICAgICAgICAgIHRhZztcblx0ICAgICAgICAgICAgZm9yICh0YWcgaW4gcGFpcnMpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChwYWlycy5oYXNPd25Qcm9wZXJ0eSh0YWcpICYmIHRhZyAhPT0gXCJfa2V5c1wiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUd2lnLmxpYi5yZXBsYWNlQWxsKHZhbHVlLCB0YWcsIHBhaXJzW3RhZ10pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi52c3ByaW50Zih2YWx1ZSwgcGFyYW1zKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgc3RyaXB0YWdzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCl7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5saWIuc3RyaXBfdGFncyh2YWx1ZSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGVzY2FwZTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZHx8IHZhbHVlID09PSBudWxsKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHZhciBzdHJhdGVneSA9IFwiaHRtbFwiO1xuXHQgICAgICAgICAgICBpZihwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAmJiBwYXJhbXNbMF0gIT09IHRydWUpXG5cdCAgICAgICAgICAgICAgICBzdHJhdGVneSA9IHBhcmFtc1swXTtcblxuXHQgICAgICAgICAgICBpZihzdHJhdGVneSA9PSBcImh0bWxcIikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHJhd192YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIiYjMDM5O1wiKTtcblx0ICAgICAgICAgICAgICAgI
46184HJldHVybiBUd2lnLk1hcmt1cChyYXdfdmFsdWUsICdodG1sJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZihzdHJhdGVneSA9PSBcImpzXCIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByYXdfdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG5cblx0ICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCByYXdfdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZihyYXdfdmFsdWVbaV0ubWF0Y2goL15bYS16QS1aMC05LFxcLl9dJC8pKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcmF3X3ZhbHVlW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcl9jb2RlID0gcmF3X3ZhbHVlLmNoYXJDb2RlQXQoaSk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hhcl9jb2RlIDwgMHg4MClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcXFx4XCIgKyBjaGFyX2NvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUd2lnLmxpYi5zcHJpbnRmKFwiXFxcXHUlMDRzXCIsIGNoYXJfY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5NYXJrdXAocmVzdWx0LCAnanMnKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmKHN0cmF0ZWd5ID09IFwiY3NzXCIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByYXdfdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG5cblx0ICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCByYXdfdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZihyYXdfdmFsdWVbaV0ubWF0Y2goL15bYS16QS1aMC05XSQvKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHJhd192YWx1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJfY29kZSA9IHJhd192YWx1ZS5jaGFyQ29kZUF0KGkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCJcXFxcXCIgKyBjaGFyX2NvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIiBcIjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLk1hcmt1cChyZXN1bHQsICdjc3MnKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmKHN0cmF0ZWd5ID09IFwidXJsXCIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBUd2lnLmZpbHRlcnMudXJsX2VuY29kZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5NYXJrdXAocmVzdWx0LCAndXJsJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZihzdHJhdGVneSA9PSBcImh0bWxfYXR0clwiKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgcmF3X3ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuXG5cdCAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcmF3X3ZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYocmF3X3ZhbHVlW2ldLm1hdGNoKC9eW2EtekEtWjAtOSxcXC5cXC1fXSQvKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHJhd192YWx1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHJhd192YWx1ZVtpXS5tYXRjaCgvXlsmPD5cIl0kLykpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSByYXdfdmFsdWVbaV0ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcl9jb2RlID0gcmF3X3ZhbHVlLmNoYXJDb2RlQXQoaSk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZXBsYWNlcyBjaGFyYWN0ZXJzIHVuZGVmaW5lZCBpbiBIVE1MIHdpdGhcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhleCBlbnRpdHkgZm9yIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3Rlci5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hhcl9jb2RlIDw9IDB4MWYgJiYgY2hhcl9jb2RlICE9IDB4MDkgJiYgY2hhcl9jb2RlICE9IDB4MGEgJiYgY2hhcl9jb2RlICE9IDB4MGQpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCImI3hGRkZEO1wiO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNoYXJfY29kZSA8IDB4ODApXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVHdpZy5saWIuc3ByaW50ZihcIiYjeCUwMnM7XCIsIGNoYXJfY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUd2lnLmxpYi5zcHJpbnRmKFwiJiN4JTA0cztcIiwgY2hhcl9jb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLk1hcmt1cChyZXN1bHQsICdodG1sX2F0dHInKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiZXNjYXBlIHN0cmF0ZWd5IHVuc3VwcG9ydGVkXCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qIEFsaWFzIG9mIGVzY2FwZSAqL1xuXHQgICAgICAgIFwiZVwiOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmZpbHRlcnMuZXNjYXBlKHZhbHVlLCBwYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBubDJicjogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBsaW5lYnJlYWtfdGFnID0gXCJCQUNLU0xBU0hfbl9yZXBsYWNlXCIsXG5cdCAgICAgICAgICAgICAgICBiciA9IFwiPGJyIC8+XCIgKyBsaW5lYnJlYWtfdGFnO1xuXG5cdCAgICAgICAgICAgIHZhbHVlID0gVHdpZy5maWx0ZXJzLmVzY2FwZSh2YWx1ZSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nLCBicilcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCBicilcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBicik7XG5cblx0ICAgICAgICAgICAgdmFsdWUgPSBUd2lnLmxpYi5yZXBsYWNlQWxsKHZhbHVlLCBsaW5lYnJlYWtfdGFnLCBcIlxcblwiKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5NYXJrdXAodmFsdWUpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGFwdGVkIGZyb206IGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL251bWJlcl9mb3JtYXQ6NDgxXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgbnVtYmVyX2Zvcm1hdDogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2Y
46184XIgbnVtYmVyID0gdmFsdWUsXG5cdCAgICAgICAgICAgICAgICBkZWNpbWFscyA9IChwYXJhbXMgJiYgcGFyYW1zWzBdKSA/IHBhcmFtc1swXSA6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgIGRlYyAgICAgID0gKHBhcmFtcyAmJiBwYXJhbXNbMV0gIT09IHVuZGVmaW5lZCkgPyBwYXJhbXNbMV0gOiBcIi5cIixcblx0ICAgICAgICAgICAgICAgIHNlcCAgICAgID0gKHBhcmFtcyAmJiBwYXJhbXNbMl0gIT09IHVuZGVmaW5lZCkgPyBwYXJhbXNbMl0gOiBcIixcIjtcblxuXHQgICAgICAgICAgICBudW1iZXIgPSAobnVtYmVyICsgJycpLnJlcGxhY2UoL1teMC05K1xcLUVlLl0vZywgJycpO1xuXHQgICAgICAgICAgICB2YXIgbiA9ICFpc0Zpbml0ZSgrbnVtYmVyKSA/IDAgOiArbnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcblx0ICAgICAgICAgICAgICAgIHMgPSAnJyxcblx0ICAgICAgICAgICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBrID0gTWF0aC5wb3coMTAsIHByZWMpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyArIE1hdGgucm91bmQobiAqIGspIC8gaztcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgcGFyc2VGbG9hdCgwLjU1KS50b0ZpeGVkKDApID0gMDtcblx0ICAgICAgICAgICAgcyA9IChwcmVjID8gdG9GaXhlZEZpeChuLCBwcmVjKSA6ICcnICsgTWF0aC5yb3VuZChuKSkuc3BsaXQoJy4nKTtcblx0ICAgICAgICAgICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuXHQgICAgICAgICAgICAgICAgc1swXSA9IHNbMF0ucmVwbGFjZSgvXFxCKD89KD86XFxkezN9KSsoPyFcXGQpKS9nLCBzZXApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuXHQgICAgICAgICAgICAgICAgc1sxXSA9IHNbMV0gfHwgJyc7XG5cdCAgICAgICAgICAgICAgICBzWzFdICs9IG5ldyBBcnJheShwcmVjIC0gc1sxXS5sZW5ndGggKyAxKS5qb2luKCcwJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHMuam9pbihkZWMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICB0cmltOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIHN0ciA9IFR3aWcuZmlsdGVycy5lc2NhcGUoICcnICsgdmFsdWUgKSxcblx0ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2U7XG5cdCAgICAgICAgICAgIGlmICggcGFyYW1zICYmIHBhcmFtc1swXSApIHtcblx0ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAnJyArIHBhcmFtc1swXTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAnIFxcblxcclxcdFxcZlxceDBiXFx4YTBcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMGJcXHUyMDI4XFx1MjAyOVxcdTMwMDAnO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAod2hpdGVzcGFjZS5pbmRleE9mKHN0ci5jaGFyQXQoaSkpID09PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoaSk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZm9yIChpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAod2hpdGVzcGFjZS5pbmRleE9mKHN0ci5jaGFyQXQoaSkpID09PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgaSArIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB3aGl0ZXNwYWNlLmluZGV4T2Yoc3RyLmNoYXJBdCgwKSkgPT09IC0xID8gc3RyIDogJyc7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIHRydW5jYXRlOiBmdW5jdGlvbiAodmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2Y
46184XIgbGVuZ3RoID0gMzAsXG5cdCAgICAgICAgICAgICAgICBwcmVzZXJ2ZSA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gJy4uLic7XG5cblx0ICAgICAgICAgICAgdmFsdWUgPSAgdmFsdWUgKyAnJztcblx0ICAgICAgICAgICAgaWYgKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1swXSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhcmFtc1swXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbMV0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZSA9IHBhcmFtc1sxXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbMl0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBwYXJhbXNbMl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gbGVuZ3RoKSB7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHZhbHVlLmluZGV4T2YoJyAnLCBsZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IC0xKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gIHZhbHVlLnN1YnN0cigwLCBsZW5ndGgpICsgc2VwYXJhdG9yO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBzbGljZTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMubGVuZ3RoIDwgMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJzbGljZSBmaWx0ZXIgZXhwZWN0cyBhdCBsZWFzdCAxIGFyZ3VtZW50XCIpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBzdGFydCBvZiBzdHJpbmdcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcGFyYW1zWzBdIHx8IDA7XG5cdCAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbGVuZ3RoIG9mIHN0cmluZ1xuXHQgICAgICAgICAgICB2Y
46184XIgbGVuZ3RoID0gcGFyYW1zLmxlbmd0aCA+IDEgPyBwYXJhbXNbMV0gOiB2YWx1ZS5sZW5ndGg7XG5cdCAgICAgICAgICAgIC8vIGhhbmRsZSBuZWdhdGl2ZSBzdGFydCB2YWx1ZXNcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBzdGFydCA+PSAwID8gc3RhcnQgOiBNYXRoLm1heCggdmFsdWUubGVuZ3RoICsgc3RhcnQsIDAgKTtcblxuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXTtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgc3RhcnRJbmRleCArIGxlbmd0aCAmJiBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZVtpXSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cihzdGFydEluZGV4LCBsZW5ndGgpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJzbGljZSBmaWx0ZXIgZXhwZWN0cyB2YWx1ZSB0byBiZSBhbiBhcnJheSBvciBzdHJpbmdcIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYWJzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZmlyc3Q6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIGlmIChpcyhcIkFycmF5XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKCdfa2V5cycgaW4gdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbdmFsdWUuX2tleXNbMF1dO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIDEpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBzcGxpdDogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMubGVuZ3RoIDwgMSB8fCBwYXJhbXMubGVuZ3RoID4gMikge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJzcGxpdCBmaWx0ZXIgZXhwZWN0cyAxIG9yIDIgYXJndW1lbnRcIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlbGltaXRlciA9IHBhcmFtc1swXSxcblx0ICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHBhcmFtc1sxXSxcblx0ICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHZhbHVlLnNwbGl0KGRlbGltaXRlcik7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXQ7XG5cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGltaXQgPCAwKSB7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoZGVsaW1pdGVyLCBzcGxpdC5sZW5ndGggKyBsaW1pdCk7XG5cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbGltaXRlZFNwbGl0ID0gW107XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1pdGVyID09ICcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IGRlbGltaXRlclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBcImFhYmJjY1wifHNwbGl0KCcnLCAyKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLT4gWydhYScsICdiYicsICdjYyddXG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoc3BsaXQubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBcIlwiO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGxpbWl0ICYmIHNwbGl0Lmxlbmd0aCA+IDA7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gc3BsaXQuc2hpZnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWRTcGxpdC5wdXNoKHRlbXApO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tZW1wdHkgZGVsaW1pdGVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwib25lLHR3byx0aHJlZSxmb3VyLGZpdmVcInxzcGxpdCgnLCcsIDMpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAtPiBbJ29uZScsICd0d28nLCAndGhyZWUsZm91cixmaXZlJ11cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bGltaXQtMSAmJiBzcGxpdC5sZW5ndGggPiAwOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWRTcGxpdC5wdXNoKHNwbGl0LnNoaWZ0KCkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWRTcGxpdC5wdXNoKHNwbGl0LmpvaW4oZGVsaW1pdGVyKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRlZFNwbGl0O1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcInNwbGl0IGZpbHRlciBleHBlY3RzIHZhbHVlIHRvIGJlIGEgc3RyaW5nXCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBsYXN0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoJ09iamVjdCcsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleXM7XG5cblx0ICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5fa2V5cyA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5cyA9IHZhbHVlLl9rZXlzO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVba2V5c1trZXlzLmxlbmd0aCAtIDFdXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIHN0cmluZ3xhcnJheVxuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cdCAgICAgICAgfSxcblx0ICAgICAgICByYXc6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLk1hcmt1cCh2YWx1ZSk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBiYXRjaDogZnVuY3Rpb24oaXRlbXMsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2Y
46184XIgc2l6ZSA9IHBhcmFtcy5zaGlmdCgpLFxuXHQgICAgICAgICAgICAgICAgZmlsbCA9IHBhcmFtcy5zaGlmdCgpLFxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgbGFzdCxcblx0ICAgICAgICAgICAgICAgIG1pc3Npbmc7XG5cblx0ICAgICAgICAgICAgaWYgKCFUd2lnLmxpYi5pcyhcIkFycmF5XCIsIGl0ZW1zKSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJiYXRjaCBmaWx0ZXIgZXhwZWN0cyBpdGVtcyB0byBiZSBhbiBhcnJheVwiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGlmICghVHdpZy5saWIuaXMoXCJOdW1iZXJcIiwgc2l6ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiYmF0Y2ggZmlsdGVyIGV4cGVjdHMgc2l6ZSB0byBiZSBhIG51bWJlclwiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSk7XG5cblx0ICAgICAgICAgICAgcmVzdWx0ID0gVHdpZy5saWIuY2h1bmtBcnJheShpdGVtcywgc2l6ZSk7XG5cblx0ICAgICAgICAgICAgaWYgKGZpbGwgJiYgaXRlbXMubGVuZ3RoICUgc2l6ZSAhPSAwKSB7XG5cdCAgICAgICAgICAgICAgICBsYXN0ID0gcmVzdWx0LnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgbWlzc2luZyA9IHNpemUgLSBsYXN0Lmxlbmd0aDtcblxuXHQgICAgICAgICAgICAgICAgd2hpbGUgKG1pc3NpbmctLSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxhc3QucHVzaChmaWxsKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFzdCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcm91bmQ6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuXG5cdCAgICAgICAgICAgIHZhciBwcmVjaXNpb24gPSBwYXJhbXMubGVuZ3RoID4gMCA/IHBhcmFtc1swXSA6IDAsXG5cdCAgICAgICAgICAgICAgICBtZXRob2QgPSBwYXJhbXMubGVuZ3RoID4gMSA/IHBhcmFtc1sxXSA6IFwiY29tbW9uXCI7XG5cblx0ICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuXHQgICAgICAgICAgICBpZihwcmVjaXNpb24gJiYgIVR3aWcubGliLmlzKFwiTnVtYmVyXCIsIHByZWNpc2lvbikpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwicm91bmQgZmlsdGVyIGV4cGVjdHMgcHJlY2lzaW9uIHRvIGJlIGEgbnVtYmVyXCIpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJjb21tb25cIikge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcubGliLnJvdW5kKHZhbHVlLCBwcmVjaXNpb24pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYoIVR3aWcubGliLmlzKFwiRnVuY3Rpb25cIiwgTWF0aFttZXRob2RdKSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJyb3VuZCBmaWx0ZXIgZXhwZWN0cyBtZXRob2QgdG8gYmUgJ2Zsb29yJywgJ2NlaWwnLCBvciAnY29tbW9uJ1wiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoW21ldGhvZF0odmFsdWUgKiBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKSkgLyBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLmZpbHRlciA9IGZ1bmN0aW9uKGZpbHRlciwgdmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgIGlmICghVHdpZy5maWx0ZXJzW2ZpbHRlcl0pIHtcblx0ICAgICAgICAgICAgdGhyb3cgXCJVbmFibGUgdG8gZmluZCBmaWx0ZXIgXCIgKyBmaWx0ZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUd2lnLmZpbHRlcnNbZmlsdGVyXS5hcHBseSh0aGlzLCBbdmFsdWUsIHBhcmFtc10pO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5maWx0ZXIuZXh0ZW5kID0gZnVuY3Rpb24oZmlsdGVyLCBkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy5maWx0ZXJzW2ZpbHRlcl0gPSBkZWZpbml0aW9uO1xuXHQgICAgfTtcblxuXHQgICAgcmV0dXJuIFR3aWc7XG5cblx0fTtcblxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gIyMgdHdpZy5mdW5jdGlvbnMuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgcGFyc2luZyBmaWx0ZXJzLlxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUd2lnKSB7XG5cdCAgICAvKipcblx0ICAgICAqIEBjb25zdGFudFxuXHQgICAgICogQHR5cGUge3N0cmluZ31cblx0ICAgICAqL1xuXHQgICAgdmFyIFRFTVBMQVRFX05PVF9GT1VORF9NRVNTQUdFID0gJ1RlbXBsYXRlIFwie25hbWV9XCIgaXMgbm90IGRlZmluZWQuJztcblxuXHQgICAgLy8gRGV0ZXJtaW5lIG9iamVjdCB0eXBlXG5cdCAgICBmdW5jdGlvbiBpcyh0eXBlLCBvYmopIHtcblx0ICAgICAgICB2Y
46184XIgY2xhcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcblx0ICAgICAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIGNsYXMgPT09IHR5cGU7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuZnVuY3Rpb25zID0ge1xuXHQgICAgICAgIC8vICBhdHRyaWJ1dGUsIGJsb2NrLCBjb25zdGFudCwgZGF0ZSwgZHVtcCwgcGFyZW50LCByYW5kb20sLlxuXG5cdCAgICAgICAgLy8gUmFuZ2UgZnVuY3Rpb24gZnJvbSBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9yYW5nZTo0OTlcblx0ICAgICAgICAvLyBVc2VkIHVuZGVyIGFuIE1JVCBMaWNlbnNlXG5cdCAgICAgICAgcmFuZ2U6IGZ1bmN0aW9uIChsb3csIGhpZ2gsIHN0ZXApIHtcblx0ICAgICAgICAgICAgLy8gaHR0cDovL2tldmluLnZhbnpvbm5ldmVsZC5uZXRcblx0ICAgICAgICAgICAgLy8gKyAgIG9yaWdpbmFsIGJ5OiBXYWxkbyBNYWxxdWkgU2lsdmFcblx0ICAgICAgICAgICAgLy8gKiAgICAgZXhhbXBsZSAxOiByYW5nZSAoIDAsIDEyICk7XG5cdCAgICAgICAgICAgIC8vICogICAgIHJldHVybnMgMTogWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTJdXG5cdCAgICAgICAgICAgIC8vICogICAgIGV4YW1wbGUgMjogcmFuZ2UoIDAsIDEwMCwgMTAgKTtcblx0ICAgICAgICAgICAgLy8gKiAgICAgcmV0dXJucyAyOiBbMCwgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwXVxuXHQgICAgICAgICAgICAvLyAqICAgICBleGFtcGxlIDM6IHJhbmdlKCAnYScsICdpJyApO1xuXHQgICAgICAgICAgICAvLyAqICAgICByZXR1cm5zIDM6IFsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knXVxuXHQgICAgICAgICAgICAvLyAqICAgICBleGFtcGxlIDQ6IHJhbmdlKCAnYycsICdhJyApO1xuXHQgICAgICAgICAgICAvLyAqICAgICByZXR1cm5zIDQ6IFsnYycsICdiJywgJ2EnXVxuXHQgICAgICAgICAgICB2Y
46184XIgbWF0cml4ID0gW107XG5cdCAgICAgICAgICAgIHZhciBpbml2YWwsIGVuZHZhbCwgcGx1cztcblx0ICAgICAgICAgICAgdmFyIHdhbGtlciA9IHN0ZXAgfHwgMTtcblx0ICAgICAgICAgICAgdmFyIGNoYXJzID0gZmFsc2U7XG5cblx0ICAgICAgICAgICAgaWYgKCFpc05hTihsb3cpICYmICFpc05hTihoaWdoKSkge1xuXHQgICAgICAgICAgICAgICAgaW5pdmFsID0gcGFyc2VJbnQobG93LCAxMCk7XG5cdCAgICAgICAgICAgICAgICBlbmR2YWwgPSBwYXJzZUludChoaWdoLCAxMCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOYU4obG93KSAmJiBpc05hTihoaWdoKSkge1xuXHQgICAgICAgICAgICAgICAgY2hhcnMgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgaW5pdmFsID0gbG93LmNoYXJDb2RlQXQoMCk7XG5cdCAgICAgICAgICAgICAgICBlbmR2YWwgPSBoaWdoLmNoYXJDb2RlQXQoMCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpbml2YWwgPSAoaXNOYU4obG93KSA/IDAgOiBsb3cpO1xuXHQgICAgICAgICAgICAgICAgZW5kdmFsID0gKGlzTmFOKGhpZ2gpID8gMCA6IGhpZ2gpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcGx1cyA9ICgoaW5pdmFsID4gZW5kdmFsKSA/IGZhbHNlIDogdHJ1ZSk7XG5cdCAgICAgICAgICAgIGlmIChwbHVzKSB7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoaW5pdmFsIDw9IGVuZHZhbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5wdXNoKCgoY2hhcnMpID8gU3RyaW5nLmZyb21DaGFyQ29kZShpbml2YWwpIDogaW5pdmFsKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdmFsICs9IHdhbGtlcjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChpbml2YWwgPj0gZW5kdmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbWF0cml4LnB1c2goKChjaGFycykgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGluaXZhbCkgOiBpbml2YWwpKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml2YWwgLT0gd2Fsa2VyO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG1hdHJpeDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGN5Y2xlOiBmdW5jdGlvbihhcnIsIGkpIHtcblx0ICAgICAgICAgICAgdmFyIHBvcyA9IGkgJSBhcnIubGVuZ3RoO1xuXHQgICAgICAgICAgICByZXR1cm4gYXJyW3Bvc107XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkdW1wOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgdmFyIEVPTCA9ICdcXG4nLFxuXHQgICAgICAgICAgICAgICAgaW5kZW50Q2hhciA9ICcgICcsXG5cdCAgICAgICAgICAgICAgICBpbmRlbnRUaW1lcyA9IDAsXG5cdCAgICAgICAgICAgICAgICBvdXQgPSAnJyxcblx0ICAgICAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFxuXHQgICAgICAgICAgICAgICAgaW5kZW50ID0gZnVuY3Rpb24odGltZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW5kICA9ICcnO1xuXHQgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aW1lcyA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5kICs9IGluZGVudENoYXI7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmQ7XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZGlzcGxheVZhciA9IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0ICs9IGluZGVudChpbmRlbnRUaW1lcyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YXJpYWJsZSkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBWYXIodmFyaWFibGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHZhcmlhYmxlKSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJ2Z1bmN0aW9uKCknICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHZhcmlhYmxlKSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdzdHJpbmcoJyArIHZhcmlhYmxlLmxlbmd0aCArICcpIFwiJyArIHZhcmlhYmxlICsgJ1wiJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZih2YXJpYWJsZSkgPT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnbnVtYmVyKCcgKyB2YXJpYWJsZSArICcpJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZih2YXJpYWJsZSkgPT09ICdib29sZWFuJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJ2Jvb2woJyArIHZhcmlhYmxlICsgJyknICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBkdW1wVmFyID0gZnVuY3Rpb24odmFyaWFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdOVUxMJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICd1bmRlZmluZWQnICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhcmlhYmxlID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gaW5kZW50KGluZGVudFRpbWVzKSArIHR5cGVvZih2YXJpYWJsZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudFRpbWVzKys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnKCcgKyAoZnVuY3Rpb24ob2JqKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IDAsIGtleTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pKHZhcmlhYmxlKSArICcpIHsnICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdmFyaWFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBpbmRlbnQoaW5kZW50VGltZXMpICsgJ1snICsgaSArICddPT4gJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYXIodmFyaWFibGVbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudFRpbWVzLS07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBpbmRlbnQoaW5kZW50VGltZXMpICsgJ30nICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYXIodmFyaWFibGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgLy8gaGFuZGxlIG5vIGFyZ3VtZW50IGNhc2UgYnkgZHVtcGluZyB0aGUgZW50aXJlIHJlbmRlciBjb250ZXh0XG5cdCAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSBhcmdzLnB1c2godGhpcy5jb250ZXh0KTtcblxuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2goYXJncywgZnVuY3Rpb24odmFyaWFibGUpIHtcblx0ICAgICAgICAgICAgICAgIGR1bXBWYXIodmFyaWFibGUpO1xuXHQgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICByZXR1cm4gb3V0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZGF0ZTogZnVuY3Rpb24oZGF0ZSwgdGltZSkge1xuXHQgICAgICAgICAgICB2Y
46184XIgZGF0ZU9iajtcblx0ICAgICAgICAgICAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCB8fCBkYXRlID09PSBudWxsIHx8IGRhdGUgPT09IFwiXCIpIHtcblx0ICAgICAgICAgICAgICAgIGRhdGVPYmogPSBuZXcgRGF0ZSgpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKFwiRGF0ZVwiLCBkYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgZGF0ZU9iaiA9IGRhdGU7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoVHdpZy5saWIuaXMoXCJTdHJpbmdcIiwgZGF0ZSkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChkYXRlLm1hdGNoKC9eWzAtOV0rJC8pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGUgKiAxMDAwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGRhdGVPYmogPSBuZXcgRGF0ZShUd2lnLmxpYi5zdHJ0b3RpbWUoZGF0ZSkgKiAxMDAwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChUd2lnLmxpYi5pcyhcIk51bWJlclwiLCBkYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wXG5cdCAgICAgICAgICAgICAgICBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZSAqIDEwMDApO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgZGF0ZSBcIiArIGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBkYXRlT2JqO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgYmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsQmxvY2tUb2tlbnNbYmxvY2tdKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5sb2dpYy5wYXJzZS5hcHBseSh0aGlzLCBbdGhpcy5vcmlnaW5hbEJsb2NrVG9rZW5zW2Jsb2NrXSwgdGhpcy5jb250ZXh0XSkub3V0cHV0O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tzW2Jsb2NrXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcGFyZW50OiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgLy8gQWRkIGEgcGxhY2Vob2xkZXJcblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcucGxhY2Vob2xkZXJzLnBhcmVudDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGF0dHJpYnV0ZTogZnVuY3Rpb24ob2JqZWN0LCBtZXRob2QsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoJ09iamVjdCcsIG9iamVjdCkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W21ldGhvZF0gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W21ldGhvZF0uYXBwbHkodW5kZWZpbmVkLCBwYXJhbXMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZXRob2RdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBBcnJheSB3aWxsIHJldHVybiBlbGVtZW50IDAtaW5kZXhcblx0ICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZXRob2RdIHx8IHVuZGVmaW5lZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG1heDogZnVuY3Rpb24odmFsdWVzKSB7XG5cdCAgICAgICAgICAgIGlmKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlcykpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJfa2V5c1wiXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5tYXgodmFsdWVzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5tYXguYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG1pbjogZnVuY3Rpb24odmFsdWVzKSB7XG5cdCAgICAgICAgICAgIGlmKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlcykpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJfa2V5c1wiXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5taW4odmFsdWVzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5taW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHRlbXBsYXRlX2Zyb21fc3RyaW5nOiBmdW5jdGlvbih0ZW1wbGF0ZSkge1xuXHQgICAgICAgICAgICBpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnJztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMucGFyc2Vycy50d2lnKHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcblx0ICAgICAgICAgICAgICAgIGRhdGE6IHRlbXBsYXRlXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcmFuZG9tOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICB2Y
46184XIgTElNSVRfSU5UMzEgPSAweDgwMDAwMDAwO1xuXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIGdldFJhbmRvbU51bWJlcihuKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTElNSVRfSU5UMzEpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGxpbWl0cyA9IFswLCBuXTtcblx0ICAgICAgICAgICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbi5hcHBseShudWxsLCBsaW1pdHMpLFxuXHQgICAgICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGxpbWl0cyk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcigobWF4IC0gbWluICsgMSkgKiByYW5kb20gLyBMSU1JVF9JTlQzMSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZihUd2lnLmxpYi5pcyhcIk51bWJlclwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBnZXRSYW5kb21OdW1iZXIodmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYoVHdpZy5saWIuaXMoXCJTdHJpbmdcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuY2hhckF0KGdldFJhbmRvbU51bWJlcih2YWx1ZS5sZW5ndGgtMSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtnZXRSYW5kb21OdW1iZXIodmFsdWUubGVuZ3RoLTEpXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGlmKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVba2V5c1tnZXRSYW5kb21OdW1iZXIoa2V5cy5sZW5ndGgtMSldXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBnZXRSYW5kb21OdW1iZXIoTElNSVRfSU5UMzEtMSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSB0ZW1wbGF0ZSB3aXRob3V0IHJlbmRlcmluZyBpdFxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG5cdCAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlX21pc3Npbmc9ZmFsc2VdXG5cdCAgICAgICAgICogQHJldHVybnMge3N0cmluZ31cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKG5hbWUsIGlnbm9yZV9taXNzaW5nKSB7XG5cdCAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVNvdXJjZTtcblx0ICAgICAgICAgICAgdmFyIHRlbXBsYXRlRm91bmQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdmFyIGlzTm9kZUVudmlyb25tZW50ID0gdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJztcblx0ICAgICAgICAgICAgdmFyIGxvYWRlcjtcblx0ICAgICAgICAgICAgdmFyIHBhdGg7XG5cblx0ICAgICAgICAgICAgLy9pZiB3ZSBhcmUgcnVubmluZyBpbiBhIG5vZGUuanMgZW52aXJvbm1lbnQsIHNldCB0aGUgbG9hZGVyIHRvICdmcycgYW5kIGVuc3VyZSB0aGVcblx0ICAgICAgICAgICAgLy8gcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgQ1dEIG9mIHRoZSBydW5uaW5nIHNjcmlwdFxuXHQgICAgICAgICAgICAvL2Vsc2UsIHNldCB0aGUgbG9hZGVyIHRvICdhamF4JyBhbmQgc2V0IHRoZSBwYXRoIHRvIHRoZSB2YWx1ZSBvZiBuYW1lXG5cdCAgICAgICAgICAgIGlmIChpc05vZGVFbnZpcm9ubWVudCkge1xuXHQgICAgICAgICAgICAgICAgbG9hZGVyID0gJ2ZzJztcblx0ICAgICAgICAgICAgICAgIHBhdGggPSBfX2Rpcm5hbWUgKyAnLycgKyBuYW1lO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgbG9hZGVyID0gJ2FqYXgnO1xuXHQgICAgICAgICAgICAgICAgcGF0aCA9IG5hbWU7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvL2J1aWxkIHRoZSBwYXJhbXMgb2JqZWN0XG5cdCAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7XG5cdCAgICAgICAgICAgICAgICBpZDogbmFtZSxcblx0ICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG5cdCAgICAgICAgICAgICAgICBtZXRob2Q6IGxvYWRlcixcblx0ICAgICAgICAgICAgICAgIHBhcnNlcjogJ3NvdXJjZScsXG5cdCAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmZXRjaFRlbXBsYXRlU291cmNlOiB0cnVlXG5cdCAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgLy9kZWZhdWx0IGlnbm9yZV9taXNzaW5nIHRvIGZhbHNlXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgaWdub3JlX21pc3NpbmcgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgICAgICBpZ25vcmVfbWlzc2luZyA9IGZhbHNlO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy90cnkgdG8gbG9hZCB0aGUgcmVtb3RlIHRlbXBsYXRlXG5cdCAgICAgICAgICAgIC8vXG5cdCAgICAgICAgICAgIC8vb24gZXhjZXB0aW9uLCBsb2cgaXRcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRlbXBsYXRlU291cmNlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZShuYW1lLCBwYXJhbXMpO1xuXG5cdCAgICAgICAgICAgICAgICAvL2lmIHRoZSB0ZW1wbGF0ZSBpcyB1bmRlZmluZWQgb3IgbnVsbCwgc2V0IHRoZSB0ZW1wbGF0ZSB0byBhbiBlbXB0eSBzdHJpbmcgYW5kIGRvIE5PVCBmbGlwIHRoZVxuXHQgICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBpbmRpY2F0aW5nIHdlIGZvdW5kIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgLy9cblx0ICAgICAgICAgICAgICAgIC8vZWxzZSwgYWxsIGlzIGdvb2QhIGZsaXAgdGhlIGJvb2xlYW4gaW5kaWNhdGluZyB3ZSBmb3VuZCB0aGUgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVTb3VyY2UgPT09ICd1bmRlZmluZWQnIHx8IHRlbXBsYXRlU291cmNlID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTb3VyY2UgPSAnJztcblx0ICAgICAgICAgICAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGb3VuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLmRlYnVnKCdUd2lnLmZ1bmN0aW9ucy5zb3VyY2U6ICcsICdQcm9ibGVtIGxvYWRpbmcgdGVtcGxhdGUgICcsIGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy9pZiB0aGUgdGVtcGxhdGUgd2FzIE5PVCBmb3VuZCBBTkQgd2UgYXJlIG5vdCBpZ25vcmluZyBtaXNzaW5nIHRlbXBsYXRlcywgcmV0dXJuIHRoZSBzYW1lIG1lc3NhZ2Vcblx0ICAgICAgICAgICAgLy8gdGhhdCBpcyByZXR1cm5lZCBieSB0aGUgUEhQIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0d2lnIHNvdXJjZSgpIGZ1bmN0aW9uXG5cdCAgICAgICAgICAgIC8vXG5cdCAgICAgICAgICAgIC8vZWxzZSwgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzb3VyY2Vcblx0ICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZvdW5kICYmICFpZ25vcmVfbWlzc2luZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFRFTVBMQVRFX05PVF9GT1VORF9NRVNTQUdFLnJlcGxhY2UoJ3tuYW1lfScsIG5hbWUpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlU291cmNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgVHdpZy5fZnVuY3Rpb24gPSBmdW5jdGlvbihfZnVuY3Rpb24sIHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICBpZiAoIVR3aWcuZnVuY3Rpb25zW19mdW5jdGlvbl0pIHtcblx0ICAgICAgICAgICAgdGhyb3cgXCJVbmFibGUgdG8gZmluZCBmdW5jdGlvbiBcIiArIF9mdW5jdGlvbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFR3aWcuZnVuY3Rpb25zW19mdW5jdGlvbl0odmFsdWUsIHBhcmFtcyk7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLl9mdW5jdGlvbi5leHRlbmQgPSBmdW5jdGlvbihfZnVuY3Rpb24sIGRlZmluaXRpb24pIHtcblx0ICAgICAgICBUd2lnLmZ1bmN0aW9uc1tfZnVuY3Rpb25dID0gZGVmaW5pdGlvbjtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vICMjIHR3aWcubGliLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBjb250YWlucyAzcmQgcGFydHkgbGlicmFyaWVzIHVzZWQgd2l0aGluIHR3aWcuXG5cdC8vXG5cdC8vIENvcGllcyBvZiB0aGUgbGljZW5zZXMgZm9yIHRoZSBjb2RlIGluY2x1ZGVkIGhlcmUgY2FuIGJlIGZvdW5kIGluIHRoZVxuXHQvLyBMSUNFTlNFUy5tZCBmaWxlLlxuXHQvL1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVHdpZykge1xuXG5cdCAgICAvLyBOYW1lc3BhY2UgZm9yIGxpYnJhcmllc1xuXHQgICAgVHdpZy5saWIgPSB7IH07XG5cblx0ICAgIFR3aWcubGliLnNwcmludGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHQgICAgVHdpZy5saWIudnNwcmludGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHQgICAgVHdpZy5saWIucm91bmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblx0ICAgIFR3aWcubGliLm1heCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHQgICAgVHdpZy5saWIubWluID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdCAgICBUd2lnLmxpYi5zdHJpcF90YWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdCAgICBUd2lnLmxpYi5zdHJ0b3RpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0ICAgIFR3aWcubGliLmRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcblx0ICAgIFR3aWcubGliLmJvb2x2YWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblxuXHQgICAgVHdpZy5saWIuaXMgPSBmdW5jdGlvbih0eXBlLCBvYmopIHtcblx0ICAgICAgICB2Y
46184XIgY2xhcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcblx0ICAgICAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIGNsYXMgPT09IHR5cGU7XG5cdCAgICB9O1xuXG5cdCAgICAvLyBzaGFsbG93LWNvcHkgYW4gb2JqZWN0XG5cdCAgICBUd2lnLmxpYi5jb3B5ID0gZnVuY3Rpb24oc3JjKSB7XG5cdCAgICAgICAgdmFyIHRhcmdldCA9IHt9LFxuXHQgICAgICAgICAgICBrZXk7XG5cdCAgICAgICAgZm9yIChrZXkgaW4gc3JjKVxuXHQgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuXG5cdCAgICAgICAgcmV0dXJuIHRhcmdldDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcubGliLmV4dGVuZCA9IGZ1bmN0aW9uIChzcmMsIGFkZCkge1xuXHQgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKSxcblx0ICAgICAgICAgICAgaTtcblxuXHQgICAgICAgIGkgPSBrZXlzLmxlbmd0aDtcblxuXHQgICAgICAgIHdoaWxlIChpLS0pIHtcblx0ICAgICAgICAgICAgc3JjW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBzcmM7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLmxpYi5yZXBsYWNlQWxsID0gZnVuY3Rpb24oc3RyaW5nLCBzZWFyY2gsIHJlcGxhY2UpIHtcblx0ICAgICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlYXJjaCkuam9pbihyZXBsYWNlKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIGNodW5rIGFuIGFycmF5IChhcnIpIGludG8gYXJyYXlzIG9mIChzaXplKSBpdGVtcywgcmV0dXJucyBhbiBhcnJheSBvZiBhcnJheXMsIG9yIGFuIGVtcHR5IGFycmF5IG9uIGludmFsaWQgaW5wdXRcblx0ICAgIFR3aWcubGliLmNodW5rQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCBzaXplKSB7XG5cdCAgICAgICAgdmFyIHJldHVyblZhbCA9IFtdLFxuXHQgICAgICAgICAgICB4ID0gMCxcblx0ICAgICAgICAgICAgbGVuID0gYXJyLmxlbmd0aDtcblxuXHQgICAgICAgIGlmIChzaXplIDwgMSB8fCAhVHdpZy5saWIuaXMoXCJBcnJheVwiLCBhcnIpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB3aGlsZSAoeCA8IGxlbikge1xuXHQgICAgICAgICAgICByZXR1cm5WYWwucHVzaChhcnIuc2xpY2UoeCwgeCArPSBzaXplKSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJpbnRmKCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc3ByaW50Zi9cblx0ICAvLyBvcmlnaW5hbCBieTogQXNoIFNlYXJsZSAoaHR0cDovL2hleG1lbi5jb20vYmxvZy8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IE1pY2hhZWwgV2hpdGUgKGh0dHA6Ly9nZXRzcHJpbmsuY29tKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBKYWNrXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IERqXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEFsbGlkeWxsc1xuXHQgIC8vICAgIGlucHV0IGJ5OiBQYXVsbyBGcmVpdGFzXG5cdCAgLy8gICAgaW5wdXQgYnk6IEJyZXR0IFphbWlyIChodHRwOi8vYnJldHQtemFtaXIubWUpXG5cdCAgLy8gICBleGFtcGxlIDE6IHNwcmludGYoXCIlMDEuMmZcIiwgMTIzLjEpXG5cdCAgLy8gICByZXR1cm5zIDE6ICcxMjMuMTAnXG5cdCAgLy8gICBleGFtcGxlIDI6IHNwcmludGYoXCJbJTEwc11cIiwgJ21vbmtleScpXG5cdCAgLy8gICByZXR1cm5zIDI6ICdbICAgIG1vbmtleV0nXG5cdCAgLy8gICBleGFtcGxlIDM6IHNwcmludGYoXCJbJScjMTBzXVwiLCAnbW9ua2V5Jylcblx0ICAvLyAgIHJldHVybnMgMzogJ1sjIyMjbW9ua2V5XSdcblx0ICAvLyAgIGV4YW1wbGUgNDogc3ByaW50ZihcIiVkXCIsIDEyMzQ1Njc4OTAxMjM0NSlcblx0ICAvLyAgIHJldHVybnMgNDogJzEyMzQ1Njc4OTAxMjM0NSdcblx0ICAvLyAgIGV4YW1wbGUgNTogc3ByaW50ZignJS0wM3MnLCAnRScpXG5cdCAgLy8gICByZXR1cm5zIDU6ICdFMDAnXG5cblx0ICB2YXIgcmVnZXggPSAvJSV8JShcXGQrXFwkKT8oWy0rJyMwIF0qKShcXCpcXGQrXFwkfFxcKnxcXGQrKT8oPzpcXC4oXFwqXFxkK1xcJHxcXCp8XFxkKykpPyhbc2Nib3hYdWlkZUVmRmdHXSkvZztcblx0ICB2YXIgYSA9IGFyZ3VtZW50cztcblx0ICB2YXIgaSA9IDA7XG5cdCAgdmFyIGZvcm1hdCA9IGFbaSsrXTtcblxuXHQgIHZhciBfcGFkID0gZnVuY3Rpb24gX3BhZChzdHIsIGxlbiwgY2hyLCBsZWZ0SnVzdGlmeSkge1xuXHQgICAgaWYgKCFjaHIpIHtcblx0ICAgICAgY2hyID0gJyAnO1xuXHQgICAgfVxuXHQgICAgdmFyIHBhZGRpbmcgPSBzdHIubGVuZ3RoID49IGxlbiA/ICcnIDogbmV3IEFycmF5KDEgKyBsZW4gLSBzdHIubGVuZ3RoID4+PiAwKS5qb2luKGNocik7XG5cdCAgICByZXR1cm4gbGVmdEp1c3RpZnkgPyBzdHIgKyBwYWRkaW5nIDogcGFkZGluZyArIHN0cjtcblx0ICB9O1xuXG5cdCAgdmFyIGp1c3RpZnkgPSBmdW5jdGlvbiBqdXN0aWZ5KHZhbHVlLCBwcmVmaXgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgemVyb1BhZCwgY3VzdG9tUGFkQ2hhcikge1xuXHQgICAgdmFyIGRpZmYgPSBtaW5XaWR0aCAtIHZhbHVlLmxlbmd0aDtcblx0ICAgIGlmIChkaWZmID4gMCkge1xuXHQgICAgICBpZiAobGVmdEp1c3RpZnkgfHwgIXplcm9QYWQpIHtcblx0ICAgICAgICB2YWx1ZSA9IF9wYWQodmFsdWUsIG1pbldpZHRoLCBjdXN0b21QYWRDaGFyLCBsZWZ0SnVzdGlmeSk7XG5cdCAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgdmFsdWUgPSBbdmFsdWUuc2xpY2UoMCwgcHJlZml4Lmxlbmd0aCksIF9wYWQoJycsIGRpZmYsICcwJywgdHJ1ZSksIHZhbHVlLnNsaWNlKHByZWZpeC5sZW5ndGgpXS5qb2luKCcnKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH07XG5cblx0ICB2YXIgX2Zvcm1hdEJhc2VYID0gZnVuY3Rpb24gX2Zvcm1hdEJhc2VYKHZhbHVlLCBiYXNlLCBwcmVmaXgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkKSB7XG5cdCAgICAvLyBOb3RlOiBjYXN0cyBuZWdhdGl2ZSBudW1iZXJzIHRvIHBvc2l0aXZlIG9uZXNcblx0ICAgIHZhciBudW1iZXIgPSB2YWx1ZSA+Pj4gMDtcblx0ICAgIHByZWZpeCA9IHByZWZpeCAmJiBudW1iZXIgJiYge1xuXHQgICAgICAnMic6ICcwYicsXG5cdCAgICAgICc4JzogJzAnLFxuXHQgICAgICAnMTYnOiAnMHgnXG5cdCAgICB9W2Jhc2VdIHx8ICcnO1xuXHQgICAgdmFsdWUgPSBwcmVmaXggKyBfcGFkKG51bWJlci50b1N0cmluZyhiYXNlKSwgcHJlY2lzaW9uIHx8IDAsICcwJywgZmFsc2UpO1xuXHQgICAgcmV0dXJuIGp1c3RpZnkodmFsdWUsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCB6ZXJvUGFkKTtcblx0ICB9O1xuXG5cdCAgLy8gX2Zvcm1hdFN0cmluZygpXG5cdCAgdmFyIF9mb3JtYXRTdHJpbmcgPSBmdW5jdGlvbiBfZm9ybWF0U3RyaW5nKHZhbHVlLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCwgY3VzdG9tUGFkQ2hhcikge1xuXHQgICAgaWYgKHByZWNpc2lvbiAhPT0gbnVsbCAmJiBwcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHByZWNpc2lvbik7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgJycsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgemVyb1BhZCwgY3VzdG9tUGFkQ2hhcik7XG5cdCAgfTtcblxuXHQgIC8vIGRvRm9ybWF0KClcblx0ICB2YXIgZG9Gb3JtYXQgPSBmdW5jdGlvbiBkb0Zvcm1hdChzdWJzdHJpbmcsIHZhbHVlSW5kZXgsIGZsYWdzLCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB0eXBlKSB7XG5cdCAgICB2YXIgbnVtYmVyLCBwcmVmaXgsIG1ldGhvZCwgdGV4dFRyYW5zZm9ybSwgdmFsdWU7XG5cblx0ICAgIGlmIChzdWJzdHJpbmcgPT09ICclJScpIHtcblx0ICAgICAgcmV0dXJuICclJztcblx0ICAgIH1cblxuXHQgICAgLy8gcGFyc2UgZmxhZ3Ncblx0ICAgIHZhciBsZWZ0SnVzdGlmeSA9IGZhbHNlO1xuXHQgICAgdmFyIHBvc2l0aXZlUHJlZml4ID0gJyc7XG5cdCAgICB2YXIgemVyb1BhZCA9IGZhbHNlO1xuXHQgICAgdmFyIHByZWZpeEJhc2VYID0gZmFsc2U7XG5cdCAgICB2YXIgY3VzdG9tUGFkQ2hhciA9ICcgJztcblx0ICAgIHZhciBmbGFnc2wgPSBmbGFncy5sZW5ndGg7XG5cdCAgICB2YXIgajtcblx0ICAgIGZvciAoaiA9IDA7IGogPCBmbGFnc2w7IGorKykge1xuXHQgICAgICBzd2l0Y2ggKGZsYWdzLmNoYXJBdChqKSkge1xuXHQgICAgICAgIGNhc2UgJyAnOlxuXHQgICAgICAgICAgcG9zaXRpdmVQcmVmaXggPSAnICc7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlICcrJzpcblx0ICAgICAgICAgIHBvc2l0aXZlUHJlZml4ID0gJysnO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICBsZWZ0SnVzdGlmeSA9IHRydWU7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiJ1wiOlxuXHQgICAgICAgICAgY3VzdG9tUGFkQ2hhciA9IGZsYWdzLmNoYXJBdChqICsgMSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlICcwJzpcblx0ICAgICAgICAgIHplcm9QYWQgPSB0cnVlO1xuXHQgICAgICAgICAgY3VzdG9tUGFkQ2hhciA9ICcwJztcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgJyMnOlxuXHQgICAgICAgICAgcHJlZml4QmFzZVggPSB0cnVlO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgLy8gcGFyYW1ldGVycyBtYXkgYmUgbnVsbCwgdW5kZWZpbmVkLCBlbXB0eS1zdHJpbmcgb3IgcmVhbCB2YWx1ZWRcblx0ICAgIC8vIHdlIHdhbnQgdG8gaWdub3JlIG51bGwsIHVuZGVmaW5lZCBhbmQgZW1wdHktc3RyaW5nIHZhbHVlc1xuXHQgICAgaWYgKCFtaW5XaWR0aCkge1xuXHQgICAgICBtaW5XaWR0aCA9IDA7XG5cdCAgICB9IGVsc2UgaWYgKG1pbldpZHRoID09PSAnKicpIHtcblx0ICAgICAgbWluV2lkdGggPSArYVtpKytdO1xuXHQgICAgfSBlbHNlIGlmIChtaW5XaWR0aC5jaGFyQXQoMCkgPT09ICcqJykge1xuXHQgICAgICBtaW5XaWR0aCA9ICthW21pbldpZHRoLnNsaWNlKDEsIC0xKV07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBtaW5XaWR0aCA9ICttaW5XaWR0aDtcblx0ICAgIH1cblxuXHQgICAgLy8gTm90ZTogdW5kb2N1bWVudGVkIHBlcmwgZmVhdHVyZTpcblx0ICAgIGlmIChtaW5XaWR0aCA8IDApIHtcblx0ICAgICAgbWluV2lkdGggPSAtbWluV2lkdGg7XG5cdCAgICAgIGxlZnRKdXN0aWZ5ID0gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFpc0Zpbml0ZShtaW5XaWR0aCkpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcHJpbnRmOiAobWluaW11bS0pd2lkdGggbXVzdCBiZSBmaW5pdGUnKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFwcmVjaXNpb24pIHtcblx0ICAgICAgcHJlY2lzaW9uID0gJ2ZGZUUnLmluZGV4T2YodHlwZSkgPiAtMSA/IDYgOiB0eXBlID09PSAnZCcgPyAwIDogdW5kZWZpbmVkO1xuXHQgICAgfSBlbHNlIGlmIChwcmVjaXNpb24gPT09ICcqJykge1xuXHQgICAgICBwcmVjaXNpb24gPSArYVtpKytdO1xuXHQgICAgfSBlbHNlIGlmIChwcmVjaXNpb24uY2hhckF0KDApID09PSAnKicpIHtcblx0ICAgICAgcHJlY2lzaW9uID0gK2FbcHJlY2lzaW9uLnNsaWNlKDEsIC0xKV07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwcmVjaXNpb24gPSArcHJlY2lzaW9uO1xuXHQgICAgfVxuXG5cdCAgICAvLyBncmFiIHZhbHVlIHVzaW5nIHZhbHVlSW5kZXggaWYgcmVxdWlyZWQ/XG5cdCAgICB2YWx1ZSA9IHZhbHVlSW5kZXggPyBhW3ZhbHVlSW5kZXguc2xpY2UoMCwgLTEpXSA6IGFbaSsrXTtcblxuXHQgICAgc3dpdGNoICh0eXBlKSB7XG5cdCAgICAgIGNhc2UgJ3MnOlxuXHQgICAgICAgI
46184HJldHVybiBfZm9ybWF0U3RyaW5nKHZhbHVlICsgJycsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkLCBjdXN0b21QYWRDaGFyKTtcblx0ICAgICAgY2FzZSAnYyc6XG5cdCAgICAgICAgcmV0dXJuIF9mb3JtYXRTdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZSgrdmFsdWUpLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCk7XG5cdCAgICAgIGNhc2UgJ2InOlxuXHQgICAgICAgIHJldHVybiBfZm9ybWF0QmFzZVgodmFsdWUsIDIsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCk7XG5cdCAgICAgIGNhc2UgJ28nOlxuXHQgICAgICAgIHJldHVybiBfZm9ybWF0QmFzZVgodmFsdWUsIDgsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCk7XG5cdCAgICAgIGNhc2UgJ3gnOlxuXHQgICAgICAgIHJldHVybiBfZm9ybWF0QmFzZVgodmFsdWUsIDE2LCBwcmVmaXhCYXNlWCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCBwcmVjaXNpb24sIHplcm9QYWQpO1xuXHQgICAgICBjYXNlICdYJzpcblx0ICAgICAgICByZXR1cm4gX2Zvcm1hdEJhc2VYKHZhbHVlLCAxNiwgcHJlZml4QmFzZVgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkKS50b1VwcGVyQ2FzZSgpO1xuXHQgICAgICBjYXNlICd1Jzpcblx0ICAgICAgICByZXR1cm4gX2Zvcm1hdEJhc2VYKHZhbHVlLCAxMCwgcHJlZml4QmFzZVgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkKTtcblx0ICAgICAgY2FzZSAnaSc6XG5cdCAgICAgIGNhc2UgJ2QnOlxuXHQgICAgICAgIG51bWJlciA9ICt2YWx1ZSB8fCAwO1xuXHQgICAgICAgIC8vIFBsYWluIE1hdGgucm91bmQgZG9lc24ndCBqdXN0IHRydW5jYXRlXG5cdCAgICAgICAgbnVtYmVyID0gTWF0aC5yb3VuZChudW1iZXIgLSBudW1iZXIgJSAxKTtcblx0ICAgICAgICBwcmVmaXggPSBudW1iZXIgPCAwID8gJy0nIDogcG9zaXRpdmVQcmVmaXg7XG5cdCAgICAgICAgdmFsdWUgPSBwcmVmaXggKyBfcGFkKFN0cmluZyhNYXRoLmFicyhudW1iZXIpKSwgcHJlY2lzaW9uLCAnMCcsIGZhbHNlKTtcblx0ICAgICAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgcHJlZml4LCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHplcm9QYWQpO1xuXHQgICAgICBjYXNlICdlJzpcblx0ICAgICAgY2FzZSAnRSc6XG5cdCAgICAgIGNhc2UgJ2YnOiAvLyBAdG9kbzogU2hvdWxkIGhhbmRsZSBsb2NhbGVzIChhcyBwZXIgc2V0bG9jYWxlKVxuXHQgICAgICBjYXNlICdGJzpcblx0ICAgICAgY2FzZSAnZyc6XG5cdCAgICAgIGNhc2UgJ0cnOlxuXHQgICAgICAgIG51bWJlciA9ICt2YWx1ZTtcblx0ICAgICAgICBwcmVmaXggPSBudW1iZXIgPCAwID8gJy0nIDogcG9zaXRpdmVQcmVmaXg7XG5cdCAgICAgICAgbWV0aG9kID0gWyd0b0V4cG9uZW50aWFsJywgJ3RvRml4ZWQnLCAndG9QcmVjaXNpb24nXVsnZWZnJy5pbmRleE9mKHR5cGUudG9Mb3dlckNhc2UoKSldO1xuXHQgICAgICAgIHRleHRUcmFuc2Zvcm0gPSBbJ3RvU3RyaW5nJywgJ3RvVXBwZXJDYXNlJ11bJ2VFZkZnRycuaW5kZXhPZih0eXBlKSAlIDJdO1xuXHQgICAgICAgIHZhbHVlID0gcHJlZml4ICsgTWF0aC5hYnMobnVtYmVyKVttZXRob2RdKHByZWNpc2lvbik7XG5cdCAgICAgICAgcmV0dXJuIGp1c3RpZnkodmFsdWUsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCB6ZXJvUGFkKVt0ZXh0VHJhbnNmb3JtXSgpO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHJldHVybiBzdWJzdHJpbmc7XG5cdCAgICB9XG5cdCAgfTtcblxuXHQgIHJldHVybiBmb3JtYXQucmVwbGFjZShyZWdleCwgZG9Gb3JtYXQpO1xuXHR9O1xuXHRcblxuLyoqKi8gfSxcbi8qIDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZzcHJpbnRmKGZvcm1hdCwgYXJncykge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvdnNwcmludGYvXG5cdCAgLy8gb3JpZ2luYWwgYnk6IGVqc2FuZGVyc1xuXHQgIC8vICAgZXhhbXBsZSAxOiB2c3ByaW50ZignJTA0ZC0lMDJkLSUwMmQnLCBbMTk4OCwgOCwgMV0pXG5cdCAgLy8gICByZXR1cm5zIDE6ICcxOTg4LTA4LTAxJ1xuXG5cdCAgdmFyIHNwcmludGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG5cdCAgcmV0dXJuIHNwcmludGYuYXBwbHkodGhpcywgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcm91bmQodmFsdWUsIHByZWNpc2lvbiwgbW9kZSkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvcm91bmQvXG5cdCAgLy8gb3JpZ2luYWwgYnk6IFBoaWxpcCBQZXRlcnNvblxuXHQgIC8vICByZXZpc2VkIGJ5OiBPbm5vIE1hcnNtYW4gKGh0dHBzOi8vdHdpdHRlci5jb20vb25ub21hcnNtYW4pXG5cdCAgLy8gIHJldmlzZWQgYnk6IFQuV2lsZFxuXHQgIC8vICByZXZpc2VkIGJ5OiBSYWZhxYIgS3VrYXdza2kgKGh0dHA6Ly9ibG9nLmt1a2F3c2tpLnBsKVxuXHQgIC8vICAgIGlucHV0IGJ5OiBHcmVlbnNlZWRcblx0ICAvLyAgICBpbnB1dCBieTogbWVvXG5cdCAgLy8gICAgaW5wdXQgYnk6IFdpbGxpYW1cblx0ICAvLyAgICBpbnB1dCBieTogSm9zZXAgU2FueiAoaHR0cDovL3d3dy53czMuZXMvKVxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBCcmV0dCBaYW1pciAoaHR0cDovL2JyZXR0LXphbWlyLm1lKVxuXHQgIC8vICAgICAgbm90ZSAxOiBHcmVhdCB3b3JrLiBJZGVhcyBmb3IgaW1wcm92ZW1lbnQ6XG5cdCAgLy8gICAgICBub3RlIDE6IC0gY29kZSBtb3JlIGNvbXBsaWFudCB3aXRoIGRldmVsb3BlciBndWlkZWxpbmVzXG5cdCAgLy8gICAgICBub3RlIDE6IC0gZm9yIGltcGxlbWVudGluZyBQSFAgY29uc3RhbnQgYXJndW1lbnRzIGxvb2sgYXRcblx0ICAvLyAgICAgIG5vdGUgMTogdGhlI
46184HBhdGhpbmZvKCkgZnVuY3Rpb24sIGl0IG9mZmVycyB0aGUgZ3JlYXRlc3Rcblx0ICAvLyAgICAgIG5vdGUgMTogZmxleGliaWxpdHkgJiBjb21wYXRpYmlsaXR5IHBvc3NpYmxlXG5cdCAgLy8gICBleGFtcGxlIDE6IHJvdW5kKDEyNDE3NTcsIC0zKVxuXHQgIC8vICAgcmV0dXJucyAxOiAxMjQyMDAwXG5cdCAgLy8gICBleGFtcGxlIDI6IHJvdW5kKDMuNilcblx0ICAvLyAgIHJldHVybnMgMjogNFxuXHQgIC8vICAgZXhhbXBsZSAzOiByb3VuZCgyLjgzNSwgMilcblx0ICAvLyAgIHJldHVybnMgMzogMi44NFxuXHQgIC8vICAgZXhhbXBsZSA0OiByb3VuZCgxLjE3NDk5OTk5OTk5OTksIDIpXG5cdCAgLy8gICByZXR1cm5zIDQ6IDEuMTdcblx0ICAvLyAgIGV4YW1wbGUgNTogcm91bmQoNTg1NTEuNzk5OTk5OTk5OTk2LCAyKVxuXHQgIC8vICAgcmV0dXJucyA1OiA1ODU1MS44XG5cblx0ICB2YXIgbSwgZiwgaXNIYWxmLCBzZ247IC8vIGhlbHBlciB2YXJpYWJsZXNcblx0ICAvLyBtYWtpbmcgc3VyZSBwcmVjaXNpb24gaXMgaW50ZWdlclxuXHQgIHByZWNpc2lvbiB8PSAwO1xuXHQgIG0gPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblx0ICB2YWx1ZSAqPSBtO1xuXHQgIC8vIHNpZ24gb2YgdGhlIG51bWJlclxuXHQgIHNnbiA9IHZhbHVlID4gMCB8IC0odmFsdWUgPCAwKTtcblx0ICBpc0hhbGYgPSB2YWx1ZSAlIDEgPT09IDAuNSAqIHNnbjtcblx0ICBmID0gTWF0aC5mbG9vcih2YWx1ZSk7XG5cblx0ICBpZiAoaXNIYWxmKSB7XG5cdCAgICBzd2l0Y2ggKG1vZGUpIHtcblx0ICAgICAgY2FzZSAnUEhQX1JPVU5EX0hBTEZfRE9XTic6XG5cdCAgICAgICAgLy8gcm91bmRzIC41IHRvd2FyZCB6ZXJvXG5cdCAgICAgICAgdmFsdWUgPSBmICsgKHNnbiA8IDApO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlICdQSFBfUk9VTkRfSEFMRl9FVkVOJzpcblx0ICAgICAgICAvLyByb3VkcyAuNSB0b3dhcmRzIHRoZSBuZXh0IGV2ZW4gaW50ZWdlclxuXHQgICAgICAgIHZhbHVlID0gZiArIGYgJSAyICogc2duO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlICdQSFBfUk9VTkRfSEFMRl9PREQnOlxuXHQgICAgICAgIC8vIHJvdW5kcyAuNSB0b3dhcmRzIHRoZSBuZXh0IG9kZCBpbnRlZ2VyXG5cdCAgICAgICAgdmFsdWUgPSBmICsgIShmICUgMik7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgLy8gcm91bmRzIC41IGF3YXkgZnJvbSB6ZXJvXG5cdCAgICAgICAgdmFsdWUgPSBmICsgKHNnbiA+IDApO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiAoaXNIYWxmID8gdmFsdWUgOiBNYXRoLnJvdW5kKHZhbHVlKSkgLyBtO1xuXHR9O1xuXHRcblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWF4KCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvbWF4L1xuXHQgIC8vIG9yaWdpbmFsIGJ5OiBPbm5vIE1hcnNtYW4gKGh0dHBzOi8vdHdpdHRlci5jb20vb25ub21hcnNtYW4pXG5cdCAgLy8gIHJldmlzZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcblx0ICAvLyBpbXByb3ZlZCBieTogSmFja1xuXHQgIC8vICAgICAgbm90ZSAxOiBMb25nIGNvZGUgY2F1c2Ugd2UncmUgYWltaW5nIGZvciBtYXhpbXVtIFBIUCBjb21wYXRpYmlsaXR5XG5cdCAgLy8gICBleGFtcGxlIDE6IG1heCgxLCAzLCA1LCA2LCA3KVxuXHQgIC8vICAgcmV0dXJucyAxOiA3XG5cdCAgLy8gICBleGFtcGxlIDI6IG1heChbMiwgNCwgNV0pXG5cdCAgLy8gICByZXR1cm5zIDI6IDVcblx0ICAvLyAgIGV4YW1wbGUgMzogbWF4KDAsICdoZWxsbycpXG5cdCAgLy8gICByZXR1cm5zIDM6IDBcblx0ICAvLyAgIGV4YW1wbGUgNDogbWF4KCdoZWxsbycsIDApXG5cdCAgLy8gICByZXR1cm5zIDQ6ICdoZWxsbydcblx0ICAvLyAgIGV4YW1wbGUgNTogbWF4KC0xLCAnaGVsbG8nKVxuXHQgIC8vICAgcmV0dXJucyA1OiAnaGVsbG8nXG5cdCAgLy8gICBleGFtcGxlIDY6IG1heChbMiwgNCwgOF0sIFsyLCA1LCA3XSlcblx0ICAvLyAgIHJldHVybnMgNjogWzIsIDUsIDddXG5cblx0ICB2YXIgYXI7XG5cdCAgdmFyIHJldFZhbDtcblx0ICB2YXIgaSA9IDA7XG5cdCAgdmFyIG4gPSAwO1xuXHQgIHZhciBhcmd2ID0gYXJndW1lbnRzO1xuXHQgIHZhciBhcmdjID0gYXJndi5sZW5ndGg7XG5cdCAgdmFyIF9vYmoyQXJyYXkgPSBmdW5jdGlvbiBfb2JqMkFycmF5KG9iaikge1xuXHQgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nKSB7XG5cdCAgICAgIHJldHVybiBvYmo7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB2YXIgYXIgPSBbXTtcblx0ICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHtcblx0ICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG5cdCAgICAgICAgICBhci5wdXNoKG9ialtpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBhcjtcblx0ICAgIH1cblx0ICB9O1xuXHQgIHZhciBfY29tcGFyZSA9IGZ1bmN0aW9uIF9jb21wYXJlKGN1cnJlbnQsIG5leHQpIHtcblx0ICAgIHZhciBpID0gMDtcblx0ICAgIHZhciBuID0gMDtcblx0ICAgIHZhciB0bXAgPSAwO1xuXHQgICAgdmFyIG5sID0gMDtcblx0ICAgIHZhciBjbCA9IDA7XG5cblx0ICAgIGlmIChjdXJyZW50ID09PSBuZXh0KSB7XG5cdCAgICAgI
46184HJldHVybiAwO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIGN1cnJlbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGN1cnJlbnQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgaWYgKCh0eXBlb2YgbmV4dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV4dCkpID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgIGN1cnJlbnQgPSBfb2JqMkFycmF5KGN1cnJlbnQpO1xuXHQgICAgICAgIG5leHQgPSBfb2JqMkFycmF5KG5leHQpO1xuXHQgICAgICAgIGNsID0gY3VycmVudC5sZW5ndGg7XG5cdCAgICAgICAgbmwgPSBuZXh0Lmxlbmd0aDtcblx0ICAgICAgICBpZiAobmwgPiBjbCkge1xuXHQgICAgICAgICAgcmV0dXJuIDE7XG5cdCAgICAgICAgfSBlbHNlIGlmIChubCA8IGNsKSB7XG5cdCAgICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAoaSA9IDAsIG4gPSBjbDsgaSA8IG47ICsraSkge1xuXHQgICAgICAgICAgdG1wID0gX2NvbXBhcmUoY3VycmVudFtpXSwgbmV4dFtpXSk7XG5cdCAgICAgICAgICBpZiAodG1wID09PSAxKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgfSBlbHNlIGlmICh0bXAgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIC0xO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIG5leHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5leHQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgcmV0dXJuIDE7XG5cdCAgICB9IGVsc2UgaWYgKGlzTmFOKG5leHQpICYmICFpc05hTihjdXJyZW50KSkge1xuXHQgICAgICBpZiAoY3VycmVudCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAwO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBjdXJyZW50IDwgMCA/IDEgOiAtMTtcblx0ICAgIH0gZWxzZSBpZiAoaXNOYU4oY3VycmVudCkgJiYgIWlzTmFOKG5leHQpKSB7XG5cdCAgICAgIGlmIChuZXh0ID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG5leHQgPiAwID8gMSA6IC0xO1xuXHQgICAgfVxuXG5cdCAgICBpZiAobmV4dCA9PT0gY3VycmVudCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIG5leHQgPiBjdXJyZW50ID8gMSA6IC0xO1xuXHQgIH07XG5cblx0ICBpZiAoYXJnYyA9PT0gMCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0byBtYXgoKScpO1xuXHQgIH0gZWxzZSBpZiAoYXJnYyA9PT0gMSkge1xuXHQgICAgaWYgKF90eXBlb2YoYXJndlswXSkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgIGFyID0gX29iajJBcnJheShhcmd2WzBdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgcGFyYW1ldGVyIGNvdW50IGZvciBtYXgoKScpO1xuXHQgICAgfVxuXHQgICAgaWYgKGFyLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCBmb3IgbWF4KCknKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgYXIgPSBhcmd2O1xuXHQgIH1cblxuXHQgIHJldFZhbCA9IGFyWzBdO1xuXHQgIGZvciAoaSA9IDEsIG4gPSBhci5sZW5ndGg7IGkgPCBuOyArK2kpIHtcblx0ICAgIGlmIChfY29tcGFyZShyZXRWYWwsIGFyW2ldKSA9PT0gMSkge1xuXHQgICAgICByZXRWYWwgPSBhcltpXTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gcmV0VmFsO1xuXHR9O1xuXHRcblxuLyoqKi8gfSxcbi8qIDEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWluKCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvbWluL1xuXHQgIC8vIG9yaWdpbmFsIGJ5OiBPbm5vIE1hcnNtYW4gKGh0dHBzOi8vdHdpdHRlci5jb20vb25ub21hcnNtYW4pXG5cdCAgLy8gIHJldmlzZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcblx0ICAvLyBpbXByb3ZlZCBieTogSmFja1xuXHQgIC8vICAgICAgbm90ZSAxOiBMb25nIGNvZGUgY2F1c2Ugd2UncmUgYWltaW5nIGZvciBtYXhpbXVtIFBIUCBjb21wYXRpYmlsaXR5XG5cdCAgLy8gICBleGFtcGxlIDE6IG1pbigxLCAzLCA1LCA2LCA3KVxuXHQgIC8vICAgcmV0dXJucyAxOiAxXG5cdCAgLy8gICBleGFtcGxlIDI6IG1pbihbMiwgNCwgNV0pXG5cdCAgLy8gICByZXR1cm5zIDI6IDJcblx0ICAvLyAgIGV4YW1wbGUgMzogbWluKDAsICdoZWxsbycpXG5cdCAgLy8gICByZXR1cm5zIDM6IDBcblx0ICAvLyAgIGV4YW1wbGUgNDogbWluKCdoZWxsbycsIDApXG5cdCAgLy8gICByZXR1cm5zIDQ6ICdoZWxsbydcblx0ICAvLyAgIGV4YW1wbGUgNTogbWluKC0xLCAnaGVsbG8nKVxuXHQgIC8vICAgcmV0dXJucyA1OiAtMVxuXHQgIC8vICAgZXhhbXBsZSA2OiBtaW4oWzIsIDQsIDhdLCBbMiwgNSwgN10pXG5cdCAgLy8gICByZXR1cm5zIDY6IFsyLCA0LCA4XVxuXG5cdCAgdmFyIGFyO1xuXHQgIHZhciByZXRWYWw7XG5cdCAgdmFyIGkgPSAwO1xuXHQgIHZhciBuID0gMDtcblx0ICB2YXIgYXJndiA9IGFyZ3VtZW50cztcblx0ICB2YXIgYXJnYyA9IGFyZ3YubGVuZ3RoO1xuXHQgIHZhciBfb2JqMkFycmF
461845ID0gZnVuY3Rpb24gX29iajJBcnJheShvYmopIHtcblx0ICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuXHQgICAgICByZXR1cm4gb2JqO1xuXHQgICAgfVxuXHQgICAgdmFyIGFyID0gW107XG5cdCAgICBmb3IgKHZhciBpIGluIG9iaikge1xuXHQgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG5cdCAgICAgICAgYXIucHVzaChvYmpbaV0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYXI7XG5cdCAgfTtcblxuXHQgIHZhciBfY29tcGFyZSA9IGZ1bmN0aW9uIF9jb21wYXJlKGN1cnJlbnQsIG5leHQpIHtcblx0ICAgIHZhciBpID0gMDtcblx0ICAgIHZhciBuID0gMDtcblx0ICAgIHZhciB0bXAgPSAwO1xuXHQgICAgdmFyIG5sID0gMDtcblx0ICAgIHZhciBjbCA9IDA7XG5cblx0ICAgIGlmIChjdXJyZW50ID09PSBuZXh0KSB7XG5cdCAgICAgIHJldHVybiAwO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIGN1cnJlbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGN1cnJlbnQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgaWYgKCh0eXBlb2YgbmV4dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV4dCkpID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgIGN1cnJlbnQgPSBfb2JqMkFycmF5KGN1cnJlbnQpO1xuXHQgICAgICAgIG5leHQgPSBfb2JqMkFycmF5KG5leHQpO1xuXHQgICAgICAgIGNsID0gY3VycmVudC5sZW5ndGg7XG5cdCAgICAgICAgbmwgPSBuZXh0Lmxlbmd0aDtcblx0ICAgICAgICBpZiAobmwgPiBjbCkge1xuXHQgICAgICAgICAgcmV0dXJuIDE7XG5cdCAgICAgICAgfSBlbHNlIGlmIChubCA8IGNsKSB7XG5cdCAgICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAoaSA9IDAsIG4gPSBjbDsgaSA8IG47ICsraSkge1xuXHQgICAgICAgICAgdG1wID0gX2NvbXBhcmUoY3VycmVudFtpXSwgbmV4dFtpXSk7XG5cdCAgICAgICAgICBpZiAodG1wID09PSAxKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgfSBlbHNlIGlmICh0bXAgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIC0xO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIG5leHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5leHQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgcmV0dXJuIDE7XG5cdCAgICB9IGVsc2UgaWYgKGlzTmFOKG5leHQpICYmICFpc05hTihjdXJyZW50KSkge1xuXHQgICAgICBpZiAoY3VycmVudCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAwO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBjdXJyZW50IDwgMCA/IDEgOiAtMTtcblx0ICAgIH0gZWxzZSBpZiAoaXNOYU4oY3VycmVudCkgJiYgIWlzTmFOKG5leHQpKSB7XG5cdCAgICAgIGlmIChuZXh0ID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG5leHQgPiAwID8gMSA6IC0xO1xuXHQgICAgfVxuXG5cdCAgICBpZiAobmV4dCA9PT0gY3VycmVudCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIG5leHQgPiBjdXJyZW50ID8gMSA6IC0xO1xuXHQgIH07XG5cblx0ICBpZiAoYXJnYyA9PT0gMCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0byBtaW4oKScpO1xuXHQgIH0gZWxzZSBpZiAoYXJnYyA9PT0gMSkge1xuXHQgICAgaWYgKF90eXBlb2YoYXJndlswXSkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgIGFyID0gX29iajJBcnJheShhcmd2WzBdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgcGFyYW1ldGVyIGNvdW50IGZvciBtaW4oKScpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoYXIubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50IGZvciBtaW4oKScpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICBhciA9IGFyZ3Y7XG5cdCAgfVxuXG5cdCAgcmV0VmFsID0gYXJbMF07XG5cblx0ICBmb3IgKGkgPSAxLCBuID0gYXIubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG5cdCAgICBpZiAoX2NvbXBhcmUocmV0VmFsLCBhcltpXSkgPT09IC0xKSB7XG5cdCAgICAgIHJldFZhbCA9IGFyW2ldO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiByZXRWYWw7XG5cdH07XG5cdFxuXG4vKioqLyB9LFxuLyogMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN0cmlwX3RhZ3MoaW5wdXQsIGFsbG93ZWQpIHtcblx0ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZVxuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc3RyaXBfdGFncy9cblx0ICAvLyBvcmlnaW5hbCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2t2ei5pbylcblx0ICAvLyBpbXByb3ZlZCBieTogTHVrZSBHb2RmcmV5XG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gICAgaW5wdXQgYnk6IFB1bFxuXHQgIC8vICAgIGlucHV0IGJ5OiBBbGV4XG5cdCAgLy8gICAgaW5wdXQgYnk6IE1hcmMgUGFsYXVcblx0ICAvLyAgICBpbnB1dCBieTogQnJldHQgWmFtaXIgKGh0dHA6Ly9icmV0dC16YW1pci5tZSlcblx0ICAvLyAgICBpbnB1dCBieTogQm9iYnkgRHJha2Vcblx0ICAvLyAgICBpbnB1dCBieTogRXZlcnRqYW4gR2FycmV0c2VuXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gYnVnZml4ZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcblx0ICAvLyBidWdmaXhlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2t2ei5pbylcblx0ICAvLyBidWdmaXhlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2t2ei5pbylcblx0ICAvLyBidWdmaXhlZCBieTogRXJpY
46184yBOYWdlbFxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va3Z6LmlvKVxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBUb21hc3ogV2Vzb2xvd3NraVxuXHQgIC8vICByZXZpc2VkIGJ5OiBSYWZhxYIgS3VrYXdza2kgKGh0dHA6Ly9ibG9nLmt1a2F3c2tpLnBsKVxuXHQgIC8vICAgZXhhbXBsZSAxOiBzdHJpcF90YWdzKCc8cD5LZXZpbjwvcD4gPGJyIC8+PGI+dmFuPC9iPiA8aT5ab25uZXZlbGQ8L2k+JywgJzxpPjxiPicpXG5cdCAgLy8gICByZXR1cm5zIDE6ICdLZXZpbiA8Yj52YW48L2I+IDxpPlpvbm5ldmVsZDwvaT4nXG5cdCAgLy8gICBleGFtcGxlIDI6IHN0cmlwX3RhZ3MoJzxwPktldmluIDxpbWcgc3JjPVwic29tZWltYWdlLnBuZ1wiIG9ubW91c2VvdmVyPVwic29tZUZ1bmN0aW9uKClcIj52YW4gPGk+Wm9ubmV2ZWxkPC9pPjwvcD4nLCAnPHA+Jylcblx0ICAvLyAgIHJldHVybnMgMjogJzxwPktldmluIHZhbiBab25uZXZlbGQ8L3A+J1xuXHQgIC8vICAgZXhhbXBsZSAzOiBzdHJpcF90YWdzKFwiPGEgaHJlZj0naHR0cDovL2t2ei5pbyc+S2V2aW4gdmFuIFpvbm5ldmVsZDwvYT5cIiwgXCI8YT5cIilcblx0ICAvLyAgIHJldHVybnMgMzogXCI8YSBocmVmPSdodHRwOi8va3Z6LmlvJz5LZXZpbiB2YW4gWm9ubmV2ZWxkPC9hPlwiXG5cdCAgLy8gICBleGFtcGxlIDQ6IHN0cmlwX3RhZ3MoJzEgPCA1IDUgPiAxJylcblx0ICAvLyAgIHJldHVybnMgNDogJzEgPCA1IDUgPiAxJ1xuXHQgIC8vICAgZXhhbXBsZSA1OiBzdHJpcF90YWdzKCcxIDxici8+IDEnKVxuXHQgIC8vICAgcmV0dXJucyA1OiAnMSAgMSdcblx0ICAvLyAgIGV4YW1wbGUgNjogc3RyaXBfdGFncygnMSA8YnIvPiAxJywgJzxicj4nKVxuXHQgIC8vICAgcmV0dXJucyA2OiAnMSA8YnIvPiAxJ1xuXHQgIC8vICAgZXhhbXBsZSA3OiBzdHJpcF90YWdzKCcxIDxici8+IDEnLCAnPGJyPjxici8+Jylcblx0ICAvLyAgIHJldHVybnMgNzogJzEgPGJyLz4gMSdcblxuXHQgIC8vIG1ha2luZyBzdXJlIHRoZSBhbGxvd2VkIGFyZyBpcyBhIHN0cmluZyBjb250YWluaW5nIG9ubHkgdGFncyBpbiBsb3dlcmNhc2UgKDxhPjxiPjxjPilcblx0ICBhbGxvd2VkID0gKCgoYWxsb3dlZCB8fCAnJykgKyAnJykudG9Mb3dlckNhc2UoKS5tYXRjaCgvPFthLXpdW2EtejAtOV0qPi9nKSB8fCBbXSkuam9pbignJyk7XG5cblx0ICB2YXIgdGFncyA9IC88XFwvPyhbYS16XVthLXowLTldKilcXGJbXj5dKj4vZ2k7XG5cdCAgdmFyIGNvbW1lbnRzQW5kUGhwVGFncyA9IC88IS0tW1xcc1xcU10qPy0tPnw8XFw/KD86cGhwKT9bXFxzXFxTXSo/XFw/Pi9naTtcblxuXHQgIHJldHVybiBpbnB1dC5yZXBsYWNlKGNvbW1lbnRzQW5kUGhwVGFncywgJycpLnJlcGxhY2UodGFncywgZnVuY3Rpb24gKCQwLCAkMSkge1xuXHQgICAgcmV0dXJuIGFsbG93ZWQuaW5kZXhPZignPCcgKyAkMS50b0xvd2VyQ2FzZSgpICsgJz4nKSA+IC0xID8gJDAgOiAnJztcblx0ICB9KTtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RydG90aW1lKHRleHQsIG5vdykge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc3RydG90aW1lL1xuXHQgIC8vIG9yaWdpbmFsIGJ5OiBDYWlvIEFyaWVkZSAoaHR0cDovL2NhaW9hcmllZGUuY29tKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va3Z6LmlvKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBDYWlvIEFyaWVkZSAoaHR0cDovL2NhaW9hcmllZGUuY29tKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBBLiBNYXTDrWFzIFF1ZXphZGEgKGh0dHA6Ly9hbWF0aWFzcS5jb20pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IHByZXV0ZXJcblx0ICAvLyBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHA6Ly9icmV0dC16YW1pci5tZSlcblx0ICAvLyBpbXByb3ZlZCBieTogTWlya28gRmFiZXJcblx0ICAvLyAgICBpbnB1dCBieTogRGF2aWRcblx0ICAvLyBidWdmaXhlZCBieTogV2FnbmVyIEIuIFNvYXJlc1xuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBBcnR1ciBUY2hlcm55Y2hldlxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBTdGVwaGFuIELDtnNjaC1QbGVwZWxpdHMgKGh0dHA6Ly9naXRodWIuY29tL3BsZXBlKVxuXHQgIC8vICAgICAgbm90ZSAxOiBFeGFtcGxlcyBhbGwgaGF2ZSBhIGZpeGVkIHRpbWVzdGFtcCB0byBwcmV2ZW50XG5cdCAgLy8gICAgICBub3RlIDE6IHRlc3RzIHRvIGZhaWwgYmVjYXVzZSBvZiB2YXJpYWJsZSB0aW1lKHpvbmVzKVxuXHQgIC8vICAgZXhhbXBsZSAxOiBzdHJ0b3RpbWUoJysxIGRheScsIDExMjk2MzMyMDApXG5cdCAgLy8gICByZXR1cm5zIDE6IDExMjk3MTk2MDBcblx0ICAvLyAgIGV4YW1wbGUgMjogc3RydG90aW1lKCcrMSB3ZWVrIDIgZGF5cyA0IGhvdXJzIDIgc2Vjb25kcycsIDExMjk2MzMyMDApXG5cdCAgLy8gICByZXR1cm5zIDI6IDExMzA0MjUyMDJcblx0ICAvLyAgIGV4YW1wbGUgMzogc3RydG90aW1lKCdsYXN0IG1vbnRoJywgMTEyOTYzMzIwMClcblx0ICAvLyAgIHJldHVybnMgMzogMTEyNzA0MTIwMFxuXHQgIC8vICAgZXhhbXBsZSA0OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDAgR01UJylcblx0ICAvLyAgIHJldHVybnMgNDogMTI0MTQyNTgwMFxuXHQgIC8vICAgZXhhbXBsZSA1OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDArMDAnKVxuXHQgIC8vICAgcmV0dXJucyA1OiAxMjQxNDI1ODAwXG5cdCAgLy8gICBleGFtcGxlIDY6IHN0cnRvdGltZSgnMjAwOS0wNS0wNCAwODozMDowMCswMjowMCcpXG5cdCAgLy8gICByZXR1cm5zIDY6IDEyNDE0MTg2MDBcblx0ICAvLyAgIGV4YW1wbGUgNzogc3RydG90aW1lKCcyMDA5LTA1LTA0VDA4OjMwOjAwWicpXG5cdCAgLy8gICByZXR1cm5zIDc6IDEyNDE0MjU4MDBcblxuXHQgIHZhciBwYXJzZWQ7XG5cdCAgdmFyIG1hdGNoO1xuXHQgIHZhciB0b2RheTtcblx0ICB2YXIgeWVhcjtcblx0ICB2YXIgZGF0ZTtcblx0ICB2YXIgZGF5cztcblx0ICB2YXIgcmFuZ2VzO1xuXHQgIHZhciBsZW47XG5cdCAgdmFyIHRpbWVzO1xuXHQgIHZhciByZWdleDtcblx0ICB2YXIgaTtcblx0ICB2YXIgZmFpbCA9IGZhbHNlO1xuXG5cdCAgaWYgKCF0ZXh0KSB7XG5cdCAgICByZXR1cm4gZmFpbDtcblx0ICB9XG5cblx0ICAvLyBVbmVjZXNzYXJ5IHNwYWNlc1xuXHQgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKS5yZXBsYWNlKC9cXHN7Mix9L2csICcgJykucmVwbGFjZSgvW1xcdFxcclxcbl0vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cblx0ICAvLyBpbiBjb250cmFzdCB0byBwaHAsIGpzIERhdGUucGFyc2UgZnVuY3Rpb24gaW50ZXJwcmV0czpcblx0ICAvLyBkYXRlcyBnaXZlbiBhcyB5eXl5LW1tLWRkIGFzIGluIHRpbWV6b25lOiBVVEMsXG5cdCAgLy8gZGF0ZXMgd2l0aCBcIi5cIiBvciBcIi1cIiBhcyBNRFkgaW5zdGVhZCBvZiBETVlcblx0ICAvLyBkYXRlcyB3aXRoIHR3by1kaWdpdCB5ZWFycyBkaWZmZXJlbnRseVxuXHQgIC8vIGV0Yy4uLmV0Yy4uLlxuXHQgIC8vIC4uLnRoZXJlZm9yZSB3ZSBtYW51YWxseSBwYXJzZSBsb3RzIG9mIGNvbW1vbiBkYXRlIGZvcm1hdHNcblx0ICB2YXIgcGF0dGVybiA9IG5ldyBSZWdFeHAoWydeKFxcXFxkezEsNH0pJywgJyhbXFxcXC1cXFxcLlxcXFwvOl0pJywgJyhcXFxcZHsxLDJ9KScsICcoW1xcXFwtXFxcXC5cXFxcLzpdKScsICcoXFxcXGR7MSw0fSknLCAnKD86XFxcXHMoXFxcXGR7MSwyfSk6KFxcXFxkezJ9KT86PyhcXFxcZHsyfSk/KT8nLCAnKD86XFxcXHMoW0EtWl0rKT8pPyQnXS5qb2luKCcnKSk7XG5cdCAgbWF0Y2ggPSB0ZXh0Lm1hdGNoKHBhdHRlcm4pO1xuXG5cdCAgaWYgKG1hdGNoICYmIG1hdGNoWzJdID09PSBtYXRjaFs0XSkge1xuXHQgICAgaWYgKG1hdGNoWzFdID4gMTkwMSkge1xuXHQgICAgICBzd2l0Y2ggKG1hdGNoWzJdKSB7XG5cdCAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICAvLyBZWVlZLU0tRFxuXHQgICAgICAgICAgaWYgKG1hdGNoWzNdID4gMTIgfHwgbWF0Y2hbNV0gPiAzMSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgI
46184H1cblxuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hdGNoWzFdLCBwYXJzZUludChtYXRjaFszXSwgMTApIC0gMSwgbWF0Y2hbNV0sIG1hdGNoWzZdIHx8IDAsIG1hdGNoWzddIHx8IDAsIG1hdGNoWzhdIHx8IDAsIG1hdGNoWzldIHx8IDApIC8gMTAwMDtcblx0ICAgICAgICBjYXNlICcuJzpcblx0ICAgICAgICAgIC8vIFlZWVkuTS5EIGlzIG5vdCBwYXJzZWQgYnkgc3RydG90aW1lKClcblx0ICAgICAgICAgIHJldHVybiBmYWlsO1xuXHQgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgLy8gWVlZWS9NL0Rcblx0ICAgICAgICAgIGlmIChtYXRjaFszXSA+IDEyIHx8IG1hdGNoWzVdID4gMzEpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFsxXSwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSAtIDEsIG1hdGNoWzVdLCBtYXRjaFs2XSB8fCAwLCBtYXRjaFs3XSB8fCAwLCBtYXRjaFs4XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAobWF0Y2hbNV0gPiAxOTAxKSB7XG5cdCAgICAgIHN3aXRjaCAobWF0Y2hbMl0pIHtcblx0ICAgICAgICBjYXNlICctJzpcblx0ICAgICAgICAgIC8vIEQtTS1ZWVlZXG5cdCAgICAgICAgICBpZiAobWF0Y2hbM10gPiAxMiB8fCBtYXRjaFsxXSA+IDMxKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWlsO1xuXHQgICAgICAgICAgfVxuXG5cdCAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbNV0sIHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgLSAxLCBtYXRjaFsxXSwgbWF0Y2hbNl0gfHwgMCwgbWF0Y2hbN10gfHwgMCwgbWF0Y2hbOF0gfHwgMCwgbWF0Y2hbOV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICAgIGNhc2UgJy4nOlxuXHQgICAgICAgICAgLy8gRC5NLllZWVlcblx0ICAgICAgICAgIGlmIChtYXRjaFszXSA+IDEyIHx8IG1hdGNoWzFdID4gMzEpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFs1XSwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSAtIDEsIG1hdGNoWzFdLCBtYXRjaFs2XSB8fCAwLCBtYXRjaFs3XSB8fCAwLCBtYXRjaFs4XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgICAgY2FzZSAnLyc6XG5cdCAgICAgICAgICAvLyBNL0QvWVlZWVxuXHQgICAgICAgICAgaWYgKG1hdGNoWzFdID4gMTIgfHwgbWF0Y2hbM10gPiAzMSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hdGNoWzVdLCBwYXJzZUludChtYXRjaFsxXSwgMTApIC0gMSwgbWF0Y2hbM10sIG1hdGNoWzZdIHx8IDAsIG1hdGNoWzddIHx8IDAsIG1hdGNoWzhdIHx8IDAsIG1hdGNoWzldIHx8IDApIC8gMTAwMDtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3dpdGNoIChtYXRjaFsyXSkge1xuXHQgICAgICAgIGNhc2UgJy0nOlxuXHQgICAgICAgICAgLy8gWVktTS1EXG5cdCAgICAgICAgICBpZiAobWF0Y2hbM10gPiAxMiB8fCBtYXRjaFs1XSA+IDMxIHx8IG1hdGNoWzFdIDwgNzAgJiYgbWF0Y2hbMV0gPiAzOCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgeWVhciA9IG1hdGNoWzFdID49IDAgJiYgbWF0Y2hbMV0gPD0gMzggPyArbWF0Y2hbMV0gKyAyMDAwIDogbWF0Y2hbMV07XG5cdCAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSAtIDEsIG1hdGNoWzVdLCBtYXRjaFs2XSB8fCAwLCBtYXRjaFs3XSB8fCAwLCBtYXRjaFs4XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgICAgY2FzZSAnLic6XG5cdCAgICAgICAgICAvLyBELk0uWVkgb3IgSC5NTS5TU1xuXHQgICAgICAgICAgaWYgKG1hdGNoWzVdID49IDcwKSB7XG5cdCAgICAgICAgICAgIC8vIEQuTS5ZWVxuXHQgICAgICAgICAgICBpZiAobWF0Y2hbM10gPiAxMiB8fCBtYXRjaFsxXSA+IDMxKSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbNV0sIHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgLSAxLCBtYXRjaFsxXSwgbWF0Y2hbNl0gfHwgMCwgbWF0Y2hbN10gfHwgMCwgbWF0Y2hbOF0gfHwgMCwgbWF0Y2hbOV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKG1hdGNoWzVdIDwgNjAgJiYgIW1hdGNoWzZdKSB7XG5cdCAgICAgICAgICAgIC8vIEguTU0uU1Ncblx0ICAgICAgICAgICAgaWYgKG1hdGNoWzFdID4gMjMgfHwgbWF0Y2hbM10gPiA1OSkge1xuXHQgICAgICAgICAgICAgIHJldHVybiBmYWlsO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpLCBtYXRjaFsxXSB8fCAwLCBtYXRjaFszXSB8fCAwLCBtYXRjaFs1XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIC8vIGludmFsaWQgZm9ybWF0LCBjYW5ub3QgYmUgcGFyc2VkXG5cdCAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICBjYXNlICcvJzpcblx0ICAgICAgICAgIC8vIE0vRC9ZWVxuXHQgICAgICAgICAgaWYgKG1hdGNoWzFdID4gMTIgfHwgbWF0Y2hbM10gPiAzMSB8fCBtYXRjaFs1XSA8IDcwICYmIG1hdGNoWzVdID4gMzgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHllYXIgPSBtYXRjaFs1XSA+PSAwICYmIG1hdGNoWzVdIDw9IDM4ID8gK21hdGNoWzVdICsgMjAwMCA6IG1hdGNoWzVdO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIHBhcnNlSW50KG1hdGNoWzFdLCAxMCkgLSAxLCBtYXRjaFszXSwgbWF0Y2hbNl0gfHwgMCwgbWF0Y2hbN10gfHwgMCwgbWF0Y2hbOF0gfHwgMCwgbWF0Y2hbOV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICAgIGNhc2UgJzonOlxuXHQgICAgICAgICAgLy8gSEg6TU06U1Ncblx0ICAgICAgICAgIGlmIChtYXRjaFsxXSA+IDIzIHx8IG1hdGNoWzNdID4gNTkgfHwgbWF0Y2hbNV0gPiA1OSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgI
46184H1cblxuXHQgICAgICAgICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSwgbWF0Y2hbMV0gfHwgMCwgbWF0Y2hbM10gfHwgMCwgbWF0Y2hbNV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gb3RoZXIgZm9ybWF0cyBhbmQgXCJub3dcIiBzaG91bGQgYmUgcGFyc2VkIGJ5IERhdGUucGFyc2UoKVxuXHQgIGlmICh0ZXh0ID09PSAnbm93Jykge1xuXHQgICAgcmV0dXJuIG5vdyA9PT0gbnVsbCB8fCBpc05hTihub3cpID8gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwIHwgMCA6IG5vdyB8IDA7XG5cdCAgfVxuXHQgIGlmICghaXNOYU4ocGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KSkpIHtcblx0ICAgIHJldHVybiBwYXJzZWQgLyAxMDAwIHwgMDtcblx0ICB9XG5cdCAgLy8gQnJvd3NlcnMgIT09IENocm9tZSBoYXZlIHByb2JsZW1zIHBhcnNpbmcgSVNPIDg2MDEgZGF0ZSBzdHJpbmdzLCBhcyB0aGV5IGRvXG5cdCAgLy8gbm90IGFjY2VwdCBsb3dlciBjYXNlIGNoYXJhY3RlcnMsIHNwYWNlLCBvciBzaG9ydGVuZWQgdGltZSB6b25lcy5cblx0ICAvLyBUaGVyZWZvcmUsIGZpeCB0aGVzZSBwcm9ibGVtcyBhbmQgdHJ5IGFnYWluLlxuXHQgIC8vIEV4YW1wbGVzOlxuXHQgIC8vICAgMjAxNS0wNC0xNSAyMDozMzo1OSswMlxuXHQgIC8vICAgMjAxNS0wNC0xNSAyMDozMzo1OXpcblx0ICAvLyAgIDIwMTUtMDQtMTV0MjA6MzM6NTkrMDI6MDBcblx0ICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChbJ14oWzAtOV17NH0tWzAtOV17Mn0tWzAtOV17Mn0pJywgJ1sgdF0nLCAnKFswLTldezJ9OlswLTldezJ9OlswLTldezJ9KFxcXFwuWzAtOV0rKT8pJywgJyhbXFxcXCstXVswLTldezJ9KDpbMC05XXsyfSk/fHopJ10uam9pbignJykpO1xuXHQgIG1hdGNoID0gdGV4dC5tYXRjaChwYXR0ZXJuKTtcblx0ICBpZiAobWF0Y2gpIHtcblx0ICAgIC8vIEB0b2RvOiB0aW1lIHpvbmUgaW5mb3JtYXRpb25cblx0ICAgIGlmIChtYXRjaFs0XSA9PT0gJ3onKSB7XG5cdCAgICAgIG1hdGNoWzRdID0gJ1onO1xuXHQgICAgfSBlbHNlIGlmIChtYXRjaFs0XS5tYXRjaCgvXihbKy1dWzAtOV17Mn0pJC8pKSB7XG5cdCAgICAgIG1hdGNoWzRdID0gbWF0Y2hbNF0gKyAnOjAwJztcblx0ICAgIH1cblxuXHQgICAgaWYgKCFpc05hTihwYXJzZWQgPSBEYXRlLnBhcnNlKG1hdGNoWzFdICsgJ1QnICsgbWF0Y2hbMl0gKyBtYXRjaFs0XSkpKSB7XG5cdCAgICAgIHJldHVybiBwYXJzZWQgLyAxMDAwIHwgMDtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBkYXRlID0gbm93ID8gbmV3IERhdGUobm93ICogMTAwMCkgOiBuZXcgRGF0ZSgpO1xuXHQgIGRheXMgPSB7XG5cdCAgICAnc3VuJzogMCxcblx0ICAgICdtb24nOiAxLFxuXHQgICAgJ3R1ZSc6IDIsXG5cdCAgICAnd2VkJzogMyxcblx0ICAgICd0aHUnOiA0LFxuXHQgICAgJ2ZyaSc6IDUsXG5cdCAgICAnc2F0JzogNlxuXHQgIH07XG5cdCAgcmFuZ2VzID0ge1xuXHQgICAgJ3llYSc6ICdGdWxsWWVhcicsXG5cdCAgICAnbW9uJzogJ01vb
46184nRoJyxcblx0ICAgICdkYXknOiAnRGF0ZScsXG5cdCAgICAnaG91JzogJ0hvdXJzJyxcblx0ICAgICdtaW4nOiAnTWludXRlcycsXG5cdCAgICAnc2VjJzogJ1NlY29uZHMnXG5cdCAgfTtcblxuXHQgIGZ1bmN0aW9uIGxhc3ROZXh0KHR5cGUsIHJhbmdlLCBtb2RpZmllcikge1xuXHQgICAgdmFyIGRpZmY7XG5cdCAgICB2YXIgZGF5ID0gZGF5c1tyYW5nZV07XG5cblx0ICAgIGlmICh0eXBlb2YgZGF5ICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICBkaWZmID0gZGF5IC0gZGF0ZS5nZXREYXkoKTtcblxuXHQgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuXHQgICAgICAgIGRpZmYgPSA3ICogbW9kaWZpZXI7XG5cdCAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDAgJiYgdHlwZSA9PT0gJ2xhc3QnKSB7XG5cdCAgICAgICAgZGlmZiAtPSA3O1xuXHQgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwICYmIHR5cGUgPT09ICduZXh0Jykge1xuXHQgICAgICAgIGRpZmYgKz0gNztcblx0ICAgICAgfVxuXG5cdCAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRpZmYpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIHByb2Nlc3ModmFsKSB7XG5cdCAgICAvLyBAdG9kbzogUmVjb25jaWxlIHRoaXMgd2l0aCByZWdleCB1c2luZyBcXHMsIHRha2luZyBpbnRvIGFjY291bnRcblx0ICAgIC8vIGJyb3dzZXIgaXNzdWVzIHdpdGggc3BsaXQgYW5kIHJlZ2V4ZXNcblx0ICAgIHZhciBzcGx0ID0gdmFsLnNwbGl0KCcgJyk7XG5cdCAgICB2YXIgdHlwZSA9IHNwbHRbMF07XG5cdCAgICB2YXIgcmFuZ2UgPSBzcGx0WzFdLnN1YnN0cmluZygwLCAzKTtcblx0ICAgIHZhciB0eXBlSXNOdW1iZXIgPSAvXFxkKy8udGVzdCh0eXBlKTtcblx0ICAgIHZhciBhZ28gPSBzcGx0WzJdID09PSAnYWdvJztcblx0ICAgIHZhciBudW0gPSAodHlwZSA9PT0gJ2xhc3QnID8gLTEgOiAxKSAqIChhZ28gPyAtMSA6IDEpO1xuXG5cdCAgICBpZiAodHlwZUlzTnVtYmVyKSB7XG5cdCAgICAgIG51bSAqPSBwYXJzZUludCh0eXBlLCAxMCk7XG5cdCAgICB9XG5cblx0ICAgIGlmIChyYW5nZXMuaGFzT3duUHJvcGVydHkocmFuZ2UpICYmICFzcGx0WzFdLm1hdGNoKC9ebW9uKGRheXxcXC4pPyQvaSkpIHtcblx0ICAgICAgcmV0dXJuIGRhdGVbJ3NldCcgKyByYW5nZXNbcmFuZ2VdXShkYXRlWydnZXQnICsgcmFuZ2VzW3JhbmdlXV0oKSArIG51bSk7XG5cdCAgICB9XG5cblx0ICAgIGlmIChyYW5nZSA9PT0gJ3dlZScpIHtcblx0ICAgICAgcmV0dXJuIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG51bSAqIDcpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAodHlwZSA9PT0gJ25leHQnIHx8IHR5cGUgPT09ICdsYXN0Jykge1xuXHQgICAgICBsYXN0TmV4dCh0eXBlLCByYW5nZSwgbnVtKTtcblx0ICAgIH0gZWxzZSBpZiAoIXR5cGVJc051bWJlcikge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblxuXHQgIHRpbWVzID0gJyh5ZWFycz98bW9udGhzP3x3ZWVrcz98ZGF5cz98aG91cnM/fG1pbnV0ZXM/fG1pbnxzZWNvbmRzP3xzZWMnICsgJ3xzdW5kYXl8c3VuXFxcXC4/fG1vbmRheXxtb25cXFxcLj98dHVlc2RheXx0dWVcXFxcLj98d2VkbmVzZGF5fHdlZFxcXFwuPycgKyAnfHRodXJzZGF5fHRodVxcXFwuP3xmcmlkYXl8ZnJpXFxcXC4/fHNhdHVyZGF5fHNhdFxcXFwuPyknO1xuXHQgIHJlZ2V4ID0gJyhbKy1dP1xcXFxkK1xcXFxzJyArIHRpbWVzICsgJ3wnICsgJyhsYXN0fG5leHQpXFxcXHMnICsgdGltZXMgKyAnKShcXFxcc2Fnbyk/JztcblxuXHQgIG1hdGNoID0gdGV4dC5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4LCAnZ2knKSk7XG5cdCAgaWYgKCFtYXRjaCkge1xuXHQgICAgcmV0dXJuIGZhaWw7XG5cdCAgfVxuXG5cdCAgZm9yIChpID0gMCwgbGVuID0gbWF0Y2gubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgIGlmICghcHJvY2VzcyhtYXRjaFtpXSkpIHtcblx0ICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIC8gMTAwMDtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvZGF0ZS9cblx0ICAvLyBvcmlnaW5hbCBieTogQ2FybG9zIFIuIEwuIFJvZHJpZ3VlcyAoaHR0cDovL3d3dy5qc2Zyb21oZWxsLmNvbSlcblx0ICAvLyBvcmlnaW5hbCBieTogZ2V0dGltZW9mZGF5XG5cdCAgLy8gICAgcGFydHMgYnk6IFBldGVyLVBhdWwgS29jaCAoaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9iZWF0Lmh0bWwpXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IE1lRXRjIChodHRwOi8veWFzcy5tZWV0Y3dlYi5jb20pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEJyYWQgVG91ZXNuYXJkXG5cdCAgLy8gaW1wcm92ZWQgYnk6IFRpbSBXaWVsXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEJyeWFuIEVsbGlvdHRcblx0ICAvLyBpbXByb3ZlZCBieTogRGF2aWQgUmFuZGFsbFxuXHQgIC8vIGltcHJvdmVkIGJ5OiBUaGVyaWF1bHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9UaGVyaWF1bHQpXG5cdCAgLy8gaW1wcm92ZWQgYnk6IFRoZXJpYXVsdCAoaHR0cHM6Ly9naXRodWIuY29tL1RoZXJpYXVsdClcblx0ICAvLyBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHA6Ly9icmV0dC16YW1pci5tZSlcblx0ICAvLyBpbXByb3ZlZCBieTogVGhlcmlhdWx0IChodHRwczovL2dpdGh1Yi5jb20vVGhlcmlhdWx0KVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBUaG9tYXMgQmVhdWNvdXJ0IChodHRwOi8vd3d3LndlYmFwcC5mcilcblx0ICAvLyBpbXByb3ZlZCBieTogSlRcblx0ICAvLyBpbXByb3ZlZCBieTogVGhlcmlhdWx0IChodHRwczovL2dpdGh1Yi5jb20vVGhlcmlhdWx0KVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBSYWZhxYIgS3VrYXdza2kgKGh0dHA6Ly9ibG9nLmt1a2F3c2tpLnBsKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBUaGVyaWF1bHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9UaGVyaWF1bHQpXG5cdCAgLy8gICAgaW5wdXQgYnk6IEJyZXR0IFphbWlyIChodHRwOi8vYnJldHQtemFtaXIubWUpXG5cdCAgLy8gICAgaW5wdXQgYnk6IG1hamFrXG5cdCAgLy8gICAgaW5wdXQgYnk6IEFsZXhcblx0ICAvLyAgICBpbnB1dCBieTogTWFydGluXG5cdCAgLy8gICAgaW5wdXQgYnk6IEFsZXggV2lsc29uXG5cdCAgLy8gICAgaW5wdXQgYnk6IEhhcmF2aWtrXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gYnVnZml4ZWQgYnk6IG1hamFrXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEJyZXR0IFphbWlyIChodHRwOi8vYnJldHQtemFtaXIubWUpXG5cdCAgLy8gYnVnZml4ZWQgYnk6IG9taWQgKGh0dHA6Ly9sb2N1dHVzLmlvL3BocC8zODA6MzgwI2NvbW1lbnRfMTM3MTIyKVxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBDaHJpcyAoaHR0cDovL3d3dy5kZXZvdGlzLm5sLylcblx0ICAvLyAgICAgIG5vdGUgMTogVXNlcyBnbG9iYWw6IGxvY3V0dXMgdG8gc3RvcmUgdGhlIGRlZmF1bHQgdGltZXpvbmVcblx0ICAvLyAgICAgIG5vdGUgMTogQWx0aG91Z2ggdGhlIGZ1bmN0aW9uIHBvdGVudGlhbGx5IGFsbG93cyB0aW1lem9uZSBpbmZvXG5cdCAgLy8gICAgICBub3RlIDE6IChzZWUgbm90ZXMpLCBpdCBjdXJyZW50bHkgZG9lcyBub3Qgc2V0XG5cdCAgLy8gICAgICBub3RlIDE6IHBlciBhIHRpbWV6b25lIHNwZWNpZmllZCBieSBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCkuIEltcGxlbWVudGVycyBtaWdodCB1c2Vcblx0ICAvLyAgICAgIG5vdGUgMTogJGxvY3V0dXMuY3VycmVudFRpbWV6b25lT2Zmc2V0IGFuZFxuXHQgIC8vICAgICAgbm90ZSAxOiAkbG9jdXR1cy5jdXJyZW50VGltZXpvbmVEU1Qgc2V0IGJ5IHRoYXQgZnVuY3Rpb25cblx0ICAvLyAgICAgIG5vdGUgMTogaW4gb3JkZXIgdG8gYWRqdXN0IHRoZSBkYXRlcyBpbiB0aGlzIGZ1bmN0aW9uXG5cdCAgLy8gICAgICBub3RlIDE6IChvciBvdXIgb3RoZXIgZGF0ZSBmdW5jdGlvbnMhKSBhY2NvcmRpbmdseVxuXHQgIC8vICAgZXhhbXBsZSAxOiBkYXRlKCdIOm06cyBcXFxcbSBcXFxcaVxcXFxzIFxcXFxtXFxcXG9cXFxcblxcXFx0XFxcXGgnLCAxMDYyNDAyNDAwKVxuXHQgIC8vICAgcmV0dXJucyAxOiAnMDc6MDk6NDAgbSBpcyBtb250aCdcblx0ICAvLyAgIGV4YW1wbGUgMjogZGF0ZSgnRiBqLCBZLCBnOmkgYScsIDEwNjI0NjI0MDApXG5cdCAgLy8gICByZXR1cm5zIDI6ICdTZXB0ZW1iZXIgMiwgMjAwMywgMTI6MjYgYW0nXG5cdCAgLy8gICBleGFtcGxlIDM6IGRhdGUoJ1kgVyBvJywgMTA2MjQ2MjQwMClcblx0ICAvLyAgIHJldHVybnMgMzogJzIwMDMgMzYgMjAwMydcblx0ICAvLyAgIGV4YW1wbGUgNDogdmFyICR4ID0gZGF0ZSgnWSBtIGQnLCAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMClcblx0ICAvLyAgIGV4YW1wbGUgNDogJHggPSAkeCArICcnXG5cdCAgLy8gICBleGFtcGxlIDQ6IHZhciAkcmVzdWx0ID0gJHgubGVuZ3RoIC8vIDIwMDkgMDEgMDlcblx0ICAvLyAgIHJldHVybnMgNDogMTBcblx0ICAvLyAgIGV4YW1wbGUgNTogZGF0ZSgnVycsIDExMDQ1MzQwMDApXG5cdCAgLy8gICByZXR1cm5zIDU6ICc1Midcblx0ICAvLyAgIGV4YW1wbGUgNjogZGF0ZSgnQiB0JywgMTEwNDUzNDAwMClcblx0ICAvLyAgIHJldHVybnMgNjogJzk5OSAzMSdcblx0ICAvLyAgIGV4YW1wbGUgNzogZGF0ZSgnVyBVJywgMTI5Mzc1MDAwMC44Mik7IC8vIDIwMTAtMTItMzFcblx0ICAvLyAgIHJldHVybnMgNzogJzUyIDEyOTM3NTAwMDAnXG5cdCAgLy8gICBleGFtcGxlIDg6IGRhdGUoJ1cnLCAxMjkzODM2NDAwKTsgLy8gMjAxMS0wMS0wMVxuXHQgIC8vICAgcmV0dXJucyA4OiAnNTInXG5cdCAgLy8gICBleGFtcGxlIDk6IGRhdGUoJ1cgWS1tLWQnLCAxMjkzOTc0MDU0KTsgLy8gMjAxMS0wMS0wMlxuXHQgIC8vICAgcmV0dXJucyA5OiAnNTIgMjAxMS0wMS0wMidcblx0ICAvLyAgICAgICAgdGVzdDogc2tpcC0xIHNraXAtMiBza2lwLTVcblxuXHQgIHZhciBqc2RhdGUsIGY7XG5cdCAgLy8gS2VlcCB0aGlzIGhlcmUgKHdvcmtzLCBidXQgZm9yIGNvZGUgY29tbWVudGVkLW91dCBiZWxvdyBmb3IgZmlsZSBzaXplIHJlYXNvbnMpXG5cdCAgLy8gdmFyIHRhbD0gW107XG5cdCAgdmFyIHR4dFdvcmRzID0gWydTdW4nLCA
46184nTW9uJywgJ1R1ZXMnLCAnV2VkbmVzJywgJ1RodXJzJywgJ0ZyaScsICdTYXR1cicsICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5cdCAgLy8gdHJhaWxpbmcgYmFja3NsYXNoIC0+IChkcm9wcGVkKVxuXHQgIC8vIGEgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgKGluY2x1ZGluZyBiYWNrc2xhc2gpIC0+IHRoZSBjaGFyYWN0ZXJcblx0ICAvLyBlbXB0eSBzdHJpbmcgLT4gZW1wdHkgc3RyaW5nXG5cdCAgdmFyIGZvcm1hdENociA9IC9cXFxcPyguPykvZ2k7XG5cdCAgdmFyIGZvcm1hdENockNiID0gZnVuY3Rpb24gZm9ybWF0Q2hyQ2IodCwgcykge1xuXHQgICAgcmV0dXJuIGZbdF0gPyBmW3RdKCkgOiBzO1xuXHQgIH07XG5cdCAgdmFyIF9wYWQgPSBmdW5jdGlvbiBfcGFkKG4sIGMpIHtcblx0ICAgIG4gPSBTdHJpbmcobik7XG5cdCAgICB3aGlsZSAobi5sZW5ndGggPCBjKSB7XG5cdCAgICAgIG4gPSAnMCcgKyBuO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG47XG5cdCAgfTtcblx0ICBmID0ge1xuXHQgICAgLy8gRGF5XG5cdCAgICBkOiBmdW5jdGlvbiBkKCkge1xuXHQgICAgICAvLyBEYXkgb2YgbW9udGggdy9sZWFkaW5nIDA7IDAxLi4zMVxuXHQgICAgICByZXR1cm4gX3BhZChmLmooKSwgMik7XG5cdCAgICB9LFxuXHQgICAgRDogZnVuY3Rpb24gRCgpIHtcblx0ICAgICAgLy8gU2hvcnRoYW5kIGRheSBuYW1lOyBNb24uLi5TdW5cblx0ICAgICAgcmV0dXJuIGYubCgpLnNsaWNlKDAsIDMpO1xuXHQgICAgfSxcblx0ICAgIGo6IGZ1bmN0aW9uIGooKSB7XG5cdCAgICAgIC8vIERheSBvZiBtb250aDsgMS4uMzFcblx0ICAgICAgcmV0dXJuIGpzZGF0ZS5nZXREYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgbDogZnVuY3Rpb24gbCgpIHtcblx0ICAgICAgLy8gRnVsbCBkYXkgbmFtZTsgTW9uZGF5Li4uU3VuZGF5XG5cdCAgICAgIHJldHVybiB0eHRXb3Jkc1tmLncoKV0gKyAnZGF5Jztcblx0ICAgIH0sXG5cdCAgICBOOiBmdW5jdGlvbiBOKCkge1xuXHQgICAgICAvLyBJU08tODYwMSBkYXkgb2Ygd2VlazsgMVtNb25dLi43W1N1bl1cblx0ICAgICAgcmV0dXJuIGYudygpIHx8IDc7XG5cdCAgICB9LFxuXHQgICAgUzogZnVuY3Rpb24gUygpIHtcblx0ICAgICAgLy8gT3JkaW5hbCBzdWZmaXggZm9yIGRheSBvZiBtb250aDsgc3QsIG5kLCByZCwgdGhcblx0ICAgICAgdmFyIGogPSBmLmooKTtcblx0ICAgICAgdmFyIGkgPSBqICUgMTA7XG5cdCAgICAgIGlmIChpIDw9IDMgJiYgcGFyc2VJbnQoaiAlIDEwMCAvIDEwLCAxMCkgPT09IDEpIHtcblx0ICAgICAgICBpID0gMDtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gWydzdCcsICduZCcsICdyZCddW2kgLSAxXSB8fCAndGgnO1xuXHQgICAgfSxcblx0ICAgIHc6IGZ1bmN0aW9uIHcoKSB7XG5cdCAgICAgIC8vIERheSBvZiB3ZWVrOyAwW1N1bl0uLjZbU2F0XVxuXHQgICAgICByZXR1cm4ganNkYXRlLmdldERheSgpO1xuXHQgICAgfSxcblx0ICAgIHo6IGZ1bmN0aW9uIHooKSB7XG5cdCAgICAgIC8vIERheSBvZiB5ZWFyOyAwLi4zNjVcblx0ICAgICAgdmFyIGEgPSBuZXcgRGF0ZShmLlkoKSwgZi5uKCkgLSAxLCBmLmooKSk7XG5cdCAgICAgIHZhciBiID0gbmV3IERhdGUoZi5ZKCksIDAsIDEpO1xuXHQgICAgICByZXR1cm4gTWF0aC5yb3VuZCgoYSAtIGIpIC8gODY0ZTUpO1xuXHQgICAgfSxcblxuXHQgICAgLy8gV2Vla1xuXHQgICAgVzogZnVuY3Rpb24gVygpIHtcblx0ICAgICAgLy8gSVNPLTg2MDEgd2VlayBudW1iZXJcblx0ICAgICAgdmFyIGEgPSBuZXcgRGF0ZShmLlkoKSwgZi5uKCkgLSAxLCBmLmooKSAtIGYuTigpICsgMyk7XG5cdCAgICAgIHZhciBiID0gbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLCAwLCA0KTtcblx0ICAgICAgcmV0dXJuIF9wYWQoMSArIE1hdGgucm91bmQoKGEgLSBiKSAvIDg2NGU1IC8gNyksIDIpO1xuXHQgICAgfSxcblxuXHQgICAgLy8gTW9udGhcblx0ICAgIEY6IGZ1bmN0aW9uIEYoKSB7XG5cdCAgICAgIC8vIEZ1bGwgbW9udGggbmFtZTsgSmFudWFyeS4uLkRlY2VtYmVyXG5cdCAgICAgIHJldHVybiB0eHRXb3Jkc1s2ICsgZi5uKCldO1xuXHQgICAgfSxcblx0ICAgIG06IGZ1bmN0aW9uIG0oKSB7XG5cdCAgICAgIC8vIE1vbnRoIHcvbGVhZGluZyAwOyAwMS4uLjEyXG5cdCAgICAgIHJldHVybiBfcGFkKGYubigpLCAyKTtcblx0ICAgIH0sXG5cdCAgICBNOiBmdW5jdGlvbiBNKCkge1xuXHQgICAgICAvLyBTaG9ydGhhbmQgbW9udGggbmFtZTsgSmFuLi4uRGVjXG5cdCAgICAgIHJldHVybiBmLkYoKS5zbGljZSgwLCAzKTtcblx0ICAgIH0sXG5cdCAgICBuOiBmdW5jdGlvbiBuKCkge1xuXHQgICAgICAvLyBNb250aDsgMS4uLjEyXG5cdCAgICAgIHJldHVybiBqc2RhdGUuZ2V0TW9udGgoKSArIDE7XG5cdCAgICB9LFxuXHQgICAgdDogZnVuY3Rpb24gdCgpIHtcblx0ICAgICAgLy8gRGF5cyBpbiBtb250aDsgMjguLi4zMVxuXHQgICAgICByZXR1cm4gbmV3IERhdGUoZi5ZKCksIGYubigpLCAwKS5nZXREYXRlKCk7XG5cdCAgICB9LFxuXG5cdCAgICAvLyBZZWFyXG5cdCAgICBMOiBmdW5jdGlvbiBMKCkge1xuXHQgICAgICAvLyBJcyBsZWFwIHllYXI/OyAwIG9yIDFcblx0ICAgICAgdmFyIGogPSBmLlkoKTtcblx0ICAgICAgcmV0dXJuIGogJSA0ID09PSAwICYgaiAlIDEwMCAhPT0gMCB8IGogJSA0MDAgPT09IDA7XG5cdCAgICB9LFxuXHQgICAgbzogZnVuY3Rpb24gbygpIHtcblx0ICAgICAgLy8gSVNPLTg2MDEgeWVhclxuXHQgICAgICB2YXIgbiA9IGYubigpO1xuXHQgICAgICB2YXIgVyA9IGYuVygpO1xuXHQgICAgICB2YXIgWSA9IGYuWSgpO1xuXHQgICAgICByZXR1cm4gWSArIChuID09PSAxMiAmJiBXIDwgOSA/IDEgOiBuID09PSAxICYmIFcgPiA5ID8gLTEgOiAwKTtcblx0ICAgIH0sXG5cdCAgICBZOiBmdW5jdGlvbiBZKCkge1xuXHQgICAgICAvLyBGdWxsIHllYXI7IGUuZy4gMTk4MC4uLjIwMTBcblx0ICAgICAgcmV0dXJuIGpzZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHk6IGZ1bmN0aW9uIHkoKSB7XG5cdCAgICAgIC8vIExhc3QgdHdvIGRpZ2l0cyBvZiB5ZWFyOyAwMC4uLjk5XG5cdCAgICAgI
46184HJldHVybiBmLlkoKS50b1N0cmluZygpLnNsaWNlKC0yKTtcblx0ICAgIH0sXG5cblx0ICAgIC8vIFRpbWVcblx0ICAgIGE6IGZ1bmN0aW9uIGEoKSB7XG5cdCAgICAgIC8vIGFtIG9yIHBtXG5cdCAgICAgIHJldHVybiBqc2RhdGUuZ2V0SG91cnMoKSA+IDExID8gJ3BtJyA6ICdhbSc7XG5cdCAgICB9LFxuXHQgICAgQTogZnVuY3Rpb24gQSgpIHtcblx0ICAgICAgLy8gQU0gb3IgUE1cblx0ICAgICAgcmV0dXJuIGYuYSgpLnRvVXBwZXJDYXNlKCk7XG5cdCAgICB9LFxuXHQgICAgQjogZnVuY3Rpb24gQigpIHtcblx0ICAgICAgLy8gU3dhdGNoIEludGVybmV0IHRpbWU7IDAwMC4uOTk5XG5cdCAgICAgIHZhciBIID0ganNkYXRlLmdldFVUQ0hvdXJzKCkgKiAzNmUyO1xuXHQgICAgICAvLyBIb3Vyc1xuXHQgICAgICB2YXIgaSA9IGpzZGF0ZS5nZXRVVENNaW51dGVzKCkgKiA2MDtcblx0ICAgICAgLy8gTWludXRlc1xuXHQgICAgICAvLyBTZWNvbmRzXG5cdCAgICAgIHZhciBzID0ganNkYXRlLmdldFVUQ1NlY29uZHMoKTtcblx0ICAgICAgcmV0dXJuIF9wYWQoTWF0aC5mbG9vcigoSCArIGkgKyBzICsgMzZlMikgLyA4Ni40KSAlIDFlMywgMyk7XG5cdCAgICB9LFxuXHQgICAgZzogZnVuY3Rpb24gZygpIHtcblx0ICAgICAgLy8gMTItSG91cnM7IDEuLjEyXG5cdCAgICAgIHJldHVybiBmLkcoKSAlIDEyIHx8IDEyO1xuXHQgICAgfSxcblx0ICAgIEc6IGZ1bmN0aW9uIEcoKSB7XG5cdCAgICAgIC8vIDI0LUhvdXJzOyAwLi4yM1xuXHQgICAgICByZXR1cm4ganNkYXRlLmdldEhvdXJzKCk7XG5cdCAgICB9LFxuXHQgICAgaDogZnVuY3Rpb24gaCgpIHtcblx0ICAgICAgLy8gMTItSG91cnMgdy9sZWFkaW5nIDA7IDAxLi4xMlxuXHQgICAgICByZXR1cm4gX3BhZChmLmcoKSwgMik7XG5cdCAgICB9LFxuXHQgICAgSDogZnVuY3Rpb24gSCgpIHtcblx0ICAgICAgLy8gMjQtSG91cnMgdy9sZWFkaW5nIDA7IDAwLi4yM1xuXHQgICAgICByZXR1cm4gX3BhZChmLkcoKSwgMik7XG5cdCAgICB9LFxuXHQgICAgaTogZnVuY3Rpb24gaSgpIHtcblx0ICAgICAgLy8gTWludXRlcyB3L2xlYWRpbmcgMDsgMDAuLjU5XG5cdCAgICAgIHJldHVybiBfcGFkKGpzZGF0ZS5nZXRNaW51dGVzKCksIDIpO1xuXHQgICAgfSxcblx0ICAgIHM6IGZ1bmN0aW9uIHMoKSB7XG5cdCAgICAgIC8vIFNlY29uZHMgdy9sZWFkaW5nIDA7IDAwLi41OVxuXHQgICAgICByZXR1cm4gX3BhZChqc2RhdGUuZ2V0U2Vjb25kcygpLCAyKTtcblx0ICAgIH0sXG5cdCAgICB1OiBmdW5jdGlvbiB1KCkge1xuXHQgICAgICAvLyBNaWNyb3NlY29uZHM7IDAwMDAwMC05OTkwMDBcblx0ICAgICAgcmV0dXJuIF9wYWQoanNkYXRlLmdldE1pbGxpc2Vjb25kcygpICogMTAwMCwgNik7XG5cdCAgICB9LFxuXG5cdCAgICAvLyBUaW1lem9uZVxuXHQgICAgZTogZnVuY3Rpb24gZSgpIHtcblx0ICAgICAgLy8gVGltZXpvbmUgaWRlbnRpZmllcjsgZS5nLiBBdGxhbnRpYy9Bem9yZXMsIC4uLlxuXHQgICAgICAvLyBUaGUgZm9sbG93aW5nIHdvcmtzLCBidXQgcmVxdWlyZXMgaW5jbHVzaW9uIG9mIHRoZSB2ZXJ5IGxhcmdlXG5cdCAgICAgIC8vIHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdCgpIGZ1bmN0aW9uLlxuXHQgICAgICAvKiAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCgpO1xuXHQgICAgICAgKi9cblx0ICAgICAgdmFyIG1zZyA9ICdOb3Qgc3VwcG9ydGVkIChzZWUgc291cmNlIGNvZGUgb2YgZGF0ZSgpIGZvciB0aW1lem9uZSBvbiBob3cgdG8gYWRkIHN1cHBvcnQpJztcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG5cdCAgICB9LFxuXHQgICAgSTogZnVuY3Rpb24gSSgpIHtcblx0ICAgICAgLy8gRFNUIG9ic2VydmVkPzsgMCBvciAxXG5cdCAgICAgIC8vIENvbXBhcmVzIEphbiAxIG1pbnVzIEphbiAxIFVUQyB0byBKdWwgMSBtaW51cyBKdWwgMSBVVEMuXG5cdCAgICAgIC8vIElmIHRoZXkgYXJlIG5vdCBlcXVhbCwgdGhlbiBEU1QgaXMgb2JzZXJ2ZWQuXG5cdCAgICAgIHZhciBhID0gbmV3IERhdGUoZi5ZKCksIDApO1xuXHQgICAgICAvLyBKYW4gMVxuXHQgICAgICB2YXIgYyA9IERhdGUuVVRDKGYuWSgpLCAwKTtcblx0ICAgICAgLy8gSmFuIDEgVVRDXG5cdCAgICAgIHZhciBiID0gbmV3IERhdGUoZi5ZKCksIDYpO1xuXHQgICAgICAvLyBKdWwgMVxuXHQgICAgICAvLyBKdWwgMSBVVENcblx0ICAgICAgdmFyIGQgPSBEYXRlLlVUQyhmLlkoKSwgNik7XG5cdCAgICAgIHJldHVybiBhIC0gYyAhPT0gYiAtIGQgPyAxIDogMDtcblx0ICAgIH0sXG5cdCAgICBPOiBmdW5jdGlvbiBPKCkge1xuXHQgICAgICAvLyBEaWZmZXJlbmNlIHRvIEdNVCBpbiBob3VyIGZvcm1hdDsgZS5nLiArMDIwMFxuXHQgICAgICB2YXIgdHpvID0ganNkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cdCAgICAgIHZhciBhID0gTWF0aC5hYnModHpvKTtcblx0ICAgICAgcmV0dXJuICh0em8gPiAwID8gJy0nIDogJysnKSArIF9wYWQoTWF0aC5mbG9vcihhIC8gNjApICogMTAwICsgYSAlIDYwLCA0KTtcblx0ICAgIH0sXG5cdCAgICBQOiBmdW5jdGlvbiBQKCkge1xuXHQgICAgICAvLyBEaWZmZXJlbmNlIHRvIEdNVCB3L2NvbG9uOyBlLmcuICswMjowMFxuXHQgICAgICB2YXIgTyA9IGYuTygpO1xuXHQgICAgICByZXR1cm4gTy5zdWJzdHIoMCwgMykgKyAnOicgKyBPLnN1YnN0cigzLCAyKTtcblx0ICAgIH0sXG5cdCAgICBUOiBmdW5jdGlvbiBUKCkge1xuXHQgICAgICAvLyBUaGUgZm9sbG93aW5nIHdvcmtzLCBidXQgcmVxdWlyZXMgaW5jbHVzaW9uIG9mIHRoZSB2ZXJ5XG5cdCAgICAgIC8vIGxhcmdlIHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdCgpIGZ1bmN0aW9uLlxuXHQgICAgICAvKiAgICAgICAgICAgICAgdmFyIGFiYnIsIGksIG9zLCBfZGVmYXVsdDtcblx0ICAgICAgaWYgKCF0YWwubGVuZ3RoKSB7XG5cdCAgICAgICAgdGFsID0gdGhhdC50aW1lem9uZV9hYmJyZXZpYXRpb25zX2xpc3QoKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoJGxvY3V0dXMgJiYgJGxvY3V0dXMuZGVmYXVsdF90aW1lem9uZSkge1xuXHQgICAgICAgIF9kZWZhdWx0ID0gJGxvY3V0dXMuZGVmYXVsdF90aW1lem9uZTtcblx0ICAgICAgICBmb3IgKGFiYnIgaW4gdGFsKSB7XG5cdCAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFsW2FiYnJdLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGlmICh0YWxbYWJicl1baV0udGltZXpvbmVfaWQgPT09IF9kZWZhdWx0KSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIGFiYnIudG9VcHBlckNhc2UoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgI
46184H1cblx0ICAgICAgfVxuXHQgICAgICBmb3IgKGFiYnIgaW4gdGFsKSB7XG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhbFthYmJyXS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgb3MgPSAtanNkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDtcblx0ICAgICAgICAgIGlmICh0YWxbYWJicl1baV0ub2Zmc2V0ID09PSBvcykge1xuXHQgICAgICAgICAgICByZXR1cm4gYWJici50b1VwcGVyQ2FzZSgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICAqL1xuXHQgICAgICByZXR1cm4gJ1VUQyc7XG5cdCAgICB9LFxuXHQgICAgWjogZnVuY3Rpb24gWigpIHtcblx0ICAgICAgLy8gVGltZXpvbmUgb2Zmc2V0IGluIHNlY29uZHMgKC00MzIwMC4uLjUwNDAwKVxuXHQgICAgICByZXR1cm4gLWpzZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjA7XG5cdCAgICB9LFxuXG5cdCAgICAvLyBGdWxsIERhdGUvVGltZVxuXHQgICAgYzogZnVuY3Rpb24gYygpIHtcblx0ICAgICAgLy8gSVNPLTg2MDEgZGF0ZS5cblx0ICAgICAgcmV0dXJuICdZLW0tZFxcXFxUSDppOnNQJy5yZXBsYWNlKGZvcm1hdENociwgZm9ybWF0Q2hyQ2IpO1xuXHQgICAgfSxcblx0ICAgIHI6IGZ1bmN0aW9uIHIoKSB7XG5cdCAgICAgIC8vIFJGQyAyODIyXG5cdCAgICAgIHJldHVybiAnRCwgZCBNIFkgSDppOnMgTycucmVwbGFjZShmb3JtYXRDaHIsIGZvcm1hdENockNiKTtcblx0ICAgIH0sXG5cdCAgICBVOiBmdW5jdGlvbiBVKCkge1xuXHQgICAgICAvLyBTZWNvbmRzIHNpbmNlIFVOSVggZXBvY2hcblx0ICAgICAgcmV0dXJuIGpzZGF0ZSAvIDEwMDAgfCAwO1xuXHQgICAgfVxuXHQgIH07XG5cblx0ICB2YXIgX2RhdGUgPSBmdW5jdGlvbiBfZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCkge1xuXHQgICAganNkYXRlID0gdGltZXN0YW1wID09PSB1bmRlZmluZWQgPyBuZXcgRGF0ZSgpIC8vIE5vdCBwcm92aWRlZFxuXHQgICAgOiB0aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUodGltZXN0YW1wKSAvLyBKUyBEYXRlKClcblx0ICAgIDogbmV3IERhdGUodGltZXN0YW1wICogMTAwMCkgLy8gVU5JWCB0aW1lc3RhbXAgKGF1dG8tY29udmVydCB0byBpbnQpXG5cdCAgICA7XG5cdCAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoZm9ybWF0Q2hyLCBmb3JtYXRDaHJDYik7XG5cdCAgfTtcblxuXHQgIHJldHVybiBfZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCk7XG5cdH07XG5cdFxuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJvb2x2YWwobWl4ZWRWYXIpIHtcblx0ICAvLyBvcmlnaW5hbCBieTogV2lsbCBSb3dlXG5cdCAgLy8gICBleGFtcGxlIDE6IGJvb2x2YWwodHJ1ZSlcblx0ICAvLyAgIHJldHVybnMgMTogdHJ1ZVxuXHQgIC8vICAgZXhhbXBsZSAyOiBib29sdmFsKGZhbHNlKVxuXHQgIC8vICAgcmV0dXJucyAyOiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSAzOiBib29sdmFsKDApXG5cdCAgLy8gICByZXR1cm5zIDM6IGZhbHNlXG5cdCAgLy8gICBleGFtcGxlIDQ6IGJvb2x2YWwoMC4wKVxuXHQgIC8vICAgcmV0dXJucyA0OiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSA1OiBib29sdmFsKCcnKVxuXHQgIC8vICAgcmV0dXJucyA1OiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSA2OiBib29sdmFsKCcwJylcblx0ICAvLyAgIHJldHVybnMgNjogZmFsc2Vcblx0ICAvLyAgIGV4YW1wbGUgNzogYm9vbHZhbChbXSlcblx0ICAvLyAgIHJldHVybnMgNzogZmFsc2Vcblx0ICAvLyAgIGV4YW1wbGUgODogYm9vbHZhbCgnJylcblx0ICAvLyAgIHJldHVybnMgODogZmFsc2Vcblx0ICAvLyAgIGV4YW1wbGUgOTogYm9vbHZhbChudWxsKVxuXHQgIC8vICAgcmV0dXJucyA5OiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSAxMDogYm9vbHZhbCh1bmRlZmluZWQpXG5cdCAgLy8gICByZXR1cm5zIDEwOiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSAxMTogYm9vbHZhbCgndHJ1ZScpXG5cdCAgLy8gICByZXR1cm5zIDExOiB0cnVlXG5cblx0ICBpZiAobWl4ZWRWYXIgPT09IGZhbHNlKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgaWYgKG1peGVkVmFyID09PSAwIHx8IG1peGVkVmFyID09PSAwLjApIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICBpZiAobWl4ZWRWYXIgPT09ICcnIHx8IG1peGVkVmFyID09PSAnMCcpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICBpZiAoQXJyYXkuaXNBcnJheShtaXhlZFZhcikgJiYgbWl4ZWRWYXIubGVuZ3RoID09PSAwKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgaWYgKG1peGVkVmFyID09PSBudWxsIHx8IG1peGVkVmFyID09PSB1bmRlZmluZWQpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICByZXR1cm4gdHJ1ZTtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUd2lnKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyTG9hZGVyKCdhamF4JywgZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICB4bWxodHRwLFxuXHQgICAgICAgICAgICBwcmVjb21waWxlZCA9IHBhcmFtcy5wcmVjb21waWxlZCxcblx0ICAgICAgICAgICAgcGFyc2VyID0gdGhpcy5wYXJzZXJzW3BhcmFtcy5wYXJzZXJdIHx8IHRoaXMucGFyc2VyLnR3aWc7XG5cblx0ICAgICAgICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1
46184ZXN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdVbnN1cHBvcnRlZCBwbGF0Zm9ybTogVW5hYmxlIHRvIGRvIGFqYXggcmVxdWVzdHMgJyArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZWNhdXNlIHRoZXJlIGlzIG5vIFwiWE1MSFRUUFJlcXVlc3RcIiBpbXBsZW1lbnRhdGlvbicpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHhtbGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgICAgICB4bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgaWYoeG1saHR0cC5yZWFkeVN0YXRlID09PSA0KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoeG1saHR0cC5zdGF0dXMgPT09IDIwMCB8fCAod2luZG93LmNvcmRvdmEgJiYgeG1saHR0cC5zdGF0dXMgPT0gMCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIkdvdCB0ZW1wbGF0ZSBcIiwgeG1saHR0cC5yZXNwb25zZVRleHQpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByZWNvbXBpbGVkID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHhtbGh0dHAucmVzcG9uc2VUZXh0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0geG1saHR0cC5yZXNwb25zZVRleHQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnVybCA9IGxvY2F0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5kYXRhID0gZGF0YTtcblxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gcGFyc2VyLmNhbGwodGhpcywgcGFyYW1zKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGVtcGxhdGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvcl9jYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayh4bWxodHRwKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHhtbGh0dHAub3BlbihcIkdFVFwiLCBsb2NhdGlvbiwgISFwYXJhbXMuYXN5bmMpO1xuXHQgICAgICAgIHhtbGh0dHAuc2VuZCgpO1xuXG5cdCAgICAgICAgaWYgKHBhcmFtcy5hc3luYykge1xuXHQgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gZGVmZXJyZWQgcHJvbWlzZVxuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0fTtcblxuXG4vKioqLyB9LFxuLyogMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVHdpZykge1xuXHQgICAgJ3VzZSBzdHJpY3QnO1xuXG5cdCAgICB2YXIgZnMsIHBhdGg7XG5cblx0ICAgIHRyeSB7XG5cdCAgICBcdC8vIHJlcXVpcmUgbGliIGRlcGVuZGVuY2llcyBhdCBydW50aW1lXG5cdCAgICBcdGZzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdCAgICBcdHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgIFx0Ly8gTk9URTogdGhpcyBpcyBpbiBhIHRyeS9jYXRjaCB0byBhdm9pZCBlcnJvcnMgY3Jvc3MgcGxhdGZvcm1cblx0ICAgIH1cblxuXHQgICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJMb2FkZXIoJ2ZzJywgZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICBkYXRhID0gbnVsbCxcblx0ICAgICAgICAgICAgcHJlY29tcGlsZWQgPSBwYXJhbXMucHJlY29tcGlsZWQsXG5cdCAgICAgICAgICAgIHBhcnNlciA9IHRoaXMucGFyc2Vyc1twYXJhbXMucGFyc2VyXSB8fCB0aGlzLnBhcnNlci50d2lnO1xuXG5cdCAgICAgICAgaWYgKCFmcyB8fCAhcGF0aCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignVW5zdXBwb3J0ZWQgcGxhdGZvcm06IFVuYWJsZSB0byBsb2FkIGZyb20gZmlsZSAnICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlY2F1c2UgdGhlcmUgaXMgbm8gXCJmc1wiIG9yIFwicGF0aFwiIGltcGxlbWVudGF0aW9uJyk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdmFyIGxvYWRUZW1wbGF0ZUZuID0gZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG5cdCAgICAgICAgICAgIGlmIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3JfY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayhlcnIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKHByZWNvbXBpbGVkID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHBhcmFtcy5kYXRhID0gZGF0YTtcblx0ICAgICAgICAgICAgcGFyYW1zLnBhdGggPSBwYXJhbXMucGF0aCB8fCBsb2NhdGlvbjtcblxuXHQgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBpcyBpbiBkYXRhXG5cdCAgICAgICAgICAgIHRlbXBsYXRlID0gcGFyc2VyLmNhbGwodGhpcywgcGFyYW1zKTtcblxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjayh0
46184ZW1wbGF0ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHBhcmFtcy5wYXRoID0gcGFyYW1zLnBhdGggfHwgbG9jYXRpb247XG5cblx0ICAgICAgICBpZiAocGFyYW1zLmFzeW5jKSB7XG5cdCAgICAgICAgICAgIGZzLnN0YXQocGFyYW1zLnBhdGgsIGZ1bmN0aW9uIChlcnIsIHN0YXRzKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFzdGF0cy5pc0ZpbGUoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3JfY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY2FsbGJhY2sobmV3IFR3aWcuRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGZpbGUgJyArIHBhcmFtcy5wYXRoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlKHBhcmFtcy5wYXRoLCAndXRmOCcsIGxvYWRUZW1wbGF0ZUZuKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBkZWZlcnJlZCBwcm9taXNlXG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhcmFtcy5wYXRoKS5pc0ZpbGUoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBmaWxlICcgKyBwYXJhbXMucGF0aCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGZpbGUgJyArIHBhcmFtcy5wYXRoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhcmFtcy5wYXRoLCAndXRmOCcpO1xuXHQgICAgICAgICAgICBsb2FkVGVtcGxhdGVGbih1bmRlZmluZWQsIGRhdGEpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAxOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7XG5cbi8qKiovIH0sXG4vKiAyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyAjIyB0d2lnLmxvZ2ljLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIHRva2VuaXppbmcsIGNvbXBpbGluZyBhbmQgcGFyc2luZyBsb2dpYyB0b2tlbnMuIHslIC4uLiAlfVxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUd2lnKSB7XG5cdCAgICBcInVzZSBzdHJpY3RcIjtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBOYW1lc3BhY2UgZm9yIGxvZ2ljIGhhbmRsaW5nLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmxvZ2ljID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTG9naWMgdG9rZW4gdHlwZXMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9naWMudHlwZSA9IHtcblx0ICAgICAgICBpZl86ICAgICAgICdUd2lnLmxvZ2ljLnR5cGUuaWYnLFxuXHQgICAgICAgIGVuZGlmOiAgICAgJ1R3aWcubG9naWMudHlwZS5lbmRpZicsXG5cdCAgICAgICAgZm9yXzogICAgICAnVHdpZy5sb2dpYy50eXBlLmZvcicsXG5cdCAgICAgICAgZW5kZm9yOiAgICAnVHdpZy5sb2dpYy50eXBlLmVuZGZvcicsXG5cdCAgICAgICAgZWxzZV86ICAgICAnVHdpZy5sb2dpYy50eXBlLmVsc2UnLFxuXHQgICAgICAgIGVsc2VpZjogICAgJ1R3aWcubG9naWMudHlwZS5lbHNlaWYnLFxuXHQgICAgICAgIHNldDogICAgICAgJ1R3aWcubG9naWMudHlwZS5zZXQnLFxuXHQgICAgICAgIHNldGNhcHR1cmU6J1R3aWcubG9naWMudHlwZS5zZXRjYXB0dXJlJyxcblx0ICAgICAgICBlbmRzZXQ6ICAgICdUd2lnLmxvZ2ljLnR5cGUuZW5kc2V0Jyxcblx0ICAgICAgICBmaWx0ZXI6ICAgICdUd2lnLmxvZ2ljLnR5cGUuZmlsdGVyJyxcblx0ICAgICAgICBlbmRmaWx0ZXI6ICdUd2lnLmxvZ2ljLnR5cGUuZW5kZmlsdGVyJyxcblx0ICAgICAgICBzaG9ydGJsb2NrOiAnVHdpZy5sb2dpYy50eXBlLnNob3J0YmxvY2snLFxuXHQgICAgICAgIGJsb2NrOiAgICAgJ1R3aWcubG9naWMudHlwZS5ibG9jaycsXG5cdCAgICAgICAgZW5kYmxvY2s6ICAnVHdpZy5sb2dpYy50eXBlLmVuZGJsb2NrJyxcblx0ICAgICAgICBleHRlbmRzXzogICdUd2lnLmxvZ2ljLnR5cGUuZXh0ZW5kcycsXG5cdCAgICAgICAgdXNlOiAgICAgICAnVHdpZy5sb2dpYy50eXBlLnVzZScsXG5cdCAgICAgICAgaW5jbHVkZTogICAnVHdpZy5sb2dpYy50eXBlLmluY2x1ZGUnLFxuXHQgICAgICAgIHNwYWNlbGVzczogJ1R3aWcubG9naWMudHlwZS5zcGFjZWxlc3MnLFxuXHQgICAgICAgIGVuZHNwYWNlbGVzczogJ1R3aWcubG9naWMudHlwZS5lbmRzcGFjZWxlc3MnLFxuXHQgICAgICAgIG1hY3JvOiAgICAgJ1R3aWcubG9naWMudHlwZS5tYWNybycsXG5cdCAgICAgICAgZW5kbWFjcm86ICAnVHdpZy5sb2dpYy50eXBlLmVuZG1hY3JvJyxcblx0ICAgICAgICBpbXBvcnRfOiAgICdUd2lnLmxvZ2ljLnR5cGUuaW1wb3J0Jyxcblx0ICAgICAgICBmcm9tOiAgICAgICdUd2lnLmxvZ2ljLnR5cGUuZnJvbScsXG5cdCAgICAgICAgZW1iZWQ6ICAgICAnVHdpZy5sb2dpYy50eXBlLmVtYmVkJyxcblx0ICAgICAgICBlbmRlbWJlZDogICdUd2lnLmxvZ2ljLnR5cGUuZW5kZW1iZWQnXG5cdCAgICB9O1xuXG5cblx0ICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGhhbmRsaW5nIGxvZ2ljIHRva2Vucy5cblx0ICAgIC8vXG5cdCAgICAvLyBQcm9wZXJ0aWVzOlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgdHlwZTogIFRoZSB0eXBlIG9mIGV4cHJlc3Npb24gdGhpcyBtYXRjaGVzXG5cdCAgICAvL1xuXHQgICAgLy8gICAgICByZWdleDogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtY
46184XRjaGVzIHRoZSBmb3JtYXQgb2YgdGhlIHRva2VuXG5cdCAgICAvL1xuXHQgICAgLy8gICAgICBuZXh0OiAgV2hhdCBsb2dpYyB0b2tlbnMgKGlmIGFueSkgcG9wIHRoaXMgdG9rZW4gb2ZmIHRoZSBsb2dpYyBzdGFjay4gSWYgZW1wdHksIHRoZVxuXHQgICAgLy8gICAgICAgICAgICAgbG9naWMgdG9rZW4gaXMgYXNzdW1lZCB0byBub3QgcmVxdWlyZSBhbiBlbmQgdGFnIGFuZCBpc24ndCBwdXNoIG9udG8gdGhlIHN0YWNrLlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgb3BlbjogIERvZXMgdGhpcyB0YWcgb3BlbiBhIGxvZ2ljIGV4cHJlc3Npb24gb3IgaXMgaXQgc3RhbmRhbG9uZS4gRm9yIGV4YW1wbGUsXG5cdCAgICAvLyAgICAgICAgICAgICB7JSBlbmRpZiAlfSBjYW5ub3QgZXhpc3Qgd2l0aG91dCBhbiBvcGVuaW5nIHslIGlmIC4uLiAlfSB0YWcsIHNvIG9wZW4gPSBmYWxzZS5cblx0ICAgIC8vXG5cdCAgICAvLyAgRnVuY3Rpb25zOlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgY29tcGlsZTogQSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgY29tcGlsaW5nIHRoZSB0b2tlbiBpbnRvIGFuIG91dHB1dCB0b2tlbiByZWFkeSBmb3Jcblx0ICAgIC8vICAgICAgICAgICAgICAgcGFyc2luZyB3aXRoIHRoZSBwYXJzZSBmdW5jdGlvbi5cblx0ICAgIC8vXG5cdCAgICAvLyAgICAgIHBhcnNlOiAgIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgdGhlIGNvbXBpbGVkIHRva2VuIGludG8gb3V0cHV0IChIVE1MIC8gd2hhdGV2ZXIgdGhlXG5cdCAgICAvLyAgICAgICAgICAgICAgIHRlbXBsYXRlIHJlcHJlc2VudHMpLlxuXHQgICAgVHdpZy5sb2dpYy5kZWZpbml0aW9ucyA9IFtcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBJZiB0eXBlIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgaWYgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmlmXyxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaWZcXHMrKFtcXHNcXFNdKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VfLFxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VpZixcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRpZlxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICAvLyBDb21waWxlIHRoZSBleHByZXNzaW9uLlxuXHQgICAgICAgICAgICAgICAgdG9rZW4uc3RhY2sgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFR3aWcubGliLmJvb2x2YWwocmVzdWx0KSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbiA9IGZhbHNlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhhdCwgW3Rva2VuLm91dHB1dCwgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFbHNlIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbHNlaWYgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVsc2VpZixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZWxzZWlmXFxzKyhbXlxcc10uKikkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VfLFxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VpZixcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRpZlxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiBmYWxzZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzFdO1xuXHQgICAgICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbi5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLnN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaGFpbiAmJiBUd2lnLmxpYi5ib29sdmFsKHJlc3VsdCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSBmYWxzZTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ob3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFbHNlIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbHNlaWYgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVsc2VfLFxuXHQgICAgICAgICAgICByZWdleDogL15lbHNlJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRpZixcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRmb3Jcblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2UsXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgcHJvbWlzZSA9IFR3aWcuUHJvbWlzZS5yZXNvbHZlKCcnKTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4ub3V0cHV0LCBjb250ZXh0XSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24ob3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRW5kIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbmRpZiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVuZGlmLFxuXHQgICAgICAgICAgICByZWdleDogL15lbmRpZiQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBGb3IgdHlwZSBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICBGb3JtYXQ6IHslIGZvciBleHByZXNzaW9uICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZm9yXyxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZm9yXFxzKyhbYS16QS1aMC05XyxcXHNdKylcXHMraW5cXHMrKFteXFxzXS4qPykoPzpcXHMraWZcXHMrKFteXFxzXS4qKSk/JC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbHNlXyxcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRmb3Jcblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5X3ZhbHVlID0gdG9rZW4ubWF0Y2hbMV0sXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzJdLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsID0gdG9rZW4ubWF0Y2hbM10sXG5cdCAgICAgICAgICAgICAgICAgICAga3Zfc3BsaXQgPSBudWxsO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5rZXlfdmFyID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlX3ZhciA9IG51bGw7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChrZXlfdmFsdWUuaW5kZXhPZihcIixcIikgPj0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGt2X3NwbGl0ID0ga2V5X3ZhbHVlLnNwbGl0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGt2X3NwbGl0Lmxlbmd0aCA9PT0gMikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5rZXlfdmFyID0ga3Zfc3BsaXRbMF0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZV92YXIgPSBrdl9zcGxpdFsxXS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJJbnZhbGlkIGV4cHJlc3Npb24gaW4gZm9yIGxvb3A6IFwiICsga2V5X3ZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlX3ZhciA9IGtleV92YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gVmFsaWQgZXhwcmVzc2lvbnMgZm9yIGEgZm9yIGxvb3Bcblx0ICAgICAgICAgICAgICAgIC8vICAgZm9yIGl0ZW0gICAgIGluIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgIC8vICAgZm9yIGtleSxpdGVtIGluIGV4cHJlc3Npb25cblxuXHQgICAgICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbi5cblx0ICAgICAgICAgICAgICAgIHRva2VuLmV4cHJlc3Npb24gPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGNvbmRpdGlvbmFsIChpZiBhdmFpbGFibGUpXG5cdCAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uYWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbi5jb25kaXRpb25hbCA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uYWxcblx0ICAgICAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY29udGludWVfY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIFBhcnNlIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXSxcblx0ICAgICAgICAgICAgICAgICAgICBsZW4sXG5cdCAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwLFxuXHQgICAgICAgICAgICAgICAgICAgIGtleXNldCxcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCA9IHRva2VuLmNvbmRpdGlvbmFsLFxuXHQgICAgICAgICAgICAgICAgICAgIGJ1aWxkTG9vcCA9IGZ1bmN0aW9uKGluZGV4LCBsZW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29uZGl0aW9uYWwgPSBjb25kaXRpb25hbCAhPT0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KzEsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDA6IGluZGV4LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aW5kZXg6IGlzQ29uZGl0aW9uYWw/dW5kZWZpbmVkOmxlbi1pbmRleCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmluZGV4MDogaXNDb25kaXRpb25hbD91bmRlZmluZWQ6bGVuLWluZGV4LTEsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdDogKGluZGV4ID09PSAwKSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IGlzQ29uZGl0aW9uYWw/dW5kZWZpbmVkOihpbmRleCA9PT0gbGVuLTEpLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBpc0NvbmRpdGlvbmFsP3VuZGVmaW5lZDpsZW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNvbnRleHRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbmNlIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcFxuXHQgICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbm5lcl9jb250ZXh0ID0gVHdpZy5DaGlsZENvbnRleHQoY29udGV4dCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJfY29udGV4dFt0b2tlbi52YWx1ZV92YXJdID0gdmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLmtleV92YXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyX2NvbnRleHRbdG9rZW4ua2V5X3Zhcl0gPSBrZXk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgI
46184H1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29wIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9jb250ZXh0Lmxvb3AgPSBidWlsZExvb3AoaW5kZXgsIGxlbik7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBjb25kaXRpb25hbCA9PT0gdW5kZWZpbmVkID9cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aWcuUHJvbWlzZS5yZXNvbHZlKHRydWUpIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFtjb25kaXRpb25hbCwgaW5uZXJfY29udGV4dF0pO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbihjb25kaXRpb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcucGFyc2VBc3luYy5hcHBseSh0aGF0LCBbdG9rZW4ub3V0cHV0LCBpbm5lcl9jb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChvKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGxvb3AtcmVsYXRlZCB2YXJpYWJsZXMgZnJvbSB0aGUgY29udGV4dFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGlubmVyX2NvbnRleHRbJ2xvb3AnXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbm5lcl9jb250ZXh0W3Rva2VuLnZhbHVlX3Zhcl07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5uZXJfY29udGV4dFt0b2tlbi5rZXlfdmFyXTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVyZ2UgaW4gdmFsdWVzIHRoYXQgZXhpc3QgaW4gY29udGV4dCBidXQgaGF2ZSBjaGFuZ2VkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBpbm5lcl9jb250ZXh0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpZy5tZXJnZShjb250ZXh0LCBpbm5lcl9jb250ZXh0LCB0cnVlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLmV4cHJlc3Npb24sIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKCdBcnJheScsIHJlc3VsdCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVzdWx0Lmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgVHdpZy5hc3luYy5mb3JFYWNoKHJlc3VsdCwgZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIga2V5ID0gaW5kZXg7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29wKGtleSwgdmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKCdPYmplY3QnLCByZXN1bHQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuX2tleXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c2V0ID0gcmVzdWx0Ll9rZXlzO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c2V0ID0gT2JqZWN0LmtleXMocmVzdWx0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBrZXlzZXQubGVuZ3RoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBUd2lnLmZvckVhY2goa2V5c2V0LCBmdW5jdGlvbihrZXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgX2tleXMgcHJvcGVydHksIGl0J3MgaW50ZXJuYWwgdG8gdHdpZy5qc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfa2V5c1wiKSByZXR1cm47XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Aoa2V5LCAgcmVzdWx0W2tleV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFsbG93IGVsc2Ugc3RhdGVtZW50cyBpZiBubyBvdXRwdXQgd2FzIGdlbmVyYXRlZFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlX2NoYWluID0gKG91dHB1dC5sZW5ndGggPT09IDApO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNvbnRpbnVlX2NoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IFR3aWcub3V0cHV0LmFwcGx5KHRoYXQsIFtvdXRwdXRdKVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRW5kIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbmRpZiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVuZGZvcixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZW5kZm9yJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIFNldCB0eXBlIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgc2V0IGtleSA9IGV4cHJlc3Npb24gJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcubG9naWMudHlwZS5zZXQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXnNldFxccysoW2EtekEtWjAtOV8sXFxzXSspXFxzKj1cXHMqKFtcXHNcXFNdKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0b2tlbi5tYXRjaFsxXS50cmltKCksXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzJdLFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24uXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl9zdGFjayAgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLmtleSA9IGtleTtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmV4cHJlc3Npb24gPSBleHByZXNzaW9uX3N0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNvbnRpbnVlX2NoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5ID0gdG9rZW4ua2V5O1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLmV4cHJlc3Npb24sIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLyogIElmIHN0b3JpbmcgdGhlIGNvbnRleHQgaW4gYSB2YXJpYWJsZSwgaXQgbmVlZHMgdG8gYmUgYSBjbG9uZSBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiBjb250ZXh0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIHdlIGhhdmUgYSBjb250ZXh0IHdpdGggaW5maW5pdGUgcmVjdXJzaW9uLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZXMgIzM0MVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFR3aWcubGliLmNvcHkodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IHZhbHVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNvbnRpbnVlX2NoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBTZXQgY2FwdHVyZSB0eXBlIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgc2V0IGtleSAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLnNldGNhcHR1cmUsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXnNldFxccysoW2EtekEtWjAtOV8sXFxzXSspJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRzZXRcblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5ID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5rZXkgPSBrZXk7XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY29udGludWVfY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBrZXkgPSB0b2tlbi5rZXk7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLm91dHB1dCwgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbiBib3RoIHRoZSBnbG9iYWwgYW5kIGxvY2FsIGNvbnRleHRcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0LmNvbnRleHRba2V5XSA9IHZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IHZhbHVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNvbnRpbnVlX2NoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFbmQgc2V0IHR5cGUgYmxvY2sgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbmRzZXQgJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcubG9naWMudHlwZS5lbmRzZXQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXmVuZHNldCQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBGaWx0ZXIgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBmaWx0ZXIgdXBwZXIgJX0gb3IgeyUgZmlsdGVyIGxvd2VyfGVzY2FwZSAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmZpbHRlcixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZmlsdGVyXFxzKyguKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVuZGZpbHRlclxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gXCJ8XCIgKyB0b2tlbi5tYXRjaFsxXS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAvLyBDb21waWxlIHRoZSBleHByZXNzaW9uLlxuXHQgICAgICAgICAgICAgICAgdG9rZW4uc3RhY2sgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odW5maWx0ZXJlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZmlsdGVyZWRcblx0ICAgICAgICAgICAgICAgICAgICB9XS5jb25jYXQodG9rZW4uc3RhY2spO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFtzdGFjaywgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXRcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRW5kIGZpbHRlciBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICBGb3JtYXQ6IHslIGVuZGZpbHRlciAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVuZGZpbHRlcixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZW5kZmlsdGVyJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEJsb2NrIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgYmxvY2sgdGl0bGUgJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgI
46184HR5cGU6IFR3aWcubG9naWMudHlwZS5ibG9jayxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eYmxvY2tcXHMrKFthLXpBLVowLTlfXSspJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRibG9ja1xuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmJsb2NrID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrX291dHB1dCxcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcuUHJvbWlzZS5yZXNvbHZlKCksXG5cdCAgICAgICAgICAgICAgICAgICAgaXNJbXBvcnRlZCA9IFR3aWcuaW5kZXhPZih0aGlzLmltcG9ydGVkQmxvY2tzLCB0b2tlbi5ibG9jaykgPiAtMSxcblx0ICAgICAgICAgICAgICAgICAgICBoYXNQYXJlbnQgPSB0aGlzLmJsb2Nrc1t0b2tlbi5ibG9ja10gJiYgVHdpZy5pbmRleE9mKHRoaXMuYmxvY2tzW3Rva2VuLmJsb2NrXSwgVHdpZy5wbGFjZWhvbGRlcnMucGFyZW50KSA+IC0xO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBEb24ndCBvdmVycmlkZSBwcmV2aW91cyBibG9ja3MgdW5sZXNzIHRoZXkncmUgaW1wb3J0ZWQgd2l0aCBcInVzZVwiXG5cdCAgICAgICAgICAgICAgICAvLyBMb29wcyBzaG91bGQgYmUgZXhlbXB0ZWQgYXMgd2VsbC5cblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmJsb2Nrc1t0b2tlbi5ibG9ja10gPT09IHVuZGVmaW5lZCB8fCBpc0ltcG9ydGVkIHx8IGhhc1BhcmVudCB8fCBjb250ZXh0Lmxvb3AgfHwgdG9rZW4ub3ZlcndyaXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gVHdpZy5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGJsb2NrX291dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbXBvcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSB0aGUgYmxvY2sgaXMgb3ZlcnJpZGRlbiwgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmltcG9ydGVkQmxvY2tzLnNwbGljZSh0aGF0LmltcG9ydGVkQmxvY2tzLmluZGV4T2YodG9rZW4uYmxvY2spLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuYmxvY2tzW3Rva2VuLmJsb2NrXSA9IFR3aWcuTWFya3VwKHRoYXQuYmxvY2tzW3Rva2VuLmJsb2NrXS5yZXBsYWNlKFR3aWcucGxhY2Vob2xkZXJzLnBhcmVudCwgYmxvY2tfb3V0cHV0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmJsb2Nrc1t0b2tlbi5ibG9ja10gPSBibG9ja19vdXRwdXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9yaWdpbmFsQmxvY2tUb2tlbnNbdG9rZW4uYmxvY2tdID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW4udHlwZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiB0b2tlbi5ibG9jayxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogdG9rZW4ub3V0cHV0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgI
46184HJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSBjaGlsZCBibG9jayBoYXMgYmVlbiBzZXQgZnJvbSBhIHRlbXBsYXRlIGV4dGVuZGluZyB0aGlzIG9uZS5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5jaGlsZC5ibG9ja3NbdG9rZW4uYmxvY2tdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHRoYXQuY2hpbGQuYmxvY2tzW3Rva2VuLmJsb2NrXTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGF0LmJsb2Nrc1t0b2tlbi5ibG9ja107XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQmxvY2sgc2hvcnRoYW5kIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgYmxvY2sgdGl0bGUgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLnNob3J0YmxvY2ssXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXmJsb2NrXFxzKyhbYS16QS1aMC05X10rKVxccysoLispJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5leHByZXNzaW9uID0gdG9rZW4ubWF0Y2hbMl0udHJpbSgpO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5vdXRwdXQgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZSh7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdG9rZW4uZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLmJsb2NrID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcubG9naWMuaGFuZGxlcltUd2lnLmxvZ2ljLnR5cGUuYmxvY2tdLnBhcnNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEVuZCBibG9jayBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICBGb3JtYXQ6IHslIGVuZGJsb2NrICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZW5kYmxvY2ssXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXmVuZGJsb2NrKD86XFxzKyhbYS16QS1aMC05X10rKSk/JC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEJsb2NrIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgZXh0ZW5kcyBcInRlbXBsYXRlLnR3aWdcIiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmV4dGVuZHNfLFxuXHQgICAgICAgICAgICByZWdleDogL15leHRlbmRzXFxzKyguKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayAgID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0ID0gVHdpZy5DaGlsZENvbnRleHQoY29udGV4dCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgZmlsZW5hbWVcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZmlsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNldCBwYXJlbnQgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0LmV4dGVuZCA9IGZpbGU7XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFR3aWcuVGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBmaWxlO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydCBmaWxlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhhdC5pbXBvcnRGaWxlKGZpbGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgdGVtcGxhdGUgaW4gY2FzZSBpdCBwdXRzIGFueXRoaW5nIGluIGl0cyBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlckFzeW5jKGlubmVyQ29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBwYXJlbnQgY29udGV4dCB3aXRoIHRoZSBleHRlbmRlZCBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5saWIuZXh0ZW5kKGNvbnRleHQsIGlubmVyQ29udGV4dCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogJydcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEJsb2NrIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgdXNlIFwidGVtcGxhdGUudHdpZ1wiICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUudXNlLFxuXHQgICAgICAgICAgICByZWdleDogL151c2VcXHMrKC4rKSQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IHRydWUsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0b2tlbi5tYXRjaFsxXS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgZmlsZW5hbWVcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZmlsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgICAgICB0aGF0LmltcG9ydEJsb2NrcyhmaWxlKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAnJ1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQmxvY2sgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBpbmNsdWRlcyBcInRlbXBsYXRlLnR3aWdcIiBbd2l0aCB7c29tZTogJ3ZhbHVlcyd9IG9ubHldICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuaW5jbHVkZSxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaW5jbHVkZVxccysoLis/KSg/Olxcc3wkKShpZ25vcmUgbWlzc2luZyg/Olxcc3wkKSk/KD86d2l0aFxccysoW1xcU1xcc10rPykpPyg/Olxcc3wkKShvbmx5KT8kLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHRva2VuLm1hdGNoLFxuXHQgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBtYXRjaFsxXS50cmltKCksXG5cdCAgICAgICAgICAgICAgICAgICAgaWdub3JlTWlzc2luZyA9IG1hdGNoWzJdICE9PSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgICAgICAgICAgd2l0aENvbnRleHQgPSBtYXRjaFszXSxcblx0ICAgICAgICAgICAgICAgICAgICBvbmx5ID0gKChtYXRjaFs0XSAhPT0gdW5kZWZpbmVkKSAmJiBtYXRjaFs0XS5sZW5ndGgpO1xuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLm9ubHkgPSBvbmx5O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uaWdub3JlTWlzc2luZyA9IGlnbm9yZU1pc3Npbmc7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAod2l0aENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuLndpdGhTdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2l0aENvbnRleHQudHJpbSgpXG5cdCAgICAgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIGZpbGVuYW1lXG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgaW5uZXJDb250ZXh0ID0ge30sXG5cdCAgICAgICAgICAgICAgICAgICAgaSxcblx0ICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gVHdpZy5Qcm9taXNlLnJlc29sdmUoKTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKCF0b2tlbi5vbmx5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0ID0gVHdpZy5DaGlsZENvbnRleHQoY29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi53aXRoU3RhY2sgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4ud2l0aFN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih3aXRoQ29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gd2l0aENvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXRoQ29udGV4dC5oYXNPd25Qcm9wZXJ0eShpKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRleHRbaV0gPSB3aXRoQ29udGV4dFtpXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt0b2tlbi5zdGFjaywgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFR3aWcuVGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBmaWxlO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydCBmaWxlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuaW1wb3J0RmlsZShmaWxlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uaWdub3JlTWlzc2luZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlckFzeW5jKGlubmVyQ29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ob3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuc3BhY2VsZXNzLFxuXHQgICAgICAgICAgICByZWdleDogL15zcGFjZWxlc3MkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVuZHNwYWNlbGVzc1xuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXG5cdCAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBodG1sIGFuZCByZXR1cm4gaXQgd2l0aG91dCBhbnkgc3BhY2VzIGJldHdlZW4gdGFnc1xuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG91dHB1dCB3aXRob3V0IGFueSBmaWx0ZXJcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLm91dHB1dCwgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih1bmZpbHRlcmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIC8vIEEgcmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQgY2xvc2luZyBhbmQgb3BlbmluZyB0YWdzIHdpdGggc3BhY2VzIGJldHdlZW4gdGhlbVxuXHQgICAgICAgICAgICAgICAgICAgICAgICByQmV0d2VlblRhZ1NwYWNlcyA9IC8+XFxzKzwvZyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhbGwgc3BhY2UgYmV0d2VlbiBjbG9zaW5nIGFuZCBvcGVuaW5nIGh0bWwgdGFnc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bmZpbHRlcmVkLnJlcGxhY2UockJldHdlZW5UYWdTcGFjZXMsJz48JykudHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXdyYXAgb3V0cHV0IGFzIGEgVHdpZy5NYXJrdXBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gVHdpZy5NYXJrdXAob3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIEFkZCB0aGUgeyUgZW5kc3BhY2VsZXNzICV9IHRva2VuXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eX
46184BlOiBUd2lnLmxvZ2ljLnR5cGUuZW5kc3BhY2VsZXNzLFxuXHQgICAgICAgICAgICByZWdleDogL15lbmRzcGFjZWxlc3MkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogTWFjcm8gbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBGb3JtYXQ6IHslIG1hcm8gaW5wdXQobmFtZSwgdmFsdWUsIHR5cGUsIHNpemUpICV9XG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUubWFjcm8sXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXm1hY3JvXFxzKyhbYS16QS1aMC05X10rKVxccypcXChcXHMqKCg/OlthLXpBLVowLTlfXSsoPzosXFxzKik/KSopXFxzKlxcKSQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbXG5cdCAgICAgICAgICAgICAgICBUd2lnLmxvZ2ljLnR5cGUuZW5kbWFjcm9cblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFjcm9OYW1lID0gdG9rZW4ubWF0Y2hbMV0sXG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IHRva2VuLm1hdGNoWzJdLnNwbGl0KC9bXFxzLF0rLyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vVE9ETzogQ2xlYW4gdXAgZHVwbGljYXRlIGNoZWNrXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxwYXJhbWV0ZXJzLmxlbmd0aDsgaisrKXtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnNbaV0gPT09IHBhcmFtZXRlcnNbal0gJiYgaSAhPT0gaikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJEdXBsaWNhdGUgYXJndW1lbnRzIGZvciBwYXJhbWV0ZXI6IFwiKyBwYXJhbWV0ZXJzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdG9rZW4ubWFjcm9OYW1lID0gbWFjcm9OYW1lO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4ucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHRoaXM7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm1hY3Jvc1t0b2tlbi5tYWNyb05hbWVdID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBnbG9iYWwgY29udGV4dCBhbmQgb3RoZXIgbWFjcm9zXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG1hY3JvQ29udGV4dCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGY6IHRlbXBsYXRlLm1hY3Jvc1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcGFyYW1ldGVycyBmcm9tIGNvbnRleHQgdG8gbWFjcm9Db250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRva2VuLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3AgPSB0b2tlbi5wYXJhbWV0ZXJzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgYXJndW1lbnRzW2ldICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9Db250ZXh0W3Byb3BdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9Db250ZXh0W3Byb3BdID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcucGFyc2VBc3luYy5hcHBseSh0ZW1wbGF0ZSwgW3Rva2VuLm91dHB1dCwgbWFjcm9Db250ZXh0XSk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICcnXG5cdCAgICAgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEVuZCBtYWNybyBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEZvcm1hdDogeyUgZW5kbWFjcm8gJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZW5kbWFjcm8sXG5cdCAgICAgICAgICAgICByZWdleDogL15lbmRtYWNybyQvLFxuXHQgICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLypcblx0ICAgICAgICAgICAgKiBpbXBvcnQgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICogRm9ybWF0OiB7JSBpbXBvcnQgXCJ0ZW1wbGF0ZS50d2lnXCIgYXMgZm9ybSAlfVxuXHQgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuaW1wb3J0Xyxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaW1wb3J0XFxzKyguKylcXHMrYXNcXHMrKFthLXpBLVowLTlfXSspJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzFdLnRyaW0oKSxcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSA9IHRva2VuLm1hdGNoWzJdLnRyaW0oKTtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4uZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5jb250ZXh0TmFtZSA9IGNvbnRleHROYW1lO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0geyBjaGFpbjogY2hhaW4sIG91dHB1dDogJycgfTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24gPT09ICdfc2VsZicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Rva2VuLmNvbnRleHROYW1lXSA9IHRoaXMubWFjcm9zO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLlByb21pc2UucmVzb2x2ZShvdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLnN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5pbXBvcnRGaWxlKGZpbGUgfHwgdG9rZW4uZXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Rva2VuLmNvbnRleHROYW1lXSA9IHRlbXBsYXRlLnJlbmRlckFzeW5jKHt9LCB7b3V0cHV0OiAnbWFjcm9zJ30pO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qXG5cdCAgICAgICAgICAgICogZnJvbSBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgKiBGb3JtYXQ6IHslIGZyb20gXCJ0ZW1wbGF0ZS50d2lnXCIgaW1wb3J0IGZ1bmMgYXMgZm9ybSAlfVxuXHQgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZnJvbSxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZnJvbVxccysoLispXFxzK2ltcG9ydFxccysoW2EtekEtWjAtOV8sIF0rKSQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IHRydWUsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0b2tlbi5tYXRjaFsxXS50cmltKCksXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9FeHByZXNzaW9ucyA9IHRva2VuLm1hdGNoWzJdLnRyaW0oKS5zcGxpdCgvXFxzKixcXHMqLyksXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9OYW1lcyA9IHt9O1xuXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bWFjcm9FeHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBtYWNyb0V4cHJlc3Npb25zW2ldO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggZnVuY3Rpb24gYXMgdmFyaWFibGVcblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbWFjcm9NYXRjaCA9IHJlcy5tYXRjaCgvXihbYS16QS1aMC05X10rKVxccythc1xccysoW2EtekEtWjAtOV9dKykkLyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3JvTWF0Y2gpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9OYW1lc1ttYWNyb01hdGNoWzFdLnRyaW0oKV0gPSBtYWNyb01hdGNoWzJdLnRyaW0oKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzLm1hdGNoKC9eKFthLXpBLVowLTlfXSspJC8pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvTmFtZXNbcmVzXSA9IHJlcztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbXBvcnRcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICAgICAgICAgIHRva2VuLm1hY3JvTmFtZXMgPSBtYWNyb05hbWVzO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcuUHJvbWlzZS5yZXNvbHZlKHRoaXMubWFjcm9zKTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24gIT09IFwiX3NlbGZcIikge1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuaW1wb3J0RmlsZShmaWxlIHx8IHRva2VuLmV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlckFzeW5jKHt9LCB7b3V0cHV0OiAnbWFjcm9zJ30pO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obWFjcm9zKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWFjcm9OYW1lIGluIHRva2VuLm1hY3JvTmFtZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3Jvcy5oYXNPd25Qcm9wZXJ0eShtYWNyb05hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Rva2VuLm1hY3JvTmFtZXNbbWFjcm9OYW1lXV0gPSBtYWNyb3NbbWFjcm9OYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAnJ1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBUaGUgZW1iZWQgdGFnIGNvbWJpbmVzIHRoZSBiZWhhdmlvdXIgb2YgaW5jbHVkZSBhbmQgZXh0ZW5kcy5cblx0ICAgICAgICAgICAgICogSXQgYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFub3RoZXIgdGVtcGxhdGUncyBjb250ZW50cywganVzdCBsaWtlIGluY2x1ZGUgZG9lcy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgZW1iZWQgXCJ0ZW1wbGF0ZS50d2lnXCIgW3dpdGgge3NvbWU6ICd2YWx1ZXMnfSBvbmx5XSAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVtYmVkLFxuXHQgICAgICAgICAgICByZWdleDogL15lbWJlZFxccysoLis/KSg/Olxcc3wkKShpZ25vcmUgbWlzc2luZyg/Olxcc3wkKSk/KD86d2l0aFxccysoW1xcU1xcc10rPykpPyg/Olxcc3wkKShvbmx5KT8kLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVuZGVtYmVkXG5cdCAgICAgICAgICAgIF0sXG5cdCAgICAgICAgICAgIG9wZW46IHRydWUsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gdG9rZW4ubWF0Y2gsXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG1hdGNoWzFdLnRyaW0oKSxcblx0ICAgICAgICAgICAgICAgICAgICBpZ25vcmVNaXNzaW5nID0gbWF0Y2hbMl0gIT09IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgICAgICB3aXRoQ29udGV4dCA9IG1hdGNoWzNdLFxuXHQgICAgICAgICAgICAgICAgICAgIG9ubHkgPSAoKG1hdGNoWzRdICE9PSB1bmRlZmluZWQpICYmIG1hdGNoWzRdLmxlbmd0aCk7XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4ub25seSA9IG9ubHk7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5pZ25vcmVNaXNzaW5nID0gaWdub3JlTWlzc2luZztcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4uc3RhY2sgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIGlmICh3aXRoQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4ud2l0aFN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIFR3aWcuZXhwcmVzc2lvbi50eXBlLmV4cHJlc3Npb24sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB3aXRoQ29udGV4dC50cmltKClcblx0ICAgICAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgZmlsZW5hbWVcblx0ICAgICAgICAgICAgICAgIHZhciBpbm5lckNvbnRleHQgPSB7fSxcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBpLFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBUd2lnLlByb21pc2UucmVzb2x2ZSgpO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoIXRva2VuLm9ubHkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShpKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29udGV4dFtpXSA9IGNvbnRleHRbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4ud2l0aFN0YWNrICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLndpdGhTdGFjaywgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24od2l0aENvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIHdpdGhDb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2l0aENvbnRleHQuaGFzT3duUHJvcGVydHkoaSkpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0W2ldID0gd2l0aENvbnRleHRbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgI
46184H1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhhdCwgW3Rva2VuLnN0YWNrLCBpbm5lckNvbnRleHRdKTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihmaWxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBUd2lnLlRlbXBsYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZmlsZTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbXBvcnQgZmlsZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0LmltcG9ydEZpbGUoZmlsZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLmlnbm9yZU1pc3NpbmcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHByZXZpb3VzIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgICAgIHRoYXQuYmxvY2tzID0ge307XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB0b2tlbnMuIG91dHB1dCB3aWxsIGJlIG5vdCB1c2VkXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcucGFyc2VBc3luYy5hcHBseSh0aGF0LCBbdG9rZW4ub3V0cHV0LCBpbm5lckNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIgdGVtcGFsdGUgd2l0aCBibG9ja3MgZGVmaW5lZCBpbiBlbWJlZCBibG9ja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVuZGVyQXN5bmMoaW5uZXJDb250ZXh0LCB7J2Jsb2Nrcyc6dGhhdC5ibG9ja3N9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvKiBBZGQgdGhlIHslIGVuZGVtYmVkICV9IHRva2VuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcubG9naWMudHlwZS5lbmRlbWJlZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZW5kZW1iZWQkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiBmYWxzZVxuXHQgICAgICAgIH1cblxuXHQgICAgXTtcblxuXG5cdCAgICAvKipcblx0ICAgICAqIFJlZ2lzdHJ5IGZvciBsb2dpYyBoYW5kbGVycy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy5oYW5kbGVyID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogRGVmaW5lIGEgbmV3IHRva2VuIHR5cGUsIGF2YWlsYWJsZSBhdCBUd2lnLmxvZ2ljLnR5cGUue3R5cGV9XG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9naWMuZXh0ZW5kVHlwZSA9IGZ1bmN0aW9uICh0eXBlLCB2YWx1ZSkge1xuXHQgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgKFwiVHdpZy5sb2dpYy50eXBlXCIgKyB0eXBlKTtcblx0ICAgICAgICBUd2lnLmxvZ2ljLnR5cGVbdHlwZV0gPSB2YWx1ZTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogRXh0ZW5kIHRoZSBsb2dpYyBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIG5ldyB0b2tlbiBkZWZpbml0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIC8vIERlZmluZSBhIG5ldyB0YWdcblx0ICAgICAqIFR3aWcubG9naWMuZXh0ZW5kKHtcblx0ICAgICAqICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUue3R5cGV9LFxuXHQgICAgICogICAgIC8vIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGZvciB0aGlzIHRva2VuXG5cdCAgICAgKiAgICAgcmVnZXg6IC4uLixcblx0ICAgICAqICAgICAvLyBXaGF0IHRva2VuIHR5cGVzIGNhbiBmb2xsb3cgdGhpcyB0b2tlbiwgbGVhdmUgYmxhbmsgaWYgYW55LlxuXHQgICAgICogICAgIG5leHQ6IFsgLi4uIF1cblx0ICAgICAqICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSB0b2tlblxuXHQgICAgICogICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuKSB7IC4uLiB9XG5cdCAgICAgKiAgICAgLy8gUGFyc2UgdGhlIGNvbXBpbGVkIHRva2VuIHdpdGggdGhlIGNvbnRleHQgcHJvdmlkZWQgYnkgdGhlIHJlbmRlciBjYWxsXG5cdCAgICAgKiAgICAgLy8gICBhbmQgd2hldGhlciB0aGlzIHRva2VuIGNoYWluIGlzIGNvbXBsZXRlLlxuXHQgICAgICogICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgY29udGV4dCwgY2hhaW4pIHsgLi4uIH1cblx0ICAgICAqIH0pO1xuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZpbml0aW9uIFRoZSBuZXcgbG9naWMgZXhwcmVzc2lvbi5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy5leHRlbmQgPSBmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuXG5cdCAgICAgICAgaWYgKCFkZWZpbml0aW9uLnR5cGUpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmFibGUgdG8gZXh0ZW5kIGxvZ2ljIGRlZmluaXRpb24uIE5vIHR5cGUgcHJvdmlkZWQgZm9yIFwiICsgZGVmaW5pdGlvbik7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgVHdpZy5sb2dpYy5leHRlbmRUeXBlKGRlZmluaXRpb24udHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIFR3aWcubG9naWMuaGFuZGxlcltkZWZpbml0aW9uLnR5cGVdID0gZGVmaW5pdGlvbjtcblx0ICAgIH07XG5cblx0ICAgIC8vIEV4dGVuZCB3aXRoIGJ1aWx0LWluIGV4cHJlc3Npb25zXG5cdCAgICB3aGlsZSAoVHdpZy5sb2dpYy5kZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgVHdpZy5sb2dpYy5leHRlbmQoVHdpZy5sb2dpYy5kZWZpbml0aW9ucy5zaGlmdCgpKTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBDb21waWxlIGEgbG9naWMgdG9rZW4gaW50byBhbiBvYmplY3QgcmVhZHkgZm9yIHBhcnNpbmcuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHJhd190b2tlbiBBbiB1bmNvbXBpbGVkIGxvZ2ljIHRva2VuLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge09iamVjdH0gQSBjb21waWxlZCBsb2dpYyB0b2tlbiwgcmVhZHkgZm9yIHBhcnNpbmcuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9naWMuY29tcGlsZSA9IGZ1bmN0aW9uIChyYXdfdG9rZW4pIHtcblx0ICAgICAgICB2Y
46184XIgZXhwcmVzc2lvbiA9IHJhd190b2tlbi52YWx1ZS50cmltKCksXG5cdCAgICAgICAgICAgIHRva2VuID0gVHdpZy5sb2dpYy50b2tlbml6ZS5hcHBseSh0aGlzLCBbZXhwcmVzc2lvbl0pLFxuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZSA9IFR3aWcubG9naWMuaGFuZGxlclt0b2tlbi50eXBlXTtcblxuXHQgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0b2tlbiBuZWVkcyBjb21waWxpbmdcblx0ICAgICAgICBpZiAodG9rZW5fdGVtcGxhdGUuY29tcGlsZSkge1xuXHQgICAgICAgICAgICB0b2tlbiA9IHRva2VuX3RlbXBsYXRlLmNvbXBpbGUuYXBwbHkodGhpcywgW3Rva2VuXSk7XG5cdCAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5sb2dpYy5jb21waWxlOiBcIiwgXCJDb21waWxlZCBsb2dpYyB0b2tlbiB0byBcIiwgdG9rZW4pO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogVG9rZW5pemUgbG9naWMgZXhwcmVzc2lvbnMuIFRoaXMgZnVuY3Rpb24gbWF0Y2hlcyB0b2tlbiBleHByZXNzaW9ucyBhZ2FpbnN0IHJlZ3VsYXJcblx0ICAgICAqIGV4cHJlc3Npb25zIHByb3ZpZGVkIGluIHRva2VuIGRlZmluaXRpb25zIHByb3ZpZGVkIHdpdGggVHdpZy5sb2dpYy5leHRlbmQuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gdGhlIGxvZ2ljIHRva2VuIGV4cHJlc3Npb24gdG8gdG9rZW5pemVcblx0ICAgICAqICAgICAgICAgICAgICAgIChpLmUuIHdoYXQncyBiZXR3ZWVuIHslIGFuZCAlfSlcblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBtYXRjaGVkIHRva2VuIHdpdGggdHlwZSBzZXQgdG8gdGhlIHRva2VuIHR5cGUgYW5kIG1hdGNoIHRvIHRoZSByZWdleCBtYXRjaC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy50b2tlbml6ZSA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0ge30sXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlX3R5cGUgPSBudWxsLFxuXHQgICAgICAgICAgICB0b2tlbl90eXBlID0gbnVsbCxcblx0ICAgICAgICAgICAgdG9rZW5fcmVnZXggPSBudWxsLFxuXHQgICAgICAgICAgICByZWdleF9hcnJheSA9IG51bGwsXG5cdCAgICAgICAgICAgIHJlZ2V4ID0gbnVsbCxcblx0ICAgICAgICAgICAgbWF0Y2ggPSBudWxsO1xuXG5cdCAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2UgYXJvdW5kIGV4cHJlc3Npb25zLlxuXHQgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnRyaW0oKTtcblxuXHQgICAgICAgIGZvciAodG9rZW5fdGVtcGxhdGVfdHlwZSBpbiBUd2lnLmxvZ2ljLmhhbmRsZXIpIHtcblx0ICAgICAgICAgICAgaWYgKFR3aWcubG9naWMuaGFuZGxlci5oYXNPd25Qcm9wZXJ0eSh0b2tlbl90ZW1wbGF0ZV90eXBlKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0eXBlIGFuZCByZWdleCBmb3IgdGhpcyB0ZW1wbGF0ZSB0eXBlXG5cdCAgICAgICAgICAgICAgICB0b2tlbl90eXBlID0gVHdpZy5sb2dpYy5oYW5kbGVyW3Rva2VuX3RlbXBsYXRlX3R5cGVdLnR5cGU7XG5cdCAgICAgICAgICAgICAgICB0b2tlbl9yZWdleCA9IFR3aWcubG9naWMuaGFuZGxlclt0b2tlbl90ZW1wbGF0ZV90eXBlXS5yZWdleDtcblxuXHQgICAgICAgICAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgcGVyIHR5cGUuXG5cdCAgICAgICAgICAgICAgICByZWdleF9hcnJheSA9IFtdO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuX3JlZ2V4IGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleF9hcnJheSA9IHRva2VuX3JlZ2V4O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleF9hcnJheS5wdXNoKHRva2VuX3JlZ2V4KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgZGVmaW5pdGlvbi5cblx0ICAgICAgICAgICAgICAgIHdoaWxlIChyZWdleF9hcnJheS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVnZXggPSByZWdleF9hcnJheS5zaGlmdCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhleHByZXNzaW9uLnRyaW0oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgID0gdG9rZW5fdHlwZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4ubWF0Y2ggPSBtYXRjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmxvZ2ljLnRva2VuaXplOiBcIiwgXCJNYXRjaGVkIGEgXCIsIHRva2VuX3R5cGUsIFwiIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBcIiwgbWF0Y2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gTm8gcmVnZXggbWF0Y2hlc1xuXHQgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiVW5hYmxlIHRvIHBhcnNlICdcIiArIGV4cHJlc3Npb24udHJpbSgpICsgXCInXCIpO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQYXJzZSBhIGxvZ2ljIHRva2VuIHdpdGhpbiBhIGdpdmVuIGNvbnRleHQuXG5cdCAgICAgKlxuXHQgICAgICogV2hhdCBhcmUgbG9naWMgY2hhaW5zP1xuXHQgICAgICogICAgICBMb2dpYyBjaGFpbnMgcmVwcmVzZW50IGEgc2VyaWVzIG9mIHRva2VucyB0aGF0IGFyZSBjb25uZWN0ZWQsXG5cdCAgICAgKiAgICAgICAgICBmb3IgZXhhbXBsZTpcblx0ICAgICAqICAgICAgICAgIHslIGlmIC4uLiAlfSB7JSBlbHNlICV9IHslIGVuZGlmICV9XG5cdCAgICAgKlxuXHQgICAgICogICAgICBUaGUgY2hhaW4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2lnbmlmeSBpZiBhIGNoYWluIGlzIG9wZW4gb2YgY2xvc2VkLlxuXHQgICAgICogICAgICBvcGVuOlxuXHQgICAgICogICAgICAgICAgTW9yZSB0b2tlbnMgaW4gdGhpcyBjaGFpbiBzaG91bGQgYmUgcGFyc2VkLlxuXHQgICAgICogICAgICBjbG9zZWQ6XG5cdCAgICAgKiAgICAgICAgICBUaGlzIHRva2VuIGNoYWluIGhhcyBjb21wbGV0ZWQgcGFyc2luZyBhbmQgYW55IGFkZGl0aW9uYWxcblx0ICAgICAqICAgICAgICAgI
46184HRva2VucyAoZWxzZSwgZWxzZWlmLCBldGMuLi4pIHNob3VsZCBiZSBpZ25vcmVkLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBUaGUgY29tcGlsZWQgdG9rZW4uXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgcmVuZGVyIGNvbnRleHQuXG5cdCAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoYWluIElzIHRoaXMgYW4gb3BlbiBsb2dpYyBjaGFpbi4gSWYgZmFsc2UsIHRoYXQgbWVhbnMgYVxuXHQgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjaGFpbiBpcyBjbG9zZWQgYW5kIG5vIGZ1cnRoZXIgY2FzZXMgc2hvdWxkIGJlIHBhcnNlZC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy5wYXJzZSA9IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY2hhaW4sIGFsbG93X2FzeW5jKSB7XG5cdCAgICAgICAgdmFyIG91dHB1dCA9ICcnLFxuXHQgICAgICAgICAgICBwcm9taXNlLFxuXHQgICAgICAgICAgICBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlO1xuXG5cdCAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgeyB9O1xuXG5cdCAgICAgICAgVHdpZy5sb2cuZGVidWcoXCJUd2lnLmxvZ2ljLnBhcnNlOiBcIiwgXCJQYXJzaW5nIGxvZ2ljIHRva2VuIFwiLCB0b2tlbik7XG5cblx0ICAgICAgICB0b2tlbl90ZW1wbGF0ZSA9IFR3aWcubG9naWMuaGFuZGxlclt0b2tlbi50eXBlXTtcblxuXHQgICAgICAgIGlmICh0b2tlbl90ZW1wbGF0ZS5wYXJzZSkge1xuXHQgICAgICAgICAgICBvdXRwdXQgPSB0b2tlbl90ZW1wbGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBbdG9rZW4sIGNvbnRleHQsIGNoYWluXSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcHJvbWlzZSA9IFR3aWcuaXNQcm9taXNlKG91dHB1dCkgPyBvdXRwdXQgOiBUd2lnLlByb21pc2UucmVzb2x2ZShvdXRwdXQpO1xuXG5cdCAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgICAgICAgaXNfYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb3V0cHV0ID0gbztcblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIGlmIChhbGxvd19hc3luYylcblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2UgfHwgVHdpZy5Qcm9taXNlLnJlc29sdmUob3V0cHV0KTtcblxuXHQgICAgICAgIGlmIChpc19hc3luYylcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoJ1lvdSBhcmUgdXNpbmcgVHdpZy5qcyBpbiBzeW5jIG1vZGUgaW4gY29tYmluYXRpb24gd2l0aCBhc3luYyBleHRlbnNpb25zLicpO1xuXG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFR3aWcpIHtcblx0ICAgICd1c2Ugc3RyaWN0JztcblxuXHQgICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJQYXJzZXIoJ3NvdXJjZScsIGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgIHJldHVybiBwYXJhbXMuZGF0YSB8fCAnJztcblx0ICAgIH0pO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAyMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUd2lnKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyUGFyc2VyKCd0d2lnJywgZnVuY3Rpb24ocGFyYW1zKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBUd2lnLlRlbXBsYXRlKHBhcmFtcyk7XG5cdCAgICB9KTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vICMjIHR3aWcucGF0aC5qc1xuXHQvL1xuXHQvLyBUaGlzIGZpbGUgaGFuZGxlcyBwYXRoIHBhcnNpbmdcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTmFtZXNwYWNlIGZvciBwYXRoIGhhbmRsaW5nLlxuXHQgICAgICovXG5cdCAgICBUd2lnLnBhdGggPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBHZW5lcmF0ZSB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgYSB1cmwgYmFzZWQgb24gdGhlIGdpdmVuIGJhc2UgcGF0aCBhbmQgZmlsZSBwYXRoIGFuZCBpblxuXHQgICAgICogdGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBuYW1lc3BhY2VzLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSAge3N0cmluZ30gdGVtcGxhdGUgVGhlIFR3aWcgVGVtcGxhdGVcblx0ICAgICAqIEBwYXJhbSAge3N0cmluZ30gZmlsZSAgICAgVGhlIGZpbGUgcGF0aCwgbWF5IGJlIHJlbGF0aXZlIGFuZCBtYXkgY29udGFpbiBuYW1lc3BhY2VzLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgVGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBwYXRoXG5cdCAgICAgKi9cblx0ICAgICBUd2lnLnBhdGgucGFyc2VQYXRoID0gZnVuY3Rpb24odGVtcGxhdGUsIGZpbGUpIHtcblx0ICAgICAgICB2Y
46184XIgbmFtZXNwYWNlcyA9IG51bGwsXG5cdCAgICAgICAgICAgIGZpbGUgPSBmaWxlIHx8IFwiXCI7XG5cblx0ICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGVtcGxhdGUub3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgbmFtZXNwYWNlcyA9IHRlbXBsYXRlLm9wdGlvbnMubmFtZXNwYWNlcztcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdvYmplY3QnICYmIChmaWxlLmluZGV4T2YoJzo6JykgPiAwKSB8fCBmaWxlLmluZGV4T2YoJ0AnKSA+PSAwKXtcblx0ICAgICAgICAgICAgZm9yICh2YXIgayBpbiBuYW1lc3BhY2VzKXtcblx0ICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KGspKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUucmVwbGFjZShrICsgJzo6JywgbmFtZXNwYWNlc1trXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUucmVwbGFjZSgnQCcgKyBrLCBuYW1lc3BhY2VzW2tdKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmaWxlO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBUd2lnLnBhdGgucmVsYXRpdmVQYXRoKHRlbXBsYXRlLCBmaWxlKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogR2VuZXJhdGUgdGhlIHJlbGF0aXZlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdXJsIGJhc2VkIG9uIHRoZSBnaXZlbiBiYXNlIHBhdGggYW5kIGZpbGUgcGF0aC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1R3aWcuVGVtcGxhdGV9IHRlbXBsYXRlIFRoZSBUd2lnLlRlbXBsYXRlLlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgVGhlIGZpbGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcGF0aC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGUgcGF0aC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5wYXRoLnJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBmaWxlKSB7XG5cdCAgICAgICAgdmFyIGJhc2UsXG5cdCAgICAgICAgICAgIGJhc2VfcGF0aCxcblx0ICAgICAgICAgICAgc2VwX2NociA9IFwiL1wiLFxuXHQgICAgICAgICAgICBuZXdfcGF0aCA9IFtdLFxuXHQgICAgICAgICAgICBmaWxlID0gZmlsZSB8fCBcIlwiLFxuXHQgICAgICAgICAgICB2YWw7XG5cblx0ICAgICAgICBpZiAodGVtcGxhdGUudXJsKSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUuYmFzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgICAgIGJhc2UgPSB0ZW1wbGF0ZS5iYXNlICsgKCh0ZW1wbGF0ZS5iYXNlLmNoYXJBdCh0ZW1wbGF0ZS5iYXNlLmxlbmd0aC0xKSA9PT0gJy8nKSA/ICcnIDogJy8nKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJhc2UgPSB0ZW1wbGF0ZS51cmw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlLnBhdGgpIHtcblx0ICAgICAgICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3Jcblx0ICAgICAgICAgICAgdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKSxcblx0ICAgICAgICAgICAgICAgIHNlcCA9IHBhdGguc2VwIHx8IHNlcF9jaHIsXG5cdCAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IG5ldyBSZWdFeHAoXCJeXFxcXC57MSwyfVwiICsgc2VwLnJlcGxhY2UoXCJcXFxcXCIsIFwiXFxcXFxcXFxcIikpO1xuXHQgICAgICAgICAgICBmaWxlID0gZmlsZS5yZXBsYWNlKC9cXC8vZywgc2VwKTtcblxuXHQgICAgICAgICAgICBpZiAodGVtcGxhdGUuYmFzZSAhPT0gdW5kZWZpbmVkICYmIGZpbGUubWF0Y2gocmVsYXRpdmUpID09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLnJlcGxhY2UodGVtcGxhdGUuYmFzZSwgJycpO1xuXHQgICAgICAgICAgICAgICAgYmFzZSA9IHRlbXBsYXRlLmJhc2UgKyBzZXA7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBiYXNlID0gcGF0aC5ub3JtYWxpemUodGVtcGxhdGUucGF0aCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKHNlcCtzZXAsIHNlcCk7XG5cdCAgICAgICAgICAgIHNlcF9jaHIgPSBzZXA7XG5cdCAgICAgICAgfSBlbHNlIGlmICgodGVtcGxhdGUubmFtZSB8fCB0ZW1wbGF0ZS5pZCkgJiYgdGVtcGxhdGUubWV0aG9kICYmIHRlbXBsYXRlLm1ldGhvZCAhPT0gJ2ZzJyAmJiB0ZW1wbGF0ZS5tZXRob2QgIT09ICdhamF4Jykge1xuXHQgICAgICAgICAgICAvLyBDdXN0b20gcmVnaXN0ZXJlZCBsb2FkZXJcblx0ICAgICAgICAgICAgYmFzZSA9IHRlbXBsYXRlLmJhc2UgfHwgdGVtcGxhdGUubmFtZSB8fCB0ZW1wbGF0ZS5pZDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIkNhbm5vdCBleHRlbmQgYW4gaW5saW5lIHRlbXBsYXRlLlwiKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBiYXNlX3BhdGggPSBiYXNlLnNwbGl0KHNlcF9jaHIpO1xuXG5cdCAgICAgICAgLy8gUmVtb3ZlIGZpbGUgZnJvbSB1cmxcblx0ICAgICAgICBiYXNlX3BhdGgucG9wKCk7XG5cdCAgICAgICAgYmFzZV9wYXRoID0gYmFzZV9wYXRoLmNvbmNhdChmaWxlLnNwbGl0KHNlcF9jaHIpKTtcblxuXHQgICAgICAgIHdoaWxlIChiYXNlX3BhdGgubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB2YWwgPSBiYXNlX3BhdGguc2hpZnQoKTtcblx0ICAgICAgICAgICAgaWYgKHZhbCA9PSBcIi5cIikge1xuXHQgICAgICAgICAgICAgICAgLy8gSWdub3JlXG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09IFwiLi5cIiAmJiBuZXdfcGF0aC5sZW5ndGggPiAwICYmIG5ld19wYXRoW25ld19wYXRoLmxlbmd0aC0xXSAhPSBcIi4uXCIpIHtcblx0ICAgICAgICAgICAgICAgIG5ld19wYXRoLnBvcCgpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgbmV3X3BhdGgucHVzaCh2YWwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIG5ld19wYXRoLmpvaW4oc2VwX2Nocik7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vICMjIHR3aWcudGVzdHMuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgZXhwcmVzc2lvbiB0ZXN0cy4gKGlzIGVtcHR5LCBpcyBub3QgZGVmaW5lZCwgZXRjLi4uKVxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUd2lnKSB7XG5cdCAgICBcInVzZSBzdHJpY3RcIjtcblx0ICAgIFR3aWcudGVzdHMgPSB7XG5cdCAgICAgICAgZW1wdHk6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgLy8gSGFuZGxlciBudW1iZXJzXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybi
46184BmYWxzZTsgLy8gbnVtYmVycyBhcmUgbmV2ZXIgXCJlbXB0eVwiXG5cdCAgICAgICAgICAgIC8vIEhhbmRsZSBzdHJpbmdzIGFuZCBhcnJheXNcblx0ICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgIC8vIEhhbmRsZSBvYmplY3RzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG9kZDogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlICUgMiA9PT0gMTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGV2ZW46IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAlIDIgPT09IDA7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkaXZpc2libGVieTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWUgJSBwYXJhbXNbMF0gPT09IDA7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkZWZpbmVkOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG5vbmU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdudWxsJzogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9uZSh2YWx1ZSk7IC8vIEFsaWFzIG9mIG5vbmVcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdzYW1lIGFzJzogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHBhcmFtc1swXTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNhbWVhczogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2BzYW1lYXNgIGlzIGRlcHJlY2F0ZWQgdXNlIGBzYW1lIGFzYCcpO1xuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy50ZXN0c1snc2FtZSBhcyddKHZhbHVlLCBwYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgaXRlcmFibGU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiAoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkgfHwgVHdpZy5saWIuaXMoXCJPYmplY3RcIiwgdmFsdWUpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLypcblx0ICAgICAgICBjb25zdGFudCA/XG5cdCAgICAgICAgICovXG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLnRlc3QgPSBmdW5jdGlvbih0ZXN0LCB2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgaWYgKCFUd2lnLnRlc3RzW3Rlc3RdKSB7XG5cdCAgICAgICAgICAgIHRocm93IFwiVGVzdCBcIiArIHRlc3QgKyBcIiBpcyBub3QgZGVmaW5lZC5cIjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFR3aWcudGVzdHNbdGVzdF0odmFsdWUsIHBhcmFtcyk7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLnRlc3QuZXh0ZW5kID0gZnVuY3Rpb24odGVzdCwgZGVmaW5pdGlvbikge1xuXHQgICAgICAgIFR3aWcudGVzdHNbdGVzdF0gPSBkZWZpbml0aW9uO1xuXHQgICAgfTtcblxuXHQgICAgcmV0dXJuIFR3aWc7XG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDI2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyAjIyB0d2lnLmFzeW5jLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIGFzeW5jaHJvbm91cyB0YXNrcyB3aXRoaW4gdHdpZy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIFR3aWcucGFyc2VBc3luYyA9IGZ1bmN0aW9uICh0b2tlbnMsIGNvbnRleHQpIHtcblx0ICAgICAgICByZXR1cm4gVHdpZy5wYXJzZS5hcHBseSh0aGlzLCBbdG9rZW5zLCBjb250ZXh0LCB0cnVlXSk7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jID0gZnVuY3Rpb24gKHRva2VucywgY29udGV4dCwgdG9rZW5zX2FyZV9wYXJhbWV0ZXJzKSB7XG5cdCAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZS5hcHBseSh0aGlzLCBbdG9rZW5zLCBjb250ZXh0LCB0b2tlbnNfYXJlX3BhcmFtZXRlcnMsIHRydWVdKTtcblx0ICAgIH1cblxuXHQgICAgVHdpZy5sb2dpYy5wYXJzZUFzeW5jID0gZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgIHJldHVybiBUd2lnLmxvZ2ljLnBhcnNlLmFwcGx5KHRoaXMsIFt0b2tlbiwgY29udGV4dCwgY2hhaW4sIHRydWVdKTtcblx0ICAgIH1cblxuXHQgICAgVHdpZy5UZW1wbGF0ZS5wcm90b3R5cGUucmVuZGVyQXN5bmMgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFyYW1zKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKGNvbnRleHQsIHBhcmFtcywgdHJ1ZSk7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuYXN5bmMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDaGVja3MgZm9yIGB0aGVuYWJsZWAgb2JqZWN0c1xuXHQgICAgICovXG5cdCAgICBUd2lnLmlzUHJvbWlzZSA9IGZ1bmN0aW9uKG9iaikge1xuXHQgICAgICAgIHJldHVybiBvYmogJiYgKHR5cGVvZiBvYmoudGhlbiA9PSAnZnVuY3Rpb24nKTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gb2YgYSBQcm9taXNlIHRoYXQgZG9lcyBub3QgZnVsbHkgZm9sbG93XG5cdCAgICAgKiB0aGUgc3BlYywgYnV0IGluc3RlYWQgd29ya3MgZnVsbHkgc3luY2hyb25vdXMgd2hpbGUgc3RpbGwgYmVpbmdcblx0ICAgICAqIHRoZW5hYmxlLlxuXHQgICAgICpcblx0ICAgICAqIFRoZXNlIHByb21pc2VzIGNhbiBiZSBtaXhlZCB3aXRoIHJlZ3VsYXIgcHJvbWlzZXMgYXQgd2hpY2ggcG9pbnRcblx0ICAgICAqIHRoZSBzeW5jaHJvbm91cyBiZWhhdmlvdXIgaXMgbG9zdC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5Qcm9taXNlID0gZnVuY3Rpb24oZXhlY3V0b3IpIHtcblx0ICAgICAgICAvLyBTdGF0ZVxuXHQgICAgICAgI
46184HZhciBzdGF0ZSA9ICd1bmtub3duJztcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIHZhciBoYW5kbGVycyA9IG51bGw7XG5cblx0ICAgICAgICBmdW5jdGlvbiBjaGFuZ2VTdGF0ZShuZXdTdGF0ZSwgdikge1xuXHQgICAgICAgICAgICBzdGF0ZSA9IG5ld1N0YXRlO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHY7XG5cdCAgICAgICAgICAgIG5vdGlmeSgpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgZnVuY3Rpb24gb25SZXNvbHZlKHYpIHsgY2hhbmdlU3RhdGUoJ3Jlc29sdmUnLCB2KTsgfVxuXHQgICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0KGUpIHsgY2hhbmdlU3RhdGUoJ3JlamVjdCcsIGUpOyB9XG5cblx0ICAgICAgICBmdW5jdGlvbiBub3RpZnkoKSB7XG5cdCAgICAgICAgICAgIGlmICghaGFuZGxlcnMpIHJldHVybjtcblxuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2goaGFuZGxlcnMsIGZ1bmN0aW9uKGgpIHtcblx0ICAgICAgICAgICAgICAgIGFwcGVuZChoLnJlc29sdmUsIGgucmVqZWN0KTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGhhbmRsZXJzID0gbnVsbDtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBmdW5jdGlvbiBhcHBlbmQob25SZXNvbHZlZCwgb25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICB2YXIgaCA9IHtcblx0ICAgICAgICAgICAgICAgIHJlc29sdmU6IG9uUmVzb2x2ZWQsXG5cdCAgICAgICAgICAgICAgICByZWplY3Q6IG9uUmVqZWN0ZWRcblx0ICAgICAgICAgICAgfTtcblxuXHQgICAgICAgICAgICAvLyBUaGUgcHJvbWlzZSBoYXMgeWV0IHRvIGJlIHJlamVjdGVkIG9yIHJlc29sdmVkLlxuXHQgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ3Vua25vd24nKSB7XG5cdCAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGhhbmRsZXJzIHx8IFtdO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJzLnB1c2goaCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBUaGUgc3RhdGUgaGFzIGJlZW4gY2hhbmdlZCB0byBlaXRoZXIgcmVzb2x2ZSwgb3IgcmVqZWN0XG5cdCAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIHdlIHNob3VsZCBjYWxsIHRoZSBoYW5kbGVyLlxuXHQgICAgICAgICAgICBpZiAoaFtzdGF0ZV0pXG5cdCAgICAgICAgICAgICAgICBoW3N0YXRlXSh2YWx1ZSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZnVuY3Rpb24gcnVuKGZuLCByZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uKHYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuXHQgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodik7XG5cdCAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfSBjYXRjaChlKSB7XG5cdCAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHJlamVjdChlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGZ1bmN0aW9uIHJlYWR5KHJlc3VsdCkge1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgaWYgKCFUd2lnLmlzUHJvbWlzZShyZXN1bHQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uUmVzb2x2ZShyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBydW4ocmVzdWx0LnRoZW4uYmluZChyZXN1bHQpLCByZWFkeSwgb25SZWplY3QpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICBvblJlamVjdChlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJ1bihleGVjdXRvciwgcmVhZHksIG9uUmVqZWN0KTtcblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHRoZW46IGZ1bmN0aW9uKG9uUmVzb2x2ZWQsIG9uUmVqZWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBoYXNSZXNvbHZlZCA9IHR5cGVvZiBvblJlc29sdmVkID09ICdmdW5jdGlvbic7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgaGFzUmVqZWN0ZWQgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR3aWcuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgICAgICAgICAgICAgICBhcHBlbmQoZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXNvbHZlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uUmVzb2x2ZWQocmVzdWx0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uUmVqZWN0ZWQoZXJyKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBjYXRjaDogZnVuY3Rpb24ob25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IFR3aWcuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG5cdCAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5Qcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uKGUpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IFR3aWcuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgICAgICAgcmVqZWN0KGUpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5Qcm9taXNlLmFsbCA9IGZ1bmN0aW9uKHByb21pc2VzKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuXHQgICAgICAgIHJldHVybiBUd2lnLmFzeW5jLmZvckVhY2gocHJvbWlzZXMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG5cdCAgICAgICAgICAgIGlmICghVHdpZy5pc1Byb21pc2UocCkpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gcDtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBwLnRoZW4oZnVuY3Rpb24odikge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2O1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9KVxuXHQgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgKiBHbyBvdmVyIGVhY2ggaXRlbSBpbiBhIGZhc2hpb24gY29tcGF0aWJsZSB3aXRoIFR3aWcuZm9yRWFjaCxcblx0ICAgICogYWxsb3cgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBhIHByb21pc2Ugb3IgY2FsbCB0aGUgdGhpcmQgYXJndW1lbnRcblx0ICAgICogdG8gc2lnbmFsIGl0IGlzIGZpbmlzaGVkLlxuXHQgICAgKlxuXHQgICAgKiBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHdpbGwgYmUgY2FsbGVkIHNlcXVlbnRpYWxseS5cblx0ICAgICovXG5cdCAgICBUd2lnLmFzeW5jLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoQXN5bmMoYXJyLCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBhcmdfaW5kZXggPSAwO1xuXHQgICAgICAgIHZhciBjYWxsYmFja3MgPSB7fTtcblx0ICAgICAgICB2Y
46184XIgcHJvbWlzZSA9IG5ldyBUd2lnLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrcyA9IHtcblx0ICAgICAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG5cdCAgICAgICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgZnVuY3Rpb24gZmFpbChlcnIpIHtcblx0ICAgICAgICAgICAgY2FsbGJhY2tzLnJlamVjdChlcnIpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCFUd2lnLmlzUHJvbWlzZSh2YWx1ZSkpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0ZSgpO1xuXG5cdCAgICAgICAgICAgIHZhbHVlLnRoZW4obmV4dCwgZmFpbCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZnVuY3Rpb24gaXRlcmF0ZSgpIHtcblx0ICAgICAgICAgICAgdmFyIGluZGV4ID0gYXJnX2luZGV4Kys7XG5cblx0ICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyci5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5yZXNvbHZlKCk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBuZXh0KGNhbGxiYWNrKGFycltpbmRleF0sIGluZGV4KSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaXRlcmF0ZSgpO1xuXG5cdCAgICAgICAgcmV0dXJuIHByb21pc2U7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblxuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gIyMgdHdpZy5leHBvcnRzLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBwcm92aWRlcyBleHRlbnNpb24gcG9pbnRzIGFuZCBvdGhlciBob29rcyBpbnRvIHRoZSB0d2lnIGZ1bmN0aW9uYWxpdHkuXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cdCAgICBUd2lnLmV4cG9ydHMgPSB7XG5cdCAgICAgICAgVkVSU0lPTjogVHdpZy5WRVJTSU9OXG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZSBhbmQgY29tcGlsZSBhIHR3aWcuanMgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIFBhcmFtdGVyZXMgZm9yIGNyZWF0aW5nIGEgVHdpZyB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtUd2lnLlRlbXBsYXRlfSBBIFR3aWcgdGVtcGxhdGUgcmVhZHkgZm9yIHJlbmRlcmluZy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHBvcnRzLnR3aWcgPSBmdW5jdGlvbiB0d2lnKHBhcmFtcykge1xuXHQgICAgICAgICd1c2Ugc3RyaWN0Jztcblx0ICAgICAgICB2Y
46184XIgaWQgPSBwYXJhbXMuaWQsXG5cdCAgICAgICAgICAgIG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgICAgICBzdHJpY3RfdmFyaWFibGVzOiBwYXJhbXMuc3RyaWN0X3ZhcmlhYmxlcyB8fCBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIC8vIFRPRE86IHR1cm4gYXV0b3NjYXBlIG9uIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cblx0ICAgICAgICAgICAgICAgIGF1dG9lc2NhcGU6IHBhcmFtcy5hdXRvZXNjYXBlICE9IG51bGwgJiYgcGFyYW1zLmF1dG9lc2NhcGUgfHwgZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBhbGxvd0lubGluZUluY2x1ZGVzOiBwYXJhbXMuYWxsb3dJbmxpbmVJbmNsdWRlcyB8fCBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIHJldGhyb3c6IHBhcmFtcy5yZXRocm93IHx8IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgbmFtZXNwYWNlczogcGFyYW1zLm5hbWVzcGFjZXNcblx0ICAgICAgICAgICAgfTtcblxuXHQgICAgICAgIGlmIChUd2lnLmNhY2hlICYmIGlkKSB7XG5cdCAgICAgICAgICAgIFR3aWcudmFsaWRhdGVJZChpZCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKHBhcmFtcy5kZWJ1ZyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIFR3aWcuZGVidWcgPSBwYXJhbXMuZGVidWc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChwYXJhbXMudHJhY2UgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBUd2lnLnRyYWNlID0gcGFyYW1zLnRyYWNlO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChwYXJhbXMuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLlRlbXBsYXRlcy5wYXJzZXJzLnR3aWcoe1xuXHQgICAgICAgICAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEsXG5cdCAgICAgICAgICAgICAgICBwYXRoOiBwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3BhdGgnKSA/IHBhcmFtcy5wYXRoIDogdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICAgICAgbW9kdWxlOiBwYXJhbXMubW9kdWxlLFxuXHQgICAgICAgICAgICAgICAgaWQ6ICAgaWQsXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG5cdCAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVmICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgaWYgKHBhcmFtcy5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIkJvdGggcmVmIGFuZCBpZCBjYW5ub3QgYmUgc2V0IG9uIGEgdHdpZy5qcyB0ZW1wbGF0ZS5cIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcuVGVtcGxhdGVzLmxvYWQocGFyYW1zLnJlZik7XG5cdCAgICAgICAgXG5cdCAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMubWV0aG9kICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgaWYgKCFUd2lnLlRlbXBsYXRlcy5pc1JlZ2lzdGVyZWRMb2FkZXIocGFyYW1zLm1ldGhvZCkpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdMb2FkZXIgZm9yIFwiJyArIHBhcmFtcy5tZXRob2QgKyAnXCIgaXMgbm90IGRlZmluZWQuJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcuVGVtcGxhdGVzLmxvYWRSZW1vdGUocGFyYW1zLm5hbWUgfHwgcGFyYW1zLmhyZWYgfHwgcGFyYW1zLnBhdGggfHwgaWQgfHwgdW5kZWZpbmVkLCB7XG5cdCAgICAgICAgICAgICAgICBpZDogaWQsXG5cdCAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG5cdCAgICAgICAgICAgICAgICBwYXJzZXI6IHBhcmFtcy5wYXJzZXIgfHwgJ3R3aWcnLFxuXHQgICAgICAgICAgICAgICAgYmFzZTogcGFyYW1zLmJhc2UsXG5cdCAgICAgICAgICAgICAgICBtb2R1bGU6IHBhcmFtcy5tb2R1bGUsXG5cdCAgICAgICAgICAgICAgICBwcmVjb21waWxlZDogcGFyYW1zLnByZWNvbXBpbGVkLFxuXHQgICAgICAgICAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcblxuXHQgICAgICAgICAgICB9LCBwYXJhbXMubG9hZCwgcGFyYW1zLmVycm9yKTtcblxuXHQgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZShwYXJhbXMuaHJlZiwge1xuXHQgICAgICAgICAgICAgICAgaWQ6IGlkLFxuXHQgICAgICAgICAgICAgICAgbWV0aG9kOiAnYWpheCcsXG5cdCAgICAgICAgICAgICAgICBwYXJzZXI6IHBhcmFtcy5wYXJzZXIgfHwgJ3R3aWcnLFxuXHQgICAgICAgICAgICAgICAgYmFzZTogcGFyYW1zLmJhc2UsXG5cdCAgICAgICAgICAgICAgICBtb2R1bGU6IHBhcmFtcy5tb2R1bGUsXG5cdCAgICAgICAgICAgICAgICBwcmVjb21waWxlZDogcGFyYW1zLnByZWNvbXBpbGVkLFxuXHQgICAgICAgICAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcblxuXHQgICAgICAgICAgICB9LCBwYXJhbXMubG9hZCwgcGFyYW1zLmVycm9yKTtcblxuXHQgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnBhdGggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZShwYXJhbXMucGF0aCwge1xuXHQgICAgICAgICAgICAgICAgaWQ6IGlkLFxuXHQgICAgICAgICAgICAgICAgbWV0aG9kOiAnZnMnLFxuXHQgICAgICAgICAgICAgICAgcGFyc2VyOiBwYXJhbXMucGFyc2VyIHx8ICd0d2lnJyxcblx0ICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtcy5iYXNlLFxuXHQgICAgICAgICAgICAgICAgbW9kdWxlOiBwYXJhbXMubW9kdWxlLFxuXHQgICAgICAgICAgICAgICAgcHJlY29tcGlsZWQ6IHBhcmFtcy5wcmVjb21waWxlZCxcblx0ICAgICAgICAgICAgICAgIGFzeW5jOiBwYXJhbXMuYXN5bmMsXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG5cblx0ICAgICAgICAgICAgfSwgcGFyYW1zLmxvYWQsIHBhcmFtcy5lcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLy8gRXh0ZW5kIFR3aWcgd2l0aCBhIG5ldyBmaWx0ZXIuXG5cdCAgICBUd2lnLmV4cG9ydHMuZXh0ZW5kRmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyLCBkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy5maWx0ZXIuZXh0ZW5kKGZpbHRlciwgZGVmaW5pdGlvbik7XG5cdCAgICB9O1xuXG5cdCAgICAvLyBFeHRlbmQgVHdpZyB3aXRoIGEgbmV3IGZ1bmN0aW9uLlxuXHQgICAgVHdpZy5leHBvcnRzLmV4dGVuZEZ1bmN0aW9uID0gZnVuY3Rpb24oZm4sIGRlZmluaXRpb24pIHtcblx0ICAgICAgICBUd2lnLl9mdW5jdGlvbi5leHRlbmQoZm4sIGRlZmluaXRpb24pO1xuXHQgICAgfTtcblxuXHQgICAgLy8gRXh0ZW5kIFR3aWcgd2l0aCBhIG5ldyB0ZXN0LlxuXHQgICAgVHdpZy5leHBvcnRzLmV4dGVuZFRlc3QgPSBmdW5jdGlvbih0ZXN0LCBkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy50ZXN0LmV4dGVuZCh0ZXN0LCBkZWZpbml0aW9uKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIEV4dGVuZCBUd2lnIHdpdGggYSBuZXcgZGVmaW5pdGlvbi5cblx0ICAgIFR3aWcuZXhwb3J0cy5leHRlbmRUYWcgPSBmdW5jdGlvbihkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy5sb2dpYy5leHRlbmQoZGVmaW5pdGlvbik7XG5cdCAgICB9O1xuXG5cdCAgICAvLyBQcm92aWRlIGFuIGVudmlyb25tZW50IGZvciBleHRlbmRpbmcgVHdpZyBjb3JlLlxuXHQgICAgLy8gQ2FsbHMgZm4gd2l0aCB0aGUgaW50ZXJuYWwgVHdpZyBvYmplY3QuXG5cdCAgICBUd2lnLmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oZm4pIHtcblx0ICAgICAgICBmbihUd2lnKTtcblx0ICAgIH07XG5cblxuXHQgICAgLyoqXG5cdCAgICAgKiBQcm92aWRlIGFuIGV4dGVuc2lvbiBmb3IgdXNlIHdpdGggZXhwcmVzcyAyLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgVGhlIHRlbXBsYXRlIG1hcmt1cC5cblx0ICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbnMgVGhlIGV4cHJlc3Mgb3B0aW9ucy5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZW5kZXJlZCB0ZW1wbGF0ZS5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHBvcnRzLmNvbXBpbGUgPSBmdW5jdGlvbihtY
46184XJrdXAsIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgaWQgPSBvcHRpb25zLmZpbGVuYW1lLFxuXHQgICAgICAgICAgICBwYXRoID0gb3B0aW9ucy5maWxlbmFtZSxcblx0ICAgICAgICAgICAgdGVtcGxhdGU7XG5cblx0ICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgdGVtcGxhdGUgZnJvbSB0aGUgY2FjaGVcblx0ICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBUd2lnLlRlbXBsYXRlKHtcblx0ICAgICAgICAgICAgZGF0YTogbWFya3VwLFxuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICBpZDogaWQsXG5cdCAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMuc2V0dGluZ3NbJ3R3aWcgb3B0aW9ucyddXG5cdCAgICAgICAgfSk7IC8vIFR3aWcuVGVtcGxhdGVzLmxvYWQoaWQpIHx8XG5cblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29udGV4dCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpO1xuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFByb3ZpZGUgYW4gZXh0ZW5zaW9uIGZvciB1c2Ugd2l0aCBleHByZXNzIDMuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBmaWxlIG9uIGRpc2suXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gVGhlIG9wdGlvbnMgb3IgY2FsbGJhY2suXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBjYWxsYmFjay5cblx0ICAgICAqIFxuXHQgICAgICogQHRocm93cyBUd2lnLkVycm9yXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwb3J0cy5yZW5kZXJGaWxlID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucywgZm4pIHtcblx0ICAgICAgICAvLyBoYW5kbGUgY2FsbGJhY2sgaW4gb3B0aW9uc1xuXHQgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBmbiA9IG9wdGlvbnM7XG5cdCAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHQgICAgICAgIHZhciBzZXR0aW5ncyA9IG9wdGlvbnMuc2V0dGluZ3MgfHwge307XG5cblx0ICAgICAgICB2Y
46184XIgcGFyYW1zID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICBiYXNlOiBzZXR0aW5ncy52aWV3cyxcblx0ICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbmQgcmV0dXJuIHRlbXBsYXRlIGFzIGEgc2ltcGxlIHN0cmluZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2lnanMvdHdpZy5qcy9wdWxsLzM0OCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHQgICAgICAgICAgICAgICAgZm4obnVsbCwgJycgKyB0ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucykpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblxuXHQgICAgICAgIC8vIG1peGluIGFueSBvcHRpb25zIHByb3ZpZGVkIHRvIHRoZSBleHByZXNzIGFwcC5cblx0ICAgICAgICB2YXIgdmlld19vcHRpb25zID0gc2V0dGluZ3NbJ3R3aWcgb3B0aW9ucyddO1xuXG5cdCAgICAgICAgaWYgKHZpZXdfb3B0aW9ucykge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBvcHRpb24gaW4gdmlld19vcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodmlld19vcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIHtcblx0ICAgICAgICAgICAgICAgICAgICBwYXJhbXNbb3B0aW9uXSA9IHZpZXdfb3B0aW9uc1tvcHRpb25dO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgVHdpZy5leHBvcnRzLnR3aWcocGFyYW1zKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIEV4cHJlc3MgMyBoYW5kbGVyXG5cdCAgICBUd2lnLmV4cG9ydHMuX19leHByZXNzID0gVHdpZy5leHBvcnRzLnJlbmRlckZpbGU7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvdWQgVHdpZy5qcyBjYWNoZSB0ZW1wbGF0ZXMuXG5cdCAgICAgKiBEaXNhYmxlIGR1cmluZyBkZXZlbG9wbWVudCB0byBzZWUgY2hhbmdlcyB0byB0ZW1wbGF0ZXMgd2l0aG91dFxuXHQgICAgICogcmVsb2FkaW5nLCBhbmQgZGlzYWJsZSBpbiBwcm9kdWN0aW9uIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtib29sZWFufSBjYWNoZVxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cG9ydHMuY2FjaGUgPSBmdW5jdGlvbihjYWNoZSkge1xuXHQgICAgICAgIFR3aWcuY2FjaGUgPSBjYWNoZTtcblx0ICAgIH07XG5cblx0ICAgIC8vV2UgbmVlZCB0byBleHBvcnQgdGhlIHBhdGggbW9kdWxlIHNvIHdlIGNhbiBlZmZlY3RpdmVseSB0ZXN0IGl0XG5cdCAgICBUd2lnLmV4cG9ydHMucGF0aCA9IFR3aWcucGF0aDtcblxuXHQgICAgLy9FeHBvcnQgb3VyIGZpbHRlcnMuXG5cdCAgICAvL1Jlc29sdmVzICMzMDdcblx0ICAgIFR3aWcuZXhwb3J0cy5maWx0ZXJzID0gVHdpZy5maWx0ZXJzO1xuXG5cdCAgICByZXR1cm4gVHdpZztcblx0fTtcblxuXG4vKioqLyB9XG4vKioqKioqLyBdKVxufSk7XG47IiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwiaW1wb3J0ICcuLi9zdHlsZXMvYXBwLnNjc3MnO1xuXG5pbXBvcnQgSGVhZGVyIGZyb20gJ2NvbXBvbmVudHMvbW9iaWxlLWhlYWRlci9pbmRleCc7XG5pbXBvcnQgSG92ZXJFZmZlY3QgZnJvbSAnY29tcG9uZW50cy9ob3Zlci1lZmZlY3QnO1xuaW1wb3J0IElucHV0VGVsZXBob25lIGZyb20gJ2NvbXBvbmVudHMvZm9ybXMvdGVsZXBob25lJztcbmltcG9ydCBNZWRpYXRvciBmcm9tICdjb21tb24vc2NyaXB0cy9tZWRpYXRvcic7XG5pbXBvcnQgTmV3cyBmcm9tICdjb21wb25lbnRzL25ld3MnO1xuaW1wb3J0IFBvcHVwIGZyb20gJ2NvbXBvbmVudHMvcG9wdXAnO1xuaW1wb3J0IHBvcHVwSW5saW5lVGVtcGxhdGUgZnJvbSAnY29tcG9uZW50cy9wb3B1cC9pbmxpbmUtcG9wdXAudHdpZyc7XG5pbXBvcnQgcG9wdXBNYXBUbXBsIGZyb20gJ2NvbXBvbmVudHMvcG9wdXAvbWFwLXBvcHVwLnR3aWcnO1xuaW1wb3J0IFByZWxvYWRlciBmcm9tICdjb21wb25lbnRzL3ByZWxvYWRlcic7XG5pbXBvcnQgU2xpZGVyIGZyb20gJ2NvbXBvbmVudHMvc2xpZGVyJztcbmltcG9ydCBTdWJtaXQgZnJvbSAnY29tcG9uZW50cy9mb3Jtcy9zdWJtaXQnO
461841xuaW1wb3J0IFRhYnMgZnJvbSAnY29tcG9uZW50cy90YWJzL2luZGV4JztcbmltcG9ydCBUZWFtUG9wdXAgZnJvbSAnY29tcG9uZW50cy90ZWFtJztcbmltcG9ydCBVdGlscyBmcm9tICdjb21tb24vc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgVmFsaWRhdGlvbiBmcm9tICdjb21wb25lbnRzL2Zvcm1zL3ZhbGlkYXRpb24nO1xuaW1wb3J0IFlhbmRleE1hcCBmcm9tICdjb21wb25lbnRzL3lhbmRleC1tYXAnO1xuaW1wb3J0IHlhbmRleE1hcExvYWQgZnJvbSAnY29tcG9uZW50cy95YW5kZXgtbWFwL2xvYWQnO1xuXG5jb25zdCB0YWJsZXRQb3J0cmFpdCA9IDY3MDtcbmNvbnN0IHRhYmxldExhbmRzY2FwZSA9IDk2MDtcbmNvbnN0IGxhcHRvcFdpZHRoID0gMTI4MDtcbmNvbnN0IHdhaXRUaW1lID0gMjAwO1xuY29uc3QgbWluV2FpdFRpbWUgPSAxMDA7XG5jb25zdCBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7XG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuY29uc3QgYm9yZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLWFuaW1hdGVkLWJvcmRlcnMnKTtcbmNvbnN0IGJvcmRlcnNTZXBhcmF0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1hbmltYXRlZC1ib3JkZXJzX19zZXBhcmF0ZWQnKTtcbmNvbnN0IGJvcmRlcnNTZWVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLXNlZW1zLWJvcmRlcnMnKTtcbmNvbnN0IHZlcnRpY2FsQm9yZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotYW5pbWF0ZWQtdmVydGljYWwtYm9yZGVyJyk7XG5jb25zdCBob3Jpem9udGFsQm9yZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotYW5pbWF0ZWQtaG9yaXpvbnRhbC1ib3JkZXInKTtcbmNvbnN0IGZhY3RvaWRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItbWFpbi1mYWN0b2lkcycpO1xuY29uc3QgbWFpbkFuaW1hdGVkVGl0bGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmItbWFpbi1zbGlkZXNfX3NwYW4tc2Vjb25kJyk7XG5jb25zdCBtYWluc2xpZGVyQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotbWFpbi1zbGlkZXInKTtcbmNvbnN0IGRpc2FwcGVhcmluZ0ltYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotc2Nyb2xsLWltYWdlLWVmZmVjdCcpO1xuY29uc3Qgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbmxldCB0YWJzRGV2ZWxvcHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10YWJzLWRldmVsb3AnKTtcbmxldCB0YWJzUHJvamVjdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10YWJzLXByb2plY3RzJyk7XG5cbmhlYWRlci5pbml0KHtcbiAgICBlbGVtZW50ICAgICAgICAgICAgICAgIDogJy5qLWhlYWRlcicsXG4gICAgYXV0b0ZpeGVkICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgIGF1dG9Qb3NpdGlvbkNsb3NlQnV0dG9uOiB0cnVlLFxuICAgIHJldHVyblBvc2l0aW9uICAgICAgICAgOiB0cnVlXG59KTtcblxuLyoqXG4gKiDQn9C+0L/QsNC/INC40L3Qu9Cw0LnQvdC+0LLRi9C5XG4gKi9cbmNvbnN0IGlubGluZVBvcHVwcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotaW5saW5lLXBvcHVwJykpO1xuXG5pZiAoaW5saW5lUG9wdXBzLmxlbmd0aCkge1xuICAgIGlubGluZVBvcHVwcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gbmV3IFBvcHVwKCk7XG5cbiAgICAgICAgcG9wdXAuaW5pdCh7XG4gICAgICAgICAgICB0YXJnZXQgIDogaXRlbSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBwb3B1cElubGluZVRlbXBsYXRlXG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqINCf0L7Qv9Cw0L8g0LrQsNGA0YLQsFxuICovXG5jb25zdCBtYXBQb3B1cHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLXByb2plY3QtcG9wdXAtbWFwJykpO1xuXG5pZiAobWFwUG9wdXBzLmxlbmd0aCkge1xuICAgIG1hcFBvcHVwcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gbmV3IFBvcHVwKCk7XG5cbiAgICAgICAgcG9wdXAuaW5pdCh7XG4gICAgICAgICAgICB0YXJnZXQgIDogaXRlbSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBwb3B1cE1hcFRtcGxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ29wZW5Qb3B1cCcsIChwb3B1cCkgPT4ge1xuICAgICAgICBpZiAocG9wdXAudHlwZSA9PT0gJ21hcCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcFNlbGVjdG9yID0gcG9wdXAucG9wdXAucXVlcnlTZWxlY3RvcignLmotcHJvamVjdC1tYXAnKTtcblxuICAgICAgICAgICAgaWYgKG1hcFNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgeWFuZGV4TWFwTG9hZCgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh5bWFwcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeWFuZGV4TWFwID0gbmV3IFlhbmRleE1hcCh5bWFwcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHlhbmRleE1hcC5pbml0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyICAgICAgICAgIDogbWFwU2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tWm9vbUNvbnRyb2w6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQn9GA0Lgg0LfQsNCz0YDRg9C30LrQtSDRj9C90LTQtdC60YEg0LrQsNGA0YIg0L/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsDogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuXG4vKipcbiAqINCh0LvQsNC50LTQtdGAINC/0YDQtdC40LzRg9GJ0LXRgdGC0LIg0L3QsCDQs9C70LDQstC90L7QuSDRgdGC0YDQsNC90LjRhtC1XG4gKiBAdHlwZSB7U2xpZGVyfVxuICovXG5jb25zdCBiZW5lZml0cyA9IG5ldyBTbGlkZXIoKTtcbmNvbnN0IGJlbmVmaXRzU2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotYmVuZWZpdHMt
46184c2xpZGVyJyk7XG5cbmlmIChiZW5lZml0c1NsaWRlciAmJiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPCBsYXB0b3BXaWR0aCkge1xuICAgIGJlbmVmaXRzLmluaXQoe1xuICAgICAgICB0YXJnZXQgICAgICAgOiBiZW5lZml0c1NsaWRlcixcbiAgICAgICAgYXV0b3BsYXkgICAgIDogdHJ1ZSxcbiAgICAgICAgaW5maW5pdGUgICAgIDogZmFsc2UsXG4gICAgICAgIGF1dG9wbGF5U3BlZWQ6IDcwMDBcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gY29uc3QgbmV4dEJ0biA9IGJlbmVmaXRzU2xpZGVyLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXJfX2Fycm93LXJpZ2h0Jyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIG5leHRCdG4uY2xpY2soKTtcbiAgICB9LCBtaW5XYWl0VGltZSk7XG59XG5cbi8qKlxuICog0YHQu9Cw0LnQtNC10YDRiyDRgSDQvtC00L3QuNC8INCy0LjQtNC40LzRi9C8INGB0LvQsNC50LTQvtC8XG4gKi9cbmNvbnN0IG9uZVNsaWRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1vbmVzbGlkZS1zbGlkZXInKTtcblxuaWYgKG9uZVNsaWRlcnMpIHtcbiAgICBvbmVTbGlkZXJzLmZvckVhY2goKHNsaWRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uZVNsaWRlciA9IG5ldyBTbGlkZXIoKTtcblxuICAgICAgICBvbmVTbGlkZXIuaW5pdCh7dGFyZ2V0OiBzbGlkZX0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqINCh0LvQsNC50LTQtdGAINGD0YHQv9C10YjQvdGL0YUg0L/RgNC+0LXQutGC0L7QslxuICovXG5jb25zdCBjb2x1bW5TbGlkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotY29sdW1ucy1zbGlkZXInKTtcblxuaWYgKGNvbHVtblNsaWRlcnMgJiYgd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoIDwgbGFwdG9wV2lkdGgpIHtcbiAgICBjb2x1bW5TbGlkZXJzLmZvckVhY2goKHNsaWRlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtblNsaWRlciA9IG5ldyBTbGlkZXIoKTtcblxuICAgICAgICBjb2x1bW5TbGlkZXIuaW5pdCh7dGFyZ2V0OiBzbGlkZX0pO1xuICAgIH0pO1xufVxuXG5jb25zdCBkZWNsYXJhdGlvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1kZWNsYXJhdGlvbi1zbGlkZXInKTtcblxuaWYgKGRlY2xhcmF0aW9ucyAmJiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPCB0YWJsZXRQb3J0cmFpdCkge1xuICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKChzbGlkZSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNsYXJhdGlvblNsaWRlciA9IG5ldyBTbGlkZXIoKTtcblxuICAgICAgICBkZWNsYXJhdGlvblNsaWRlci5pbml0KHt0YXJnZXQ6IHNsaWRlfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0KHQu9Cw0LnQtNC10YAg0YEg0YPRh9Cw0YHRgtC90LjQutCw0LzQuCDQutC+0LzQsNC90LTRi1xuICovXG5jb25zdCB0ZWFtID0gbmV3IFNsaWRlcigpO1xuY29uc3QgdGVhbVBvcHVwID0gbmV3IFRlYW1Qb3B1cCgpO1xuY29uc3QgdGVhbVNsaWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLXRlYW0tc2xpZGVyJyk7XG5cbmlmICh0ZWFtU2xpZGVyKSB7XG4gICAgdGVhbS5pbml0KHtcbiAgICAgICAgdGFyZ2V0ICAgICAgICA6IHRlYW1TbGlkZXIsXG4gICAgICAgIHRyYW5zaXRpb25UaW1lOiAxNTBcbiAgICB9KTtcbiAgICB0ZWFtUG9wdXAuaW5pdCh0ZWFtU2xpZGVyKTtcbn1cblxuY29uc3QgdGVhbU1hbnVhbCA9IG5ldyBTbGlkZXIoKTtcbmNvbnN0IHRlYW1TbGlkZXJNYW51YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10ZWFtLXNsaWRlci1tYW51YWwnKTtcblxuaWYgKHRlYW1TbGlkZXJNYW51YWwpIHtcbiAgICB0ZWFtTWFudWFsLmluaXQoe1xuICAgICAgICB0YXJnZXQgICAgICAgIDogdGVhbVNsaWRlck1hbnVhbCxcbiAgICAgICAgdHJhbnNpdGlvblRpbWU6IDE1MFxuICAgIH0pO1xufVxuXG4vKipcbiAqINCh0LvQsNC50LTQtdGAINGBINC70L7Qs9C+0YLQuNC/0LDQvNC4INC/0LDRgNGC0L3QtdGA0L7QslxuICovXG5jb25zdCBwYXJ0bmVycyA9IG5ldyBTbGlkZXIoKTtcbmNvbnN0IHBhcnRuZXJzU2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotcHJvamVjdHMtc2xpZGVyJyk7XG5cbmlmIChwYXJ0bmVyc1NsaWRlcikge1xuICAgIHBhcnRuZXJzLmluaXQoe3RhcmdldDogcGFydG5lcnNTbGlkZXJ9KTtcbn1cblxuY29uc3QgcHJpbmNpcGVzU2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotcHJpbmNpcGVzLXNsaWRlcicpO1xuXG5pZiAocHJpbmNpcGVzU2xpZGVyKSB7XG4gICAgcHJpbmNpcGVzU2xpZGVyLmZvckVhY2goKHNsaWRlcikgPT4ge1xuICAgICAgICBjb25zdCBwcmluY2lwZXMgPSBuZXcgU2xpZGVyKCk7XG5cbiAgICAgICAgcHJpbmNpcGVzLmluaXQoe3RhcmdldDogc2xpZGVyfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0KHQu9Cw0LnQtNC10YAg0L/RgNC10LjQvNGD0YnQtdGB0YLQsiDQv9GA0L7QtdC60YLQvtCyINCb0LDRgNGD0YHQsFxuICovXG5jb25zdCBsYXJ1c0ZlYXR1cmVzID0gbmV3IFNsaWRlcigpO1xuY29uc3QgbGFydXNGZWF0dXJlc1NsaWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLWxhcnVzLXByb2plY3QtZmVhdHVyZS1zbGlkZXInKTtcblxuaWYgKGxhcnVzRmVhdHVyZXNTbGlkZXIgJiYgd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoIDwgdGFibGV0TGFuZHNjYXBlKSB7XG4gICAgbGFydXNGZWF0dXJlcy5pbml0KHt0YXJnZXQ6IGxhcnVzRmVhdHVyZXNTbGlkZXJ9KTtcbn1cblxuLyoqXG4gKiDRgNC10LjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDRgdC70LDQudC00LXRgCwg0LXRgdC70Lgg0L7QvSDQsiDRgtCw0LHQtVxuICovXG5tZWRpYXRvci5zdWJzY3JpYmUoJ2NoYW5nZVRhYnMnLCAoZWxlbWVudCkgPT4ge1xuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaXMtc2xpZGVyJykpIHtcbiAgICAgICAgY29uc3QgZ2FsbGVyeVdyYXAgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLXByb2plY3RzLXNsaWRlcicpO1xuXG4gICAgICAgIGlmIChnYWxsZXJ5V3JhcC5jbGFzc0xpc3QuY29udGFpbnMoJ2Itc2xpZGVyX2lzX3JlYWR5JykpIHtcbiAgICAgICAgICAgI
46184HJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdhbGxlcnkgPSBuZXcgU2xpZGVyKCk7XG5cbiAgICAgICAgZ2FsbGVyeS5pbml0KHt0YXJnZXQ6IGdhbGxlcnlXcmFwfSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICog0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0YLQsNCx0L7QslxuICovXG5pZiAodGFic0RldmVsb3BzKSB7XG4gICAgdGFic0RldmVsb3BzID0gbmV3IFRhYnMoKTtcbiAgICB0YWJzRGV2ZWxvcHMuaW5pdCh7ZWxlbWVudDogJy5qLXRhYnMtZGV2ZWxvcCd9KTtcbn1cblxuaWYgKHRhYnNQcm9qZWN0cykge1xuICAgIHRhYnNQcm9qZWN0cyA9IG5ldyBUYWJzKCk7XG4gICAgdGFic1Byb2plY3RzLmluaXQoe2VsZW1lbnQ6ICcuai10YWJzLXByb2plY3RzJ30pO1xufVxuXG5jb25zdCB0YWJzUHJvamVjdHNDb2xsYXBzZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10YWJzLXByb2plY3RzJyk7XG5cbmlmICh3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPCB0YWJsZXRMYW5kc2NhcGUgJiYgdGFic1Byb2plY3RzQ29sbGFwc2VkKSB7XG4gICAgbGV0IG9wZW5lZCA9IGZhbHNlO1xuXG4gICAgdGFic1Byb2plY3RzQ29sbGFwc2VkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgICAgICB0YWJzUHJvamVjdHMudGFic1BhcmVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1vcGVuZWQnKTtcbiAgICAgICAgICAgIHRhYnNQcm9qZWN0cy50YWJzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgICAgICAgICAgICBsaW5rLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5lZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFic1Byb2plY3RzLnRhYnNQYXJlbnQuY2xhc3NMaXN0LmFkZCgnaXMtb3BlbmVkJyk7XG4gICAgICAgICAgICB0YWJzUHJvamVjdHMudGFicy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgbGluay5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgICAgICAgIGxpbmsuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGFic1Byb2plY3RzLnRhYnMuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsaW5rLnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JztcbiAgICAgICAgICAgIG9wZW5lZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vLyDQlNCy0LjQttC10L3QuNC1INGE0LDQutGC0L7QuNC00L7QslxuaWYgKGZhY3RvaWRzICYmIHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA8IGxhcHRvcFdpZHRoKSB7XG4gICAgbGV0IGJlbmVmaXRQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGZpcnN0U2xpZGUgPSAwO1xuICAgIGNvbnN0IHplcm8gPSAwO1xuICAgIGNvbnN0IG9uZSA9IDE7XG4gICAgY29uc3QgdHdvID0gMjtcbiAgICBjb25zdCBmb3VyID0gNDtcbiAgICBjb25zdCBmYWN0b2lkID0gZmFjdG9pZHMucXVlcnlTZWxlY3RvcignLmItbWFpbi1mYWN0b2lkc19faXRlbScpO1xuICAgIGNvbnN0IG1haW5JbWFnZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYi1tYWluLXNsaWRlc19faW1nIGltZycpO1xuICAgIGNvbnN0IHNsaWRlV2lkdGggPSBmYWN0b2lkLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IG1ha2VWaXNpYmxlID0gKG51bWJlcikgPT4ge1xuICAgICAgICBpZiAobWFpbkltYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1haW5JbWFnZXNbbnVtYmVyXS5jbGFzc0xpc3QuYWRkKCdiLW1haW4tc2xpZGVzX19pbWctc2NhbGluZycpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtYWtlSGlkZGVuID0gKCkgPT4ge1xuICAgICAgICBtYWluSW1hZ2VzLmZvckVhY2goKGltYWdlKSA9PiB7XG4gICAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCdiLW1haW4tc2xpZGVzX19pbWctc2NhbGluZycpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGNsZWFyVGl0bGVBbmltYXRpb24gPSAoKSA9PiB7XG4gICAgICAgIG1haW5BbmltYXRlZFRpdGxlcy5mb3JFYWNoKCh0aXRsZSkgPT4ge1xuICAgICAgICAgICAgdGl0bGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtZ29lcy1sZWZ0X19sb25nJyk7XG4gICAgICAgICAgICB0aXRsZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1nb2VzLXJpZ2h0X19sb25nJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBtYWluc2xpZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2lzLWF1dG9wbGF5Jyk7XG5cbiAgICBtYWtlSGlkZGVuKCk7XG4gICAgbWFrZVZpc2libGUoZmlyc3RTbGlkZSk7XG4gICAgbWFpbkFuaW1hdGVkVGl0bGVzW2ZpcnN0U2xpZGVdLmNsYXNzTGlzdC5hZGQoJ2lzLWdvZXMtbGVmdF9fbG9uZycpO1xuICAgIGZhY3RvaWRzLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7YmVuZWZpdFBvc2l0aW9ufXB4KWA7XG5cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ2JlbmVmaXRHb2VzTGVmdCcsIChhY3RpdmVTbGlkZSkgPT4ge1xuICAgICAgICBmaXJzdFNsaWRlID0gZmlyc3RTbGlkZSAtIG9uZTtcbiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA+PSB0YWJsZXRMYW5kc2NhcGUpIHtcbiAgICAgICAgICAgIGJlbmVmaXRQb3NpdGlvbiA9IHplcm87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiZW5lZml0UG9zaXRpb24gPSBiZW5lZml0UG9zaXRpb24gKyBzbGlkZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3RpdmVTbGlkZSA9PT0gZm91cikge1xuICAgICAgICAgICAgZmlyc3RTbGlkZSA9IHR3bztcbiAgICAgICAgICAgIGJlbmVmaXRQb3NpdGlvbiA9IC1zbGlkZVdpZHRoICogdHdvO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VIaWRkZW4oKTtcbiAgICAgICAgbWFrZVZpc2libGUoZmlyc3RTbGlkZSk7XG5cbiAgICAgICAgZmFjdG9pZHMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtiZW5lZml0UG9zaXRpb259cHgpYDtcbiAgICAgICAgY2xlYXJUaXRsZUFuaW1hdGlvbigpO1xuICAgICAgICBtYWluQW5pbWF0ZWRUaXRsZXNbZmlyc3RTbGlkZV0uY2xhc3NMaXN0LnJlbW92ZSgnaXMtZ29lcy1yaWdodF9fbG9uZycpO1xuICAgICAgICBtYWluQW5pbWF0ZWRUaXRsZXNbZmlyc3RTbGlkZV0uY2xhc3NMaXN0LmFkZCgnaXMtZ29lcy1yaWdodF9fbG9uZycpO1xuICAgIH0pO1xuICAgIG1lZGlhdG9yLnN1YnNjcmliZSgnYmVuZWZpdEdvZXNSaWdodCcsIChwYXJhbWV0ZXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcGFyYW1ldGVycy5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgYWN0aXZlU2xpZGUgPSBwYXJhbWV0ZXJzLnNsaWRlO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gemVybykge1xuICAgICAgICAgICAgZmlyc3RTbGlkZSA9IHplcm87XG4gICAgICAgICAgICBiZW5lZml0UG9zaXRpb24gPSB6ZXJvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA+PSB0YWJsZXRMYW5kc2NhcGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU2xpZGUgIT09IHR3bykge1xuICAgICAgICAgICAgICAgICAgICBiZW5lZml0UG9zaXRpb24gPSAtc2xpZGVXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJlbmVmaXRQb3NpdGlvbiA9IGJlbmVmaXRQb3NpdGlvbiAtIHNsaWRlV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdFNsaWRlID0gZmlyc3RTbGlkZSArIG9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1ha2VIaWRkZW4oKTtcbiAgICAgICAgbWFrZVZpc2libGUoZmlyc3RTbGlkZSk7XG4gICAgICAgIGZhY3RvaWRzLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7YmVuZWZpdFBvc2l0aW9ufXB4KWA7XG4gICAgICAgIGNsZWFyVGl0bGVBbmltYXRpb24oKTtcbiAgICAgICAgbWFpbkFuaW1hdGVkVGl0bGVzW2ZpcnN0U2xpZGVdLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWdvZXMtbGVmdF9fbG9uZycpO1xuICAgICAgICBtYWluQW5pbWF0ZWRUaXRsZXNbZmlyc3RTbGlkZV0uY2xhc3NMaXN0LmFkZCgnaXMtZ29lcy1sZWZ0X19sb25nJyk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogaG92ZXIg0Y3RhNGE0LXQutGCXG4gKi9cbmNvbnN0IGhvdmVyQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotaG92ZXItaGlnaGxpZ2h0Jyk7XG5cbmlmIChob3ZlckJsb2NrcyAmJiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPj0gbGFwdG9wV2lkdGgpIHtcbiAgICBob3ZlckJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IEhvdmVyRWZmZWN0KGJsb2NrKTtcbiAgICB9KTtcbn1cblxubWVkaWF0b3Iuc3Vic2NyaWJlKCdyZWNlaXZlZE5ld3MnLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3c0Jsb2NrcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLWhvdmVyLWhpZ2hsaWdodCcpO1xuXG4gICAgaWYgKG5ld3NCbG9ja3MgJiYgd2luZG93LnNjcmVlbi5hdmFpbFdpZHR
46184oID49IGxhcHRvcFdpZHRoKSB7XG4gICAgICAgIG5ld3NCbG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSG92ZXJFZmZlY3QoYmxvY2spO1xuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiDQmtCw0YDRgtCwINC90LAg0LPQu9Cw0LLQvdC+0Lkg0YHRgtGA0LDQvdC40YbQtVxuICovXG5jb25zdCBtYXBTZWxlY3RvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLW1haW4tbWFwJyk7XG5cbmlmIChtYXBTZWxlY3Rvcikge1xuICAgIHlhbmRleE1hcExvYWQoKVxuICAgICAgICAudGhlbigoeW1hcHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHlhbmRleE1hcCA9IG5ldyBZYW5kZXhNYXAoeW1hcHMpO1xuXG4gICAgICAgICAgICB5YW5kZXhNYXAuaW5pdCh7XG4gICAgICAgICAgICAgICAgd3JhcHBlciAgICAgICAgICA6IG1hcFNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGN1c3RvbVpvb21Db250cm9sOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxlZ2VuZCAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQn9GA0Lgg0LfQsNCz0YDRg9C30LrQtSDRj9C90LTQtdC60YEg0LrQsNGA0YIg0L/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsDogJHtlcnJvcn1gKTtcbiAgICAgICAgfSk7XG59XG5cbi8qKlxuICog0JrQsNGA0YLQsCDQvdCwINGB0YLRgNCw0L3QuNGG0LUg0LrQvtC90YLQsNC60YLQvtCyXG4gKi9cbmNvbnN0IG1hcENvbnRhY3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotY29udGFjdHMtbWFwJyk7XG5cbmlmIChtYXBDb250YWN0cykge1xuICAgIHlhbmRleE1hcExvYWQoKVxuICAgICAgICAudGhlbigoeW1hcHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHlhbmRleE1hcCA9IG5ldyBZYW5kZXhNYXAoeW1hcHMpO1xuXG4gICAgICAgICAgICB5YW5kZXhNYXAuaW5pdCh7XG4gICAgICAgICAgICAgICAgd3JhcHBlciAgICAgICAgICA6IG1hcENvbnRhY3RzLFxuICAgICAgICAgICAgICAgIGN1c3RvbVpvb21Db250cm9sOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdwcyAgICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQn9GA0Lgg0LfQsNCz0YDRg9C30LrQtSDRj9C90LTQtdC60YEg0LrQsNGA0YIg0L/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsDogJHtlcnJvcn1gKTtcbiAgICAgICAgfSk7XG59XG5cbi8qKlxuICog0L7QsdC70LDRgdGC0Ywg0LLQuNC00LjQvNC+0YHRgtC4XG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINC/0YDQvtGB0LzQsNGC0YDQuNCy0LDQtdC80YvQuSDRjdC70LXQvNC10L3RglxuICogQHJldHVybnMge2Jvb2xlYW59IC0g0LLQvtC30LLRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0Y3Qu9C10LzQtdC90YIg0L3QsNGF0L7QtNC40YLRgdGPINCyINC+0LHQu9Cw0YHRgtC4INCy0LjQtNC40LzQvtGB0YLQuFxuICovXG5jb25zdCBpc1Njcm9sbGVkSW50b1ZpZXcgPSAoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGRvY1ZpZXdUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgY29uc3QgZG9jVmlld0JvdHRvbSA9IGRvY1ZpZXdUb3AgKyB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3QgZWxlbVRvcCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBlbGVtQm90dG9tID0gZWxlbVRvcCArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgcmV0dXJuIChlbGVtQm90dG9tIDw9IGRvY1ZpZXdCb3R0b20pICYmIChlbGVtVG9wID49IGRvY1ZpZXdUb3ApO1xufTtcblxuLyoqXG4gKiDQvtCx0LvQsNGB0YLRjCDQstC40LTQuNC80L7RgdGC0LhcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0g0L/RgNC+0YHQvNCw0YLRgNC40LLQsNC10LzRi9C5INGN0LvQtdC80LXQvdGCXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0g0J7RgtGB0YLRg9C/INGB0LLQtdGA0YXRgyDQsiDQv9GA0L7RhtC10L3RgtCw0YVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCIHRydWUsINC10YHQu9C4INGN0LvQtdC80LXQvdGCINC90LDRhdC+0LTQuNGC0YHRjyDQsiDQvtCx0LvQsNGB0YLQuCDQstC40LTQuNC80L7RgdGC0LhcbiAqL1xuY29uc3QgaXNTY3JvbGxlZEludG9Ub3AgPSAoZWxlbWVudCwgb2Zmc2V0KSA9PiB7XG4gICAgY29uc3QgaHVuZHJlZCA9IDEwMDtcbiAgICBjb25zdCBkb2NWaWV3Qm90dG9tID0gd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0O1xuICAgIGNvbnN0IGVsZW1lbnRCb3VuZGluZyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbVRvcCA9IGVsZW1lbnRCb3VuZGluZy50b3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGxldCBvZmZzZXRQeCA9IDA7XG5cbiAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldFB4ID0gZWxlbWVudEJvdW5kaW5nLmhlaWdodCAqIG9mZnNldCAvIGh1bmRyZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY1ZpZXdCb3R0b20gPiAoZWxlbVRvcCArIG9mZnNldFB4KTtcbn07XG5cbi8qKlxuICog0LjQt9C80LXRgNGP0LXRgiDRgdC60L7RgNC+0YHRgtGMINGB0LrRgNC+0LvQu9CwXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5jb25zdCBjaGVja1Njcm9sbFNwZWVkID0gKGZ1bmN0aW9uKHNldH
46184RpbmdzKSB7XG4gICAgc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB7fTtcblxuICAgIHZhciBsYXN0UG9zLCBuZXdQb3MsIHRpbWVyLCBkZWx0YSxcbiAgICAgICAgZGVsYXkgPSBzZXR0aW5ncy5kZWxheSB8fCA1MDsgLy8gaW4gXCJtc1wiIChoaWdoZXIgbWVhbnMgbG93ZXIgZmlkZWxpdHkgKVxuXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIGxhc3RQb3MgPSBudWxsO1xuICAgICAgICBkZWx0YSA9IDA7XG4gICAgfVxuXG4gICAgY2xlYXIoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpe1xuICAgICAgICBuZXdQb3MgPSB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgICAgaWYgKCBsYXN0UG9zICE9IG51bGwgKXsgLy8gJiYgbmV3UG9zIDwgbWF4U2Nyb2xsXG4gICAgICAgICAgICBkZWx0YSA9IG5ld1BvcyAtICBsYXN0UG9zO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQb3MgPSBuZXdQb3M7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjbGVhciwgZGVsYXkpO1xuICAgICAgICByZXR1cm4gZGVsdGE7XG4gICAgfTtcbn0pKCk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbi8qKlxuICog0LDQvdC40LzQsNGG0LjRjyDQv9GA0Lgg0YHQutGA0L7Qu9C70LUg0YHRgtGA0LDQvdC40YZcbiAqL1xuY29uc3QgZmFkZVN0b3AgPSAzNTA7XG5cbndpbmRvdy5vbnNjcm9sbCA9ICgpID0+IHtcbiAgICAvLyDQsNC90LjQvNCw0YbQuNGPINC70LjQvdC40LlcbiAgICBpZiAod2luZG93LnNjcmVlbi5hdmFpbFdpZHRoID49IHRhYmxldExhbmRzY2FwZSkge1xuICAgICAgICBib3JkZXJzLmZvckVhY2goKGRpdikgPT4ge1xuICAgICAgICAgICAgaWYgKGlzU2Nyb2xsZWRJbnRvVmlldyhkaXYpKSB7XG4gICAgICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ItYW5pbWF0ZS1ib3JkZXJzX19ob3Jpem9udGFsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJvcmRlcnNTZXBhcmF0ZWQuZm9yRWFjaCgoZGl2KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSAxMDtcbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZSA9IDUwO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gMTAwO1xuXG4gICAgICAgICAgICBpZiAoaXNTY3JvbGxlZEludG9Ub3AoZGl2LCB0b3ApKSB7XG4gICAgICAgICAgICAgICAgLy8g0KHRjtC00LAg0LDQvdC40LzQsNGP0YbQuNGPINC00LvRjyDQstC10YXQvdC10LPQviDQsdC+0YDQtNC10YDQsFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTY3JvbGxlZEludG9Ub3AoZGl2LCBtaWRkbGUpKSB7XG4gICAgICAgICAgICAgICAgLy8g0KHRjtC00LAg0LDQvdC40LzQsNGP0YbQuNGPINC00LvRjyDQsdC+0LrQvtCy0L7Qs9C+INCx0L7RgNC00LXRgNCwXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1Njcm9sbGVkSW50b1RvcChkaXYsIGJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnYi1hbmltYXRlLWJvcmRlcnNfX3NlcGFyYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2ZXJ0aWNhbEJvcmRlci5mb3JFYWNoKChkaXYpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Njcm9sbGVkSW50b1ZpZXcoZGl2KSkge1xuICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdiLWFuaW1hdGUtYm9yZGVyc19fdmVydGljYWwtYm9yZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGhvcml6b250YWxCb3JkZXIuZm9yRWFjaCgoZGl2KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNTY3JvbGxlZEludG9WaWV3KGRpdikpIHtcbiAgICAgICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnYi1hbmltYXRlLWJvcmRlcnNfX2hvcml6b250YWwtYm9yZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQsNC90LjQvNCw0YbQuNGPINC90LAg0YHRgtGA0LDQvdC40YbQtSBcItC/0YDQvtC10LrRgiDQm9Cw0YDRg9GB0LBcIlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGRpc2FwcGVhcmluZ0ltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBmYWRlVW50aWwgPSBjaGVja1Njcm9sbFNwZWVkKCkgPiAxMDAgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiAzMDA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGNvbnN0IG9uZSA9IDE7XG4gICAgICAgICAgICBjb25zdCBzY2FsZVVudGlsID0gMjEwMDtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGRpc2FwcGVhcmluZ0ltYWdlLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LnBhZ2VZT2Zmc2V0IDw9IGZhZGVTdG9wKSB7XG4gICAgICAgICAgICAgICAgZGlzYXBwZWFyaW5nSW1hZ2Uuc3R5bGUub3BhY2l0eSA9IG9uZSAtICh3aW5kb3cucGFnZVlPZmZzZXQgLyBmYWRlVW50aWwpO1xuICAgICAgICAgICAgICAgIGltZy5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtvbmUgKyAod2luZG93LnBhZ2VZT2Zmc2V0IC8gc2NhbGVVbnRpbCl9KWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc2FwcGVhcmluZ0ltYWdlLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA+PSB0YWJsZXRMYW5kc2NhcGUpIHtcbiAgICBib3JkZXJzU2VlbXMuZm9yRWFjaCgoZGl2KSA9PiB7XG4gICAgICAgIGlmIChpc1Njcm9sbGVkSW50b1ZpZXcoZGl2KSkge1xuICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ItYW5pbWF0ZS1ib3JkZXJzX19zZXBhcmF0ZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGRpc2FwcGVhcmluZ0ltYWdlICYmIHdpbmRvdy5wYWdlWU9mZnNldCA+IGZhZGVTdG9wKSB7XG4gICAgICAgIGRpc2FwcGVhcmluZ0ltYWdlLmNsYXNzTGlzdC5hZGQoJ2lzLXNjcm9sbGVkJyk7XG4gICAgfVxufVxuXG4vKipcbiAqINC90L7QstC+0YHRgtC4XG4gKi9cbmNvbnN0IG5ld3NGb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcign
46184I25ld3NGb3JtJyk7XG5cbmlmIChuZXdzRm9ybSkge1xuICAgIGNvbnN0IG5ld3MgPSBuZXcgTmV3cygpO1xuXG4gICAgbmV3cy5pbml0KG5ld3NGb3JtKTtcbn1cblxuLyoqXG4gKiDQvdC+0LLQvtGB0YLQuCDQvdCwINCz0LvQsNCy0L3QvtC5INGB0YLRgNCw0L3QuNGG0LVcbiAqIEB0eXBlIHtFbGVtZW50fVxuICovXG5jb25zdCBuZXdzTWFpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXdzTWFpbnBhZ2UnKTtcblxuaWYgKG5ld3NNYWluKSB7XG4gICAgLyoqXG4gICAgICog0LLRi9GH0LjRgdC70Y/QtdGCINC/0L7Qt9C40YbQuNGOINCx0LvQvtC60LAg0L3QvtCy0L7RgdGC0LgsINC00L7QsdCw0LLQu9GP0Y8g0L3QtdC+0LHRhdC+0LTQuNC80YvQuSDQutC70LDRgdGBXG4gICAgICog0LTQu9GPINGB0LrRgNGL0YLQuNGPINCz0YDQsNC90LjRhlxuICAgICAqL1xuICAgIGNvbnN0IG5ld3NCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iLW5ld19fYmxhbmsnKTtcbiAgICBjb25zdCBuZXdzTWFpblBvc2l0aW9uID0gbmV3c01haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdE1pbiA9IDA7XG4gICAgY29uc3QgcmlnaHRNaW4gPSAtMTtcbiAgICBjb25zdCBkZXN0cm95Qm9yZGVyID0gKGRpdikgPT4ge1xuICAgICAgICBjb25zdCBib3JkZXJFbGVtZW50cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3MqPWJvcmRlcl0nKTtcblxuICAgICAgICBib3JkZXJFbGVtZW50cy5mb3JFYWNoKChib3JkZXIpID0+IHtcbiAgICAgICAgICAgIFV0aWxzLnJlbW92ZUVsZW1lbnQoYm9yZGVyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIG5ld3NCbG9jay5mb3JFYWNoKChkaXYpID0+IHtcbiAgICAgICAgY29uc3QgYmxvY2tQb3NpdGlvbiA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbGVmdERpZmZlcmVuY2UgPSBibG9ja1Bvc2l0aW9uLmxlZnQgLSBuZXdzTWFpblBvc2l0aW9uLmxlZnQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0RGlmZmVyZW5jZSA9IGJsb2NrUG9zaXRpb24ucmlnaHQgLSBuZXdzTWFpblBvc2l0aW9uLnJpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0RGlmZmVyZW5jZSA9PT0gbGVmdE1pbikge1xuICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2lzLWxlZnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHJpZ2h0RGlmZmVyZW5jZSkgPj0gcmlnaHRNaW4pIHtcbiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdpcy1yaWdodCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA8IHRhYmxldExhbmRzY2FwZSkge1xuICAgICAgICAgICAgZGVzdHJveUJvcmRlcihkaXYpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICog0JLQsNC70LjQtNCw0YbQuNGPINC40L3Qv9GD0YLQvtCyXG4gKi9cblxuY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1pbnB1dCcpKTtcblxuaWYgKGlucHV0cy5sZW5ndGgpIHtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dFZhbGlkYXRpb24gPSBuZXcgVmFsaWRhdGlvbigpO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBpdGVtLmRhdGFzZXQuZXJyb3I7XG5cbiAgICAgICAgaW5wdXRWYWxpZGF0aW9uLmluaXQoe1xuICAgICAgICAgICAgdGFyZ2V0OiBpdGVtLFxuICAgICAgICAgICAgZXJyb3IgOiBlcnJvck1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0JzQsNGB0LrQsCDQtNC70Y8g0LjQvdC/0YPRgtCwINGBINGC0LXQu9C10YTQvtC90L7QvFxuICovXG5jb25zdCBpbnB1dFRlbCA9IG5ldyBJbnB1dFRlbGVwaG9uZSgpO1xuY29uc3QgcGhvbmVJbnB1dHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJ0ZWxcIl0nKSk7XG5cbmlmIChwaG9uZUlucHV0cy5sZW5ndGgpIHtcbiAgICBpbnB1dFRlbC5pbml0KHtpbnB1dDogcGhvbmVJbnB1dHN9KTtcbn1cblxubWVkaWF0b3Iuc3Vic2NyaWJlKCdvcGVuUG9wdXAnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXRUZWxJblBvcHVwID0gbmV3IElucHV0VGVsZXBob25lKCk7XG4gICAgY29uc3QgcGhvbmVJbnB1dHNJblBvcHVwID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwidGVsXCJdJykpO1xuXG4gICAgaWYgKHBob25lSW5wdXRzSW5Qb3B1cC5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRUZWxJblBvcHVwLmluaXQoe2lucHV0OiBwaG9uZUlucHV0c0luUG9wdXB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHNJblBvcHVwID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1pbnB1dCcpKTtcblxuICAgIGlmIChpbnB1dHNJblBvcHVwLmxlbmd0aCkge1xuICAgICAgICBpbnB1dHNJblBvcHVwLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbkluUG9wdXAgPSBuZXcgVmFsaWRhdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JJblBvcHVwID0gaXRlbS5kYXRhc2V0LmVycm9yO1xuXG4gICAgICAgICAgICBpbnB1dFZhbGlkYXRpb25JblBvcHVwLmluaXQoe1xuICAgICAgICAgICAgICAgIHRhcmdldDogaXRlbSxcbiAgICAgICAgICAgICAgICBlcnJvciA6IGVycm9ySW5Qb3B1cFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Ym1pdFNlbGVjdG9ySW5Qb3B1cCA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotaW5wdXQtc3VibWl0JykpO1xuXG4gICAgaWYgKHN1Ym1pdFNlbGVjdG9ySW5Qb3B1cC5sZW5ndGgpIHtcbiAgICAgICAgc3VibWl0U2VsZWN0b3JJblBvcHVwLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdElucHV0c0luUG9wdXAgPSBuZXcgU3VibWl0KCk7XG5cbiAgICAgICAgICAgIHN1Ym1pdElucHV0c0luUG9wdXAuaW5pdCh7dGFyZ2V0OiBpdGVtfSk7XG4gICAgICAgI
46184H0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiyDQuCDQstCw0LvQuNC00LDRhtC40Y8g0L/RgNC4INGB0LDQsdC80LjRgtC1XG4gKi9cbmNvbnN0IHN1Ym1pdFNlbGVjdG9yID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1pbnB1dC1zdWJtaXQnKSk7XG5cbmlmIChzdWJtaXRTZWxlY3Rvci5sZW5ndGgpIHtcbiAgICBzdWJtaXRTZWxlY3Rvci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1Ym1pdElucHV0cyA9IG5ldyBTdWJtaXQoKTtcblxuICAgICAgICBzdWJtaXRJbnB1dHMuaW5pdCh7dGFyZ2V0OiBpdGVtfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0LTQu9GPINGA0LXQuNC90LjRhtC40LDQu9C40LfQsNGG0LjQuCDRgdC70LDQudC00LXRgNC+0LIg0L/RgNC4INGA0LXRgdCw0LnQt9C1INC+0LrQvdCwXG4gKi9cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBVdGlscy5kZWJvdW5jZSgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoICE9PSB3aW5kb3dXaWR0aCkge1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9XG59LCB3YWl0VGltZSkpO1xuXG5cbmlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai1wcmVsb2FkZXInKSkge1xuICAgIG5ldyBQcmVsb2FkZXIoKS5pbml0KCk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXRoaXMgKi9cbmxldCBpbnN0YW5jZSA9IG51bGw7XG5cbmNsYXNzIE1lZGlhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFubmVscyA9IHt9O1xuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUoY2hhbm5lbCwgZm4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzW2NoYW5uZWxdKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdLnB1c2goe1xuICAgICAgICAgICAgY29udGV4dCA6IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFjazogZm5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGlzaChjaGFubmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsc1tjaGFubmVsXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IDE7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIGZpcnN0QXJndW1lbnQpO1xuXG4gICAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbF0uZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2suYXBwbHkoc3Vic2NyaXB0aW9uLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpbnN0YWxsVG8ob2JqKSB7XG4gICAgICAgIG9iai5jaGFubmVscyA9IHt9O1xuXG4gICAgICAgIG9iai5wdWJsaXNoID0gdGhpcy5wdWJsaXNoO1xuICAgICAgICBvYmouc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpYmU7XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUoY2hhbm5lbCkge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbY2hhbm5lbF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbF0gPSBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVkaWF0b3I7XG4vKiBlc2xpbnQtZW5hYmxlIGNvbnNpc3RlbnQtdGhpcyAqL1xuIiwiLyoqXG4gKiBAdmVyc2lvbiAxLjRcbiAqIEBhdXRob3IgS2VsbmlrIFN0dWRpb3Mge2h0dHA6Ly9rZWxuaWsucnV9XG4gKiBAbGluayBodHRwczovL2tlbG5pay5naXRib29rcy5pby9rZWxuaWstZG9jdW1lbnRhdGlvbi9jb250ZW50L2Zyb250LWVuZC9jb21wb25lbnRzL3V0aWxzLmh0bWwgZG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogREVQRU5ERU5DSUVTXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmNsYXNzIFV0aWxzIHtcbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC60L7QvNGE0L7RgNC90YPRjiDQt9Cw0LTQtdGA0LbQutGDINCy0YvQv9C+0LvQvdC10L3QuNGPINCw0L3QuNC80LDRhtC40LguXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBjb21mb3J0YWJsZUFuaW1hdGlvblRpbWVWYWx1ZSAtINC30L3QsNGH0LXQvdC40LUg0LIg0LzRgS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tZm9ydGFibGVBbmltYXRpb25UaW1lKCkge1xuICAgICAgICBjb25zdCBjb21mb3J0YWJsZUFuaW1hdGlvblRpbWVWYWx1ZSA9IDMwMDtcblxuICAgICAgICByZXR1cm4gY29tZm9ydGFibGVBbmltYXRpb25UaW1lVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9C+0LvQvdC+0YHRgtGM0Y4g0L7Rh9C40YnQsNC10YIg0LLQtdGB0YwgaHRtbCDRjdC70LXQvNC10L3Rgi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIERPTS3RjdC70LXQvNC10L3Rgiwg0LrQvtGC0L7RgNGL0Lkg0L3QtdC+0LHRhdC+0LTQuNC80L4g0L7Rh9C40YHRgtC40YLRjC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYXJIdG1sKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INCy0YHRgtCw0LLQu9GP0LXRgiDRgdC+0LTQtdGA0LbQuNC80L7QtSDQsiDQsdC70L7Qui5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCINCyINC60L7RgtC+0YDRi9C5INC90YPQttC90L4g0LLRgdGC0LDQstC40YLRjC5cbiAgICAgKiBAcGFyYW0ge09iamVjdC9zdHJpbmd9IGNvbnRlbnQgLSDQstGB0YLQsNCy0LvRj9C10LzRi9C5INC60L7QvdGC0LXQvdGCLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnNldENvbnRlbnQoZWxlbWVudCwgY29udGVudCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgY29udGVudCk7XG4gICAgICAgI
46184H0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9C+0LvQvdC+0YHRgtGM0Y4g0YPQtNCw0LvRj9C10YIg0Y3Qu9C10LzQtdC90YIg0LjQtyBET00t0LTQtdGA0LXQstCwLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0g0Y3Qu9C10LzQtdC90YIsINC60L7RgtC+0YDRi9C5INC90LXQvtCx0YXQvtC00LjQvNC+INGD0LTQsNC70LjRgtGMLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgLy8gbm9kZS5yZW1vdmUoKSDQvdC1INGA0LDQsdC+0YLQsNC10YIg0LIgSUUxMVxuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC/0L7QutCw0LfRi9Cy0LDQtdGCINGN0LvQtdC80LXQvdGCLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCLCDQutC+0YLQvtGA0YvQuSDQvdC10L7QsdGF0L7QtNC40LzQviDQv9C+0LrQsNC30LDRgtGMLlxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93KGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INGB0LrRgNGL0LLQsNC10YIg0Y3Qu9C10LzQtdC90YIuXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IC0g0Y3Qu9C10LzQtdC90YIsINC60L7RgtC+0YDRi9C5INC90LXQvtCx0YXQvtC00LjQvNC+INGB0LrRgNGL0YLRjC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaGlkZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC+0YLQv9GA0LDQstC70Y/QtdGCIGFqYXgg0LfQsNC/0YDQvtGBINC90LAg0YHQtdGA0LLQtdGALlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0g0L7RgtC/0YDQsNCy0LvRj9C10LzRi9C1INC00LDQvdC90YvQtS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0g0LzQsNGA0YjRgNGD0YIg0L/QviDQutC+0YLQvtGA0L7QvNGDINC90YPQttC90L4g0L/RgNC+0LjQt9Cy0LXRgdGC0Lgg0LfQsNC/0YDQvtGBLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LAsINC60L7RgtC+0YDQsNGPINC/0YDQuCDRg9GB0L/QtdGF0LUg0LLRi9C30L7QstC10YIgc3VjY2Vzcywg0LAg0L/RgNC4INC+0YjQuNCx0LrQtSBlcnJvci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIC0g0LzQtdGC0L7QtCDQt9Cw0L/RgNC+0YHQsFxuICAgICAqL1xuICAgIHN0YXRpYyBzZW5kKGRhdGEsIHVybCwgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9LCBtZXRob2QgPSAnUE9TVCcpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgY29uc3Qgc3RhdHVzU3VjY2VzcyA9IDIwMDtcbiAgICAgICAgbGV0IGRhdGFUb1NlbmQgPSBkYXRhO1xuXG4gICAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsKTtcblxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigneC1yZXF1ZXN0ZWQtd2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVRvU2VuZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGRhdGFUb1NlbmQgPSAkLnBhcmFtKGRhdGFUb1NlbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgeGhyLnNlbmQoZGF0YVRvU2VuZCk7XG5cbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIFhIUigpIHtcbiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSBzdGF0dXNTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxID0gSlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjay5zdWNjZXNzKHJlcSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L/RgNC+0LLQtdGA0Y/QtdGCINC90LDQu9C40YfQuNC1INC40L3RgtC10YDQvdC10YLQsFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0g0J/RgNC4INC90LDQu9C40YfQuNC4INGA0LXQt9GD0LvRjNGC0LDRgtC+0Lwg0LHRg9C00LXRgiB0cnVlLCDQsCDQv9GA0Lgg0L7RgtGB0YPRgtGB0LLQuNC4IGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBjaGVja0ludGVybmV0Q29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9GA0L7QstC10YDRj9C10YIg0L/RgNC40YHRg9GC0YHRgtCy0YPQtdGCINC70Lgg0LrQu9GO0Ycg0LIg0L7QsdGK0LXQutGC0LVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0g0L/RgNC+0LLQtdGA0Y/QtdC8INC+0LHRitC10LrRglxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSDQutC70Y7Rhywg0L3QsNC70LjRh9C40LUg0LrQvtGC0L7RgNC+0LPQviDQv9GA0L7QstC10YDRj9C10YIg0LIg0L7QsdGK0LXQutGC0LVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtINC/0YDQuNGB0YPRgtGB0YLQstGD0LXRgiDQuNC70Lgg0L3QtdGCINC60LvRjtGHINCyINC+0LHRitC10LrRgtC1XG4gICAgICovXG4gICAgc3RhdGljIGtleUV4aXN0KG9iamVjdCwga2V5KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L/RgNC+0LLQtdGA0Y/QtdGCINC/0YPRgdGC0L7QuSDQvtCx0YrQtdC60YIg0LjQu9C4INC90LXRglxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSDQvtCx0YrQtdC60YIg0L/RgNC+0LLQtdGA0Y/QtdC80YvQuSDQvdCwINC/0YPRgdGC0L7RgtGDXG4gICAgICogQHJldHVybi
46184B7Ym9vbGVhbn0gLSB0cnVlINC10YHQu9C4INC/0YPRgdGC0L7QuSDQuCBmYWxzZSDQtdGB0LvQuCDQv9C+0LvQvdGL0LlcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNFbXB0eU9iamVjdChvYmplY3QpIHtcbiAgICAgICAgY29uc3QgZW1wdHkgPSAwO1xuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCA9PT0gZW1wdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCINC/0LXRgNC10LTQsNC90L3Ri9C1INC00LDQvdC90YvQtSDQvdCwINGB0YLRgNC+0LrRg1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgLSDQtNCw0L3QvdGL0LUg0L3QsCDQv9GA0L7QstC10YDQutGDXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSDQstC+0LfRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0YHRgtGA0L7QutCwLCDQuCBmYWxzZSDQvdCw0L7QsdC+0YDQvtGCXG4gICAgICovXG4gICAgc3RhdGljIGlzU3RyaW5nKHN0cmluZykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQt9C90LDQtdGCIGluZGV4INGN0LvQtdC80LXQvdGC0LAg0LIg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC5INGN0LvQtdC80LXQvdGCXG4gICAgICog0JDQvdCw0LvQvtCzIGpxdWVyeS5pbmRleCgpXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IC0g0LjRgdC60L7QvNGL0Lkg0Y3Qu9C10LzQtdC90YJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0g0L/QvtGA0Y/QtNC60L7QstGL0Lkg0L3QvtC80LXRgCAo0LjQvdC00LXQutGBKSDQsiDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0Lwg0Y3Qu9C10LzQtdC90YLQtVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRFbGVtZW50SW5kZXgoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LvQuCDRg9GB0YLRgNC+0LnRgdGC0LLQviB0b3VjaC3RgdC+0LHRi9GC0LjRj1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0g0LLQvtC30YDQsNGJ0LDQtdGCIHRydWUsINC10YHQu9C4IFRvdWNoLdGD0YHRgtGA0L7QudGB0YLQstC+LCDQuCBmYWxzZSDQvdCw0L7QsdC+0YDQvtGCXG4gICAgICovXG4gICAgc3RhdGljIGlzVG91Y2goKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCkpKSB8fFxuICAgICAgICAgICAgQm9vbGVhbih0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQt9C90LDQtdGCINC90LDRhdC+0LTQuNGC0YHRjyDQu9C4INGN0LvQtdC80LXQvdGCINCy0L4g0LLRjNGO0L/QvtGA0YLQtVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCAtINC40YHQutC+0LzRi9C5INGN0LvQtdC80LXQvdGCXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSDQstC+0LfRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0Y3Qu9C10LzQtdC90YIg0LLQuNC00LXQvSDQvdCwINGN0LrRgNCw0L3QtSwg0LggZmFsc2Ug0L3QsNC+0LHQvtGA0L7RglxuICAgICAqL1xuICAgIHN0YXRpYyBpc0luVmlld3BvcnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCBiZWxvd1ZpZXdwb3J0ID0gMDtcblxuICAgICAgICBjb25zdCB2ZXJ0aWNhbEluVmlldyA9IChyZWN0LnRvcCA8PSB3aW5kb3dIZWlnaHQpICYmICgocmVjdC50b3AgKyByZWN0LmhlaWdodCkgPj0gYmVsb3dWaWV3cG9ydCk7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxJblZpZXcgPSAocmVjdC5sZWZ0IDw9IHdpbmRvd1dpZHRoKSAmJiAoKHJlY3QubGVmdCArIHJlY3Qud2lkdGgpID49IGJlbG93Vmlld3BvcnQpO1xuXG4gICAgICAgIHJldHVybiB2ZXJ0aWNhbEluVmlldyAmJiBob3Jpem9udGFsSW5WaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0LXRgNC10LTQsNCy0LDQtdC80YPRjiDRhNGD0L3QutGG0LjRjiDQvdC1INGH0LDRidC1LCDRh9C10Lwg0YDQsNC3INCyIHdhaXQg0LzRgVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmdW5jIC0g0YTRg9C90LrRhtC40Y9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCAtINCy0YDQtdC80Y8g0L7QttC40LTQsNC90LjRjywg0LzRgVxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gLSBmdW5jXG4gICAgICovXG4gICAgc3RhdGljIGRlYm91bmNlKGZ1bmMsIHdhaXQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgICAgbGV0IHRpbWVvdXQ7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgI
46184H07XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9XG5cbiAgICBzdGF0aWMgY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdCA9IDA7XG4gICAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSAkKGVsZW1lbnQpLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghZm91bmRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzW2ZpcnN0XTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFV0aWxzO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHN1Y2Nlc3NUcGwgZnJvbSAnY29tcG9uZW50cy9mb3Jtcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHdpZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuaW1wb3J0IFZhbGlkYXRpb24gZnJvbSAnY29tcG9uZW50cy9mb3Jtcy92YWxpZGF0aW9uJztcblxuY2xhc3MgU3VibWl0IHtcbiAgICBpbml0KG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy50YXJnZXQuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgICB0aGlzLmZvcm1XcmFwID0gdGhpcy50YXJnZXQuY2xvc2VzdCgnLmItY2FsbGJhY2tfX2Zvcm0nKTtcbiAgICAgICAgdGhpcy5yZXBseVdyYXAgPSB0aGlzLmZvcm1XcmFwLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLmZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKTtcbiAgICAgICAgdGhpcy5tZXRob2QgPSB0aGlzLmZvcm0uZ2V0QXR0cmlidXRlKCdtZXRob2QnKTtcbiAgICAgICAgdGhpcy5pbnB1dHMgPSB0aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmotaW5wdXQnKTtcbiAgICAgICAgdGhpcy5ub0Vycm9ycyA9IDA7XG5cbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgYmluZEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25DaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YWxpZGF0aW9uQ2hlY2soKSB7XG4gICAgICAgIHRoaXMuaW5wdXRzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbiA9IG5ldyBWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBpdGVtLmRhdGFzZXQuZXJyb3I7XG5cbiAgICAgICAgICAgIGlucHV0VmFsaWRhdGlvbi5pbml0KHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGl0ZW0sXG4gICAgICAgICAgICAgICAgZXJyb3IgOiBlcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpbnB1dFZhbGlkYXRpb24udmFsaWRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZXJyb3InKS5sZW5ndGggPT09IHRoaXMubm9FcnJvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VuZCgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gJCh0aGlzLmZvcm0pLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgIFV0aWxzLnNlbmQoZm9ybURhdGEsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlc3BvbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5zaG93U3VjY2Vzc01lc3NhZ2UocmVzcG9uZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQvtGI0LjQsdC60LAg0L3QsCDRgdC10YDQstC10YDQtTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzLm1ldGhvZCk7XG4gICAgfVxuXG4gICAgc2hvd1N1Y2Nlc3NNZXNzYWdlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5mb3JtV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBVdGlscy5pbnNldENvbnRlbnQodGhpcy5yZXBseVdyYXAsIHN1Y2Nlc3NUcGwoZGF0YS5kYXRhKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdWJtaXQ7XG4iLCIvKipcbiAqIEB2ZXJzaW9uIDEuMGFscGhhXG4gKiBAYXV0aG9yIEtlbG5payBTdHVkaW9zIHtodHRwOi8va2VsbmlrLnJ1fVxuICogQGxpbmsgaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9mb3Jtcy9pbnB1dC10ZWwuaHRtbCBkb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBEZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgaW5wdXRtYXNrIGZyb20gJ2lucHV0bWFzayc7XG5cbi8qKlxuICog0JzQvtC00YPQu9GMINCy0LLQtdGI0LDQtdGCINC80LDRgdC60YMg0L3QsCBpbnB1dCDRgtC40L/QvtC8IHRlbFxuICovXG5jbGFzcyBJbnB1dFRlbGVwaG9uZSB7XG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBvcHRpb25zLmlucHV0O1xuICAgICAgICB0aGlzLm1hc2sgPSBvcHRpb25zLm1hc2sgfHwgJys3KDk5OSkgOTk5LTk5LTk5JztcblxuICAgICAgICB0aGlzLnNldE1hc2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDQvNCw0YHQutGDINC90LAg0LjQvdC/0YPRglxuICAgICAqL1xuICAgIHNldE1hc2soKSB7XG4gICAgICAgIGlucHV0bWFzayh7bWFzazogdGhpcy5tYXNrfSkubWFzayh0aGlzLmlucHV0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IElucHV0VGVsZXBob25lO1xuIiwiLyoqXG4gKiBEZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgaHlwZXJmb3JtIGZyb20gJ2h5cGVyZm9ybSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuY29uc3QgZm9jdXNDbGFzcyA9ICdpcy1mb2N1c2VkJztcblxuY2xhc3MgVmFsaWRhdGlvbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgI
46184HRoaXMuZXJyb3JDbGFzcyA9ICdoYXMtZXJyb3InO1xuICAgICAgICB0aGlzLmVycm9yV3JhcENsYXNzID0gJ2ItZm9ybS1lcnJvcic7XG4gICAgfVxuXG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBvcHRpb25zLmVycm9yIHx8ICfQktCy0LXQtNC40YLQtSDRgtC10LrRgdGCINCyINC/0L7Qu9C1INCy0LLQvtC00LAnO1xuICAgICAgICB0aGlzLmlucHV0V3JhcCA9IHRoaXMuaW5wdXQuY2xvc2VzdCgnZGl2Jyk7XG4gICAgICAgIHRoaXMuZXJyb3JXcmFwID0gdGhpcy5pbnB1dFdyYXAucXVlcnlTZWxlY3RvcihgLiR7dGhpcy5lcnJvcldyYXBDbGFzc31gKTtcblxuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBjcmVhdGVFcnJvcldyYXAoKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yV3JhcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgVXRpbHMuaW5zZXRDb250ZW50KHRoaXMuaW5wdXRXcmFwLCBgPGRpdiBjbGFzcz1cIiR7dGhpcy5lcnJvcldyYXBDbGFzc31cIj48L2Rpdj5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycm9yV3JhcCA9IHRoaXMuaW5wdXRXcmFwLnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMuZXJyb3JXcmFwQ2xhc3N9YCk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRXJyb3JXcmFwKCk7XG4gICAgICAgIHRoaXMubGFiZWxDb25kdWN0KCk7XG5cbiAgICAgICAgaWYgKGh5cGVyZm9ybS53aWxsVmFsaWRhdGUodGhpcy5pbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSBoeXBlcmZvcm0uVmFsaWRpdHlTdGF0ZSh0aGlzLmlucHV0KS52YWxpZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIFV0aWxzLmNsZWFySHRtbCh0aGlzLmVycm9yV3JhcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFdyYXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmVycm9yQ2xhc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBVdGlscy5jbGVhckh0bWwodGhpcy5lcnJvcldyYXApO1xuICAgICAgICAgICAgICAgIFV0aWxzLmluc2V0Q29udGVudCh0aGlzLmVycm9yV3JhcCwgdGhpcy5lcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRXcmFwLmNsYXNzTGlzdC5hZGQodGhpcy5lcnJvckNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxhYmVsQ29uZHVjdCgpIHtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuaW5wdXQubmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXQudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoZm9jdXNDbGFzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsLmNsYXNzTGlzdC5hZGQoZm9jdXNDbGFzcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZhbGlkYXRpb247XG4iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCI5MjY2MGQzYzQ2NTQ3ZTg5YTQzNDA1MmI2NWM2YWIyMmY1YmQzMDZiZDhmYjRlZTJjZjYyMjQzZTY2YmRmOTdkM2RmNWJiOGViOTZlMjE2ZDZkNjk2NjVhY2VkYzQwMTg2ODIzZGI2YzRiMjdjMGNiYmQ3ZjY3ZDc2YTk4OTRlMFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8aDQgY2xhc3M9XFxcImItY2FsbGJhY2stcmVwbHlfX3RpdGxlXFxcIj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRpdGxlXCIsXCJtYXRjaFwiOltcInRpdGxlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvaDQ+XFxuPGRpdiBjbGFzcz1cXFwiYi1jYWxsYmFjay1yZXBseV9fdGV4dFxcXCI+XCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJtZXNzYWdlXCIsXCJtYXRjaFwiOltcIm1lc3NhZ2VcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwiYi1jYWxsYmFjay1yZXBseV9faWNvblxcXCI+XFxuICAgIDxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgd2lkdGg9XFxcIjE1MlxcXCIgaGVpZ2h0PVxcXCIxNTJcXFwiIHZpZXdCb3g9XFxcIjAgMCAxNTIgMTUyXFxcIj48ZGVmcz48cGF0aCBpZD1cXFwidnY5M2FcXFwiIGQ9XFxcIk02NDQgNDc1YzAtNDEuOTc0IDM0LjAyNi03NiA3Ni03NnM3NiAzNC4wMjYgNzYgNzYtMzQuMDI2IDc2LTc2IDc2LTc2LTM0LjAyNi03Ni03NnpcXFwiLz48cGF0aCBpZD1cXFwidnY5M2JcXFwiIGQ9XFxcIk03MTYuMjUgNDc3LjVsMTcuNS0xNy41IDYuMjUgNi4yNUw3MTYuMjUgNDkwIDcwMCA0NzMuNzVsNi4yNS02LjI1elxcXCIvPjwvZGVmcz48Zz48ZyBvcGFjaXR5PVxcXCIuMlxcXCIgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTY0NCAtMzk5KVxcXCI+PHVzZSBmaWxsPVxcXCIjZDY5ZDNhXFxcIiB4bGluazpocmVmPVxcXCIjdnY5M2FcXFwiLz48L2c+PGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTY0NCAtMzk5KVxcXCI+PHVzZSBmaWxsPVxcXCIjZDY5ZDNhXFxcIiB4bGluazpocmVmPVxcXCIjdnY5M2JcXFwiLz48L2c+PC9nPjwvc3ZnPlxcbjwvZGl2PlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiY29uc3QgZGVmYXVsdFBvc2l0aW9uID0gMDtcbmNvbnN0IGhhbGYgPSAyO1xuY29uc3QgcmlnaHRDbGFzc0luID0gJ2lzLWdvZXMtcmlnaHQnO1xuY29uc3QgbGVmdENsYXNzSW4gPSAnaXMtZ29lcy1sZWZ0JztcbmNvbnN0IHJpZ2h0Q2xhc3NPdXQgPSAnaXMtZ29lcy1yaWdodF9fb3V0JztcbmNvbnN0IGxlZnRDbGFzc091dCA9ICdpcy1nb2VzLWxlZnRfX291dCc7XG5jb25zdCBpdGVtV2l0aEJnSW1nID0gJ2lzLWdvZXMtd2l0aC1pbWFnZSc7XG5cbmNsYXNzIEhvdmVyRWZmZWN0IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgICAgI
46184HRoaXMud2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLnRpdGxlID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbY2xhc3MqPXR0bF0nKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdiLWhpZ2hsaWdodC1wYXJlbnQnKTtcbiAgICAgICAgLy8g0JXRgdC70Lgg0YTQvtC9INGBINC40LfQvtCx0YDQsNC20LXQvdC40LXQvCDRgtC+INC00LXQu9Cw0LXQvCDQutC70LjQvyDQuCDQvdCwINGB0LDQvCDRgtC10LrRgdGCXG4gICAgICAgIHRoaXMud2l0aEJnSW1nID0gZWxlbWVudC5kYXRhc2V0LndpdGhCZ0ltZztcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcihlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jaGVja0VsZW1lbnRXaXRoQmcodGhpcy50aXRsZSk7XG4gICAgICAgIHRoaXMuX2xvYWRFdmVudHMoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIg0YHQu9C+0Lkt0LzQsNGB0LrRg1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0gZGl2XG4gICAgICovXG4gICAgY3JlYXRlTGF5ZXIoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmxheWVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMubGF5ZXIuY2xhc3NOYW1lID0gJ2ItaGlnaGxpZ2h0LWxheWVyJztcblxuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubGF5ZXIpO1xuICAgIH1cblxuICAgIF9sb2FkRXZlbnRzKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxheWVyLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgICAgICB0aGlzLmdldEN1cnNvckRpcmVjdGlvbihldmVudCk7XG4gICAgICAgICAgICB0aGlzLm1vdmVMYXllckluKHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRDdXJzb3JEaXJlY3Rpb24oZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5tb3ZlTGF5ZXJPdXQodGhpcy5kaXJlY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDdXJzb3JEaXJlY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBldmVudC5vZmZzZXRYO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQv9C10YDQtdC80LXRidCw0LXRgiDRgdC+0LfQtNCw0L3QvdGL0Lkg0YHQu9C+0Lkg0L/QvtCy0LXRgNGFINGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INCx0LvQvtC60LBcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gY29vcmRYIC0g0LfQvdCw0YfQtdC90LjQtSDQutC+0L7RgNC00LjQvdCw0YLRiyB4INC60YPRgNGB0L7RgNCwXG4gICAgICovXG4gICAgbW92ZUxheWVySW4oY29vcmRYKSB7XG4gICAgICAgIGlmIChjb29yZFggPiB0aGlzLndpZHRoIC8gaGFsZikge1xuICAgICAgICAgICAgdGhpcy50aXRsZS5jbGFzc0xpc3QuYWRkKHJpZ2h0Q2xhc3NJbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlLmNsYXNzTGlzdC5hZGQobGVmdENsYXNzSW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGl0bGUuY2xhc3NMaXN0LnJlbW92ZShyaWdodENsYXNzT3V0KTtcbiAgICAgICAgdGhpcy50aXRsZS5jbGFzc0xpc3QucmVtb3ZlKGxlZnRDbGFzc091dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0L/QtdGA0LXQvNC10YnQsNC10YIg0YHQvtC30LTQsNC90L3Ri9C5INGB0LvQvtC5INC30LAg0L/RgNC10LTQtdC70Ysg0YDQvtC00LjRgtC10LvRjNGB0LrQvtCz0L4g0LHQu9C+0LrQsFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb29yZFggLSDQt9C90LDRh9C10L3QuNC1INC60L7QvtGA0LTQuNC90LDRgtGLIHgg0LrRg9GA0YHQvtGA0LBcbiAgICAgKi9cbiAgICBtb3ZlTGF5ZXJPdXQoY29vcmRYKSB7XG4gICAgICAgIGlmIChjb29yZFggPiBkZWZhdWx0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubGF5ZXIuc3R5bGUubGVmdCA9ICcxMDAlJztcbiAgICAgICAgICAgIHRoaXMudGl0bGUuY2xhc3NMaXN0LmFkZCgnaXMtZ29lcy1sZWZ0X19vdXQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGF5ZXIuc3R5bGUubGVmdCA9ICctMTAwJSc7XG4gICAgICAgICAgICB0aGlzLnRpdGxlLmNsYXNzTGlzdC5hZGQoJ2lzLWdvZXMtcmlnaHRfX291dCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aXRsZS5jbGFzc0xpc3QucmVtb3ZlKHJpZ2h0Q2xhc3NJbik7XG4gICAgICAgIHRoaXMudGl0bGUuY2xhc3NMaXN0LnJlbW92ZShsZWZ0Q2xhc3NJbik7XG4gICAgfVxuXG4gICAgY2hlY2tFbGVtZW50V2l0aEJnKHRpdGxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy53aXRoQmdJbWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKGl0ZW1XaXRoQmdJbWcpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIb3ZlckVmZmVjdDtcbiIsIi8qKlxuICogQHZlcnNpb24gMS4xYWxwaGFcbiAqIEBhdXRob3IgS2VsbmlrIFN0dWRpb3Mge2h0dHA6Ly9rZWxuaWsucnV9XG4gKiBAbGluayBodHRwczovL2tlbG5pay5naXRib29rcy5pby9rZWxuaWstZG9jdW1lbnRhdGlvbi9jb250ZW50L2Zyb250LWVuZC9jb21wb25lbnRzL21vYmlsZS1oZWFkZXIuaHRtbCBkb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBEZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0ICcuL21vYmlsZS1oZWFkZXIuc2Nzcyc7XG5pbXBvcnQgSGFtbWVyIGZyb20gJ2hhbW1lcmpzJztcblxuXG4vKipcbiAqIENvbXBvbmVudFxuICovXG5jbGFzcyBIZWFkZXIge1xuICAgIGluaXQob3B0aW9ucykge1xuICAgICAgICB0aGlzLmhlYWRlclBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy5lbGVtZW50KSB8fCBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQn9GA0L7QstC10YDQutCwINC90LAg0L3QsNC70LjRh9C40LUg0YXRjdC00LXRgNCwXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUGFyZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOZWVkIHRhcmdldCBlbGVtZW50IC0gaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9tb2JpbGUtaGVhZGVyLmh0bWwnKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgdGhpcy5oZWFkZXIgPSB0aGlzLmhlYWRlclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuYi1oZWFkZXItd3JhcCcpO1xuICAgICAgICB0aGlzLm1lbnUgPSB0aGlzLmhlYWRlclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuYi1oZWFkZXJfX21vYmlsZS1tZW51Jyk7XG4gICAgICAgI
46184HRoaXMub3BlbkJ1dHRvbiA9IHRoaXMuaGVhZGVyUGFyZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLWhlYWRlcl9fb3Blbi1tZW51Jyk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24gPSB0aGlzLmhlYWRlclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuYi1oZWFkZXJfX21vYmlsZS1tZW51LWNsb3NlJyk7XG4gICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLmF1dG9GaXhlZCA9IG9wdGlvbnMuYXV0b0ZpeGVkO1xuICAgICAgICB0aGlzLmF1dG9Qb3NpdGlvbkNsb3NlQnV0dG9uID0gb3B0aW9ucy5hdXRvUG9zaXRpb25DbG9zZUJ1dHRvbjtcbiAgICAgICAgdGhpcy5yZXR1cm5Qb3NpdGlvbiA9IG9wdGlvbnMucmV0dXJuUG9zaXRpb247XG4gICAgICAgIHRoaXMuc3dpcGVEaXJlY3Rpb24gPSBvcHRpb25zLnN3aXBlRGlyZWN0aW9uIHx8ICdyaWdodCc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQutC+0YDRgNC10LrRgtC90L7QtSDRg9C60LDQt9Cw0L3QuNC1INC90LDQv9GA0LDQstC70LXQvdC40Y8g0LTQu9GPINGB0LLQsNC50L/QsCAo0LTQvtGB0YLRg9C/0L3QviDRgtC+0LvRjNC60L4g0YHQu9C10LLQsCDQvdCw0L/RgNCw0LLQviwg0Lgg0YHQv9GA0LDQstCwINC90LDQu9C10LLQvilcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLnN3aXBlRGlyZWN0aW9uICE9PSAnbGVmdCcgJiYgdGhpcy5zd2lwZURpcmVjdGlvbiAhPT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignV3JvbmcgZGlyZWN0aW9uIHN3aXBlIC0gaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9tb2JpbGUtaGVhZGVyLmh0bWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlT3B0aW9ucygpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHRIZWFkZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjRj1xuICAgICAqL1xuICAgIGJpbmRFdmVudHMoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBD0L7QsdGL0YLQuNGPINC00LvRjyDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjRjyDQutC90L7Qv9C60Lgg0LfQsNC60YDRi9GC0Ywg0Lgg0YPRgdGC0LDQvdC+0LLQutC4INCy0YvRgdC+0YLRiyDRhdGN0LTQtdGA0YNcbiAgICAgICAgICovXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmNoYW5nZVBvc2l0aW9uQ2xvc2VCdXR0b24uYmluZCh0aGlzKSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnNldEhlaWdodEhlYWRlci5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ9C+0LHRi9GC0LjRjyDQtNC70Y8g0L7RgtC60YDRi9GC0LjRjy/Qt9Cw0LrRgNGL0YLQuNGPINC80LXQvdGOXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9wZW5NZW51LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbG9zZU1lbnUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCX0LDQutGA0YvRgtC40LUg0LzQtdC90Y4g0L/QviDRgdCy0LDQudC/0YMgKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOIC0g0YHQu9C10LLQsCDQvdCw0L/RgNCw0LLQvilcbiAgICAgICAgICovXG4gICAgICAgIG5ldyBIYW1tZXIodGhpcy5tZW51KS5vbihgc3dpcGUke3RoaXMuc3dpcGVEaXJlY3Rpb259YCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9GA0LjQvNC10L3QtdC90LjRjyDQvdCw0YHRgtGA0L7QtdC6XG4gICAgICovXG4gICAgdXNlT3B0aW9ucygpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqINCX0LDQv9GD0YHQuiDRgdC60YDQuNC/0YLQsCDRgdC60YDQvtC70LvQsCDQv9GA0Lgg0L3QsNGB0YLRgNC+0LnQutC1IGF1dG9GaXhlZDogdHJ1ZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmF1dG9GaXhlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXIuY2xhc3NMaXN0LmFkZCgnYi1oZWFkZXJfcG9zaXRpb25fZml4ZWQnKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUG9zaXRpb25IZWFkZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0YDQtdCw0LvQuNC30LDRhtC40Lgg0L/QvtGP0LLQu9C10L3QuNGPL9GB0LrRgNGL0YLQuNGPINGF0Y3QtNC10YDQsFxuICAgICAqL1xuICAgIGNoYW5nZVBvc2l0aW9uSGVhZGVyKCkge1xuICAgICAgICAvLyDRiNCw0LMg0LLRgNC10LzQtdC90Lgg0LfQsNC00LXRgNC20LrQuCDQvtGC0YDQsNCx0LDRgtGL0LLQsNC90LjRjyDRhNGD0L3QutGG0LjQuCDRgdC60YDRi9GC0LjRjyDRhdGN0LTQtdGA0LBcbiAgICAgICAgY29uc3Qgc3RlcFNjcm9sbFRvcCA9IC01O1xuICAgICAgICAvLyDRiNCw0LMg0LLRgNC10LzQtdC90Lgg0LfQsNC00LXRgNC20LrQuCDQvtGC0YDQsNCx0LDRgtGL0LLQsNC90LjRjyDRhNGD0L3QutGG0LjQuCDQvtGC0L7QsdGA0LDQttC10L3QuNGPINGF0Y3QtNC10YDQsFxuICAgICAgICBjb25zdCBzdGVwU2Nyb2xsQm90dG9tID0gNTtcbiAgICAgICAgY29uc3QgaGVpZ2h0SGVhZGVyID0gdGhpcy5oZWFkZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAvLyDRgtC10LrRg9GJ0LDRjyDQv9C+0LfQuNGG0LjRjyDRgdC60YDQvtC70LvQsFxuICAgICAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgICAgICBjb25zdCBtaW5TY3JvbGxQb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDQntGC0LrQu9GO0YfQtdC90LjQtSDQvNC10YLQvtC00LAg0LXRgdC70Lgg0LzQtdC90Y4g0L7RgtC60YDRi9GC0L5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMubWVudS5jbGFzc0xpc3QuY29udGFpbnMoJ2ItaGVhZGVyX19tb2JpbGUtbWVudV9zdGF0ZV9vcGVuJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcFBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEPQutGA0L7Qu9C7INCy0L3QuNC3INC/0YDQuCDRg9GB0LvQvtCy0LjQuCwg0YfRgtC+INC/0YDQvtGI0LvQsCDQv9C+0LvQvtCy0LjQvdCwINCy0YvRgdC+0YLRiyDRhdGN0LTQtdGA0LBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChzY3JvbGxUb3BQb3NpdGlvbiA+IGhlaWdodEhlYWRlcikgJiYgKHNjcm9sbFRvcFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb24pID4gc3RlcFNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgI
46184HRoaXMuaGVhZGVyLmNsYXNzTGlzdC5hZGQoJ2ItaGVhZGVyX3Bvc2l0aW9uX2ZpeGVkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXIuY2xhc3NMaXN0LmFkZCgnYi1oZWFkZXJfcG9zaXRpb25faGlkZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEPQutGA0L7Qu9C7INCy0LLQtdGA0YVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChzY3JvbGxUb3BQb3NpdGlvbiAtIHNjcm9sbFBvc2l0aW9uKSA8IHN0ZXBTY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdiLWhlYWRlcl9wb3NpdGlvbl9oaWRlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog0J7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0Lkg0YHQutGA0L7Qu9C7ICjQv9GA0L7QutGA0YPRgtC60LAg0LLQstC10YDRhSwg0L3QsNGF0L7QtNGP0YHRjCDQv9GA0Lgg0Y3RgtC+0Lwg0LIg0YHQsNC80L7QuSDQstC10YDRhdC90LXQuSDRgtC+0YfQutC1KVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoc2Nyb2xsVG9wUG9zaXRpb24gPCBtaW5TY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2ItaGVhZGVyX3Bvc2l0aW9uX2ZpeGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L7RgtC60YDRi9GC0LjRjyDQvNC10L3RjlxuICAgICAqL1xuICAgIG9wZW5NZW51KCkge1xuICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB0aGlzLm1lbnUuY2xhc3NMaXN0LmFkZCgnYi1oZWFkZXJfX21vYmlsZS1tZW51X3N0YXRlX29wZW4nKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VQb3NpdGlvbkNsb3NlQnV0dG9uKCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTcGVlZCA9IDMwMDtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYm9keS5jbGFzc0xpc3QuYWRkKCdib2R5LWZpeGVkJyk7XG4gICAgICAgIH0sIGRlZmF1bHRTcGVlZCk7XG4gICAgICAgIC8vIHRoaXMuc2V0SGVpZ2h0TWVudSgpOyAvLyFCVUdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC30LDQutGA0YvRgtC40Y8g0LzQtdC90Y5cbiAgICAgKi9cbiAgICBjbG9zZU1lbnUoKSB7XG4gICAgICAgIHRoaXMubWVudS5jbGFzc0xpc3QucmVtb3ZlKCdiLWhlYWRlcl9fbW9iaWxlLW1lbnVfc3RhdGVfb3BlbicpO1xuICAgICAgICB0aGlzLmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYm9keS1maXhlZCcpO1xuICAgICAgICB0aGlzLnJldHVybkNvbnRlbnRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0LLQvtC30LLRgNCw0YLQsCDQv9C+0LfQuNGG0LjQuCDQutC+0L3RgtC10L3RgtCwINC/0YDQuCDQt9Cw0LrRgNGL0YLQuNC4INC80LXQvdGOXG4gICAgICovXG4gICAgcmV0dXJuQ29udGVudFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMucmV0dXJuUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3BTY3JvbGxQb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgd2luZG93LnNjcm9sbEJ5KHRvcFNjcm9sbFBvc2l0aW9uLCB0aGlzLnNjcm9sbFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC/0L7Qt9C40YbQuNC+0L3QuNGA0L7QstCw0L3QuNGPINC60L3QvtC/0LrQuCDQt9Cw0LrRgNGL0YLQuNGPXG4gICAgICovXG4gICAgY2hhbmdlUG9zaXRpb25DbG9zZUJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9Qb3NpdGlvbkNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9zaXRpb25PcGVuQnV0dG9uVG9wID0gdGhpcy5vcGVuQnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgY29uc3QgcG9zaXRpb25PcGVuQnV0dG9uTGVmdCA9IHRoaXMub3BlbkJ1dHRvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc3R5bGUubGVmdCA9IGAke3Bvc2l0aW9uT3BlbkJ1dHRvbkxlZnR9cHhgO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLnN0eWxlLnRvcCA9IGAke3Bvc2l0aW9uT3BlbkJ1dHRvblRvcH1weGA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDRg9GB0YLQsNC90L7QstC60Lgg0LLRi9GB0L7RgtGLINGF0Y3QtNC10YDRg1xuICAgICAqL1xuICAgIHNldEhlaWdodEhlYWRlcigpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJQYXJlbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5oZWFkZXIub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCVUchINCc0LXRgtC+0LQg0YPRgdGC0LDQvdC+0LLQutC4INCy0YvRgdC+0YLRiyDQvNC10L3RjiDQuNGB0YXQvtC00Y8g0LjQtyDQstGL0YHQvtGC0Ysg0LLQuNC00LjQvNC+0Lkg0L7QsdC70LDRgdGC0Lgg0Y3QutGA0LDQvdCwXG4gICAgICovXG4gICAgc2V0SGVpZ2h0TWVudSgpIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0U2NyZWVuID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgICAgICB0aGlzLm1lbnUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0U2NyZWVufXB4YDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsInZhciB0d2lnID0gcmVxdWlyZShcInR3aWdcIikudHdpZyxcbiAgICB0ZW1wbGF0ZSA9IHR3aWcoe1wiaWRcIjpcIjEyNzhkNTUxY2I3MTU3OTcxMDcwNjViZjIwZWQyMzc5N2RhMzJlOWVmMzA2NTAzM2U0NWVjYWYyMDBkNGU5ZDhhMTQwY2NiNzZhMDQ2YmU1NWJjNjQyMmE5ZmEwODRjNmViZWQ0ZDZiYWUyN2UwZjZhYTY4Njg0ZTIxZGJjODFhXCIsXCJkYXRhXCI6W3tcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjxhIGhyZWY9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwibGlua1wiLFwibWF0Y2hcIjpbXCJsaW5rXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcXCIgY2xhc3M9XFxcImItbmV3X19ibGFuayBiLWFuaW1hdGUtYm9yZGVyc19fc2VwYXJhdGVkIGotaG92ZXItaGlnaGxpZ2h0XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi10b3AtYm9yZGVyXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1sZWZ0LWJvcmRlclxcXCI+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImItcmlnaHQtYm9yZGVyXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1ib3R0b20tYm9yZGVyXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1uZXdfX2RhdGVcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiZGF0ZVwiLFwibWF0Y2hcIjpbXCJkYXRlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLW5ld19fdHRsXFxcIiBkYXRhLXRleHQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGl0bGVcIixcIm1hdGNoXCI6W1widGl0bGVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRpdGxlXCIsXCJtYXRjaFwiOltcInRpdGxlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLW5ld19fdGV4dFxcXCI+XCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJhbm5vdW5jZVwiLFwibWF0Y2hcIjpbXCJhbm5vdW5jZVwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8L2Rpdj5cXG48L2E+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybi
46184B0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJiZGI0ODBlNzY0MTg2YWYyYWEwOWNhMzVjZDUxYTc0OTEwZGUzYzExYzBiM2E5NzA1ZTlkNGIxYjUzZTE5MzU1NTc0NjRiMzQ0ZGZmOWM2MjgzZWM3NGUxODI5MGQ5YThhNzM3ZWI0OTZmYTI0YzYyYjM5ZGQ0NzJlY2IxMTY1N1wiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8YSBocmVmPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImxpbmtcIixcIm1hdGNoXCI6W1wibGlua1wiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXFwiIGNsYXNzPVxcXCJiLW5ld19fYmFja2dyb3VuZCBqLWhvdmVyLWhpZ2hsaWdodFxcXCIgZGF0YS13aXRoLWJnLWltZyBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCdcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImltYWdlXCIsXCJtYXRjaFwiOltcImltYWdlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIicpXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1uZXdfX2RhdGVcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiZGF0ZVwiLFwibWF0Y2hcIjpbXCJkYXRlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLW5ld19fdHRsXFxcIiBkYXRhLXRleHQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGl0bGVcIixcIm1hdGNoXCI6W1widGl0bGVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj48c3Bhbj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRpdGxlXCIsXCJtYXRjaFwiOltcInRpdGxlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvc3Bhbj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1uZXdfX3RleHRcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiYW5ub3VuY2VcIixcIm1hdGNoXCI6W1wiYW5ub3VuY2VcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPC9kaXY+XFxuPC9hPlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiaW1wb3J0IGJhc2ljVGVtcGxhdGUgZnJvbSAnY29tcG9uZW50cy9uZXdzL2Jhc2ljVGVtcGxhdGUudHdpZyc7XG5pbXBvcnQgaW1hZ2VUZW1wbGF0ZSBmcm9tICdjb21wb25lbnRzL25ld3MvaW1hZ2VUZW1wbGF0ZS50d2lnJztcbmltcG9ydCBNZWRpYXRvciBmcm9tICdjb21tb24vc2NyaXB0cy9tZWRpYXRvcic7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuY29uc3QgdGFibGV0TGFuZHNjYXBlID0gOTYwO1xuY29uc3QgaGlkZGVuQ2xhc3MgPSAnaXMtaGlkZGVuJztcblxuY2xhc3MgTmV3cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubW9yZUJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLWxvYWQtbW9yZScpO1xuICAgICAgICB0aGlzLmZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1uZXdzLWZpbHRlcicpO1xuICAgICAgICB0aGlzLnBhZ2VJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYWdlJyk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25ld3MnKTtcbiAgICAgICAgdGhpcy5tb3JlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYWdlSW5wdXQudmFsdWUrKzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgdGhpcy5zZW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNoYW5nZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXQoZm9ybSkge1xuICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgICAgICB0aGlzLnVybCA9IHRoaXMuZm9ybS5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IHRoaXMuZm9ybS5nZXRBdHRyaWJ1dGUoJ21ldGhvZCcpO1xuICAgICAgICB0aGlzLnNlbmQoKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJDaGFuZ2UoKSB7XG4gICAgICAgIFV0aWxzLmNsZWFySHRtbCh0aGlzLnBhcmVudCk7XG4gICAgICAgIHRoaXMucGFnZUlucHV0LnZhbHVlID0gMTtcbiAgICAgICAgdGhpcy5zZW5kKCk7XG4gICAgfVxuXG4gICAgc2VuZCgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5kYXRhVG9TZW5kID0gJCh0aGlzLmZvcm0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICBVdGlscy5zZW5kKHRoaXMuZGF0YVRvU2VuZCwgdGhpcy51cmwsIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzcG9uZCkge1xuICAgICAgICAgICAgICAgIHJlc3BvbmQuZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgI
46184HRoYXQuaW5zZXJ0VGVtcGxhdGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhhdC5nZXRCbG9ja1Bvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbmQucmVxdWVzdC5pc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5oaWRlQnRuKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5zaG93QnRuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1lZGlhdG9yLnB1Ymxpc2goJ3JlY2VpdmVkTmV3cycpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihg0L7RiNC40LHQutCwINC90LAg0YHQtdGA0LLQtdGA0LU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRlbXBsYXRlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkYXRhLmltYWdlID8gaW1hZ2VUZW1wbGF0ZSA6IGJhc2ljVGVtcGxhdGU7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCB0ZW1wbGF0ZShkYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0LLRi9GH0LjRgdC70Y/QtdGCINC/0L7Qt9C40YbQuNGOINCx0LvQvtC60LAg0L3QvtCy0L7RgdGC0LgsINC00L7QsdCw0LLQu9GP0Y8g0L3QtdC+0LHRhdC+0LTQuNC80YvQuSDQutC70LDRgdGBXG4gICAgICog0LTQu9GPINGB0LrRgNGL0YLQuNGPINCz0YDQsNC90LjRhlxuICAgICAqL1xuICAgIGdldEJsb2NrUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmItbmV3X19ibGFuaycpO1xuICAgICAgICBjb25zdCBwYXJlbnRQb3NpdGlvbiA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBsZWZ0TWluID0gMDtcbiAgICAgICAgY29uc3QgcmlnaHRNaW4gPSAtMTtcblxuICAgICAgICBibG9jay5mb3JFYWNoKChkaXYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrUG9zaXRpb24gPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZmVyZW5jZSA9IGJsb2NrUG9zaXRpb24ubGVmdCAtIHBhcmVudFBvc2l0aW9uLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmZlcmVuY2UgPSBibG9ja1Bvc2l0aW9uLnJpZ2h0IC0gcGFyZW50UG9zaXRpb24ucmlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0RGlmZmVyZW5jZSA9PT0gbGVmdE1pbikge1xuICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdpcy1sZWZ0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHJpZ2h0RGlmZmVyZW5jZSkgPj0gcmlnaHRNaW4pIHtcbiAgICAgICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnaXMtcmlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA8IHRhYmxldExhbmRzY2FwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJvcmRlcihkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95Qm9yZGVyKGRpdikge1xuICAgICAgICBjb25zdCBib3JkZXJzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjbGFzcyo9Ym9yZGVyXScpO1xuXG4gICAgICAgIGJvcmRlcnMuZm9yRWFjaCgoYm9yZGVyKSA9PiB7XG4gICAgICAgICAgICBVdGlscy5yZW1vdmVFbGVtZW50KGJvcmRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3dCdG4oKSB7XG4gICAgICAgIHRoaXMubW9yZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKGhpZGRlbkNsYXNzKTtcbiAgICB9XG5cbiAgICBoaWRlQnRuKCkge1xuICAgICAgICB0aGlzLm1vcmVCdG4uY2xhc3NMaXN0LmFkZChoaWRkZW5DbGFzcyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBOZXdzO1xuIiwiLyoqXG4gKiBAdmVyc2lvbiAxLjFiZXRhXG4gKiBAYXV0aG9yIEtlbG5payBTdHVkaW9zIHtodHRwOi8va2VsbmlrLnJ1fVxuICogQGxpbmsgaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9wb3B1cC5odG1sIGRvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIERFUEVOREVOQ0lFU1xuICovXG5pbXBvcnQgTWVkaWF0b3IgZnJvbSAnY29tbW9uL3NjcmlwdHMvbWVkaWF0b3InO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJ2NvbXBvbmVudHMvcG9wdXAvcG9wdXAudHdpZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuXG5jbGFzcyBQb3B1cCB7XG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlIHx8IHRlbXBsYXRlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlQ29udGVudCA9IG9wdGlvbnMudGVtcGxhdGVDb250ZW50IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMudGFyZ2V0O1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uQXJpYUxhYmVsID0gb3B0aW9ucy5jbG9zZUJ1dHRvbkFyaWFMYWJlbCB8fCAn0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3Qvic7XG4gICAgICAgIHRoaXMuc3RhdGVDbGFzcyA9ICdiLXBvcHVwX3N0YXRlX29wZW4nO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC10YjQsNC10Lwg0YHQu9GD0YjQsNGC0LXQu9C10Lkg0YHQvtCx0YvRgtC40LlcbiAgICAgKi9cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMubWFrZU9wZW4uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU9uUHJlc3NCdXR0b24oZWxlbWVudCk7XG4gICAgICAgI
46184H0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCR0LDQudC90LQg0YHQvtCx0YvRgtC40Lkg0L/QvtGB0LvQtSDRgdC+0LfQtNCw0L3QuNGPIHBvcHVwLlxuICAgICAqL1xuICAgIGJpbmRFdmVudHNBZnRlck9wZW4oKSB7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsb3NlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VPbkNsaWNrT3ZlcmxheShlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JTQvtCx0LDQstC70Y/QtdGCIGJvZHkgcG9zaXRpb246Zml4ZWQsINC00LDQsdGLINC40LfQsdC10LbQsNGC0Ywg0L/RgNC+0LrRgNGD0YLQutC4INGB0YLRgNCw0L3QuNGG0Ysg0L/RgNC4INC+0YLQutGA0YvRgtC+0Lwg0L/QvtC/0LDQv9C1LlxuICAgICAqINCa0L7Qs9C00LAt0L3QuNCx0YPQtNGMINC/0LXRgNC10L3QtdGB0LXQvCDQsiBNZWRpYXRvci5cbiAgICAgKi9cbiAgICBmaXhlZEJvZHkoKSB7XG4gICAgICAgIHRoaXMuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdib2R5LWZpeGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JfQsNC/0YPRgdC6INC/0L7Qv9Cw0L/QsCDQv9GA0Lgg0LrQu9C40LrQtSDQvdCwINC60L3QvtC/0LrRgy5cbiAgICAgKi9cbiAgICBtYWtlT3BlbigpIHtcbiAgICAgICAgdGhpcy5jb250ZW50VHlwZUNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0LrQsCDRgtC40L/QsCDQv9C+0L/QsNC/0LAgLSDRgdGC0LDRgtC40LrQsC9hamF4LlxuICAgICAqL1xuICAgIGNvbnRlbnRUeXBlQ2hlY2soKSB7XG4gICAgICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVIcmVmID0gdGhpcy50YXJnZXQuZGF0YXNldC5ocmVmO1xuICAgICAgICBjb25zdCBkYXRhQXR0cmlidXRlQWpheCA9IHRoaXMudGFyZ2V0LmRhdGFzZXQuYWpheDtcbiAgICAgICAgY29uc3QgZGF0YUF0dHJpYnV0ZUFqYXhEYXRhID0gJC5wYXJhbSh0aGlzLnRhcmdldC5kYXRhc2V0KTtcblxuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLnRhcmdldC5kYXRhc2V0LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXG4gICAgICAgIGlmIChkYXRhQXR0cmlidXRlSHJlZikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGF0YUF0dHJpYnV0ZUhyZWYpO1xuXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRJZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYNCh0L7Qt9C00LDQuSDQutC+0L3RgtC10L3RgtC90YvQuSDQsdC70L7QuiDQv9C+0L/QsNC/0LAg0YEgaWQgXCIke2RhdGFBdHRyaWJ1dGVIcmVmfVwiYCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXRpY0NvbnRlbnQgPSBjb250ZW50SWQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICB0aGlzLm91dHB1dE9uRGlzcGxheShzdGF0aWNDb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFBdHRyaWJ1dGVBamF4KSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dE9uRGlzcGxheSgpO1xuICAgICAgICAgICAgdGhpcy5zZW5kKGRhdGFBdHRyaWJ1dGVBamF4RGF0YSwgdGhpcy5vcGVuLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRi9Cy0L7QtCDQv9C+0L/QsNC/0LAg0L3QsCDRjdC60YDQsNC9LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0g0LrQvtC90YLQtdC90YIg0LjQtyDRgdGC0LDRgtC40LrQuCDQuNC70Lgg0LjQtyBqc29uLlxuICAgICAqL1xuICAgIG91dHB1dE9uRGlzcGxheShjb250ZW50KSB7XG4gICAgICAgIHRoaXMuc2V0RGF0YShjb250ZW50KTtcbiAgICAgICAgdGhpcy5pbnNlcnRUZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLmdldEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC00LPQvtGC0L7QstC60LAg0LTQsNC90L3Ri9GFINC00LvRjyDRiNCw0LHQu9C+0L3QsFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0g0LrQvtC90YLQtdC90YIg0LjQtyDRgdGC0LDRgtC40LrQuCDQuNC70Lgg0LjQtyBqc29uLlxuICAgICAqL1xuICAgIHNldERhdGEoY29udGVudCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgYnV0dG9uQXJpYUxhYmVsOiB0aGlzLmNsb3NlQnV0dG9uQXJpYUxhYmVsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdGC0LDQstC60LAg0YjQsNCx0LvQvtC90LAuXG4gICAgICovXG4gICAgaW5zZXJ0VGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCB0aGlzLnRlbXBsYXRlKHRoaXMuZGF0YSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7Qu9GD0YfQsNC10Lwg0L/QvtC/0LDQvyDQuCDQtdCz0L4g0Y3Qu9C10LzQtdC90YLRiywg0LLQtdGI0LDQtdC8INGB0L7QsdGL0YLQuNGPLlxuICAgICAqL1xuICAgIGdldEVsZW1lbnRzKCkge1xuICAgICAgICB0aGlzLnBvcHVwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItcG9wdXAnKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItcG9wdXBfX2NvbnRlbnQnKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IHRoaXMucG9wdXAucXVlcnlTZWxlY3RvcignLmItcG9wdXBfX2Nsb3NlJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IHRoaXMucG9wdXAucXVlcnlTZWxlY3RvcignLmItcG9wdXBfX292ZXJsYXknKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzQWZ0ZXJPcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdGC0LDQstC60LAg0LrQvtC90YLQtdC90YLQsFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwb3B1cCAtINGN0LvQtdC80LXQvdGCLCDQutGD0LTQsCDQstGB0YLQsNCy0LvRj9C10YLRgdGPINC60L7QvdGC0LXQvdGCLiAo0L3QtSDRgdCw0Lwg0L/QvtC/0LDQvywg0LAg0LXQs9C+INC60L7QvdGC0LXQvdGC0L3QsNGPINGH0LDRgdGC0YwhKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0g0LLRgdGC0LDQstC70Y/QtdC80YvQuSDQutC+0L3RgtC10L3Rgi5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW5zZXRDb250ZW50KHBvcHVwLCBjb250ZW50KSB7XG4gICAgICAgIFV0aWxzLmNsZWFySHRtbChwb3B1cCk7XG4gICAgICAgIFV0aWxzLmluc2V0Q29udGVudChwb3B1cCwgY29udGVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQvtGC0L/RgNCw0LLQutC4IGFqYXgg0LfQsNC/0YDQvtGB0LBcbiAgICAgKiBAcGFyYW0ge09
46184iamVjdH0gc2VudERhdGEgLSDQvtGC0L/RgNCw0LLQu9GP0LXQvNGL0LUg0LTQsNC90L3Ri9C1LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBsZXRlIC0g0YTRg9C90LrRhtC40Y8g0L7RgtC60YDRi9GC0LjRjyDQv9C+0L/QsNC/0LBcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSAtIGZhbHNlIC0g0LXRgdC70Lgg0L3QtdGCINC40L3RgtC10YDQvdC10YLQsCwg0LfQsNC/0YDQvtGBINC/0YDQtdGA0YvQstCw0LXRgtGB0Y8uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSB0cnVlIC0g0YPRgdC/0LXRiNC90L7QtSDQstGL0L/QvtC70L3QtdC90LjQtSDQt9Cw0L/RgNC+0YHQsC5cbiAgICAgKi9cbiAgICBzZW5kKHNlbnREYXRhLCBjb21wbGV0ZSA9IGZ1bmN0aW9uKCkge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrSW50ZXJuZXQoKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNlbmRpbmcoc2VudERhdGEpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy50YXJnZXQuZGF0YXNldC5hamF4O1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcS5yZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC50ZW1wbGF0ZUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVwLmluc2V0Q29udGVudCh0aGF0LmNvbnRlbnQsIHRoYXQudGVtcGxhdGVDb250ZW50KHJlcS5kYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBQb3B1cC5pbnNldENvbnRlbnQodGhhdC5jb250ZW50LCByZXEuZGF0YS5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5lcnJvckhhbmRsZXIoJ2RhdGEnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXEucmVx
46184dWVzdC5lcnJvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yKGVycikge1xuICAgICAgICAgICAgICAgIHRoYXQuZXJyb3JIYW5kbGVyKCdzZXJ2ZXInKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBzZXJ2ZXIgZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgVXRpbHMuc2VuZChzZW50RGF0YSwgdXJsLCBjYWxsYmFjayk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQt9Cw0LrRgNGL0YLQuNGPINC/0L7Qv9Cw0L/QsCDQv9C+INC60LvQuNC60YMg0L3QsCDQvtCy0LXRgNC70LXQuS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUuIEPQvC4g0LzQtdGC0L7QtCBiaW5kRXZlbnRzQWZ0ZXJPcGVuXG4gICAgICovXG4gICAgY2xvc2VPbkNsaWNrT3ZlcmxheShlbGVtZW50KSB7XG4gICAgICAgIGlmIChlbGVtZW50LnRhcmdldCA9PT0gdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC30LDQutGA0YvRgtC40Y8g0L/QvtC/0LDQv9CwINC/0L4g0L3QsNC20LDRgtC40Y4g0L3QsCBFU0NcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUuIEPQvC4g0LzQtdGC0L7QtCBiaW5kRXZlbnRzXG4gICAgICovXG4gICAgY2xvc2VPblByZXNzQnV0dG9uKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qga2V5Q29kZUVTQyA9IDI3O1xuXG4gICAgICAgIGlmIChlbGVtZW50LmtleUNvZGUgPT09IGtleUNvZGVFU0MpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L7RgtC60YDRi9Cy0LDQtdGCINC/0L7Qv9Cw0L9cbiAgICAgKi9cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnBvcHVwLmNsYXNzTGlzdC5hZGQodGhpcy5zdGF0ZUNsYXNzKTtcbiAgICAgICAgdGhpcy5maXhlZEJvZHkoKTtcblxuICAgICAgICBtZWRpYXRvci5wdWJsaXNoKCdvcGVuUG9wdXAnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC30LDQutGA0YvQstCw0LXRgiDQv9C+0L/QsNC/XG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMucG9wdXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnN0YXRlQ2xhc3MpO1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmZpeGVkQm9keSgpO1xuXG4gICAgICAgIG1lZGlhdG9yLnB1Ymxpc2goJ2Nsb3NlUG9wdXAnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9C10L3QuNC1INC/0L7Qv9Cw0L/QsCDRgdC+INGB0YLRgNCw0L3QuNGG0YsuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBVdGlscy5yZW1vdmVFbGVtZW50KHRoaXMucG9wdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L7QsdGA0LDQsdC+0YLQutC4INC+0YjQuNCx0L7Qui5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZUVycm9yIC0g0YLQuNC/INC+0YjQuNCx0LrQuC5cbiAgICAgKi9cbiAgICBlcnJvckhhbmRsZXIodHlwZUVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTGlzdCA9IFt7XG4gICAgICAgICAgICB0eXBlOiAnaW50ZXJuZXQnLFxuICAgICAgICAgICAgaHRtbDogJzxoMT7QktGLINC90LUg0L/QvtC00LrQu9GO0YfQtdC90Ysg0Log0LjQvdGC0LXRgNC90LXRgtGDLiDQn9C+0LLRgtC+0YDQuNGC0LUg0LfQsNC/0YDQvtGBINC/0L7Qt9C00L3QtdC1PC9oMT4nXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdzZXJ2ZXInLFxuICAgICAgICAgICAgaHRtbDogJzxoMT7QndCwINGB0LXRgNCy0LXRgNC1INC/0YDQvtC40LfQvtGI0LvQsCDQvtGI0LjQsdC60LAuINCf0L7QstGC0L7RgNC40YLQtSDQt9Cw0L/RgNC+0YEg0L/QvtC30LTQvdC10LU8L2gxPidcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdHlwZTogJ2RhdGEnLFxuICAgICAgICAgICAgaHRtbDogJzxoMT7QndCwINGB0LXRgNCy0LXRgNC1INC/0YDQvtC40LfQvtGI0LvQsCDQvtGI0LjQsdC60LAuINCf0L7QstGC0L7RgNC40YLQtSDQt9Cw0L/RgNC+0YEg0L/QvtC30LTQvdC10LU8L2gxPidcbiAgICAgICAgfV07XG5cbiAgICAgICAgZXJyb3JMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlRXJyb3IgPT09IGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIFBvcHVwLmluc2V0Q29udGVudCh0aGlzLmNvbnRlbnQsIGl0ZW0uaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQvdCw0LvQuNGH0LjQtSDQuNC90YLQtdGA0L3QtdGC0LAuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSAtINC40L3RgtC10YDQvdC10YIg0LXRgdGC0YwuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gZmFsc2UgLSDQuNC90YLQtdGA0L3QtdGCYSDQvdC10YIuXG4gICAgICovXG4gICAgY2hlY2tJbnRlcm5ldCgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNldEludGVydmFsKTtcbiAgICAgICAgaWYgKCFVdGlscy5jaGVja0ludGVybmV0Q29ubmVjdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlcignaW50ZXJuZXQnKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtCy0YLQvtGA0L3Ri9C5INC30LDQv9GA0L7RgSDQvdCwINGB0LXRgNCy0LXRgC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc2VudERhdGEgLSDQvtGC0YDQv9GA0LDQstC70Y/QtdC80YvQtS
46184DQtNCw0L3QvdGL0LUuXG4gICAgICpcbiAgICAgKi9cbiAgICByZXNlbmRpbmcoc2VudERhdGEpIHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSA1MDAwO1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgICB0aGlzLnNldEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5zZW5kKHNlbnREYXRhKTtcbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUG9wdXA7XG4iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJjZTgxNWEyMGIyZGM4ZmQyNzA2NDgyYmE3MWI1NzA5YzQ5ZTJkMjNiNjNjMjZiOTRjOGQwYTViNWNlNGVjNWQwZDViNzcxMTQ4YmNkOTY3NmQwN2MwODYxM2NiNWVjYzM1YzZmMzMwNGY1MDJiOTIzZjczZmVhZjIzYmUxMzAyNFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1wb3B1cF9fb3ZlcmxheVxcXCI+PC9kaXY+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX2lubGluZS13cmFwXFxcIj5cXG4gICAgICAgIDxidXR0b24gY2xhc3M9XFxcImItcG9wdXBfX2Nsb3NlXFxcIlxcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImJ1dHRvbkFyaWFMYWJlbFwiLFwibWF0Y2hcIjpbXCJidXR0b25BcmlhTGFiZWxcIl19LHtcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLmZpbHRlclwiLFwidmFsdWVcIjpcImRlZmF1bHRcIixcIm1hdGNoXCI6W1wifGRlZmF1bHRcIixcImRlZmF1bHRcIl0sXCJwYXJhbXNcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0XCIsXCJ2YWx1ZVwiOlwiKFwiLFwibWF0Y2hcIjpbXCIoXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5zdHJpbmdcIixcInZhbHVlXCI6XCLQl9Cw0LrRgNGL0YLRjCDQstGB0L/Qu9GL0LLQsNGO0YnQtdC1INC+0LrQvdC+XCJ9LHtcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5lbmRcIixcInZhbHVlXCI6XCIpXCIsXCJtYXRjaFwiOltcIilcIl0sXCJleHByZXNzaW9uXCI6ZmFsc2V9XX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXFwiPlxcbiAgICAgICAgICAgIFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLl9mdW5jdGlvblwiLFwiZm5cIjpcInNvdXJjZVwiLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwiL2ljb25zL3BvcHVwL21lZGlhL2Nsb3NlLnN2Z1wifSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kXCIsXCJ2YWx1ZVwiOlwiKVwiLFwibWF0Y2hcIjpbXCIpXCJdLFwiZXhwcmVzc2lvblwiOmZhbHNlfV19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX2lubGluZS1jb250ZW50XFxcIj5cXG4gICAgICAgICAgICBcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImNvbnRlbnRcIixcIm1hdGNoXCI6W1wiY29udGVudFwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIn1dLFwiYWxsb3dJbmxpbmVJbmNsdWRlc1wiOnRydWUsXCJyZXRocm93XCI6dHJ1ZX0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQpIHsgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KTsgfSIsInJlcXVpcmUoXCIuL21lZGlhL2Nsb3NlLnN2Zy50d2lnXCIpO1xuXG52YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCIyOThkODE5ZmEyYzk2YWQwNTRiZjE1NjRiYTYxMjU2MGNmODYzZDJhYWVlNGEwZTQ2ZWNlNzVlNzk3NGE4NTZhNjljOWYzMGYwOGMyMTE1OGJiZWU1YTY3Y2RhNjJhYjE5NThiM2FjOTJiN2JmMGZiNjU3ZDJmMjlmYTY0ZDE2YVwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwIGItcG9wdXBfZm9yX21hcFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX292ZXJsYXlcXFwiPjwvZGl2PlxcblxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwX19pbmxpbmUtd3JhcFxcXCI+XFxuICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJiLXBvcHVwX19jbG9zZVxcXCJcXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJidXR0b25BcmlhTGFiZWxcIixcIm1hdGNoXCI6W1wiYnV0dG9uQXJpYUxhYmVsXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXJcIixcInZhbHVlXCI6XCJkZWZhdWx0XCIsXCJtYXRjaFwiOltcInxkZWZhdWx0XCIsXCJkZWZhdWx0XCJdLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwi0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3QvlwifSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kXCIsXCJ2YWx1ZVwiOlwiKVwiLFwibWF0Y2hcIjpbXCIpXCJdLFwiZXhwcmVzc2lvblwiOmZhbHNlfV19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cXG4gICAgICAgICAgICBcIn0se1widHlwZVwiOlwibG9naWNcIixcInRva2VuXCI6e1widHlwZVwiOlwiVHdpZy5sb2dpYy50eXBlLmluY2x1ZGVcIixcIm9ubHlcIjpmYWxzZSxcImlnbm9yZU1pc3NpbmdcIjpmYWxzZSxcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZ1wiLFwidmFsdWVcIjpcImFlODlmZjkyNjE3MzkxMTNkOTRiZjcyNDZhY2YxMWU1ODEyMzY0YjljYTJiMDZhNDcwYjY0NmE4N2M2YzY3ODNiZmYyM2FmYWVlOTZhN2FmODk4NTQxZGJkYjgyNmZmYzY5Y2NjODdmNDc0MzJmYThjNzRlMjViNjNjZmNjYjM2XCJ9XX19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIiAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwX19pbmxpbmUtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJjb250ZW50XCIsXCJtYXRjaFwiOltcImNvbnRlbn
46184RcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJhZTg5ZmY5MjYxNzM5MTEzZDk0YmY3MjQ2YWNmMTFlNTgxMjM2NGI5Y2EyYjA2YTQ3MGI2NDZhODdjNmM2NzgzYmZmMjNhZmFlZTk2YTdhZjg5ODU0MWRiZGI4MjZmZmM2OWNjYzg3ZjQ3NDMyZmE4Yzc0ZTI1YjYzY2ZjY2IzNlwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiIHdpZHRoPVxcXCIyNlxcXCIgaGVpZ2h0PVxcXCIyNlxcXCIgdmlld0JveD1cXFwiMCAwIDI2IDI2XFxcIj48ZGVmcz48cGF0aCBpZD1cXFwiNzNodGFcXFwiIGQ9XFxcIk0xMDUxLjQ0NCA3M0wxMDUwIDcxLjU1NiAxMDYxLjU1NiA2MCAxMDUwIDQ4LjQ0NGwxLjQ0NC0xLjQ0NEwxMDYzIDU4LjU1NiAxMDc0LjU1NiA0N2wxLjQ0NCAxLjQ0NEwxMDY0LjQ0NCA2MCAxMDc2IDcxLjU1NiAxMDc0LjU1NiA3MyAxMDYzIDYxLjQ0NHpcXFwiLz48L2RlZnM+PGc+PGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTEwNTAgLTQ3KVxcXCI+PHVzZSB4bGluazpocmVmPVxcXCIjNzNodGFcXFwiLz48L2c+PC9nPjwvc3ZnPlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwidmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiMTBmNzVkMzJkMDYzMDc5NDE0YTlkOTEyYTVkYzcwZjRhNDNhYTYzNWIxMzVhYTBjMDBjMzRlZGM1YmFkNzVlZDJkODlmNTM5ZTVkYmQ1MzNmYTM1MjMwYmU0ZTFmNjcwMmZmZjgwYTBjYTUzZWRkYmMyNzdjYTFmN2EwN2ZkMzVcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPGRpdiBjbGFzcz1cXFwiYi1wb3B1cFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX292ZXJsYXlcXFwiPjwvZGl2PlxcblxcbiAgICA8YnV0dG9uIGNsYXNzPVxcXCJiLXBvcHVwX19jbG9zZVxcXCIgYXJpYS1sYWJlbD1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJidXR0b25BcmlhTGFiZWxcIixcIm1hdGNoXCI6W1wiYnV0dG9uQXJpYUxhYmVsXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXJcIixcInZhbHVlXCI6XCJkZWZhdWx0XCIsXCJtYXRjaFwiOltcInxkZWZhdWx0XCIsXCJkZWZhdWx0XCJdLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwi0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3QvlwifSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kXCIsXCJ2YWx1ZVwiOlwiKVwiLFwibWF0Y2hcIjpbXCIpXCJdLFwiZXhwcmVzc2lvblwiOmZhbHNlfV19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cXG4gICAgICAgIFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLl9mdW5jdGlvblwiLFwiZm5cIjpcInNvdXJjZVwiLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwiL2ltYWdlcy9wb3B1cC9jbG9zZS5zdmdcIn0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZFwiLFwidmFsdWVcIjpcIilcIixcIm1hdGNoXCI6W1wiKVwiXSxcImV4cHJlc3Npb25cIjpmYWxzZX1dfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcbiAgICA8L2J1dHRvbj5cXG5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1wb3B1cF9fd3JhcFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwX19jb250ZW50XFxcIj5cXG4gICAgICAgICAgICBcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImNvbnRlbnRcIixcIm1hdGNoXCI6W1wiY29udGVudFwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIn1dLFwiYWxsb3dJbmxpbmVJbmNsdWRlc1wiOnRydWUsXCJyZXRocm93XCI6dHJ1ZX0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQpIHsgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KTsgfSIsImltcG9ydCBVdGlscyBmcm9tICcuLi8uLi9jb21tb24vc2NyaXB0cy91dGlscyc7XG5cbmNsYXNzIFByZWxvYWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJlbG9hZGVyU2VsZWN0b3IgPSAnLmotcHJlbG9hZGVyJztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDMwMDtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLl9pbml0RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoIXRoaXMucHJlbG9hZGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcmVsb2FkZXIgJyR7dGhpcy5wcmVsb2FkZXJTZWxlY3Rvcn0nIG5vdCBmb3VuZGApO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgI
46184H1cblxuICAgICAgICBpZiAodGhpcy5faXNOb3RGaXJzdExvYWQoKSkge1xuICAgICAgICAgICAgdGhpcy5faGlkZVByZWxvYWRlcigpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgX2luaXRFbGVtZW50cygpIHtcbiAgICAgICAgdGhpcy5wcmVsb2FkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMucHJlbG9hZGVyU2VsZWN0b3IpO1xuICAgIH1cblxuICAgIF9iaW5kRXZlbnRzKCkge1xuICAgICAgICB3aW5kb3cub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2F2ZUluU3RvcmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2hpZGVQcmVsb2FkZXIoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfaXNOb3RGaXJzdExvYWQoKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGFnZUxvYWRlZCcpID09PSAndHJ1ZSc7XG4gICAgfVxuXG4gICAgX2hpZGVQcmVsb2FkZXIoKSB7XG4gICAgICAgIHRoaXMucHJlbG9hZGVyLmNsYXNzTGlzdC5hZGQoJ2lzLWhpZGUnKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIFV0aWxzLmhpZGUodGhpcy5wcmVsb2FkZXIpO1xuICAgICAgICB9LCB0aGlzLmR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBfc2F2ZUluU3RvcmUoKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwYWdlTG9hZGVkJywgJ3RydWUnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByZWxvYWRlcjtcblxuIiwiLyoqXG4gKiBAdmVyc2lvbiAyLjBhbHBoYVxuICogQGF1dGhvciBLZWxuaWsgU3R1ZGlvcyB7aHR0cDovL2tlbG5pay5ydX1cbiAqIEBsaW5rIGh0dHBzOi8va2VsbmlrLmdpdGJvb2tzLmlvL2tlbG5pay1kb2N1bWVudGF0aW9uL2NvbnRlbnQvZnJvbnQtZW5kL2NvbXBvbmVudHMv0L/QvtC60LAg0L3QtdGCIGRvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIERFUEVOREVOQ0lFU1xuICovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgTWVkaWF0b3IgZnJvbSAnY29tbW9uL3NjcmlwdHMvbWVkaWF0b3InO1xuaW1wb3J0IEhhbW1lciBmcm9tICdoYW1tZXJqcyc7XG5pbXBvcnQgc2xpZGVyVGVtcGxhdGUgZnJvbSAnLi9zbGlkZXIudHdpZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuXG5jbGFzcyBTbGlkZXIge1xuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINC/0LDRgNCw0LzQtdGC0YDQvtCyXG4gICAgICovXG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZ2FsbGVyeSA9IG9wdGlvbnMudGFyZ2V0O1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25UaW1lID0gb3B0aW9ucy50cmFuc2l0aW9uVGltZSB8fCAzMDA7XG4gICAgICAgIHRoaXMuaW5maW5pdGUgPSBvcHRpb25zLmluZmluaXRlIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmF1dG9wbGF5ID0gb3B0aW9ucy5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5hdXRvcGxheVR1cm4gPSAncmlnaHQnO1xuICAgICAgICB0aGlzLmF1dG9wbGF5U3BlZWQgPSBvcHRpb25zLmF1dG9wbGF5U3BlZWQgfHwgMzAwMDtcbiAgICAgICAgdGhpcy5kb3RzID0gb3B0aW9ucy5kb3RzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmNoaWxkcmVucyA9IEFycmF5LmZyb20odGhpcy5nYWxsZXJ5LmNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy5pdGVtc0NvdW50ID0gdGhpcy5jaGlsZHJlbnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gMTtcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLmZsZXhIZWlnaHQgPSBmYWxzZTtcblxuICAgICAgICAvLyBVdGlscy5jbGVhckh0bWwodGhpcy5nYWxsZXJ5KTsgLy/Qv9C+0YfQtdC80YMg0YLQviDQsiBJRSDQvtGH0LjRidCw0LXRgiAtIHRoaXMuY2hpbGRyZW5zXG5cbiAgICAgICAgdGhpcy5jcmVhdGVHYWxsZXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JPQu9Cw0LLQvdGL0Lkg0LzQtdGC0L7QtC4g0KHQvtC30LTQsNC10YIg0LLQtdGB0Ywg0YHQu9Cw0LnQtNC10YAuXG4gICAgICovXG4gICAgY3JlYXRlR2FsbGVyeSgpIHtcbiAgICAgICAgVXRpbHMuaW5zZXRDb250ZW50KHRoaXMuZ2FsbGVyeSwgc2xpZGVyVGVtcGxhdGUoKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmdhbGxlcnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ9Ci0LDQutC+0LPQviDQutC+0L3RgtC10LnQvdC10YDQsCDQtNC70Y8g0YHQu9Cw0LnQtNC10YDQsCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCIScpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldEVsZW1lbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLmRvdHMpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRG90cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkcygpO1xuICAgICAgICB0aGlzLnNldEhlaWdodCgpO1xuICAgICAgICB0aGlzLmRvdEFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMucmVhZHkoKTtcbiAgICAgICAgdGhpcy5hdXRvcGxheVN0YXJ0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ291bnRlcigpO1xuICAgICAgICB0aGlzLnN3aXBlRmFjdG9pZHMoKTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtc0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fY291bnRlcicpO1xuICAgICAgICAgICAgY29uc3QgYXJyb3dzID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fYXJyb3dzJyk7XG5cbiAgICAgICAgICAgIGNvdW50ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIGFycm93cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2FsbGVyeS5jbGFzc0xpc3QuY29udGFpbnMoJ2ItcHJpbmNpcGUtY2Fyb3VzZWwtdmlldy0yJykpIHtcbiAgICAgICAgICAgIC8vINGDINGN0YLQvtCz0L4g0YHQu9Cw0LnQtNC10YDQsCDQvtGB0L7QsdC+0LUg0L/QvtC70L7QttC10L3QuNC1INGB0YLRgNC10LvQvtC6XG4gICAgICAgICAgICB0aGlzLnNldEFycm93c0N1c3RvbVBvc2l0aW9uKCk7XG4gICAgICAgI
46184H1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdC8INGN0LvQtdC80LXQvdGC0Ysg0YHQu9Cw0LnQtNC10YDQsC5cbiAgICAgKi9cbiAgICBnZXRFbGVtZW50cygpIHtcbiAgICAgICAgdGhpcy5kb3RzV3JhcHBlciA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2RvdHMnKTtcbiAgICAgICAgdGhpcy53cmFwcGVyID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fd3JhcHBlcicpO1xuICAgICAgICB0aGlzLmFycm93TGVmdCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyX19hcnJvdy1sZWZ0Jyk7XG4gICAgICAgIHRoaXMuYXJyb3dSaWdodCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyX19hcnJvdy1yaWdodCcpO1xuICAgICAgICB0aGlzLmNvdW50QWN0aXZlID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fY291bnRlci1hY3RpdmUnKTtcbiAgICAgICAgdGhpcy5jb3VudEFsbCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2NvdW50ZXItYWxsJyk7XG4gICAgfVxuXG4gICAgc3dpcGVGYWN0b2lkcygpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nYWxsZXJ5LmNsb3Nlc3QoJy5qLW1haW4tc2xpZGVyJyk7XG5cbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmFjdG9pZHNXcmFwcGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qLWZhY3RvaWRzLXdyYXBwZXInKTtcblxuXG4gICAgICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBuZXcgSGFtbWVyKHRoaXMuZmFjdG9pZHNXcmFwcGVyKTtcblxuICAgICAgICB0b3VjaEV2ZW50Lm9uKCdzd2lwZXJpZ2h0JywgdGhpcy5pc1NsaWRlTGVmdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdG91Y2hFdmVudC5vbignc3dpcGVsZWZ0JywgdGhpcy5pc1NsaWRlUmlnaHQuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ291bnRlcigpIHtcbiAgICAgICAgdGhpcy5jb3VudEFjdGl2ZS5pbm5lckhUTUwgPSB0aGlzLm51bWJlckZvcm1hdCh0aGlzLmFjdGl2ZVNsaWRlKTtcbiAgICAgICAgdGhpcy5jb3VudEFsbC5pbm5lckhUTUwgPSB0aGlzLm51bWJlckZvcm1hdCh0aGlzLml0ZW1zQ291bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L4g0LIg0YTQvtGA0LzQsNGC0LUgMDAgKNC00LjQt9Cw0LnQvSlcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbnVtYmVyIC0g0YfQuNGB0LvQvlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgbnVtYmVyRm9ybWF0KG51bWJlcikge1xuICAgICAgICByZXR1cm4gKCcwJyArIG51bWJlcikuc2xpY2UoLTIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDRkdGCINGC0L7Rh9C60Lgg0LIgaHRtbC5cbiAgICAgKi9cbiAgICBjcmVhdGVEb3RzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbXNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRvdHNXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRG90KCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNGR0YIg0YLQvtGH0LrRgy5cbiAgICAgKiBAcmV0dXJuIHtIVE1MQnV0dG9uRWxlbWVudH1cbiAgICAgKi9cbiAgICBjcmVhdGVEb3QoKSB7XG4gICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXG4gICAgICAgIGRvdC5jbGFzc0xpc3QuYWRkKCdiLXNsaWRlcl9fZG90Jyk7XG5cbiAgICAgICAgcmV0dXJuIGRvdDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqINCd0LDQstC10YjQuNCy0LDQtdGCINGB0L7QsdGL0YLQuNGPINC90LAg0LrQvtC90YLRgNC+0LvRi1xuICAgICAqL1xuICAgIGJpbmRFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBuZXcgSGFtbWVyKHRoaXMuZ2FsbGVyeSk7XG5cbiAgICAgICAgdG91Y2hFdmVudC5vbignc3dpcGVyaWdodCcsIHRoaXMuaXNTbGlkZUxlZnQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRvdWNoRXZlbnQub24oJ3N3aXBlbGVmdCcsIHRoaXMuaXNTbGlkZVJpZ2h0LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYXJyb3dMZWZ0LmNsYXNzTGlzdC5hZGQoJ2lzLWxhc3QnKTtcblxuICAgICAgICB0aGlzLmFycm93TGVmdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaXNTbGlkZUxlZnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmFycm93UmlnaHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmlzU2xpZGVSaWdodC5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5kb3RzV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBVdGlscy5nZXRFbGVtZW50SW5kZXgoZXZlbnQudGFyZ2V0KSArIDE7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2xpZGUgPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuZG90QWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVUbyh0aGlzLmdvVG8oaW5kZXgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iLXNsaWRlcl9faXRlbScpW3RoaXMuYWN0aXZlU2xpZGVdLm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gLSh0aGlzLndpZHRoICogKHRoaXMuYWN0aXZlU2xpZGUgLSAxKSk7XG4gICAgICAgIHRoaXMuc2xpZGVUbyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIg0YHQu9Cw0LnQtNGLLlxuICAgICAqL1xuICAgIGFwcGVuZENoaWxkcygpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ2Itc2xpZGVyX19pdGVtJyk7XG4gICAgICAgICAgICBpdGVtLmFwcGVuZENoaWxkKHRoaXMuY2hpbGRyZW5zW2ldKTtcblxuICAgICAgICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMud3JhcHBlci5vZmZzZXRXaWR0aCAtIHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgICBjb25zdCBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIG91
46184dGVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMTAwcHgnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblxuICAgICAgICBjb25zdCB3aWR0aE5vU2Nyb2xsID0gb3V0ZXIub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcblxuICAgICAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cbiAgICAgICAgY29uc3Qgd2lkdGhXaXRoU2Nyb2xsID0gaW5uZXIub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgb3V0ZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvdXRlcik7XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoTm9TY3JvbGwgLSB3aWR0aFdpdGhTY3JvbGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7Qv9GA0LXQtNC10LvRj9C10YIg0LzQsNC60YHQuNC80LDQu9GM0L3Rg9GOINCy0YvRgdC+0YLRgyDRgdC70LDQudC00L7Qsiwg0Lgg0YPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LXQtSDQvtCx0LXRgNGC0LrQtSAoKS5cbiAgICAgKi9cbiAgICBzZXRIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTbGlkZSA9IHRoaXMud3JhcHBlci5xdWVyeVNlbGVjdG9yKGAuYi1zbGlkZXJfX2l0ZW06bnRoLWNoaWxkKCR7dGhpcy5hY3RpdmVTbGlkZX0pYCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbWcgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJbWcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRJbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWRlSGVpZ2h0ID0gY3VycmVudFNsaWRlLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsIGAke3NsaWRlSGVpZ2h0fXB4YCwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdC90Y/QtdGCINCw0LrRgtC40LLQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDRgyDRgtC+0YfQutC4LlxuICAgICAqL1xuICAgIGRvdEFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLmFsbERvdHMgPSBBcnJheS5mcm9tKHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yQWxsKCcuYi1zbGlkZXJfX2RvdCcpKTtcbiAgICAgICAgY29uc3QgYWN0aXZlRG90Q2xhc3MgPSAnYi1zbGlkZXJfX2RvdF9pc19hY3RpdmUnO1xuXG4gICAgICAgIHRoaXMuYWxsRG90cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGUgLSAxID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChhY3RpdmVEb3RDbGFzcyk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uQ29udHJvbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlRG90Q2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC70LDQudC00LXRgCDQutC+0LPQtNCwINCy0YHQtSDQvNC10YLQvtC00Ysg0LLRi9C/0L7Qu9C90Y/RgtGB0Y8uXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuZ2FsbGVyeS5jbGFzc0xpc3QuYWRkKCdiLXNsaWRlcl9pc19yZWFkeScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0LXRgNC10LvQuNGB0YLRi9Cy0LDQtdGCINC6INC/0LXRgNC10LTQsNC90L3QvtC5INC/0L7Qt9C40YbQuNC4LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0b1Bvc2l0aW9uIC0g0L/QvtC30LjRhtC40Y8g0YHQu9Cw0LnQtNC10YDQsCDQv9C+IFgg0L7RgdC4LlxuICAgICAqL1xuICAgIHNsaWRlVG8odG9Qb3NpdGlvbikge1xuICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHt0b1Bvc2l0aW9ufXB4KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JvQuNGB0YLQsNC10YIg0YHQu9Cw0LnQtNC10YAg0LLQv9GA0LDQstC+LlxuICAgICAqL1xuICAgIHNsaWRlTGVmdCgpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uQ29udHJvbCgpO1xuICAgICAgICB0aGlzLnNsaWRlVG8odGhpcy5wb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGUgLT0gMTtcbiAgICAgICAgdGhpcy5kb3RBY3RpdmF0ZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQm9C40YHRgtCw0LXRgiDRgdC70LDQudC00LXRgCDQstC70LXQstC+LlxuICAgICAqL1xuICAgIHNsaWRlUmlnaHQoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvbkNvbnRyb2woKTtcbiAgICAgICAgdGhpcy5zbGlkZVRvKHRoaXMucG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlICs9IDE7XG4gICAgICAgIHRoaXMuZG90QWN0aXZhdGUoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCINC80L7QttC90L4g0LvQuCDQu9C40YHRgtCw0YLRjCDQstC70LXQstC+ICjQtdGB0LvQuCDQvdC1INC90YPQttC10L0g0LjQvdGE0LjQvdC40YLQuCDRgdC60YDQvtC70LssINGC0L4g0LIgaWYg0L/RgNC+0YHRgtC+INCy0LXRgNC90YPRgtGMIGZhbHNlKS5cbiAgICAgKi9cbiAgICBpc1NsaWRlTGVmdCgpIHtcbiAgICAgICAgdGhpcy5hcnJvd1JpZ2h0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxhc3QnKTtcblxuICAgICAgICB0aGlzLmNsZWFyQXV0b3BsYXkoKTtcblxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5maW5pdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gLSgodGhpcy5pdGVtc0NvdW50IC0gMSkgKiB0aGlzLndpZHRoKTtcbiAgICAgICAgICAgI
46184HRoaXMuYWN0aXZlU2xpZGUgPSB0aGlzLml0ZW1zQ291bnQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiArPSB0aGlzLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdhbGxlcnkuY2xhc3NMaXN0LmNvbnRhaW5zKCdqLWJlbmVmaXRzLXNsaWRlcicpKSB7XG4gICAgICAgICAgICBtZWRpYXRvci5wdWJsaXNoKCdiZW5lZml0R29lc0xlZnQnLCB0aGlzLmFjdGl2ZVNsaWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLmFycm93TGVmdC5jbGFzc0xpc3QuYWRkKCdpcy1sYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50QWN0aXZlLmlubmVySFRNTCA9IHRoaXMubnVtYmVyRm9ybWF0KHRoaXMuYWN0aXZlU2xpZGUgLSAxKTtcbiAgICAgICAgdGhpcy5zbGlkZUxlZnQoKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIg0LzQvtC20L3QviDQu9C4INC70LjRgdGC0LDRgtGMINCy0L/RgNCw0LLQviAo0LXRgdC70Lgg0L3QtSDQvdGD0LbQtdC9INC40L3RhNC40L3QuNGC0Lgg0YHQutGA0L7Qu9C7LCDRgtC+INCyIGlmINC/0YDQvtGB0YLQviDQstC10YDQvdGD0YLRjCBmYWxzZSkuXG4gICAgICovXG4gICAgaXNTbGlkZVJpZ2h0KCkge1xuICAgICAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHRoaXMuZ2FsbGVyeS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2xpZGVXaWR0aCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2l0ZW0nKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2xpZGVTdG9wID0gTWF0aC5yb3VuZChwYXJlbnRXaWR0aCAvIHNsaWRlV2lkdGgpO1xuXG4gICAgICAgIHRoaXMuYXJyb3dMZWZ0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxhc3QnKTtcblxuICAgICAgICB0aGlzLmNsZWFyQXV0b3BsYXkoKTtcblxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA8PSAtKHRoaXMud2lkdGggKiAodGhpcy5pdGVtc0NvdW50IC0gc2xpZGVTdG9wKSkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmZpbml0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTbGlkZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uIC09IHRoaXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2FsbGVyeS5jbGFzc0xpc3QuY29udGFpbnMoJ2otYmVuZWZpdHMtc2xpZGVyJykpIHtcbiAgICAgICAgICAgIG1lZGlhdG9yLnB1Ymxpc2goJ2JlbmVmaXRHb2VzUmlnaHQnLCB7cG9zaXRpb246IHRoaXMucG9zaXRpb24sIHNsaWRlOiB0aGlzLmFjdGl2ZVNsaWRlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVTbGlkZSA9PT0gKHRoaXMuaXRlbXNDb3VudCAtIDEpKSB7XG4gICAgICAgICAgICB0aGlzLmFycm93UmlnaHQuY2xhc3NMaXN0LmFkZCgnaXMtbGFzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudEFjdGl2ZS5pbm5lckhUTUwgPSB0aGlzLm51bWJlckZvcm1hdCh0aGlzLmFjdGl2ZVNsaWRlICsgMSk7XG4gICAgICAgIHRoaXMuc2xpZGVSaWdodCgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0L/RgNC10LTQtdC70Y/QtdGCINC90L7QstGD0Y4g0L/QvtC30LjRhtC40Y4g0YHQu9Cw0LnQtNCwINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L3QsCDQutCw0LrRg9GOINGC0L7Rh9C60YMg0L3QsNC20LDQu9C4LlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfSAtINCf0L7RgNGP0LTQutC+0LLRi9C5INC90L7QvNC10YAg0YHQu9Cw0LnQtNCwLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSDQndC+0LLQsNGPINC/0L7Qt9C40YbQuNGPLlxuICAgICAqL1xuICAgIGdvVG8odmFsdWUpIHtcbiAgICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSAtKHRoaXMud2lkdGggKiAodmFsdWUgLSAxKSk7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIHJldHVybiBuZXdQb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIgdHJhbnNpdGlvbiDRgtC+0LvRjNC60L4g0L3QsCDQstGA0LXQvNGPINGB0LvQsNC50LTQsCAo0YfRgtC+0LHRiyDQvdC10LHRi9C70L4g0LDQvdC40LzQsNGG0LjQuCDQv9GA0Lgg0YDQtdGB0LDQudC30LUpXG4gICAgICovXG4gICAgdHJhbnNpdGlvbkNvbnRyb2woKSB7XG4gICAgICAgIHRoaXMud3JhcHBlci5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHsxMDAgLyB0aGlzLnRyYW5zaXRpb25UaW1lfXNgO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0cmFuc2l0aW9uLWR1cmF0aW9uJyk7XG4gICAgICAgIH0sIHRoaXMudHJhbnNpdGlvblRpbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0LDQstGC0L7Qv9GA0L7Qu9C40YHRgtGL0LLQsNC90LjRjyDRgdC70LDQudC00L7Qsi5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtINC10YHQu9C4INCw0LLRgtC+0L/Qu9GN0Lkg0L3QtSDQt9Cw0LTQsNC9INC70LjQsdC+IGZhbHNlLCDRgtC+INGB0LXRgtC40L3RgtC10YDQstCw0Lsg0L3QtSDRgNCw0LHQvtGC0LDQtdGCXG4gICAgICovXG4gICAgYXV0b3BsYXlTdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9wbGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dG9wbGF5VGltZSA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9wbGF5VHVybiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NsaWRlUmlnaHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9wbGF5VHVybiA9ICdsZWZ0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NsaWRlTGVmdCgpO1xuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2xpZGVMZWZ0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvcGxheVR1cm4gPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTbGlkZVJpZ2h0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sIHRoaXMuYXV0b3BsYXlTcGVlZCk7XG4gICAgfVxuXG4gICAgY2xlYXJBdXRvcGxheSgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9wbGF5VGltZSk7XG5cbiAgICAgICAgdGhpcy5hdXRvcGxheVN0YXJ0KCk7XG4gICAgfVxuXG4gICAgc2V0QXJyb3dzQ3VzdG9tUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGFycm93cyA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2Fycm93cycpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdhbGxlcnkucXVlcnlTZWxlY3RvcignLmItcHJpbmNpcGUtY2Fyb3VzZWxfX2ltZycpLm9mZnNldEhlaWdodDtcblxuICAgICAgICBhcnJvd3Muc3R5bGUudG9wID0gYCR7aGVpZ2h0fXB4YDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNsaWRlcjtcbi8qIGVzbGludC1lbmFibGUgKi9cbiIsInZhciB0d2lnID0gcmVxdWlyZShcInR3aWdcIikudHdpZyxcbiAgICB0ZW1wbGF0ZSA9IHR3aWcoe1wiaWRcIjpcImZlOTg3OWZkZDY4ZmU5MDMyY2Q3NDk3MjYyZmUxMGQ5YjE1OTA4YTljMjI2MjFmMTM5NjhkZmM4OTRjYjJmNGZjM2UwOWEyYjI1ZDFiZmNjNTIzNmJiODdmNzBiYWViNWYzNzM0NGJmZWQzYTM0Y2YwZTZiZmZlYTUzM2FjMjJjXCIsXCJkYXRhXCI6W3tcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgd2lkdGg9XFxcIjE3XFxcIiBoZWlnaHQ9XFxcIjE2XFxcIlxcbiAgICAgdmlld0JveD1cXFwiMCAwIDE3IDE2XFxcIj5cXG4gICAgPGRlZnM+XFxuICAgICAgICA8cGF0aCBpZD1cXFwiczZlN2FcXFwiIGQ9XFxcIk0yNzIuNDMxIDIyMC44di0xLjI2aC0xNC4xOTNsNi42NS02LjY1MUwyNjQgMjEybC04IDggOCA4IC44ODktLjg4OS02LjMxMS02LjMxMXpcXFwiLz5cXG4gICAgPC9kZWZzPlxcbiAgICA8Zz5cXG4gICAgICAgIDxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0yNTYgLTIxMilcXFwiPlxcbiAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cXFwiI3M2ZTdhXFxcIi8+XFxuICAgICAgICA8L2c+XFxuICAgIDwvZz5cXG48L3N2Zz5cXG5cIn1dLFwiYWxsb3dJbmxpbmVJbmNsdWRlc1wiOnRydWUsXCJyZXRocm93XCI6dHJ1ZX0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQpIHsgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KTsgfSIsInZhciB0d2lnID0gcmVxdWlyZShcInR3aWdcIikudHdpZyxcbiAgICB0ZW1wbGF0ZSA9IHR3aWcoe1wiaWRcIjpcImFhMmIwYmE2ZjI1NWY4NDA0MzA4NTU4ZjM2Yjk2YTA4ZGUxY2FjNWI4YTJhN2RmZGVkMmI3NWU2OWJiOTBjOWIxZDU4MzQ3NTk2ZmQ0MzFjZDZlYzUzOTFlMDcxNTRiYTkwNGYwYjU4MmYwODAzNDM0ZTc5M2JiNDhmNWMxYjIzXCIsXCJkYXRhXCI6W3tcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgd2lkdGg9XFxcIjE3XFxcIiBoZWlnaHQ9XFxcIjE2XFxcIlxcbiAgICAgdmlld0JveD1cXFwiMCAwIDE3IDE2XFxcIj5cXG4gICAgPGRlZnM+XFxuICAgICAgICA8cGF0aCBpZD1cXFwiZHpvemFcXFwiIGQ9XFxcIk0yODYgMjIwLjh2LTEuMjZoMTQuMTk0bC02LjY1Mi02LjY1MS44OS0uODg5IDggOC04IDgtLjg5LS44ODkgNi4zMTItNi4zMTF6XFxcIi8+XFxuICAgIDwvZGVmcz5cXG4gICAgPGc+XFxuICAgICAgICA8ZyB0cmFuc2Zvcm09XFxcInRyYW5zbGF0ZSgtMjg2IC0yMTIpXFxcIj5cXG4gICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XFxcIiNkem96YVxcXCIvPlxcbiAgICAgICAgPC9nPlxcbiAgICA8L2c+XFxuPC9zdmc+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJyZXF1aXJlKFwiLi9tZWRpYS9hcnJvdy1yaWdodC5zdmcudHdpZ1wiKTtcblxucmVxdWlyZShcIi4vbWVkaWEvYXJyb3ctbGVmdC5zdmcudHdpZ1wiKTtcblxudmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiNDRlNDY0Mzg3OGE0NGMxZTc3YTgyNDNhNmQyNzA1YWQ0N2NmNzc3MzNhZjZhZWYxYzM2MmFhNGVhZmZmOWYyNDQ1MWU0ZGM4NjE4MTRhODk0MjZhZTMyZTRiMzk1ZDAxMzNlMDJhNjFjNjU1NzI4NWFjMjRlNzlkYTI1YmJlODhcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuPGRpdiBjbGFzcz1cXFwiYi1zbGlkZXJfX3dyYXBwZXJcXFwiPlxcblxcbjwvZGl2PlxcblxcblwifSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG48ZGl2IGNsYXNzPVxcXCJiLXNsaWRlcl9fY291bnRlclxcXCI+XFxuICAgIDxzcGFuIGNsYXNzPVxcXCJiLXNsaWRlcl9fY291bnRlci1hY3RpdmVcXFwiPjwvc3Bhbj5cXG4gICAgPHNwYW4+Lzwvc3Bhbj5cXG4gICAgPHNwYW4gY2xhc3M9XFxcImItc2xpZGVyX19jb3VudGVyLWFsbFxcXCI+PC9zcGFuPlxcbjwvZGl2PlxcblxcblwifSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG48ZGl2IGNsYXNzPVxcXCJiLXNsaWRlcl9fYXJyb3dzXFxcIj5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cXFwiYi1zbGlkZXJfX2Fycm93IHNsaWRlcl9fYXJyb3ctbGVmdFxcXCI+XFxuICAgICAgICBcIn0se1widHlwZVwiOlwibG9naWNcIixcInRva2VuXCI6e1widHlwZVwiOlwiVHdpZy5sb2dpYy50eXBlLmluY2x1ZGVcIixcIm9ubHlcIjpmYWxzZSxcImlnbm9yZU1pc3NpbmdcIjpmYWxzZSxcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZ1wiLFwidmFsdWVcIjpcImZlOTg3OWZkZDY4ZmU5MDMyY2Q3NDk3MjYyZmUxMGQ5YjE1OTA4YTljMjI2MjFmMTM5NjhkZmM4OTRjYjJmNGZjM2UwOWEyYjI1ZDFiZmNjNTIzNmJiODdmNzBiYWViNWYzNzM0NGJmZWQzYTM0Y2YwZTZiZmZlYTUzM2FjMjJjXCJ9XX19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIiAgICA8L2J1dHRvbj5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cXFwiYi1zbGlkZXJfX2Fycm93IHNsaWRlcl9fYXJyb3ctcmlnaHRcXFwiPlxcbiAgICAgICAgXCJ9LHtcInR5cGVcIjpcImxvZ2ljXCIsXCJ0b2tlblwiOntcInR5cGVcIjpcIlR3aWcubG9naWMudHlwZS5pbmNsdWRlXCIsXCJvbmx5XCI6ZmFsc2UsXCJpZ25vcmVNaXNzaW5nXCI6ZmFsc2UsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5zdHJpbmdcIixcInZhbHVlXCI6XCJhYTJi
46184MGJhNmYyNTVmODQwNDMwODU1OGYzNmI5NmEwOGRlMWNhYzViOGEyYTdkZmRlZDJiNzVlNjliYjkwYzliMWQ1ODM0NzU5NmZkNDMxY2Q2ZWM1MzkxZTA3MTU0YmE5MDRmMGI1ODJmMDgwMzQzNGU3OTNiYjQ4ZjVjMWIyM1wifV19fSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgICAgPC9idXR0b24+XFxuPC9kaXY+XFxuXCJ9LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcbjxkaXYgY2xhc3M9XFxcImItc2xpZGVyX19kb3RzXFxcIiBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiPlxcblxcbjwvZGl2PlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiLyoqXG4gKiBAdmVyc2lvbiAyLjBhbHBoYVxuICogQGF1dGhvciBLZWxuaWsgU3R1ZGlvcyB7aHR0cDovL2tlbG5pay5ydX1cbiAqL1xuXG4vKipcbiAqIERlcGVuZGVuY2llc1xuICovXG4vLyBpbXBvcnQgdGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZS9jb250ZW50LnR3aWcnO1xuLy8gaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL2NvbW1vbi9zY3JpcHRzL3V0aWxzJztcbmltcG9ydCBNZWRpYXRvciBmcm9tICdjb21tb24vc2NyaXB0cy9tZWRpYXRvcic7XG5cbi8qKlxuICogVmFyaWFibGVzICYmIGNvbnN0YW50c1xuICovXG4vLyDQvNCw0YHRgdC40LIgZ2V0INC/0LDRgNCw0LzQtdGC0YDQvtCyINC40Lcg0YPRgNC70LAuINCR0YPQtNC10Lwg0YHRgNCw0LLQvdC40LLQsNGC0Ywg0LTQsNGC0LAg0YLQsNCxINCw0YLRgNC40LHRg9GC0Ysg0YLQsNCx0L7QsiDQuNC3INCy0YHQtdGFINGN0LrQt9C10LzQv9C70Y/RgNC+0LIg0LrQu9Cw0YHRgdCwINGBINC00LDQvdC90YvQvNC4INC40Ldcbi8vINC80LDRgdGB0LjQstCwLCDRh9GC0L4g0LHRiyDQvtGC0LrRgNGL0LLQsNGC0Ywg0L3Rg9C20L3Ri9C1INGC0LDQsdGLINC/0YDQuCDQvtGC0LrRgNGL0YLQuNC4INGB0YLRgNCw0L3QuNGG0Ysg0L/QviDRgdGB0YvQu9C60LVcbi8vIGxldCB1cmxBcnJheSA9IFtdO1xuXG4vKipcbiAqINCi0LDQsdGLXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINC+0LHQtdGA0LDRgtC60LAg0LLRgdC10LPQviDQsdC70L7QutCwXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuY2xhc3MgVGFicyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWVkaWF0b3IgPSBuZXcgTWVkaWF0b3IoKTtcbiAgICAgICAgLy8g0L3QvtC00LAg0YDQvtC00LjRgtC10LvRjyDRgtCw0LHQvtCyICjRjdC70LXQvNC10L3RgtC+0LIg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNGPINGC0LDQsdC+0LIpXG4gICAgICAgIHRoaXMudGFic1BhcmVudCA9IHt9O1xuXG4gICAgICAgIC8vINC80LDRgdGB0LjQsiDRgtCw0LHQvtCyICjRjdC70LXQvNC10L3RgtC+0LIg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNGPINGC0LDQsdC+0LIpXG4gICAgICAgIHRoaXMudGFicyA9IFtdO1xuXG4gICAgICAgIC8vINC90L7QtNCwINGA0L7QtNC40YLQtdC70Y8g0LrQvtC90YLQtdC90YLQsCDRgtCw0LHQvtCyXG4gICAgICAgIHRoaXMuY29udGVudHNQYXJlbnQgPSB7fTtcblxuICAgICAgICAvLyDQvNCw0YHRgdC40LIg0Y3Qu9C10LzQtdC90YLQvtCyINGBINC60L7QvdGC0LXQvdGC0L7QsiDRgtCw0LHQvtCyXG4gICAgICAgIHRoaXMuY29udGVudHMgPSBbXTtcblxuICAgICAgICAvLyDQt9Cw0L/QuNGB0YvQstCw0LXQvCDQtNCw0L3QvdGL0LUg0YLQsNCx0LAg0L3QsCDQutC+0YLQvtGA0L7QvCDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUg0LrQu9C40LrQsFxuICAgICAgICB0aGlzLmRhdGFUYWIgPSB7fTtcblxuICAgICAgICAvLyDQmtC70LDRgdGBINCw0LrRgtC40LLQvdC+0LPQvijQstGL0LHRgNCw0L3QvdC+0LPQvikg0YLQsNCx0LBcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAnaXMtYWN0aXZlJztcblxuICAgICAgICAvLyDQmtC70LDRgdGBINC30LDQtNC40YHQsNCx0LvQtdC90L3QvtCz0L4g0YLQsNCx0LBcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9ICdpcy1kaXNhYmxlZCc7XG4gICAgfVxuXG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudGFic1BhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy5lbGVtZW50KSB8fCBudWxsO1xuXG4gICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQvdCw0LvQuNGH0LjQtSDRgtCw0LHQvtCyXG4gICAgICAgIGlmICghdGhpcy50YWJzUGFyZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOZWVkIHRhcmdldCBlbGVtZW50IC0gJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8va2VsbmlrLmdpdGJvb2tzLmlvL2tlbG5pay1kb2N1bWVudGF0aW9uL2Zyb250LWVuZC9jb21wb25lbnRzL3RhYnMuaHRtbCcpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQvdCw0YXQvtC00LjQvCDQstGB0LUg0YLQsNCx0Ysg0Lgg0L/RgNC40LLQvtC00LjQvCDQutC+0LvQu9C10LrRhtC40Y4g0L3QvtC0INC6INC80LDRgdGB0LjQstGDLiDQlNC70Y8g0YDQsNCx0L7RgtGLINGBIGZvckVhY2gg0LIg0JjQlS5cbiAgICAgICAgdGhpcy50YWJzID0gQXJyYXkuZnJvbSh0aGlzLnRhYnNQYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnLmItdGFic19faXRlbScpKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRzUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy50YWJzUGFyZW50LmRhdGFzZXQuY29udGVudH1gKTtcblxuICAgICAgICAvLyDQvdCw0YXQvtC00LjQvCDQstGB0LUg0Y3Qu9C10LzQtdC90YLRiyDQutC+0L3RgtC10L3RgtCwINC4INC/0YDQuNCy0L7QtNC40Lwg0LrQvtC70LvQtdC60YbQuNGOINC90L7QtCDQuiDQvNCw0YHRgdC40LLRgy4g0JTQu9GPINGA0LDQsdC+0YLRiyDRgSBmb3JFYWNoINCyINCY0JUuXG4gICAgICAgIHRoaXMuY29udGVudHMgPSBBcnJheS5mcm9tKHRoaXMuY29udGVudHNQYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnLmItdGFicy1jb250ZW50X19pdGVtJykpO1xuXG4gICAgICAgI
46184HRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICAvLyB0aGlzLmNoZWNrVXJsUGFyYW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC10YjQsNC10Lwg0YHQu9GD0YjQsNGC0LXQu9GMINC90LAg0YLQsNCx0YtcbiAgICAgKi9cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRvZ2dsZVRhYi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXQutC70Y7Rh9Cw0LXQvCDRgtCw0LHRi1xuICAgICAqIEBwYXJhbSB7ZXZlbnR9IGV2ZW50IC0g0L/QtdGA0LXQtNCw0LXQvCDRgdC+0LHRi9GC0LjQtVxuICAgICAqL1xuICAgIHRvZ2dsZVRhYihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YWIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgICAgIGlmICh0YWIuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldERhdGEodGFiKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAvLyB0aGlzLnN0YXRlVXJsKHRhYik7XG4gICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCgndGFiU3dpdGNoZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdC8INC30L3QsNGH0LXQvdC40Y8gZGF0YSDQsNGC0YDQuNCx0YPRgtC+0LIg0YLQsNCx0LBcbiAgICAgKiBAcGFyYW0ge25vZGV9IGFjdGl2ZVRhYiAtINC90L7QtNCwINGC0LDQsdCwINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUg0LrQu9C40LrQsFxuICAgICAqL1xuICAgIHNldERhdGEoYWN0aXZlVGFiKSB7XG4gICAgICAgIHRoaXMuZGF0YVRhYiA9IHtcbiAgICAgICAgICAgIHRhYiA6IGFjdGl2ZVRhYixcbiAgICAgICAgICAgIGlkICA6IGFjdGl2ZVRhYi5kYXRhc2V0LnRhYixcbiAgICAgICAgICAgIHVybCA6IGFjdGl2ZVRhYi5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxcbiAgICAgICAgICAgIGFqYXg6IGFjdGl2ZVRhYi5kYXRhc2V0LmFqYXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0LXRgdGC0Ywg0LvQuCDQsiB1cmwnZSDQv9Cw0YDQsNC80LXRgtGA0YsuXG4gICAgICovXG4gICAgLy8gY2hlY2tVcmxQYXJhbSgpIHtcbiAgICAvLyAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuZ2V0VXJsUGFyYW1zKCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0LIgaHJlZiDRgdGB0YvQu9C60LggKNC20LzQsNC60L3Rg9GC0YvQuSDRgtCw0LEpINC90LDQu9C40YfQuNC1INGB0YLRgNC+0LrQuCDRgSDQsNC00YDQtdGB0L7QvC5cbiAgICAgKiDQv9GA0L7QstC10YDRj9C10YLRgdGPINGB0LDQvCDRhNCw0LrRgiDQvdCw0LvQuNGH0LjRjyDQsdC+0LvQtdC1INC+0LTQvdC+0LPQviDRgdC40LzQstC+0LvQsCAo0LIg0L/Rg9GB0YLQvtC5INGB0YHRi9C70LrQtSDQstGB0LXQs9C00LAg0LTQvtC70LbQtdC9INCx0YvRgtGMICMpXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgb3IgZmFsc2VcbiAgICAgKi9cbiAgICBpc0xpbmsoKSB7XG4gICAgICAgIGNvbnN0IGFyclNsaWNlID0ge1xuICAgICAgICAgICAgYmVnaW46IDAsXG4gICAgICAgICAgICBlbmQgIDogLTFcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFiLnVybC5zbGljZShhcnJTbGljZS5iZWdpbiwgYXJyU2xpY2UuZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0LrQu9Cw0YHRgdCwIGlzLWRpc2FibGVkINGDINC20LzQsNC60L3Rg9GC0L7Qs9C+INGC0LDQsdCwXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGZhbHNlIG9yIHRydWVcbiAgICAgKi9cbiAgICBpc0Rpc2FibGVUYWIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWIudGFiLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10L3Rj9C10Lwg0YHQvtGB0YLQvtGP0L3QuNC1INGC0LDQsdC+0LJcbiAgICAgKi9cbiAgICBjaGFuZ2VTdGF0ZSgpIHtcbiAgICAgICAgLy8g0L3QuNGH0LXQs9C+INC90LUg0LTQtdC70LDQtdC8INC10YHQu9C4INGC0LDQsSDQvdC10LDQutGC0LjQstC10L1cbiAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlVGFiKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINC/0LXRgNC10YXQvtC00LjQvCDQv9C+INGB0YHRi9C70LrQtSDQsiDRgtCw0LHQtSDQv9GA0Lgg0LXQtSDQvdCw0LvQuNGH0LjQuFxuICAgICAgICBpZiAodGhpcy5pc0xpbmsoKSkge1xuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHRoaXMuZGF0YVRhYi51cmw7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINC30LDQutGA0YPQttCw0LXQvCDQutC+0L3RgtC10L3RgiBhamF4J9C+0LxcbiAgICAgICAgLy8gaWYgKHRoaXMuZGF0YVRhYi5hamF4KSB7XG4gICAgICAgIC8vICAgICB0aGlzLmFqYXhMb2FkKCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyDQvNC10L3Rj9C10Lwg0YHQvtGB0YLQvtGP0L3QuNC1INGC0LDQsdC+0LJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQudGFiID09PSB0aGlzLmRhdGFUYWIuaWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5hY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuYWN0aXZlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g0Lgg0L/QvtC60LDQt9GL0LLQsNC10Lwg0L3Rg9C20L3Ri9C5INC60L7QvdGC0LXQvdGCXG4gICAgICAgI
46184HRoaXMuY29udGVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC50YWJDb250ZW50ID09PSB0aGlzLmRhdGFUYWIuaWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5hY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKCdjaGFuZ2VUYWJzJywgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5hY3RpdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodGA0LDQstC90LjQstCw0LXQvCBnZXQg0L/QsNGA0LDQvNC10YLRgNGLINC40LcgVXJsJ2Eg0YHQviDQt9C90LDRh9C10L3QuNGP0LzQuCBkYXRhLXRhYiDQsNGC0YDQuNCx0YPRgtCwINC20LzQsNC60L3Rg9GC0L7Qs9C+INGC0LDQsdCwXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjdGl2ZVRhYiAtINGC0LDQsSDQvdCwINC60L7RgtC+0YDQvtC8INC/0YDQvtC40LfQvtGI0LvQviDRgdC+0LHRi9GC0LjQtSDQutC70LjQulxuICAgICAqL1xuICAgIC8vINC30LDQsdGL0LsgSlNET0MgLSDRh9GC0L4g0YLQsNC60L7QtSBhY3RpdmVUYXY/INC40Lcg0L3QsNC30LLQsNC90LjRjyDQv9C+0L3Rj9GC0L3Qviwg0L3QviDRgSBKU0RPQyDQu9GD0YfRiNC1XG4gICAgLy8g0LzQtdGC0L7QtCDQvtGH0LXQvdGMINCx0L7Qu9GM0YjQvtC5INC90LUg0L/QvtC90Y/RgtC90L4sINGH0YLQviDRj9Cy0LvRj9C10YLRgdGPINGA0LXQt9GD0LvRjNGC0LDRgtC8INGA0LDQsdC+0YLRiyDQvNC10YLQvtC00LBcbiAgICAvLyDQv9C+INC40LTQtdC1INGA0LDQtyDRgdGA0LDQstC90LjQstCw0LXRgiAsINGC0L4g0LTQvtC70LbQtdC9INCy0LXRgNC90YPRgtGMIHRydWUg0LjQu9C4IGZhbHNlXG4gICAgLy8gc3RhdGVVcmwoYWN0aXZlVGFiKSB7XG4gICAgLy8gICAgIC8vIGNvbnN0IHRhYklkID0gYWN0aXZlVGFiLmRhdGFzZXQudGFiO1xuICAgIC8vICAgICBjb25zdCB0YWJJZCA9IHRoaXMuZGF0YVRhYi5pZDtcbiAgICAvLyAgICAgY29uc3QgdGFiVXJsID0gYWN0aXZlVGFiLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIC8vICAgICBjb25zdCBnZXRVcmwgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpO1xuICAgIC8vICAgICBjb25zdCBnZXRBcnJheSA9IGdldFVybC5zcGxpdCgnJicpO1xuICAgIC8vICAgICBsZXQgY29uZ3J1ZW5jZVRhYlVybCA9IHRydWU7XG4gICAgLy9cbiAgICAvLyAgICAgY29uc3QgYXJyU2xpY2UgPSB7XG4gICAgLy8gICAgICAgICBiZWdpbjogMCxcbiAgICAvLyAgICAgICAgIGVuZCAgOiAtMVxuICAgIC8vICAgICB9O1xuICAgIC8vXG4gICAgLy8gICAgIC8vINC/0YDQvtCy0LXRgNGP0LXQvCwg0LXRgdGC0Ywg0LvQuCB1cmwg0LIgaHJlZlxuICAgIC8vICAgICBpZiAodGFiVXJsLnNsaWNlKGFyclNsaWNlLmJlZ2luLCBhcnJTbGljZS5lbmQpKSB7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvL1xuICAgIC8vICAgICAvLyDQv9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70LggZ2V0INC/0LDRgNCw0LzQtdGC0YAg0LIgdXJsJ2Ug0Lgg0LXRgdC70Lgg0LXQs9C+INC10YnQtSDQv9C+0LrQsCDQvdC10YIsINC/0LXRgNC10LTQsNC10Lwg0YLRg9C00LAg0LfQvdCw0YfQtdC90LjQtSBkYXRhLXRhYiDQsNGC0YDQuNCx0YPRgtCwXG4gICAgLy8gICAgIC8vINC20LzQsNC60L3Rg9GC0L7Qs9C+INGC0LDQsdCwXG4gICAgLy8gICAgIGlmICghZ2V0VXJsKSB7XG4gICAgLy8gICAgICAgICB1cmxBcnJheVt1cmxBcnJheS5sZW5ndGhdID0gdGFiSWQ7XG4gICAgLy8gICAgICAgICB0aGlzLmNoYW5nZVVybCgpO1xuICAgIC8vXG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvL1xuICAgIC8vXG4gICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAvLyAgICAgICAgIGlmIChnZXRBcnJheVtpXSA9PT0gdGFiSWQpIHtcbiAgICAvLyAgICAgICAgICAgICBpID0gZ2V0QXJyYXkubGVuZ3RoO1xuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vXG4gICAgLy8gICAgICAgICBmb3IgKGxldCB0YWJJbmRleCA9IDA7IHRhYkluZGV4IDwgdGhpcy50YWJzLmxlbmd0aDsgdGFiSW5kZXgrKykge1xuICAgIC8vICAgICAgICAgICAgIGlmIChnZXRBcnJheVtpXSA9PT0gdGhpcy50YWJzW3RhYkluZGV4XS5kYXRhc2V0LnRhYikge1xuICAgIC8vICAgICAgICAgICAgICAgICB1cmxBcnJheVtnZXRBcnJheS5pbmRleE9mKGdldEFycmF5W2ldKV0gPSB0YWJJZDtcbiAgICAvLyAgICAgICAgICAgICAgICAgdGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoO1xuICAgIC8vICAgICAgICAgICAgICAgICBpID0gZ2V0QXJyYXkubGVuZ3RoO1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVVybCgpO1xuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICBjb25ncnVlbmNlVGFiVXJsID0gZmFsc2U7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvL1xuICAgIC8vICAgICBpZiAoIWNvbmdydWVuY2VUYWJVcmwpIHtcbiAgICAvLyAgICAgICAgIHVybEFycmF5W3VybEFycmF5Lmxlbmd0aF0gPSB0YWJJZDtcbiAgICAvLyAgICAgICAgIHRoaXMuY2hhbmdlVXJsKCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiDQpNC+0YDQvNC40YDRg9C10Lwg0YHRgtGA0L7QutGDINGBIGdldCDQv9Cw0YDQsNC80LXRgtGA0LDQvNC4INC00LvRjyDRgdC80LXQvdGLIHVybCdhXG4gICAgICovXG4gICAgLy8gY2hhbmdlVXJsKCkge1xuICAgIC8vICAgICBjb25zdCB1cmxTdHJpbmcgPSB1cmxBcnJheS5qb2luKCcmJyk7XG4gICAgLy9cbiAgICAvLyAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKGA/JHt1cmxTdHJpbmd9YCwgbnVsbCwgYD8ke3VybFN0cmluZ31gKTtcbiAgICAvLyB9XG5cbiAgICAvLyAvKipcbiAgICAvLyAgKiDQn9C+0LTQs9GA0YPQttCw0LXQvCBhamF4XG4gICAgLy8gICovXG4gICAgLy8gYWpheExvYWQoKSB7XG4gICAgLy8gICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIC8vICAgICBjb25zdCBhamF4VXJsID0gYC90ZXN0cy8ke3RoYXQuZGF0YVRhYi5hamF4fWA7XG4gICAgLy9cbiAgICAvLyAgICAgVXRpbHMuc2VuZChudWxsLCBhamF4VXJsLFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgI
46184HN1Y2Nlc3MocmVxKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoYXQuYWRkUGFnZUNvbnRlbnQocmVxLCB0aGF0LmRhdGFUYWIudGFiKTtcbiAgICAvLyAgICAgICAgICAgICB9LFxuICAgIC8vICAgICAgICAgICAgIGVycm9yKGVycikge1xuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQvtGI0LjQsdC60LAg0L3QsCDRgdC10YDQstC10YDQtTogJHtlcnJ9YCk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gfVxuICAgIC8vXG4gICAgLy8gLyoqXG4gICAgLy8gICog0JTQvtCx0LDQstC70Y/QtdC8INC60L7QvdGC0LXQvdGCINC/0YDQuNGI0LXQtNGI0LjQuSDRgSDRgdC10YDQstC10YDQsCDQvdCwINGB0YLRgNCw0L3QuNGG0YNcbiAgICAvLyAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtINC+0YLQstC10YIg0L7RgiDRgdC10YDQstC10YDQsCDQv9GA0LggYWpheCDQt9Cw0L/RgNC+0YHQtVxuICAgIC8vICAqIEBwYXJhbSB7bm9kZX0gYWN0aXZlVGFiIC0g0YLQsNCxINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC10Lsg0LrQu9C40LpcbiAgICAvLyAgKi9cbiAgICAvLyBhZGRQYWdlQ29udGVudChkYXRhLCBhY3RpdmVUYWIpIHtcbiAgICAvLyAgICAgdGhpcy5jb250ZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgLy8gICAgICAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnRhYkNvbnRlbnQgPT09IGFjdGl2ZVRhYi5kYXRhc2V0LnRhYikge1xuICAgIC8vICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdGVtcGxhdGUoZGF0YSk7XG4gICAgLy8gICAgICAgICAgICAgYWN0aXZlVGFiLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hamF4Jyk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQuCDRgdC+0LfQtNCw0L3QuNC4INGN0LrQt9C10LzQv9C70Y/RgNCwINC60LvQsNGB0YHQsCwg0L/RgNC+0LLQtdGA0Y/QtdC8INC10YHRgtGMINC70Lgg0YMg0L3QsNGBINC/0LDRgNCw0LzQtdGC0YDRiyDQsiDQsNC00YDQtdGB0L3QvtC5INGB0YLRgNC+0LrQtS5cbiAgICAgKiDQldGB0LvQuCDQtdGB0YLRjCAtINCy0YvRgtCw0YHQutC40LLQsNC10Lwg0LjRhSDQsiDQvNCw0YHRgdC40LIuXG4gICAgICovXG4gICAgLy8gZ2V0VXJsUGFyYW1zKCkge1xuICAgIC8vICAgICAvLyDQsdC10YDQtdC8INGB0YLRgNC+0LrRgyDQuNC3INGD0YDQu9CwINC4INC+0LHRgNC10LfQsNC10Lwg0LXQvNGDINC/0LXRgNCy0YvQuSDRgdC40LzQstC+0Lsg0Lgg0L/Qv9GA0LXQvtCx0YDQsNC30YPQtdC8INCyINC80LDRgdGB0LjQslxuICAgIC8vICAgICBjb25zdCBnZXRBcnJheSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgnPycsICcnKS5zcGxpdCgnJicpO1xuICAgIC8vXG4gICAgLy8gICAgIGlmIChnZXRBcnJheS5sZW5ndGgpIHtcbiAgICAvLyAgICAgICAgIC8vINC/0LXRgNC10LTQsNC10Lwg0LzQsNGB0YHQuNCyINC00LvRjyDRgdGA0LDQstC90LXQvdC40Y8g0YEgZGF0YS10YWIg0LDRgtC40LHRg9GC0LDQvNC4XG4gICAgLy8gICAgICAgICB0aGlzLmNvbXBhcmlzb25UYWJVcmwoZ2V0QXJyYXkpO1xuICAgIC8vICAgICAgICAgdXJsQXJyYXkgPSBnZXRBcnJheTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqINCV0YHQu9C4INCyIGdldCDQv9Cw0YDQsNC80LXRgtGA0LDRhSB1cmwnYSDQtdGB0YLRjCDQt9C90LDRh9C10L3QuNGPINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQtSDQt9C90LDRh9C10L3QuNGP0LwgZGF0YS10YWIg0LDRgtGA0LjQsdGD0YLQvtCyLCDRgtC+INC+0YLQutGA0YvQstCw0LXQvCDRjdGC0L7RgiDRgtCw0LFcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBnZXRBcnJheSAtINC80LDRgdGB0LjQsiBnZXQg0L/QsNGA0LDQvNC10YLRgNC+0LIg0LjQtyB1cmwnYSDQtNC70Y8g0YHRgNCw0LLQvdC10L3QuNGPINGBINC30L3QsNGH0LXQvdC40Y/QvNC4IGRhdGEtdGFiINCw0YLRgNC40LHRg9GC0L7QslxuICAgICAqL1xuICAgIC8vIGNvbXBhcmlzb25UYWJVcmwoZ2V0QXJyYXkpIHtcbiAgICAvLyAgICAgLy8g0L/RgNC+0YXQvtC00LjQvCDQv9C+INC80LDRgdGB0LjQstGDINC40Lcg0LfQvdCw0YfQtdC90LjQuSDQstC30Y/RgtGL0YUg0LIg0YPRgNC70LVcbiAgICAvLyAgICAgZ2V0QXJyYXkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIC8vICAgICAgICAgLy8g0L/RgNC+0YXQvtC00LjQvCDQv9C+INC80LDRgdGB0LjQstGDIGRhdGEtdGFiINGN0LvQtdC80LXQvdGC0L7QslxuICAgIC8vICAgICAgICAgdGhpcy50YWJzLmZvckVhY2goKHRhYikgPT4ge1xuICAgIC8vICAgICAgICAgICAgIC8vINC40YnQtdC8INGB0L7QstC/0LDQtNC10L3QuNC1INC30L3QsNGH0LXQvdC40LkgZGF0YS10YWIg0LDRgtC40YDRg9Cx0YLQvtCyINGB0L4g0LfQvdCw0YfQtdC90LjRj9C80Lgg0LjQtyDRg9GA0LvQsFxuICAgIC8vICAgICAgICAgICAgIGlmICh0YWIuZGF0YXNldC50YWIgPT09IGVsZW1lbnQpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgLy8g0LLRi9C30YvQstCw0LXQvCDQvNC10YLQvtC0INGB0LzQtdC90Ysg0YLQsNCx0L7QsiDQsiDRgdC70YPRh9Cw0LUg0YHQvtCy0L/QsNC00LXQvdC40Y9cbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKHRhYik7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoKTtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUYWJzO1xuIiwiaW1wb3J0IHRlbXBsYXRlIGZyb20gJ2NvbXBvbmVudHMvdGVhbS9wb3B1cC50d2lnJztcbmltcG9ydCBVdGlscyBmcm9tICdjb21tb24vc2NyaXB0cy91dGlscyc7XG5cbmNsYXNzIHRlYW1Qb3B1cCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGFiQnV0dG9ucyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotdGVhbS10YWItYnV0dG9uJykpO1xuICAgICAgICB0aGlzLnRhYkNvbnRlbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai10ZWFtLXRhYi1jb250ZW50JykpO1xuICAgICAgICB0aGlzLnRhYkJ1dHRvbkFjdGl2ZSA9ICdiLXRlYW0tdGV4dF9fYnV0dG9uX2lzX2FjdGl2ZSc7XG4gICAgICAgI
46184HRoaXMudGFiQ29udGVudEhpZGUgPSAnYi10ZWFtLXRleHRfX3RhYl9pc19oaWRlJztcbiAgICB9XG5cbiAgICBpbml0KG9iamVjdCkge1xuICAgICAgICB0aGlzLmJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICBjb25zdCBpdGVtcyA9IG9iamVjdC5xdWVyeVNlbGVjdG9yQWxsKCcuYi10ZWFtLXNsaWRlc19fbW9kYWwnKTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBVdGlscy5jbG9zZXN0KGl0ZW0sICcuYi10ZWFtLXNsaWRlc19faXRlbScpO1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShjb250YWluZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGVtcGxhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpeGVkQm9keSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBfYmluZEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy50YWJCdXR0b25zLmZvckVhY2goKHRhYkJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgdGFiQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0YWJCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMudGFiQnV0dG9uQWN0aXZlKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnRhYkJ1dHRvbkFjdGl2ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZVRhYkNvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFjdGl2ZUJ1dHRvbigpO1xuXG4gICAgICAgICAgICAgICAgdGFiQnV0dG9uLmNsYXNzTGlzdC5hZGQodGhpcy50YWJCdXR0b25BY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaWRUYWJDb250ZW50ID0gdGFiQnV0dG9uLmRhdGFzZXQudGFiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZFRhYkNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZVRhYkNvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgICAgICB0YWJDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWJDb250ZW50SGlkZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZUFjdGl2ZUJ1dHRvbigpIHtcbiAgICAgICAgdGhpcy50YWJCdXR0b25zLmZvckVhY2goKHRhYkJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgdGFiQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWJCdXR0b25BY3RpdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfaGlkZVRhYkNvbnRlbnRzKCkge1xuICAgICAgICB0aGlzLnRhYkNvbnRlbnRzLmZvckVhY2goKHRhYkNvbnRlbnRzKSA9PiB7XG4gICAgICAgICAgICB0YWJDb250ZW50cy5jbGFzc0xpc3QuYWRkKHRoaXMudGFiQ29udGVudEhpZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXREYXRhKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLXRlYW0tc2xpZGVzX19sZWdlbmQnKTtcblxuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICBuYW1lICAgIDogZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYi10ZWFtLXNsaWRlc19fdHRsJykuaW5uZXJIVE1MLFxuICAgICAgICAgICAgc3RhdHVzICA6IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmItdGVhbS1zbGlkZXNfX3RleHQnKS5pbm5lckhUTUwsXG4gICAgICAgICAgICBwb3NpdGlvbjogZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYi10ZWFtLXNsaWRlc19fdGV4dC1oaWRkZW4nKS5pbm5lckhUTUwsXG4gICAgICAgICAgICB0ZXh0ICAgIDogdGV4dEVsZW1lbnQgPyB0ZXh0RWxlbWVudC5pbm5lckhUTUwgOiAnJyxcbiAgICAgICAgICAgIGltYWdlICAgOiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLXRlYW0tc2xpZGVzX19pbWcnKS5zcmNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpbnNlcnRUZW1wbGF0ZSgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCB0ZW1wbGF0ZSh0aGlzLmRhdGEpKTtcbiAgICAgICAgdGhpcy5pbml0Q2xvc2VCdG4oKTtcbiAgICB9XG5cbiAgICBpbml0Q2xvc2VCdG4oKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotcG9wdXAtY2xvc2UnKTtcblxuICAgICAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVBvcHVwKCk7XG4gICAgICAgICAgICB0aGlzLmZpeGVkQm9keSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95UG9wdXAoKSB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItdGVhbS1wb3B1cCcpO1xuXG4gICAgICAgIFV0aWxzLnJlbW92ZUVsZW1lbnQocG9wdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCU0L7QsdCw0LLQu9GP0LXRgiBib2R5IHBvc2l0aW9uOmZpeGVkLCDQtNCw0LHRiyDQuNC30LHQtdC20LDRgtGMINC/0YDQvtC60YDRg9GC0LrQuCDRgdGC0YDQsNC90LjRhtGLINC/0YDQuCDQvtGC0LrRgNGL0YLQvtC8INC/0L7Qv9Cw0L/QtS5cbiAgICAgKi9cbiAgICBmaXhlZEJvZHkoKSB7XG4gICAgICAgIHRoaXMuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdib2R5LWZpeGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB0ZWFtUG9wdXA7XG4iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJjMDEzMDlmZWEwNTkxOGUwNjZjOWY1NjY2ZTVjMjY0NzkxMDRiOTRmNTM2NGM3MDI1ZDNjZmU1YzdhNmZhZGUwYTc0ZjQxOTA2MjI0ZDhkYmM3ODJkNjc2NDFkN2NlZTc1OTMwNzUwMjAxZjYwMDdlZDVlNDVjNzFkZTQwNDViZlwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXRlYW0tcG9wdXBcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLXRlYW0tcG9wdXBfX2lubGluZS13cmFwcGVyXFxcIj5cXG4gICAgICAgIDxidXR0b24gY2xhc3M9XFxcImItdGVhbS1wb3B1cF9fY2xvc2Ugai1wb3B1cC1jbG9zZVxcXCIgYXJpYS1sYWJlbD1cXFwi0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3QvlxcXCI+XFxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB3aWR0aD1cXFwiMjZcXFwiIGhlaWdodD1cXFwiMjZcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNiAyNlxcXCI+PGRlZnM+PHBhdGggaWQ9XFxcIjczaHRhXFxcIiBkPVxcXCJNMTA1MS40NDQgNzNMMTA1MCA3MS41NTYgMTA2MS41NTYgNjAgMTA1MCA0OC40NDRsMS40NDQtMS40NDRMMTA2MyA1OC41NTYgMTA3NC41NTYgNDdsMS40NDQgMS40NDRMMTA2NC40NDQgNjAgMTA3NiA3MS41NTYgMTA3NC41NTYgNzMgMTA2MyA2MS40NDR6XFxcIi8+PC9kZWZzPjxnPjxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0xMDUwIC00NylcXFwiPjx1c2UgZmlsbD1cXFwiI2ZmZlxcXCIgeGxpbms6aHJlZj1cXFwiIzczaHRhXFxcIi8+PC9nPjwvZz48L3N2Zz5cXG4gICAgICAgIDwvYnV0dG9uPlxcblxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYi10ZWFtLXBvcHVwX19oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9fbmFtZVxcXCI+XCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJuYW1lXCIsXCJtYXRjaFwiOltcIm5hbWVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYi10ZWFtLXBvcHVwX19zdGF0dXNcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwic3RhdHVzXCIsXCJtYXRjaFwiOltcInN0YXR1c1wiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJiLXRlYW0tcG9wdXBfX3Bvc2l0aW9uXFxcIj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInBvc2l0aW9uXCIsXCJtYXRjaFwiOltcInBvc2l0aW9uXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9faW1hZ2Utd3JhcFxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImltYWdlXCIsXCJtYXRjaFwiOltcImltYWdlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcXCIgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9faW1hZ2VcXFwiIGFsdD1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJuYW1lXCIsXCJtYXRjaFwiOltcIm5hbWVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgXCJ9LHtcInR5cGVcIjpcImxvZ2ljXCIsXCJ0b2tlblwiOntcInR5cGVcIjpcIlR3aWcubG9naWMudHlwZS5pZlwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJ0ZXh0XCIsXCJtYXRjaFwiOltcInRleHRcIl19XSxcIm91dHB1dFwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgICAgICAgIDxkaXYgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9fYm9keVxcXCI+XFxuICAgICAgICAgICAgXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJ0ZXh0XCIsXCJtYXRjaFwiOltcInRleHRcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIFwifV19fSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgICAgPC9kaXY+XFxuPC9kaXY+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybi
46184B0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4vKipcbiAqIEB2ZXJzaW9uIDEuMFxuICogQGF1dGhvciBLZWxuaWsgU3R1ZGlvcyB7aHR0cDovL2tlbG5pay5ydX1cbiAqINCS0LfRj9GC0L4g0YEgaHR0cHM6Ly9naXRsYWIua2VsbmlrLnByby9zYW1vbGV0L2hpbWtpL2Jsb2IvZGV2L3NyYy9zY3JpcHRzL2FwcC95YW5kZXgtbWFwcy5qc1xuICovXG5cbmltcG9ydCBtYWluSHRtbE1hcmtlciBmcm9tICcuL3RlbXBsYXRlcy9tYXJrZXJzL21haW4udHdpZyc7XG5pbXBvcnQgc2Vjb25kYXJ5SHRtbE1hcmtlciBmcm9tICcuL3RlbXBsYXRlcy9tYXJrZXJzL3NlY29uZGFyeS50d2lnJztcbmltcG9ydCB0ZXh0SHRtbE1hcmtlciBmcm9tICcuL3RlbXBsYXRlcy9tYXJrZXJzL3RleHQudHdpZyc7XG5pbXBvcnQgbGlua0h0bWxCYWxsb29uIGZyb20gJy4vdGVtcGxhdGVzL2JhbGxvbnMvbGluay50d2lnJztcbmltcG9ydCBsZWdlbmRUZW1wbGF0ZSBmcm9tICcuL3RlbXBsYXRlcy9sZWdlbmQudHdpZyc7XG5pbXBvcnQgY29udHJvbHNUZW1wbGF0ZSBmcm9tICcuL3RlbXBsYXRlcy9jb250cm9scy50d2lnJztcbmltcG9ydCBVdGlscyBmcm9tICdjb21tb24vc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgTWVkaWF0b3IgZnJvbSAnY29tbW9uL3NjcmlwdHMvbWVkaWF0b3InO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuXG5jbGFzcyBZYW5kZXhNYXAge1xuICAgIGNvbnN0cnVjdG9yKHltYXBzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQrdC60LfQtdC80L/Qu9GP0YAg0LfQsNCz0YDRg9C20LXQvdC90YvRhSDRj9C90LTQtdC60YEg0LrQsNGA0YIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnltYXBzID0geW1hcHM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCS0YHQtSDQvdCw0YHRgtGA0L7QutC4INC60LDRgNGC0YtcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICog0K/QvdC00LXQutGB0L7QstGL0Lkg0L7QsdGK0LXQutGCINC60LDRgNGC0YtcbiAgICAgICAgICogQHR5cGUge251bGx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVUkwg0L/QviDQutC+0YLQvtGA0L7QvNGDINCx0YPQtNC10YIg0LLRi9C/0L7Qu9C90LXQvSBhamF4INC30LDQv9GA0L7RgSDQt9CwINC00LDQvdC90YvQvNC4XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybCA9ICcnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQmtC70LDRgdGB0LAgRE9NLdGN0LvQtdC80LXQvdGC0LAg0LIg0LrQvtGC0L7RgNGL0Lkg0LHRg9C00LXRgiDQstGB0YLQsNCy0LvQtdC90LAg0LrQsNGA0YLQsFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iYXNlID0gJy5iLXlhbmRleC1tYXBfX2Jhc2UnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdXRlck9wdGlvbnMgLSDQvdCw0YHRgtGA0L7QudC60Lgg0LjQtyDQstC90LXRiNC90LXQs9C+INGE0LDQudC70LBcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbml0WWFuZGV4TWFwIC0g0YTRg9C90LrRhtC40Y8g0L7QsdGA0LDRgtC90L7Qs9C+INCy0YvQt9C+0LLQsCwg0YHRgNCw0LHQsNGC0YvQstCw0LXRgiwg0LrQvtCz0LTQsCDQutCw0YDRgtCwINGD0LbQtSDQt9Cw0LPRgNGD0LfQuNC70LDRgdGMXG4gICAgICog0Lgg0L/QvtC60LDQt9GL0LLQsNC10YLRgdGPXG4gICAgICovXG4gICAgaW5pdChvdXRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5tYXBXcmFwcGVyID0gb3V0ZXJPcHRpb25zLndyYXBwZXI7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRoaXMubWFwV3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuYmFzZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbnRlbnQuaWQ7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5tYXBXcmFwcGVyLmRhdGFzZXQuYWpheDtcbiAgICAgICAgdGhpcy5qc29uID0gdGhpcy5tYXBXcmFwcGVyLmRhdGFzZXQuanNvbjtcblxuICAgICAgICBpZiAodGhpcy5qc29uKSB7XG4gICAgICAgICAgICB0aGlzLmpzb24gPSBKU09OLnBhcnNlKGF0b2IodGhpcy5qc29uKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBsZXRlU2V0dGluZ3Mob3V0ZXJPcHRpb25zLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluaXRZYW5kZXhNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2Nyb2xsWm9vbSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1hcmtlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRUYWJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q2lyY2xlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU1vYmlsZURyYWcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRMZWdlbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRHUFMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCd0LXQv9C+0YHRgNC10LTRgdGC0LLQtdC90L3QvtC1INGB0L7Qt9C00LDQvdC40LUg0Y3QutC30LXQvNC/0LvRj9GA0LAg0K/QvdC00LXQutGBINCa0LDRgNGCXG4gICAgICogQHBhcmFtIGluaXRNYXBDYWxsYmFjayAtINC60L7Qu9C70LHRjdC6INC+0YHRgtCw0LvRjNC90YvRhSDQvNC10YLQvtC00L7QsiDQvNC+0LTRg9C70Y8uINCh0YDQsNCx0L7RgtCw0Y7RgiDRgtC+0LvRjNC60L4g0YLQvtCz0LTQsCwg0LrQvtCz0LTQsCDQutCw0YDRgtCwINCx0YPQtNC10YIg0L/QvtC70L3QvtGB0YLRjNGOINGB0L7Qt9C00LDQvdCwXG4gICAgICovXG4gICAgaW5pdFlhbmRleE1hcChpbml0TWFwQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9KSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IHRoaXMueW1hcHMuTWFwKHRoaXMuaWQsIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBpbml0TWFwQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBpbml0TGVnZW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MubGVnZW5kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgI
46184H1cblxuICAgICAgICBjb25zdCBDdXN0b21Db250cm9sQ2xhc3MgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgQ3VzdG9tQ29udHJvbENsYXNzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuXyRjb250ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2dlb2NvZGVyRGVmZXJyZWQgPSBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vINC90LDRgdC70LXQtNGD0LXQvCDQvtGCIGNvbGxlY3Rpb24uSXRlbVxuICAgICAgICB5bWFwcy51dGlsLmF1Z21lbnQoQ3VzdG9tQ29udHJvbENsYXNzLCB5bWFwcy5jb2xsZWN0aW9uLkl0ZW0sIHtcbiAgICAgICAgICAgIG9uQWRkVG9NYXA6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBDdXN0b21Db250cm9sQ2xhc3Muc3VwZXJjbGFzcy5vbkFkZFRvTWFwLmNhbGwodGhpcywgbWFwKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0Q2VudGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFBhcmVudCgpLmdldENoaWxkRWxlbWVudCh0aGlzKS50aGVuKHRoaXMuX29uR2V0Q2hpbGRFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uUmVtb3ZlRnJvbU1hcDogZnVuY3Rpb24gKG9sZE1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RDZW50ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl8kY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kY29udGVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwRXZlbnRHcm91cC5yZW1vdmVBbGwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ3VzdG9tQ29udHJvbENsYXNzLnN1cGVyY2xhc3Mub25SZW1vdmVGcm9tTWFwLmNhbGwodGhpcywgb2xkTWFwKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9vbkdldENoaWxkRWxlbWVudDogZnVuY3Rpb24gKHBhcmVudERvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIC8vINCh0L7Qt9C00LDQtdC8IEhUTUwt0Y3Qu9C10LzQtdC90YIg0YEg0YLQtdC60YHRgtC+0LwuXG4gICAgICAgICAgICAgICAgdGhpcy5fJGNvbnRlbnQgPSAkKGxlZ2VuZFRlbXBsYXRlKCkpLmFwcGVuZFRvKHBhcmVudERvbUNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjdXN0b21Db250cm9sID0gbmV3IEN1c3RvbUNvbnRyb2xDbGFzcygpO1xuICAgICAgICB0aGlzLm1hcC5jb250cm9scy5hZGQoY3VzdG9tQ29udHJvbCwge1xuICAgICAgICAgICAgZmxvYXQ6ICdub25lJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdEdQUygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmdwcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vINCh0L7Qt9C00LDQtdC8INGB0L7QsdGB0YLQstC10L3QvdGL0Lkg0LrQu9Cw0YHRgS5cbiAgICAgICAgY29uc3QgR1BTQ2xhc3MgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgR1BTQ2xhc3Muc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fJGNvbnRlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZ2VvY29kZXJEZWZlcnJlZCA9IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g0Jgg0L3QsNGB0LvQtdC00YPQtdC8INC10LPQviDQvtGCIGNvbGxlY3Rpb24uSXRlbS5cbiAgICAgICAgeW1hcHMudXRpbC5hdWdtZW50KEdQU0NsYXNzLCB5bWFwcy5jb2xsZWN0aW9uLkl0ZW0sIHtcbiAgICAgICAgICAgIG9uQWRkVG9NYXA6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBHUFNDbGFzcy5zdXBlcmNsYXNzLm9uQWRkVG9NYXAuY2FsbCh0aGlzLCBtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RDZW50ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRFbGVtZW50KHRoaXMpLnRoZW4odGhpcy5fb25HZXRDaGlsZEVsZW1lbnQsIHRoaXMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmVGcm9tTWFwOiBmdW5jdGlvbiAob2xkTWFwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdENlbnRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuXyRjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRjb250ZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBFdmVudEdyb3VwLnJlbW92ZUFsbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBHUFNDbGFzcy5zdXBlcmNsYXNzLm9uUmVtb3ZlRnJvbU1hcC5jYWxsKHRoaXMsIG9sZE1hcCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfb25HZXRDaGlsZEVsZW1lbnQ6IGZ1bmN0aW9uIChwYXJlbnREb21Db250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAvLyDQodC+0LfQtNCw0LXQvCBIVE1MLdGN0LvQtdC80LXQvdGCINGBINGC0LXQutGB0YLQvtC8LlxuICAgICAgICAgICAgICAgIHRoaXMuXyRjb250ZW50ID0gJCgnPGJ1dHRvbiBjbGFzcz1cImIteWFuZGV4LW1hcF9fZ3BzLWJ0biBqLWdldC1nZW9sb2NhdGlvblwiPjwvYnV0dG9uPicpLmFwcGVuZFRvKHBhcmVudERvbUNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fbWFwRXZlbnRHcm91cCA9IHRoaXMuZ2V0TWFwKCkuZXZlbnRzLmdyb3VwKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfY3JlYXRlUmVxdWVzdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RDZW50ZXIgPSB0aGlzLl9sYXN0Q2VudGVyID0gdGhpcy5nZXRNYXAoKS5nZXRDZW50ZXIoKS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgLy8g0JfQsNC/0YDQsNGI0LjQstCw0LXQvCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDQvNC10YHRgtC1INC/0L4g0LrQvtC+0YDQtNC40L3QsNG
46184C0LDQvCDRhtC10L3RgtGA0LAg0LrQsNGA0YLRiy5cbiAgICAgICAgICAgICAgICB5bWFwcy5nZW9jb2RlKHRoaXMuX2xhc3RDZW50ZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g0KPQutCw0LfRi9Cy0LDQtdC8LCDRh9GC0L4g0L7RgtCy0LXRgiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LIg0YTQvtGA0LzQsNGC0LUgSlNPTi5cbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0LvQuNC80LjRgiDQvdCwINC60L7Quy3QstC+INC30LDQv9C40YHQtdC5INCyINC+0YLQstC10YLQtS5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogMVxuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyDQkdGD0LTQtdC8INC+0LHRgNCw0LHQsNGC0YvQstCw0YLRjCDRgtC+0LvRjNC60L4g0L7RgtCy0LXRgiDQvtGCINC/0L7RgdC70LXQtNC90LXQs9C+INC30LDQv9GA0L7RgdCwLlxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENlbnRlciA9PSB0aGlzLl9sYXN0Q2VudGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblNlcnZlclJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9vblNlcnZlclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8g0JTQsNC90L3Ri9C1INC+0YIg0YHQtdGA0LLQtdGA0LAg0LHRi9C70Lgg0L/QvtC70YPRh9C10L3RiyDQuCDRgtC10L/QtdGA0Ywg0LjRhSDQvdC10L7QsdGF0L7QtNC40LzQviDQvtGC0L7QsdGA0LDQt9C40YLRjC5cbiAgICAgICAgICAgICAgICAvLyDQntC/0LjRgdCw0L3QuNC1INC+0YLQstC10YLQsCDQsiDRhNC+0YDQvNCw0YLQtSBKU09OLlxuICAgICAgICAgICAgICAgIHZhciBtZW1iZXJzID0gcmVzdWx0Lkdlb09iamVjdENvbGxlY3Rpb24uZmVhdHVyZU1lbWJlcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvT2JqZWN0RGF0YSA9IChtZW1iZXJzICYmIG1lbWJlcnMubGVuZ3RoKSA/IG1lbWJlcnNbMF0uR2VvT2JqZWN0IDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZ2VvT2JqZWN0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kY29udGVudC50ZXh0KGdlb09iamVjdERhdGEubWV0YURhdGFQcm9wZXJ0eS5HZW9jb2Rlck1ldGFEYXRhLnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ3BzID0gbmV3IEdQU0NsYXNzKCk7XG4gICAgICAgIHRoaXMubWFwLmNvbnRyb2xzLmFkZChncHMsIHtcbiAgICAgICAgICAgIGZsb2F0OiAnbm9uZScsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHRvcDogKHRoaXMuc2V0dGluZ3MuaGVpZ2h0IC8gMikgKyAxNixcbiAgICAgICAgICAgICAgICByaWdodDogMTVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0R2VvTG9jYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGdlb2xvY2F0aW9uID0geW1hcHMuZ2VvbG9jYXRpb247XG5cbiAgICAgICAgLy8g0KHRgNCw0LLQvdC40Lwg0L/QvtC70L7QttC10L3QuNC1LCDQstGL0YfQuNGB0LvQtdC90L3QvtC1INC/0L4gaXAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINC4XG4gICAgICAgIC8vINC/0L7Qu9C+0LbQtdC90LjQtSwg0LLRi9GH0LjRgdC70LXQvdC90L7QtSDRgdGA0LXQtNGB0YLQstCw0LzQuCDQsdGA0LDRg9C30LXRgNCwLlxuICAgICAgICBnZW9sb2NhdGlvbi5nZXQoe1xuICAgICAgICAgICAgcHJvdmlkZXI6ICd5YW5kZXgnLFxuICAgICAgICAgICAgbWFwU3RhdGVBdXRvQXBwbHk6IHRydWVcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyDQmtGA0LDRgdC90YvQvCDRhtCy0LXRgtC+0Lwg0L/QvtC80LXRgtC40Lwg0L/QvtC70L7QttC10L3QuNC1LCDQstGL0YfQuNGB0LvQtdC90L3QvtC1INGH0LXRgNC10LcgaXAuXG4gICAgICAgICAgICByZXN1bHQuZ2VvT2JqZWN0cy5vcHRpb25zLnNldCgncHJlc2V0JywgJ2lzbGFuZHMjcmVkQ2lyY2xlSWNvbicpO1xuICAgICAgICAgICAgcmVzdWx0Lmdlb09iamVjdHMuZ2V0KDApLnByb3BlcnRpZXMuc2V0KHtcbiAgICAgICAgICAgICAgICBiYWxsb29uQ29udGVudEJvZHk6ICfQnNC+0LUg0LzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjQtSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbXlNYXAuZ2VvT2JqZWN0cy5hZGQocmVzdWx0Lmdlb09iamVjdHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBnZW9sb2NhdGlvbi5nZXQoe1xuICAgICAgICAgICAgcHJvdmlkZXI6ICdicm93c2VyJyxcbiAgICAgICAgICAgIG1hcFN0YXRlQXV0b0FwcGx5OiB0cnVlXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8g0KHQuNC90LjQvCDRhtCy0LXRgtC+0Lwg0L/QvtC80LXRgtC40Lwg0L/QvtC70L7QttC10L3QuNC1LCDQv9C+0LvRg9GH0LXQvdC90L7QtSDRh9C10YDQtdC3INCx0YDQsNGD0LfQtdGALlxuICAgICAgICAgICAgLy8g0JXRgdC70Lgg0LHRgNCw0YPQt9C10YAg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0Y3RgtGDINGE0YPQvdC60YbQuNC+0L3QsNC70YzQvdC+0YHRgtGMLCDQvNC10YLQutCwINC90LUg0LHRg9C00LXRgiDQtNC+0LHQsNCy0LvQtdC90LAg0L3QsCDQutCw0YDRgtGDLlxuICAgICAgICAgICAgcmVzdWx0Lmdlb09iamVjdHMub3B0aW9ucy5zZXQoJ3ByZXNldCcsICdpc2xhbmRzI2JsdWVDaXJjbGVJY29uJyk7XG4gICAgICAgICAgICBteU1hcC5nZW9PYmplY3RzLmFkZChyZXN1bHQuZ2VvT2JqZWN0cyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0LrQu9C10LjQstCw0LXRgiDQstGB0LUg0L3QsNGB0YLRgNC+0LnQutC4INC60LDRgNGC0Ysg0LIg0L7QtNC90YMg0L/QtdGA0LzQtdC90L3Rg9GOXG4gICAgICovXG4gICAgY29tcGxldGVTZXR0aW5ncy
46184hvdXRlck9wdGlvbnMsIGluaXRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge30pIHtcblxuICAgICAgICBpZiAodGhpcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFNldHRpbmdzKHRoaXMuc2V0RGVmYXVsdFNldHRpbmdzKCkpO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0U2V0dGluZ3ModGhpcy5nZXRTY3JpcHRTZXR0aW5ncyhvdXRlck9wdGlvbnMpKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmVyU2V0dGluZ3ModGhpcy51cmwsIGluaXRDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29ubmVjdFNldHRpbmdzKHRoaXMuc2V0RGVmYXVsdFNldHRpbmdzKCkpO1xuICAgICAgICB0aGlzLmNvbm5lY3RTZXR0aW5ncyh0aGlzLmdldFNjcmlwdFNldHRpbmdzKG91dGVyT3B0aW9ucykpO1xuICAgICAgICB0aGlzLmNvbm5lY3RTZXR0aW5ncyh0aGlzLmpzb24pO1xuICAgICAgICBpbml0Q2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdGCINC90LDRgdGC0YDQvtC50LrQuCDQvtGCINGB0LXRgNCy0LXRgNCwXG4gICAgICovXG4gICAgZ2V0U2VydmVyU2V0dGluZ3ModXJsLCBzZXJ2ZXJTdWNjZXNzID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICAgICAgVXRpbHMuc2VuZCgnJywgdXJsLCB7XG4gICAgICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RTZXR0aW5ncyhyZXNwb25zZS5kYXRhKTtcblxuICAgICAgICAgICAgICAgIHNlcnZlclN1Y2Nlc3MoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihg0J/RgNC4INC30LDQs9GA0YPQt9C60LUg0L3QsNGB0YLRgNC+0LXQuiDRgSDRgdC10YDQstC10YDQsCDQv9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwOiAke2Vycm9yfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAnR0VUJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQutC70LXQuNCy0LDQtdGCINC60L7QvdC60YDRgtC10L3Rg9GOINC90LDRgdGC0YDQvtC50LrRgyDQsiDQvtCx0YnRg9GOINC90LDRgdGC0YDQvtC50LrRgyDQstGB0LXQuSDQutCw0YDRgtGLXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG91dGVyU2V0dGluZ3MgLSDQvtCx0YrQtdC60YIg0L3QsNGB0YLRgNC+0LXQuiDQutCw0YDRgtGLXG4gICAgICovXG4gICAgY29ubmVjdFNldHRpbmdzKG91dGVyU2V0dGluZ3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRlclNldHRpbmdzID09PSBgb2JqZWN0YCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLCBvdXRlclNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNC70LjQstCw0LXRgiDQvdCw0YHRgtGA0L7QudC60Lgg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y5cbiAgICAgKiBAcmV0dXJuIHt7Y2VudGVyOiB7bGF0LCBsbmd9LCB6b29tOiBudW1iZXIsIG1pblpvb206IG51bWJlciwgbWF4Wm9vbTogbnVtYmVyLCB6b29tU3RlcDogbnVtYmVyfX0gLVxuICAgICAqINC+0LHRitC10LrRgiDQvdCw0YHRgtGA0L7QtdC6INC60LDRgNGC0YtcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0U2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IGxhdENlbnRlciA9IDU5LjkzOTAxNDtcbiAgICAgICAgY29uc3QgbG5nQ2VudGVyID0gMzAuMzE1NTQ1O1xuXG4gICAgICAgIC8vINCy0YvRgdGH0LjRgtGL0LLQsNC10Lwg0LLRi9GB0L7RgtGDINC+0LHQtdGA0YLQutC4INC60LDRgNGC0YssINCwINGA0LDQstC90L4g0LLRi9GB0L7RgtGDINC60LDRgNGC0YssINC00LvRjyDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjRjyDRjdC70LXQvNC10L3RgtC+0LIg0YPQv9GA0LDQstC70LXQvdC40Y9cbiAgICAgICAgY29uc3QgaGVpZ2h0TWFwID0gdGhpcy5jb250ZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2VudGVyICAgICAgICAgICAgICAgICA6IFtsYXRDZW50ZXIsIGxuZ0NlbnRlcl0sXG4gICAgICAgICAgICBtYXBUeXBlQ29udHJvbCAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB6b29tICAgICAgICAgICAgICAgICAgIDogMTIsXG4gICAgICAgICAgICBtaW5ab29tICAgICAgICAgICAgICAgIDogMTAsXG4gICAgICAgICAgICBtYXhab29tICAgICAgICAgICAgICAgIDogMTgsXG4gICAgICAgICAgICB6b29tU3RlcCAgICAgICAgICAgICAgIDogMSxcbiAgICAgICAgICAgIGNvbnRyb2xzICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgIHpvb21Db250cm9sICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICAgICAgY3VzdG9tWm9vbUNvbnRyb2wgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgZnVsbFNjcmVlbkNvbnRyb2wgICAgICA6IHRydWUsXG4gICAgICAgICAgICBjdXN0b21GdWxsU2NyZWVuQ29udHJvbDogZmFsc2UsXG4gICAgICAgICAgICBoZWlnaHQgICAgICAgICAgICAgICAgIDogaGVpZ2h0TWFwLFxuICAgICAgICAgICAgem9vbVNjcm9sbCAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQu9C40LLQsNC10YIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0L3QsNGB0YLRgNC+0LnQutC4XG4gICAgICogQHJldHVybiB7b2JqZWN0fSAtINC+0LHRitC10LrRgiDQvdCw0YHRgtGA0L7QtdC6INC60LDRgNGC0Ysg0LjQtyDRgdC60YDQuNC/0YLQsCDRgdC+INGB0YLRgNCw0L3QuNGG0YtcbiAgICAgKi9cbiAgICBnZXRTY3JpcHRTZXR0aW5ncyhvdXRlck9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG91dGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10Lwg0Y3Qu9C10LzQtdC90YLRiyDRg9C/0YDQsNCy0LvQtdC90LjRjyDQvdCwINC60LDRgNGC0YNcbiAgICAgKi9cbiAgICBpbml0Q29udHJvbHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5oZWlnaHQpIHtcbiAgICAgICAgICAgIG1lZGlhdG9yLnN1YnNjcmliZSgndGFiU3dpdGNoZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5oZWlnaHQgPSB0aGlzLm1hcFdyYXBwZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgI
46184HRoaXMuYWRkWm9vbUNvbnRyb2woKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZFpvb21Db250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRGdWxsU2NyZWVuQ29udHJvbCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICog0JTQvtCx0LDQstC70Y/QtdGCINGN0LvQtdC80LXQvdGCINGD0L/RgNCw0LLQu9C10L3QuNGPINC80LDRgdGI0YLQsNCx0L7QvCDQutCw0YDRgtGLXG4gICAgKi9cbiAgICBhZGRab29tQ29udHJvbCgpIHtcbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8INC+0YLQutC70Y7Rh9C10L0g0LvQuCDQv9C+0LrQsNC3INGN0LvQtdC80LXQvdGC0L7QsiDRg9C/0YDQsNCy0LvQtdC90LjRjyDQstC+0L7QsdGJ0LVcbiAgICAgICAgLy8g0JXRgdC70Lgg0LTQsCwg0YLQviDQvdC40YfQtdCz0L4g0L3QtSDQv9C+0LrQsNC30YvQstCw0LXQvFxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3Muem9vbUNvbnRyb2wgfHwgdGhpcy5hZGRab29tQ29udHJvbC5mbGFnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0L3Rg9C20L3QviDQu9C4INC/0L7QutCw0LfRi9Cy0LDRgtGMINC60LDRgdGC0L7QvNC90YvQuSDRjdC70LXQvNC10L3RgiDRg9C/0YDQsNCy0LvQtdC90LjQtVxuICAgICAgICAvLyDQldGB0LvQuCDQvdC10YIg0YLQviDQv9C+0LrQsNC30YvQstCw0LXQvCDRgdGC0LDQvdC00LDRgNGC0L3Ri9C1XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5jdXN0b21ab29tQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5tYXAuY29udHJvbHMuYWRkKGB6b29tQ29udHJvbGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0LrQsNGB0YLQvtC80L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0YPQv9GA0LDQstC70LXQvdC40LVcbiAgICAgICAgY29uc3Qgem9vbUNvbnRyb2wgPSBuZXcgeW1hcHMuY29udHJvbC5ab29tQ29udHJvbCh7XG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgbGF5b3V0OiB0aGlzLmNyZWF0ZUxheW91dFpvb21Db250cm9sKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwLmNvbnRyb2xzLmFkZCh6b29tQ29udHJvbCwge1xuICAgICAgICAgICAgZmxvYXQgICA6ICdub25lJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgdG9wICA6ICh0aGlzLm1hcFdyYXBwZXIub2Zmc2V0SGVpZ2h0IC8gMikgLSA3MCxcbiAgICAgICAgICAgICAgICByaWdodDogJzE1cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZFpvb21Db250cm9sLmZsYWcgPSB0cnVlO1xuICAgIH1cblxuICAgIGluaXRTY3JvbGxab29tKCkge1xuICAgICAgICBjb25zdCBzY3JvbGxab29tID0gdGhpcy5zZXR0aW5ncy56b29tU2Nyb2xsO1xuICAgICAgICBzd2l0Y2ggKHNjcm9sbFpvb20pIHtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5iZWhhdmlvcnMuZW5hYmxlKCdzY3JvbGxab29tJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICAgIHRoaXMubWFwLmJlaGF2aW9ycy5kaXNhYmxlKCdzY3JvbGxab29tJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXQvCDQtNC40LfQsNC50L3QtdGA0YHQutC40Lkg0Y3Qu9C10LzQtdC90YIg0YPQv9GA0LDQstC70LXQvdC40Y8g0LrQsNGA0YLQvtC5XG4gICAgICogQHJldHVybiB7b2JqZWN0fSAtINC+0LHRitC10LrRgiDQutCw0YHRgtC+0LzQvdC+0LPQviDQvNCw0LrQtdGC0LAg0LrQvdC+0L/QvtC6INC30YPQvNC80LjRgNC+0LLQsNC90LjRjyDQutCw0YDRgtGLXG4gICAgICovXG4gICAgY3JlYXRlTGF5b3V0Wm9vbUNvbnRyb2woKSB7XG4gICAgICAgIC8vINC10YHQu9C4INC90LAg0YHRgtGA0LDQvdC40YbQtSDQsdC+0LvQtdC1INC+0LTQvdC+0Lkg0LrQsNGA0YLRiywg0YLQviBpZCDQutC90L7Qv9C+0Log0LfRg9C80LzQuNGA0L7QstCw0L3QuNGPINC00L7Qu9C20L3RiyDQvtGC0LvQuNGH0LDRgtGM0YHRj1xuICAgICAgICAvLyDQuNC90LDRh9C1INC30YPQvCDQsdGD0LTQtdGCINGB0YDQsNCx0LDRgtGL0LLQsNGC0Ywg0L7QtNC90L7QstGA0LXQvNC10L3QvdC+INC90LAg0LLRgdC10YUg0LrQsNGA0YLQsNGFXG4gICAgICAgIC8vIG1hcElkINC/0LXRgNC10LTQsNC10Lwg0LIg0YjQsNCx0LvQvtC90L3Rg9GOINGB0YLRgNC+0LrRgyDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDRg9C90LjQutCw0LvRjNC90YvRhSBpZCDQutC90L7Qv9C+0LpcbiAgICAgICAgY29uc3QgbWFwSWQgPSB0aGlzLmlkO1xuXG4gICAgICAgIC8vINCh0L7Qt9C00LDQtNC40Lwg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40Lkg0LzQsNC60LXRgiDQv9C+0LvQt9GD0L3QutCwINC80LDRgdGI0YLQsNCx0LAuXG4gICAgICAgIGNvbnN0IHpvb21MYXlvdXQgPSB5bWFwcy50ZW1wbGF0ZUxheW91dEZhY3RvcnkuY3JlYXRlQ2xhc3MoY29udHJvbHNUZW1wbGF0ZSh7aWQ6IG1hcElkfSksIHtcblxuICAgICAgICAgICAgICAgIC8vINCf0LXRgNC10L7Qv9GA0LXQtNC10LvRj9C10Lwg0LzQtdGC0L7QtNGLINC80LDQutC10YLQsCwg0YfRgtC+0LHRiyDQstGL0L/QvtC70L3Rj9GC0Ywg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQtNC10LnRgdGC0LLQuNGPXG4gICAgICAgICAgICAgICAgLy8g0L/RgNC4INC/0L7RgdGC0YDQvtC10L3QuNC4INC4INC+0YfQuNGB0YLQutC1INC80LDQutC10YLQsC5cbiAgICAgICAgICAgICAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vINCS0YvQt9GL0LLQsNC10Lwg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5INC80LXRgtC+0LQgYnVpbGQuXG4gICAgICAgICAgICAgICAgICAgIHpvb21MYXlvdXQuc3VwZXJjbGFzcy5idWlsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vINCf0YDQuNCy0Y/Qt9GL0LLQsNC10Lwg0YTRg9C90LrRhtC40Lgt0L7QsdGA0LDQsdC+0YLRh9C40LrQuCDQuiDQutC+0L3RgtC10LrRgdGC0YMg0Lgg0YHQvtGF0YDQsNC90Y/QtdC8INGB0YHRi9C70LrQuFxuICAgICAgICAgICAgICAgICAgICAvLyDQvdCwINC90LjRhSwg0YfRgtC+0LHRiyDQv9C+0YLQvtC8INC+0YLQv9C40YHQsNGC0YzRgdGPINC+0YIg0YHQvtCx0YvRgtC40LkuXG4gICAgICAgICAgICAgICAgICAgI
46184HRoaXMuem9vbUluQ2FsbGJhY2sgPSB5bWFwcy51dGlsLmJpbmQodGhpcy56b29tSW4sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21PdXRDYWxsYmFjayA9IHltYXBzLnV0aWwuYmluZCh0aGlzLnpvb21PdXQsIHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vINCd0LDRh9C40L3QsNC10Lwg0YHQu9GD0YjQsNGC0Ywg0LrQu9C40LrQuCDQvdCwINC60L3QvtC/0LrQsNGFINC80LDQutC10YLQsC5cbiAgICAgICAgICAgICAgICAgICAgJChgIyR7bWFwSWR9LWluYCkuYmluZCgnY2xpY2snLCB0aGlzLnpvb21JbkNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgJChgIyR7bWFwSWR9LW91dGApLmJpbmQoJ2NsaWNrJywgdGhpcy56b29tT3V0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBjbGVhcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vINCh0L3QuNC80LDQtdC8INC+0LHRgNCw0LHQvtGC0YfQuNC60Lgg0LrQu9C40LrQvtCyLlxuICAgICAgICAgICAgICAgICAgICAkKGAjJHttYXBJZH0taW5gKS51bmJpbmQoJ2NsaWNrJywgdGhpcy56b29tSW5DYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICQoYCMke21hcElkfS1vdXRgKS51bmJpbmQoJ2NsaWNrJywgdGhpcy56b29tT3V0Q2FsbGJhY2spO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vINCS0YvQt9GL0LLQsNC10Lwg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5INC80LXRgtC+0LQgY2xlYXIuXG4gICAgICAgICAgICAgICAgICAgIHpvb21MYXlvdXQuc3VwZXJjbGFzcy5jbGVhci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB6b29tSW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFwID0gdGhpcy5nZXREYXRhKCkuY29udHJvbC5nZXRNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb20obWFwLmdldFpvb20oKSArIDEsIHtjaGVja1pvb21SYW5nZTogdHJ1ZX0pO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB6b29tT3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcCA9IHRoaXMuZ2V0RGF0YSgpLmNvbnRyb2wuZ2V0TWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tKG1hcC5nZXRab29tKCkgLSAxLCB7Y2hlY2tab29tUmFuZ2U6IHRydWV9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHpvb21MYXlvdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JTQvtCx0LDQstC70Y/QtdGCINC60L3QvtC/0LrRgyDQvtGC0LrRgNGL0YLQuNGPINC60LDRgNGC0Ysg0L3QsCDQv9C+0LvQvdGL0Lkg0Y3QutGA0LDQvVxuICAgICAqL1xuICAgIGFkZEZ1bGxTY3JlZW5Db250cm9sKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZnVsbFNjcmVlbkNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5jdXN0b21GdWxsU2NyZWVuQ29udHJvbCkge1xuICAgICAgICAgICAgbGV0IHRha2VPcHRpb25zID0ge307XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmZ1bGxTY3JlZW5Db250cm9sT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRha2VPcHRpb25zID0gdGhpcy5zZXR0aW5ncy5mdWxsU2NyZWVuQ29udHJvbE9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxzY3JlZW5Db250cm9sID0gbmV3IHltYXBzLmNvbnRyb2wuRnVsbHNjcmVlbkNvbnRyb2woe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRha2VPcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5tYXAuY29udHJvbHMuYWRkKGZ1bGxzY3JlZW5Db250cm9sKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v0YLRg9GCINCy0YvQt9GL0LLQsNC10Lwg0LzQtdGC0L7QtCDRgdC+0LfQtNCw0Y7RidC40Lkg0LrQsNGB0YLQvtC80L3Ri9C5INC60L7QvdGC0YDQvtC7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC60LDQt9GL0LLQsNC10Lwg0LzQsNGA0LrQtdGA0Ysg0L7QsdGK0LXQutGC0L7QsiDQuNC90YTRgNCw0YHRgtGA0YPQutGC0YPRgNGLINC90LAg0LrQsNGA0YLQtVxuICAgICAqL1xuICAgIGluaXRNYXJrZXJzKCkge1xuICAgICAgICBjb25zdCBtYXJrZXJzID0gdGhpcy5zZXR0aW5ncy5tYXJrZXJzO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWFya2VycyAhPT0gYG9iamVjdGApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmh0bWxNYXJrZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRIdG1sTWFya2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya2Vycy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAvLyDQv9GA0L7QstC10YDRj9C10Lwg0LXRgdGC0Ywg0LvQuCDRgdCy0L7QudGB0YLQstC+IG9mZnNldCDRgyDQvNCw0YDQutC10YDQsCwg0LXRgdC70Lgg0L3QtdGCXG4gICAgICAgICAgICAvLyDRgdC+0LfQtNCw0LXQvCDQvNCw0YHRgdC40LIg0LfQvdCw0YfQtdC90LjQuSDRgdC80LXRidC10L3QuNGPINC80LDRgNC60LXRgNCwINC90LAg0L/QvtC70L7QstC40L3RgyDRgdCy0L7QtdC5INGI0LjRgNC40L3RiyDQuCDQstGL0YHQvtGC0YtcbiAgICAgICAgICAgIC8vINC00LvRjyDRgtC+0LPQviwg0YfRgtC+INCx0Ysg0LrQvtC+0YDQtNC40L3QsNGC0LAg0LzQsNGA0LrQtdGA0LAg0Lgg0YbQtdC90YLRgCDQuNC60L7QvdC60Lgg0LzQsNGA0LrQtdGA0LAg0LHRi9C70Lgg0YHQvtCy0LzQtdGJ0LXQvdGLXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJPZmZzZXQgPSBlbGVtZW50Lm9mZnNldCA/IGVsZW1lbnQub2Zmc2V0IDogZWxlbWVudC5zaXplLm1hcCgoc2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAtKHNpemUgLyAyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vINC/0YDQvtCy0LXRgNGP0LXQvCDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0LzQsNGA0LrQtdGAINC80LDRgNC60LXRgNC+0Lwg0JbQmi5cbiAgICAgICAgICAgIGxldCBpY29uQmFsbG9vbiA9IGBgO1xuICAgICAgICAgICAgbGV0IG9iamVjdFR5cGUgPSBgYDtcbiAgICAgICAgICAgIGNvbnN0IGJhbGxvb25Mb2dvID0gZWxlbWVudC5sb2dvIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgYmFsbG9vbkxpbmsgPSBlbGVtZW50LmxpbmsgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV4ID0gYGNvbXBsZXhgO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWNvbkJhbGxvb24gPSBlbGVtZW50Lmljb25CYWxsb29uO1xuICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBpY29uQmFsbG9vbiA/IGNvbXBsZXggOiBmYWxzZTtcbiAgICAgICAgICAgI
46184H0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWNvbkJhbGxvb24gPSBlbGVtZW50Lmljb25CYWxsb29uID8gZWxlbWVudC5pY29uQmFsbG9vbiA6IGVsZW1lbnQuaWNvbjtcbiAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gZWxlbWVudC5vYmplY3RUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDQtdGB0LvQuCDQsiDQvtCx0YrQtdC60YLQtSDQvNCw0YDQutC10YDQsCDQvdC10YIg0L3QuCDRgtC10LrRgdGC0LAg0L3QuCDQt9Cw0LPQvtC70L7QstC60LAsINGC0L4g0LHQsNC70LvRg9C9INC90LUg0L/QvtC60LDQt9GL0LLQsNC10LxcbiAgICAgICAgICAgIGlmICghZWxlbWVudC50aXRsZSAmJiAhZWxlbWVudC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmtlciA9IG5ldyB5bWFwcy5QbGFjZW1hcmsoZWxlbWVudC5jb29yZHMsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBpY29uTGF5b3V0ICAgICA6ICdkZWZhdWx0I2ltYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbkltYWdlSHJlZiAgOiBlbGVtZW50Lmljb24sXG4gICAgICAgICAgICAgICAgICAgIGljb25JbWFnZVNpemUgIDogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgICAgICAgICBpY29uSW1hZ2VPZmZzZXQ6IG1hcmtlck9mZnNldFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tYXAuZ2VvT2JqZWN0cy5hZGQobWFya2VyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQmFsbG9uT25DbGlja01hcCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDQstGL0LLQvtC00LjQvCDQutC70LDRgdGBINC80L7QtNC40YTQuNC60LDRgtC+0YAg0LTQu9GPINGA0LDQt9C80LXRgtC60Lgg0LHQsNC70LvRg9C90LAg0LzQsNGA0LrQtdGA0LAg0JbQmiwg0LLQvdC1INC30LDQstC40YHQuNC80L7RgdGC0LggLSDQtdGB0YLRjCDQsiDQvtCx0YrQtdC60YLQtSDQvNCw0YDQutC10YDQsFxuICAgICAgICAgICAgLy8gb2JqZWN0VHlwZSDQuNC70Lgg0L3QtdGCXG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyB5bWFwcy5QbGFjZW1hcmsoZWxlbWVudC5jb29yZHMsIHtcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgIDogZWxlbWVudC50eXBlLFxuICAgICAgICAgICAgICAgIGJhbGxvb25JY29uICAgOiAob2JqZWN0VHlwZSAhPT0gdW5kZWZpbmVkKT8gZWxlbWVudC5pbWFnZSA6IGljb25CYWxsb29uLFxuICAgICAgICAgICAgICAgIGJhbGxvb25IZWFkZXIgOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgICAgIGJhbGxvb25Db250ZW50OiBlbGVtZW50LnRleHQsXG4gICAgICAgICAgICAgICAgYmFsbG9vbkxvZ28gICA6IGJhbGxvb25Mb2dvLFxuICAgICAgICAgICAgICAgIGhpbnRDb250ZW50ICAgOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGJhbGxvb25TaGFkb3cgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhbGxvb25MYXlvdXQgICAgICAgICA6IHRoaXMuY3JlYXRlQmFsbG9vbkxheW91dChvYmplY3RUeXBlKSxcbiAgICAgICAgICAgICAgICBiYWxsb29uQ29udGVudExheW91dCAgOiB0aGlzLmNyZWF0ZUJhbGxvb25Db250ZW50TGF5b3V0KGljb25CYWxsb29uLCBiYWxsb29uTG9nbywgYmFsbG9vbkxpbmspLFxuICAgICAgICAgICAgICAgIGJhbGxvb25QYW5lbE1heE1hcEFyZWE6IDAsXG4gICAgICAgICAgICAgICAgLy8gaGludExheW91dCAgICAgICAgICAgIDogdGhpcy5jcmVhdGVCYWxsb29uTGF5b3V0KG9iamVjdFR5cGUpLFxuICAgICAgICAgICAgICAgIC8vIGhpbnRDb250ZW50TGF5b3V0ICAgICA6IHRoaXMuY3JlYXRlQmFsbG9vbkNvbnRlbnRMYXlvdXQoaWNvbkJhbGxvb24pLFxuICAgICAgICAgICAgICAgIC8vINCd0LUg0YHQutGA0YvQstCw0LXQvCDQuNC60L7QvdC60YMg0L/RgNC4INC+0YLQutGA0YvRgtC+0Lwg0LHQsNC70YPQvdC1LlxuICAgICAgICAgICAgICAgIGhpZGVJY29uT25CYWxsb29uT3BlbiA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGljb25MYXlvdXQgICAgICAgICAgICA6ICdkZWZhdWx0I2ltYWdlJyxcbiAgICAgICAgICAgICAgICBpY29uSW1hZ2VIcmVmICAgICAgICAgOiBlbGVtZW50Lmljb24sXG4gICAgICAgICAgICAgICAgaWNvbkltYWdlU2l6ZSAgICAgICAgIDogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgICAgIGljb25JbWFnZU9mZnNldCAgICAgICA6IG1hcmtlck9mZnNldFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuYWRkKG1hcmtlcik7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC60LDQt9GL0LLQsNC10LwgaHRtbCDQvNCw0YDQutC10YDRiyDQvtCx0YrQtdC60YLQvtCyINC40L3RhNGA0LDRgdGC0YDRg9C60YLRg9GA0Ysg0L3QsCDQutCw0YDRgtC1XG4gICAgICovXG4gICAgaW5pdEh0bWxNYXJrZXJzKCkge1xuICAgICAgICBjb25zdCBodG1sTWFya2VycyA9IHRoaXMuc2V0dGluZ3MuaHRtbE1hcmtlcnM7XG5cbiAgICAgICAgbGV0IHRlbXBsYXRlID0gbnVsbDtcblxuICAgICAgICBodG1sTWFya2Vycy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFpbic6XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gbWFpbkh0bWxNYXJrZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZGFyeSc6XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gc2Vjb25kYXJ5SHRtbE1hcmtlcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGV4dEh0bWxNYXJrZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgI
46184HRlbXBsYXRlID0gbWFpbkh0bWxNYXJrZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBlbGVtZW50OyAvL9Ca0LDQui3RgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L/QtdGA0LXQtNCw0LLQsNGC0LDRgtGMINC90LDRgdGC0YDQvtC50LrQuFxuXG4gICAgICAgICAgICBjb25zdCBDdXN0b21MYXlvdXRDbGFzcyA9IHltYXBzLnRlbXBsYXRlTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGFzcyh0ZW1wbGF0ZShwcm9wZXJ0aWVzKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWFyayA9IG5ldyB5bWFwcy5QbGFjZW1hcmsoZWxlbWVudC5jb29yZHMsIHtcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpY29uTGF5b3V0OiBDdXN0b21MYXlvdXRDbGFzc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuYWRkKHBsYWNlbWFyayk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J3QsNCy0LXRiNC40LLQsNC10YIg0L7QsdGA0LDQsdC+0YLRh9C60Lgg0YHQvtCx0YvRgtC40Y8g0LrQu9C40Log0L/QviDQutCw0YDRgtC1INC4INCz0LXQvtCx0YrQtdC60YLQsNC8INC00LvRjyDQt9Cw0LrRgNGL0YLQuNGPINCx0LDQu9GD0L3QvtCyLlxuICAgICAqL1xuICAgIGNsb3NlQmFsbG9uT25DbGlja01hcCgpIHtcbiAgICAgICAgdGhpcy5tYXAuZ2VvT2JqZWN0cy5ldmVudHMuYWRkKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFwLmJhbGxvb24uY2xvc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXAuZXZlbnRzLmFkZCgnY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcC5iYWxsb29uLmNsb3NlKCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGljb25CYWxsb29uIC0g0YHRgtGA0L7QutCwOiDQt9C90LDRh9C10L3QuNC1INGB0LLQvtC50YHRgtCy0LAgaWNvbkJhbGxvb24g0L7QsdGK0LXQutGC0LAg0LzQsNGA0LrQtdGA0LBcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtINC+0LHRitC10LrRgiDQvNCw0LrQtdGC0LAg0LrQvtC90YLQtdC90YLQsCDQsdCw0LvRg9C90LBcbiAgICAgKi9cbiAgICBjcmVhdGVCYWxsb29uQ29udGVudExheW91dChpY29uQmFsbG9vbiwgYmFsbG9vbkxvZ28sIGJhbGxvb25MaW5rKSB7XG4gICAgICAgIGxldCBpY29uSHRtbCA9IGBgO1xuICAgICAgICBsZXQgbG9nb0h0bWwgPSBgYDtcbiAgICAgICAgbGV0IGxpbmtIdG1sID0gYGA7XG5cbiAgICAgICAgaWYgKGljb25CYWxsb29uKSB7XG4gICAgICAgICAgICBpY29uSHRtbCA9IGA8aW1nIGNsYXNzPVwiYi15YW5kZXgtbWFwX19iYWxsb29uLWljb25cIiBzcmM9XCIkW3Byb3BlcnRpZXMuYmFsbG9vbkljb25dXCIgYWx0PVwiaWNvbiBtYXBcIj5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGxvb25Mb2dvKSB7XG4gICAgICAgICAgICBsb2dvSHRtbCA9IGA8aW1nIGNsYXNzPVwiYi15YW5kZXgtbWFwX19iYWxsb29uLWxvZ29cIiBzcmM9XCIkW3Byb3BlcnRpZXMuYmFsbG9vbkxvZ29dXCI+YFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGxvb25MaW5rKSB7XG4gICAgICAgICAgICBsaW5rSHRtbCA9IGA8YSBocmVmPVwiJHtiYWxsb29uTGlua31cIiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi1saW5rXCI+JHtsaW5rSHRtbEJhbGxvb24oKX0g0J/QvtC00YDQvtCx0L3QtdC1PC9hPmA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi1pbWctd3JhcFwiPlxuICAgICAgICAgICAgICAgICR7aWNvbkh0bWx9XG4gICAgICAgICAgICAgICAgJHtsb2dvSHRtbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi10aXRsZVwiPiRbcHJvcGVydGllcy5iYWxsb29uSGVhZGVyXTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi1jb250ZW50XCI+JFtwcm9wZXJ0aWVzLmJhbGxvb25Db250ZW50XTwvZGl2PlxuICAgICAgICAgICAgJHtsaW5rSHRtbH1cbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgY29uc3QgYmFsbG9vbkNvbnRlbnRMYXlvdXQgPSB5bWFwcy50ZW1wbGF0ZUxheW91dEZhY3RvcnkuY3JlYXRlQ2xhc3MoaHRtbCk7XG5cbiAgICAgICAgcmV0dXJuIGJhbGxvb25Db250ZW50TGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTW9kaWZ5IC0g0YHRgtGA0L7QutCwOiDQt9C90LDRh9C10L3QuNC1INGB0LLQvtC50YHRgtCy0LAgb2JqZWN0VHlwZSDQvtCx0YrQtdC60YLQsCDQvNCw0YDQutC10YDQsFxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0g0L7QsdGK0LXQutGCINC80LDQutC10YLQsCDQsdCw0LvQu9GD0L3QsFxuICAgICAqL1xuICAgIGNyZWF0ZUJhbGxvb25MYXlvdXQoY2xhc3NNb2RpZnkpIHtcbiAgICAgICAgY29uc3QgYmFsbG9vbkNsYXNzID0gYGIteWFuZGV4LW1hcF9fYmFsbG9vbmA7XG4gICAgICAgIGNvbnN0IGJhbGxvb21DbGFzc01vZGlmeSA9IGNsYXNzTW9kaWZ5ID8gYCR7YmFsbG9vbkNsYXNzfV90aGVtZV8ke2NsYXNzTW9kaWZ5fWAgOiBgYDtcbiAgICAgICAgY29uc3QgYmFsbG9vbkNsb3NlID0gYGItbWFwLWJhbGxvb25fX2Nsb3NlYDtcbiAgICAgICAgY29uc3QgYmFsbG9vbkFycm93ID0gYGItbWFwLWJhbGxvb25fX2Fycm93YDtcbiAgICAgICAgY29uc3QgYmFsbG9vbkNvbnRlbnRXcmFwID0gYGItbWFwLWJhbGxvb25fX2NvbnRlbnQtd3JhcGA7XG4gICAgICAgIGNvbnN0IGNsYXNzVGFiID0gYC5iLW1hcC10YWJzX19pdGVtYDtcbiAgICAgICAgY29uc3QgdGFiSXRlbXMgPSBbLi4udGhpcy5tYXBXcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NUYWIpXTtcbiAgICAgICAgY29uc3QgY3VzdG9tQmFsbG9vbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLXlhbmRleC1tYXBfX2luZm8nKTtcblxuICAgICAgICAvLyDQodC+0LfQtNCw0L3QuNC1INC80LDQutC10YLQsCDQsdCw0LvRg9C90LBcbiAgICAgICAgY29uc3QgYmFsbG9vbkxheW91dCA9IHltYXBzLnRlbXBsYXRlTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGFzcyhcbiAgICAgICAgICAgIGA8ZGl2IGNsYXNzPVwiJHtiYWxsb29uQ2xhc3N9ICR7YmFsbG9vbUNsYXNzTW9kaWZ5fVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke2JhbGxvb25DbG9zZX1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiJHtiYWxsb29uQXJyb3d9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7YmFsbG9vbkNvbnRlbnRXcmFwfVwiPlxuICAgICAgICAgICAgICAgICAgICAkW1tvcHRpb25zLmNvbn
46184RlbnRMYXlvdXRdXVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCwge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCh0YLRgNC+0LjRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LzQsNC60LXRgtCwINC90LAg0L7RgdC90L7QstC1INGI0LDQsdC70L7QvdCwINC4INC00L7QsdCw0LLQu9GP0LXRgiDQtdCz0L4g0LIg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5IEhUTUwt0Y3Qu9C10LzQtdC90YIuXG4gICAgICAgICAgICAgICAgICogQHNlZSBodHRwczovL2FwaS55YW5kZXgucnUvbWFwcy9kb2MvanNhcGkvMi4xL3JlZi9yZWZlcmVuY2UvbGF5b3V0LnRlbXBsYXRlQmFzZWQuQmFzZS54bWwjYnVpbGRcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAbmFtZSBidWlsZFxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGJ1aWxkOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3MuYnVpbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZWxlbWVudCA9ICQoYC4ke2JhbGxvb25DbGFzc31gLCB0aGlzLmdldFBhcmVudEVsZW1lbnQoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUVsZW1lbnRPZmZzZXQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZWxlbWVudC5maW5kKGAuJHtiYWxsb29uQ2xvc2V9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCAkLnByb3h5KHRoaXMub25DbG9zZUNsaWNrLCB0aGlzKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGFiSXRlbXMuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAkLnByb3h5KHRoaXMub25DbG9zZUNsaWNrLCB0aGlzKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21CYWxsb29uLmlubmVySFRNTCA9IHRoaXMuXyRlbGVtZW50WzBdLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUN1c3RvbUJhbGxvb24oKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgY2xvc2VDdXN0b21CYWxsb29uKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9zZUJ0biA9IGN1c3RvbUJhbGxvb24ucXVlcnlTZWxlY3RvcignLmItbWFwLWJhbGxvb25fX2Nsb3NlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCdG4ucGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCj0LTQsNC70Y/QtdGCINGB0L7QtNC10YDQttC40LzQvtC1INC80LDQutC10YLQsCDQuNC3IERPTS5cbiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vYXBpLnlhbmRleC5ydS9tYXBzL2RvYy9qc2FwaS8yLjEvcmVmL3JlZmVyZW5jZS9sYXlvdXQudGVtcGxhdGVCYXNlZC
461845CYXNlLnhtbCNjbGVhclxuICAgICAgICAgICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZWxlbWVudC5maW5kKGAuJHtiYWxsb29uQ2xvc2V9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmYoJ2NsaWNrJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5zdXBlcmNsYXNzLmNsZWFyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCc0LXRgtC+0LQg0LHRg9C00LXRgiDQstGL0LfQstCw0L0g0YHQuNGB0YLQtdC80L7QuSDRiNCw0LHQu9C+0L3QvtCyINCQ0J/QmCDQv9GA0Lgg0LjQt9C80LXQvdC10L3QuNC4INGA0LDQt9C80LXRgNC+0LIg0LLQu9C+0LbQtdC90L3QvtCz0L4g0LzQsNC60LXRgtCwLlxuICAgICAgICAgICAgICAgICAqIEBzZWUgaHR0cHM6Ly9hcGkueWFuZGV4LnJ1L21hcHMvZG9jL2pzYXBpLzIuMS9yZWYvcmVmZXJlbmNlL0lCYWxsb29uTGF5b3V0LnhtbCNldmVudC11c2VyY2xvc2VcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAbmFtZSBvblN1YmxheW91dFNpemVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBvblN1YmxheW91dFNpemVDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBiYWxsb29uTGF5b3V0LnN1cGVyY2xhc3Mub25TdWJsYXlvdXRTaXplQ2hhbmdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0VsZW1lbnQodGhpcy5fJGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RWxlbWVudE9mZnNldCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmZpcmUoJ3NoYXBlY2hhbmdlJyk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCh0LTQstC40LPQsNC10Lwg0LHQsNC70YPQvSwg0YfRgtC+0LHRiyBcItGF0LLQvtGB0YLQuNC6XCIg0YPQutCw0LfRi9Cy0LDQuyDQvdCwINGC0L7Rh9C60YMg0L/RgNC40LLRj9C30LrQuC5cbiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vYXBpLnlhbmRleC5ydS9tYXBzL2RvYy9qc2FwaS8yLjEvcmVmL3JlZmVyZW5jZS9JQmFsbG9vbkxheW91dC54bWwjZXZlbnQtdXNlcmNsb3NlXG4gICAgICAgICAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICogQG5hbWUgYXBwbHlFbGVtZW50T2Zmc2V0XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgYXBwbHlFbGVtZW50T2Zmc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdDogLSh0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRXaWR0aCAvIDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDogLSh0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRlbGVtZW50LmZpbmQoYC4ke2JhbGxvb25BcnJvd31gKVswXS5vZmZzZXRIZWlnaHQgKiAyKSovXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICog0JfQsNC60YDRi9Cy0LDQtdGCINCx0LDQu9GD0L0g0L/RgNC4INC60LvQuNC60LUg0L3QsCDQutGA0LXRgdGC0LjQuiwg0LrQuNC00LDRjyDRgdC+0LHRi9GC0LjQtSBcInVzZXJjbG9zZVwiINC90LAg0LzQsNC60LXRgtC1LlxuICAgICAgICAgICAgICAgICAqIEBzZWUgaHR0cHM6Ly9hcGkueWFuZGV4LnJ1L21hcHMvZG9jL2pzYXBpLzIuMS9yZWYvcmVmZXJlbmNlL0lCYWxsb29uTGF5b3V0LnhtbCNldmVudC11c2VyY2xvc2VcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge2V2ZW50fSBldmVudCAtINGB0L7QsdGL0YLQuNC1XG4gICAgICAgICAgICAgICAgICogQG5hbWUgb25DbG9zZUNsaWNrXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgb25DbG9zZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmZpcmUoJ3VzZXJjbG9zZScpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiDQmNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0LTQu9GPINCw0LLRgtC+0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40Y8gKGJhbGxvb25BdXRvUGFuKS5cbiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vYXBpLnlhbmRleC5ydS9tYXBzL2RvYy9qc2FwaS8yLjEvcmVmL3JlZmVyZW5jZS9JTGF5b3V0LnhtbCNnZXRDbGllbnRCb3VuZHNcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtINCa0L7QvtGA0LTQuNC90LDRgtGLINC70LXQstC+0LPQviDQstC10YDRhdC90LXQs9C+INC4INC/0YDQsNCy0L7Qs9C+INC90LjQttC90LXQs9C+INGD0LPQu9C+0LIg0YjQsNCx0LvQvtC90LAg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+XG4gICAgICAgICAgICAgICAgICog0YLQvtGH0LrQuCDQv9GA0LjQstGP0LfQutC4LlxuICAgICAgICAgICAgICAgICAqIEBuYW1lIGdldFNoYXBlXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgZ2V0U2hhcGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzRWxlbWVudCh0aGlzLl8kZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HJldHVybiBiYWxsb29uTGF5b3V0LnN1cGVyY2xhc3MuZ2V0U2hhcGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuXyRlbGVtZW50LnBvc2l0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB5bWFwcy5zaGFwZS5SZWN0YW5nbGUobmV3IHltYXBzLmdlb21ldHJ5LnBpeGVsLlJlY3RhbmdsZShbXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9zaXRpb24ubGVmdCwgcG9zaXRpb24udG9wXSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmxlZnQgKyB0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50b3AgKyB0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRlbGVtZW50LmZpbmQoYC4ke2JhbGxvb25BcnJvd31gKVswXS5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0Y3Qu9C10LzQtdC90YLQsCAo0LIg0JjQlSDQuCDQntC/0LXRgNC1INC10LPQviDQtdGJ0LUg0LzQvtC20LXRgiDQvdC1INCx0YvRgtGMKS5cbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgICAgICAgICAqIEBuYW1lIF9pc0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge2pRdWVyeX0gW2VsZW1lbnRdINCt0LvQtdC80LXQvdGCLlxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSDQpNC70LDQsyDQvdCw0LvQuNGH0LjRjy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBfaXNFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnRbMF0gJiYgZWxlbWVudC5maW5kKGAuJHtiYWxsb29uQXJyb3d9YClbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBiYWxsb29uTGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10Lwg0YLQsNCx0YtcbiAgICAgKi9cbiAgICBpbml0VGFicygpIHtcbiAgICAgICAgY29uc3QgY2xhc3NUYWIgPSBgLmIteWFuZGV4LW1hcF9fdGFiLWl0ZW1gO1xuICAgICAgICBjb25zdCB0YWJJdGVtcyA9IHRoaXMubWFwV3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzVGFiKTtcblxuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0YLQsNCx0L7QslxuICAgICAgICBpZiAoIXRhYkl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFic0FycmF5ID0gWy4uLnRhYkl0ZW1zXTtcblxuICAgICAgICB0YWJzQXJyYXkuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcihgY2xpY2tgLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlVGFicyh0YWIpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFya2Vycyh0YWIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7QutCw0LfRi9Cy0LDQtdC8L9GB0LrRgNGL0LLQsNC10Lwg0LzQsNGA0LrQtdGA0Ysg0L3QsCDQutCw0YDRgtC1XG4gICAgICogQHBhcmFtIHtub2RlfSB0YWIgLSDQvdC+0LTQsCDRgtCw0LHQsCDQv9C+INC60L7RgtC+0YDQvtC80YMg0L/RgNC+0LjQt9C+0YjQvtC7INC60LvQuNC6XG4gICAgICovXG4gICAgdG9nZ2xlTWFya2Vycyh0YWIpIHtcbiAgICAgICAgY29uc3QgY2xhc3NMaW5rID0gYC5iLXlhbmRleC1tYXBfX3RhYi1saW5rYDtcblxuICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VJbnQodGFiLnF1ZXJ5U2VsZWN0b3IoY2xhc3NMaW5rKS5kYXRhc2V0LnR5cGUpO1xuXG4gICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuZWFjaChmdW5jdGlvbihnZW9PYmplY3QpIHtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudFR5cGUgPSBwYXJzZUludChnZW9PYmplY3QucHJvcGVydGllcy5nZXQoJ3R5cGUnKSk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb09iamVjdC5vcHRpb25zLnNldCgndmlzaWJsZScsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFR5cGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvT2JqZWN0Lm9wdGlvbnMuc2V0KCd2aXNpYmxlJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBnZW9PYmplY3Qub3B0aW9ucy5zZXQoJ3Zpc2libGUnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvT2JqZWN0Lm9wdGlvbnMuc2V0KCd2aXNpYmxlJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C10YDQtdC60LvRjtGH0LDQtdC8INGC0LDQsdGLXG4gICAgICogQHBhcmFtIHtub2RlfSB0YWIgLSDQvdC+0LTQsCDRgtCw0LHQsCDQv9C+INC60L7RgtC+0YDQvtC80YMg0L/RgNC+0LjQt9C+0YjQvtC7INC60LvQuNC6XG4gICAgICovXG4gICAgdG9nZ2xlVGFicyh0YWIpIHtcbiAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBgaXMtYWN0aXZlYDtcbiAgICAgICAgY29uc3QgY2xhc3NMaW5rID0gYC5iLXlhbmRleC1tYXBfX3RhYi1saW5rYDtcbiAgICAgICAgY29uc3QgY2xhc3NUYWIgPSBgLmIteWFuZGV4LW1hcF9fdGFiLWl0ZW1gO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZVR5cGUgPSB0YWIucXVlcnlTZWxlY3RvcihjbGFzc0xpbmspLmRhdGFzZXQudHlwZTtcbiAgICAgICAgY29uc3QgdGFiSXRlbXMgPSBbLi4udGhpcy5tYXBXcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NUYWIpXTtcblxuICAgICAgICB0YWJJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVHlwZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcihjbGFzc0xpbmspLmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgIGlmIChpdGVtVHlwZSA9PT0gYWN0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChpc0FjdGl2ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGlzQWN0aXZlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0YDQsNC00LjRg9GB0L7QslxuICAgICAqL1xuICAgIGluaXRDaXJjbGVzKCkge1xuICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5zZXR0aW5ncy5jaXJjbGVzO1xuXG5cbiAgICAgICAgaWYgKGNpcmNsZXMpIHtcbiAgICAgICAgICAgIGNpcmNsZXMuZm9yRWFjaCgoY2lyY2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlDaXJjbGUgP
46184SBuZXcgeW1hcHMuQ2lyY2xlKFtcbiAgICAgICAgICAgICAgICAgICAgY2lyY2xlLmNlbnRlciwgY2lyY2xlLnJhZGl1c1xuICAgICAgICAgICAgICAgIF0sIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogY2lyY2xlLmZpbGxDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IGNpcmNsZS5maWxsT3BhY2l0eSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IGNpcmNsZS5zdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlT3BhY2l0eTogY2lyY2xlLnN0cm9rZU9wYWNpdHksXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaXJjbGUuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVN0eWxlOiBjaXJjbGUuc3Ryb2tlU3R5bGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuYWRkKG15Q2lyY2xlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQntGC0LrQu9GO0YfQsNC10Lwg0L/QtdGA0LXRgtCw0YHQutC40LLQsNC90LjQtSDQutCw0YDRgtGLINC/0YDQuCDQv9GA0L7QutGA0YPRgtC60LUg0L7QtNC90LjQvCDQv9Cw0LvRjNGG0LXQvCDQvdCwINC80L7QsdC40LvQutC1XG4gICAgICovXG4gICAgLy8gVE9ETyDQn9C10YDQtdC/0LjRgdCw0YLRjCDQv9GA0LDQstC40LvRjNC90L4sINGH0YLQviDQsdGLINGD0LHRgNCw0YLRjCDQuNCz0L3QvtGA0LjRgNC+0LLQsNC90LjQtSDQu9C40L3RgtC+0LxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGRpc2FibGVNb2JpbGVEcmFnKCkge1xuICAgICAgICBjb25zdCBpc01vYmlsZSA9IHtcbiAgICAgICAgICAgIEFuZHJvaWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBCbGFja0JlcnJ5OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaU9TOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgT3BlcmE6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBXaW5kb3dzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFueTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc01vYmlsZS5BbmRyb2lkKCkgfHwgaXNNb2JpbGUuQmxhY2tCZXJyeSgpIHx8IGlzTW9iaWxlLmlPUygpIHx8IGlzTW9iaWxlLk9wZXJhKCkgfHwgaXNNb2JpbGUuV2luZG93cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpc01vYmlsZS5hbnkoKSkge1xuICAgICAgICAgICAgdGhpcy5tYXAuYmVoYXZpb3JzLmRpc2FibGUoJ2RyYWcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgWWFuZGV4TWFwO1xuXG4vKiBlc2xpbnQtZW5hYmxlICovXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuICAgICAgICBzY3JpcHQuc3JjID0gYGh0dHBzOi8vYXBpLW1hcHMueWFuZGV4LnJ1LzIuMS8/bGFuZz1ydV9SVWA7XG4gICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG4gICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICBzY3JpcHQub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2
46184N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LnltYXBzLnJlYWR5KHJlc29sdmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xufVxuIiwidmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiMGJiNTg5MmJjZGUwMmMzYjQ2MzdkYmE5ODFkMjk2NjVhZmJlOGIxMzgxOTg2OThjNTQ1MTMzM2E2NDI1OGQ5YjUwYjJkZjMyY2JjMzMwNThiYTNmODFmNzIyMGE3YjFmMWExNDJkZmVmM2FjNmMxOTRiOGMzMmEzYjZkZWViZDhcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPHN2ZyB3aWR0aD1cXFwiMjRcXFwiIGhlaWdodD1cXFwiMjRcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+XFxuICAgIDxwYXRoIGZpbGw9XFxcIiNENjlEM0FcXFwiXFxuICAgICAgICAgIGQ9XFxcIk0xMy42OTA2Mzk5LDE3LjA4NjI5MzEgQzE1LjA4MjI2OTYsMTIuMzEyNTQ2IDE5LjE1MjgxMzEsMTAuNzY1Mzc1NiAyNCwxMC4xMjEwMzM5IEwyNCw4IEMxOS42MzEzMDA3LDguNTE2OTMyMDMgMTUuNzA4NTQwOCw4Ljk4MDQyNzkyIDEzLjI3NzA2MDgsMTIuNzAyMzQ5OSBMMTEuOTk5NjY4LDE0LjY1NzY4NDIgTDEwLjcyMjc0MDcsMTIuNzAyMDQ1OSBDOC4yOTI2MDM0NSw4Ljk4MDI0NTAyIDQuMzY5ODc5Niw4LjUxNjc2ODYxIDAsOCBMMCwxMC4xMjA5OTUgQzQuODQ3NzY5MjQsMTAuNzY1MTg3OCA4LjkxNzg4Nzk0LDEyLjMxMTk4NTcgMTAuMzEwNTkyOCwxNy4wODYyOTMxIEwxMy42OTA2Mzk5LDE3LjA4NjI5MzEgWlxcXCI+XFxuICAgICAgICA8YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPVxcXCJkXFxcIiBkdXI9XFxcIjI1MDBtc1xcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHZhbHVlcz1cXFwiTTEzLjY5MDYzOTksMTcuMDg2MjkzMSBDMTUuMDgyMjY5NiwxMi4zMTI1NDYgMTkuMTUyODEzMSwxMC43NjUzNzU2IDI0LDEwLjEyMTAzMzkgTDI0LDggQzE5LjYzMTMwMDcsOC41MTY5MzIwMyAxNS43MDg1NDA4LDguOTgwNDI3OTIgMTMuMjc3MDYwOCwxMi43MDIzNDk5IEwxMS45OTk2NjgsMTQuNjU3Njg0MiBMMTAuNzIyNzQwNywxMi43MDIwNDU5IEM4LjI5MjYwMzQ1LDguOTgwMjQ1MDIgNC4zNjk4Nzk2LDguNTE2NzY4NjEgMCw4IEwwLDEwLjEyMDk5NSBDNC44NDc3NjkyNCwxMC43NjUxODc4IDguOTE3ODg3OTQsMTIuMzExOTg1NyAxMC4zMTA1OTI4LDE3LjA4NjI5MzEgTDEzLjY5MDYzOTksMTcuMDg2MjkzMSBaO1xcbiAgICAgICAgICBNMTMuNjkwNjM5OSwxOC4wODYyOTMxIEMxNS4wODIyNjk2LDEzLjMxMjU0NiAxOC4xNTI4MTMxLDExLjc2NTM3NTYgMjMsMTEuMTIxMDMzOSBMMjQsOS4wMDAwNDk1NCBDMTkuNjMxMzAwNyw5LjUxNjkzMjAzIDE1LjcwODU0MDgsOS45ODA0Mjc5MiAxMy4yNzcwNjA4LDEzLjcwMjM0OTkgTDExLjk5OTY2OCwxNS42NTc2ODQyIEwxMC43MjI3NDA3LDEzLjcwMjA0NTkgQzguMDkwNTU4ODIsMTAuNTE2NzY4NiA0LjM2OTg3OTYsMTAuNTE2NzY4NiA0LjU0NzQ3MzUxZS0xMywxMCBMMSwxMi4xMjA5OTUgQzUuODQ3NzY5MjQsMTIuNzY1MTg3OCA4LjkxNzg4Nzk0LDEzLjMxMTk4NTcgMTAuMzEwNTkyOCwxOC4wODYyOTMxIEwxMy42OTA2Mzk5LDE4LjA4NjI5MzEgWjtcXG4gICAgICAgICAgTTEyLjY5MDYzOTksMTguMDg2MjkzMSBDMTQuMDgyMjY5NiwxMy4zMTI1NDYgMTkuMTUyODEzMSwxNC43NjUzNzU2IDI0LDE0LjEyMTAzMzkgTDI0LDEyLjAwMDA0OTUgQzE5LjYzMTMwMDcsMTIuNTE2OTMyIDE1LjcwODU0MDgsOS45ODA0Mjc5MiAxMy4yNzcwNjA4LDEzLjcwMjM0OTkgTDExLjk5OTY2OCwxNS42NTc2ODQyIEwxMC43MjI3NDA3LDEzLjcwMjA0NTkgQzguMjkyNjAzNDUsOS45ODAyNDUwMiA0LjM2OTg3OTYsMTIuNTE2NzY4NiA0LjU0NzQ3MzUxZS0xMywxMiBMMCwxNC4xMjA5OTUgQzQuODQ3NzY5MjQsMTQuNzY1MTg3OCA5LjkxNzg4Nzk0LDEzLjMxMTk4NTcgMTEuMzEwNTkyOCwxOC4wODYyOTMxIEwxMi42OTA2Mzk5LDE4LjA4NjI5MzEgWjtcXG4gICAgICAgICAgICAgIE0xMi42OTA2Mzk5LDE4LjA4NjI5MzEgQzE0LjA4MjI2OTYsMTMuMzEyNTQ2IDE4LjE1MjgxMzEsMTIuNzY1Mzc1NiAyMywxMi4xMjEwMzM5IEwyMywxMC4wMDAwNDk1IEMxOC42MzEzMDA3LDEwLjUxNjkzMiAxNS43MDg1NDA4LDkuOTgwNDI3OTIgMTMuMjc3MDYwOCwxMy43MDIzNDk5IEwxMS45OTk2NjgsMTUuNjU3Njg0MiBMMTAuNzIyNzQwNywxMy43MDIwNDU5IEM4LjI5MjYwMzQ1LDkuOTgwMjQ1MDIgNS4zNjk4Nzk2LDguNTE2NzY4NjEgMSw4IEwxLDEwLjEyMDk5NSBDNS44NDc3NjkyNCwxMC43NjUxODc4IDkuOTE3ODg3OTQsMTMuMzExOTg1NyAxMS4zMTA1OTI4LDE4LjA4NjI5MzEgTDEyLjY5MDYzOTksMTguMDg2MjkzMSBaO1xcbiAgICAgICAgIE0xMy42OTA2Mzk5LDE3LjA4NjI5MzEgQzE1LjA4MjI2OTYsMTIuMzEyNTQ2IDE5LjE1MjgxMzEsMTAuNzY1Mzc1NiAyNCwxMC4xMjEwMzM5IEwyNCw4IEMxOS42MzEzMDA3LDguNTE2OTMyMDMgMTUuNzA4NTQwOCw4Ljk4MDQyNzkyIDEzLjI3NzA2MDgsMTIuNzAyMzQ5OSBMMTEuOTk5NjY4LDE0LjY1NzY4NDIgTDEwLjcyMjc0MDcsMTIuNzAyMDQ1OSBDOC4yOTI2MDM0NSw4Ljk4MDI0NTAyIDQuMzY5ODc5Niw4LjUxNjc2ODYxIDAsOCBMMCwxMC4xMjA5OTUgQzQuODQ3NzY5MjQsMTAuNzY1MTg3OCA4LjkxNzg4Nzk0LDEyLjMxMTk4NTcgMTAuMzEwNTkyOCwxNy4wODYyOTMxIEwxMy42OTA2Mzk5LDE3LjA4NjI5MzEgWlxcXCI+PC9hbmltYXRlPlxcbiAgICA8L3BhdGg+XFxuPC9zdmc+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCI2NTUyMDI0ZDU3NzQwYjBl
46184NTY5MzVlMjhiMjk1ZTEyMDkwOGQ4NWRjYjM2ZGU4NTI2ZDg3MDFiMTY1YzUxZGJhMDJhZWQ3MDM0MmNlZWEwODIwMGMyYzZkODU4NjM5ZTEzMjg4MTkzNjNlYzRiYzJmZGNiNDAzZTk0ODFhNjMyZVwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPSdiLXlhbmRleC1tYXBfX3pvb20tY29udHJvbHMnPlxcbiAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgaWQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiaWRcIixcIm1hdGNoXCI6W1wiaWRcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiLWluXFxcIiBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX196b29tLWJ0blxcXCI+XFxuICAgICAgICA8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCJcXG4gICAgICAgICAgICAgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiXFxuICAgICAgICAgICAgIHdpZHRoPVxcXCIxMlxcXCJcXG4gICAgICAgICAgICAgaGVpZ2h0PVxcXCIxMlxcXCJcXG4gICAgICAgICAgICAgdmlld0JveD1cXFwiMCAwIDEyIDEyXFxcIlxcbiAgICAgICAgICAgICBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX196b29tLWljb24gYi15YW5kZXgtbWFwX196b29tLWljb25fcGx1c19pY29uXFxcIj5cXG4gICAgICAgICAgICA8cGF0aCBpZD1cXFwiZDNsMGFcXFwiIGQ9XFxcIk0xNzcyIDEyNDdhMSAxIDAgMCAxIDIgMHYxMGExIDEgMCAwIDEtMiAwelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgIDxwYXRoIGlkPVxcXCJkM2wwYlxcXCIgZD1cXFwiTTE3NzggMTI1MWExIDEgMCAwIDEgMCAyaC0xMGExIDEgMCAwIDEgMC0yelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0xNzY3IC0xMjQ2KVxcXCI+XFxuICAgICAgICAgICAgICAgIDx1c2UgZmlsbD1cXFwiIzY2NlxcXCIgeGxpbms6aHJlZj1cXFwiI2QzbDBhXFxcIj48L3VzZT5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTE3NjcgLTEyNDYpXFxcIj5cXG4gICAgICAgICAgICAgICAgPHVzZSBmaWxsPVxcXCIjNjY2XFxcIiB4bGluazpocmVmPVxcXCIjZDNsMGJcXFwiPjwvdXNlPlxcbiAgICAgICAgICAgIDwvZz5cXG4gICAgICAgIDwvc3ZnPlxcbiAgICA8L2J1dHRvbj5cXG4gICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGlkPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImlkXCIsXCJtYXRjaFwiOltcImlkXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIi1vdXRcXFwiIGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX3pvb20tYnRuXFxcIj5cXG4gICAgICAgIDxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIlxcbiAgICAgICAgICAgICB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCJcXG4gICAgICAgICAgICAgd2lkdGg9XFxcIjEyXFxcIlxcbiAgICAgICAgICAgICBoZWlnaHQ9XFxcIjEyXFxcIlxcbiAgICAgICAgICAgICB2aWV3Qm94PVxcXCIwIDAgMTIgMlxcXCJcXG4gICAgICAgICAgICAgY2xhc3M9XFxcImIteWFuZGV4LW1hcF9fem9vbS1pY29uIGIteWFuZGV4LW1hcF9fem9vbS1pY29uX21pbnVzX2ljb25cXFwiPlxcbiAgICAgICAgICAgIDxwYXRoIGlkPVxcXCJjaWhqYVxcXCIgZD1cXFwiTTE3NzggMTI4M2ExIDEgMCAwIDEgMCAyaC0xMGExIDEgMCAwIDEgMC0yelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0xNzY3IC0xMjgzKVxcXCI+XFxuICAgICAgICAgICAgICAgIDx1c2UgZmlsbD1cXFwiIzY2NlxcXCIgeGxpbms6aHJlZj1cXFwiI2NpaGphXFxcIj48L3VzZT5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICA8L3N2Zz5cXG4gICAgPC9idXR0b24+XFxuPC9kaXY+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJjMTM1ODFhOWRhN2EyMTY5YmJhNmRkMGIyM2E4NDQzZmEzZDMxYzUzNDkxZTgwYTA4Y2EyZDQzMTBlNDAyN2U2ZTM3ZjhiZDBkODUxYjNiMjEwMmQ4NmI2ZDZhMmE4OTc2ZDlhNjNmNTFjN2UzZmEzYzc1OGExNGRhYWFkYjMxZFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8dWwgY2xhc3M9XFxcImItbGVnZW5kLWxpc3RcXFwiPlxcbiAgICA8bGk+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy95YW5kZXgtbWFwL3Bpbi15ZWxsb3cucG5nXFxcIiBjbGFzcz1cXFwiYi1sZWdlbmQtbGlzdF9faW1nXFxcIiBhbHQ9XFxcItCi0LXQutGD0YnQuNC1INC/0YDQvtC10LrRgtGLXFxcIj5cXG4gICAgICAgINCi0LXQutGD0YnQuNC1INC/0YDQvtC10LrRgtGLXFxuICAgIDwvbGk+XFxuICAgIDxsaT5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3lhbmRleC1tYXAvcGluLXdoaXRlLnBuZ1xcXCIgY2xhc3M9XFxcImItbGVnZW5kLWxpc3RfX2ltZ1xcXCIgYWx0PVxcXCLQoNC10LDQu9C40LfQvtCy0LDQvdC90YvQtSDQv9GA0L7QtdC60YLRi1xcXCI+XFxuICAgICAgICDQoNC10LDQu9C40LfQvtCy0LDQvdC90YvQtSDQv9GA0L7QtdC60YLRi1xcbiAgICA8L2xpPlxcbjwvdWw+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJhMzMwNDRlYzc2NTdiYWQ2YmI3YmM0MTc0MmY4MjU2NzJmZTM1ODQwYjEzMzc1Nzc2YmIyOTg4MTZiZDQzM2FjNmNmM2IzZWE1ZjlkODQ3OTgwNThjYzIzYmE0ZTM0M2VjYjlhNTA0ZGZhYjE5MzNjMzY1OGY4ODRlMzc2MTg3ZFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX2h0bWwtbWFya2VyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX19odG1sLW1hcmtlci10aXRsZVxcXCI+IFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGl0bGVcIixcIm1hdGNoXCI6W1widGl0bGVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX2h0bWwtbWFya2VyLXRleHRcXFwiPiBcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRleHRcIixcIm1hdGNoXCI6W1widG
46184V4dFwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImIteWFuZGV4LW1hcF9faHRtbC1tYXJrZXItaWNvblxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJpY29uXCIsXCJtYXRjaFwiOltcImljb25cIl19LHtcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLmtleS5wZXJpb2RcIixcImtleVwiOlwic3JjXCJ9XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIiBhbHQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiaWNvblwiLFwibWF0Y2hcIjpbXCJpY29uXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkucGVyaW9kXCIsXCJrZXlcIjpcImFsdFwifV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcXCI+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwidmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiZjYwOTA2MWRiNDg1MGJiMDc4NTliOTAzMDQ0MDNlZDgwNWQxN2IxYjc3MWE5ZGY1Y2YwMTg2OTZiMjEyNTEyZTZkNjcxM2EyMjc1ZWFkNTljMDJhNjExOGJmYTE3YjE1MWFmNjhkNTY4MzM0MjNhMTFiNzg0NGFhZTAwYjVjNWZcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPGRpdiBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX19odG1sLW1hcmtlci0yXFxcIj4gXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJ0aXRsZVwiLFwibWF0Y2hcIjpbXCJ0aXRsZVwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgPC9kaXY+XCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCI5YzEzZjA4ZWQ3Njc0MTY2OTVmYjQ4NGI3ODk4ZWRjOWVmMzUzN2RlNjQ1ODM1M2Q2MGZkN2FkMGFiNDk3ZWIwM2E4MDkyYWUxOTBmODc4ZWVjMjA4MzgxMWUyNjY3NzFhNjU4YjQ1ODA4NDIzZDc3YTMwZDEyYWQ4ZmM1NDhmY1wiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX2h0bWwtdGV4dFxcXCI+XFxuICAgIFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGV4dFwiLFwibWF0Y2hcIjpbXCJ0ZXh0XCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcbjwvZGl2PlwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3pCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSkE7QUFNQTtBQUNBO0FBWkE7QUFDQTtBQVlBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMzQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUdBOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBN0NBO0FBK0NBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVBBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFwSEE7Ozs7Ozs7Ozs7O0FDMUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEJBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFuQ0E7Ozs7Ozs7Ozs7OztBQ2hEQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcEZBO0FBQUE7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFUQTtBQUNBO0FBVUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOzs7Ozs7Ozs7Ozs7QUN6QkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUZBO0FBR0E7QUFBQTtBQUVBO0FBTEE7QUFNQTtBQUFBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0Q0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUN4QkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkE
461847QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQVRBO0FBQ0E7QUFVQTtBQUNBOzs7Ozs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcEVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNGQTs7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTUE7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBOzs7Ozs7Ozs7Ozs7O0FDOUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBOzs7Ozs7Ozs7OztBQ3pDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDeENBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFFQTtBQUNBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ05BOzs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFDQTs7O0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBbEJBO0FBbUJBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFMQTtBQU1BOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQWZBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzdCQTs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDaEZBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFDQTs7O0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQXZFQTtBQUNBO0FBeUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBQ0E7QUFXQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFDQTtBQU1BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDL2RBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0F
46184BQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbERBO0FBb0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNuUkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFKQTs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUlBOzs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBSUE7Ozs7Ozs7Ozs7OztBQ2JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBekJBOzs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFJQTtBQVBBOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFaQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFKQTs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVRBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQWZBOzs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBTkE7Ozs7Ozs7Ozs7O0FDZkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBTkE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBR0E7QUFMQTs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQW5CQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBTEE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUhBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFqREE7Ozs7Ozs7Ozs7OztBQy9EQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDRkE
461847QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBSkE7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWZBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhDQTs7Ozs7Ozs7Ozs7QUNwUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBOzs7Ozs7Ozs7OztBQ1RBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpCQTs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWEE7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ2hDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBSEE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBREE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBakJBO0FBQ0E7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7OztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7OztBQ3JJQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBVkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFEQTtBQUNBO0FBZkE7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFKQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFaQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBUkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBOzs7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUhBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBYkE7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUNBO0FBZUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6T0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQWRBO0FBQ0E7QUFnQkE7Ozs7Ozs7Ozs7O0FDN0NBO0FBQ0E7QUFBQTtBQUNBO0FBREE7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFDQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0RBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBQ0E7QUFXQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVVBOzs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7Ozs7Ozs7Ozs7O0FDREE7QUFDQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE
461847Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBOzs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUhBOzs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWJBOzs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFSQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQXBEQTtBQUNBO0FBc0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQVlBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBM0NBO0FBOENBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFYQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDZEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBSEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBUkE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ05BOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7Ozs7Ozs7Ozs7O0FDREE7QUFDQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBL0JBO0FBQ0E7QUFpQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDekRBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDRkE
461847QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7O0FDck1BOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkJBO0FBMEJBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQWhDQTtBQW1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9DQTtBQWtEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUExQkE7QUE2QkE7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFkQTtBQWlCQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUVBOzs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQS9CQTtBQUNBO0FBaUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQXhGQTtBQTJGQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBMU5BO0FBNk5BOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7Ozs7QUFJQTtBQUxBO0FBQ0E7QUFPQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBakRBO0F
46184Bb0RBOzs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWhFQTtBQW1FQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBMUJBO0FBNkJBOzs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZEQTtBQTBEQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFsQkE7QUFxQkE7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEzQ0E7QUE4Q0E7Ozs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpGQTtBQTRGQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUVBOzs7OztBQUlBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBR0E7Ozs7O0FBS0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBNUNBO0FBNURBO0FBNEdBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpQQTtBQW9QQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsREE7QUFzREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLF
46184dBSUE7QUFFQTs7Ozs7Ozs7Ozs7O0FDbGxGQTtBQUFBO0FBR0E7Ozs7QUFHQTtBQUdBOzs7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXJDQTtBQXlDQTs7Ozs7Ozs7Ozs7O0FDckRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3JGQTtBQUFBO0FBQUE7QUFBQTtBQUdBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuQkE7QUFEQTtBQXlCQTs7OztBQUdBO0FBR0E7Ozs7QUFHQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7Ozs7Ozs7QUFNQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBaERBO0FBbURBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4RUE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBZkE7QUFtQkE7Ozs7Ozs7Ozs7OztBQy9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUVBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTs7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUExRUE7QUErRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBcEJBO0FBeUJBOzs7Ozs7Ozs7Ozs7QUNwSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFEQTs7Ozs7Ozs7Ozs7O0FDekJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUVBOzs7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBRUE7Ozs7QUFHQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBOzs7OztBQUlBO0FBRUE7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBS0E7QUFDQTs7O0FBR0E7QUFHQTs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxHQTtBQXVHQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0TUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQWNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQU9BO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcEVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUVBOzs7OztBQUdBO0FBRUE7Ozs7Ozs7Ozs7OztBQ3JFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBU0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7O0F
46184BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBTkE7QUFRQTtBQUdBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWZBO0FBaUJBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBNUJBO0FBOEJBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyVEE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvQkE7QUFDQTtBQXNDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWhCQTtBQWtCQTs7Ozs7Ozs7Ozs7O0FDdEJBO0FBQUE7QUFHQTs7Ozs7OztBQU1BO0FBR0E7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUdBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7O0FBR0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVGQTtBQUFBO0FBQUE7QUFHQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2QkE7QUFBQTtBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBWUE7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNGQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BCQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQTlCQTtBQW1DQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVCQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
46184BRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlEQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdEJBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFqQ0E7QUFDQTtBQW1DQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoREE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7O0FDaEJBO0FBQUE7QUFBQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzREE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBR0E7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFmQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFmQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBOzs7Ozs7Ozs7Ozs7QUN4VEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUF4QkE7QUFDQTtBQTBCQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25DQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUFBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQ0E7QUFBQTtBQUdBOzs7O0FBR0E7QUFDQTtBQU9BOzs7Ozs7Ozs7Ozs7QUNkQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOzs7OztBQUtBO0FBT0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFPQTtBQWRBO0FBaUJBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7QUFJQTtBQUVBO0FBQ0E7QUFBQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEVBO0FBQ0E7QUFxRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkdBO0F
46184BQUE7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7O0FDREE7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQUFBO0FBQ0E7QUFVQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFtQkE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQTVEQTtBQUFBO0FBQ0E7QUEyREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBM0lBO0FBQ0E7QUE0SUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDNVNBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNYQTs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbERBO0FBQUE7QUFvREE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBRkE7QUFPQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwRUE7QUFEQTtBQXdFQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM1BBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFUQTtBQWNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFUQTtBQURBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQURBO0FBSkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQXFCQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQURBO0FBTUE7QUFDQTtBQVRBO0FBcERBO0FBZ0VBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoR0E7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeERBO0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQVRBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBN0hBO0FBK0hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQTVnQkE7QUFDQTtBQTZnQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFvQkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBVkE7QUFZQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhCQTtBQUNBO0FBd0JBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUN
46184BO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXBDQTtBQUNBO0FBcUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBckZBO0FBdUZBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEJBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFqQ0E7QUFtQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVZQTtBQUNBO0FBNllBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBbkJBO0FBcUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRkE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBL0ZBO0FBaUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4ckZBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FJQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBREE7QUFIQTtBQVVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUEzQ0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFMQTtBQU9BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUE5REE7QUFnRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQS9FQTtBQWdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBN2RBO0FBK2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQWxmQTtBQStmQTtBQUNBOzs7Ozs7Ozs7OztBQ3hpQkE7QUFDQTt
46184BQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNKQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUVBO0FBQ0E7QUFnRkE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUE5S0E7QUFDQTtBQWdMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQTtBQWJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1QkE7QUF2QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBbkNBO0FBc0NBO0FBdENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXZEQTtBQUFBO0FBNkRBO0FBQ0E7QUE5REE7QUFpRUE7QUFqRUE7QUFvRUE7QUFFQTtBQUVBO0FBeEVBO0FBNkVBO0FBQ0E7QUFFQTtBQUVBO0FBbEZBO0FBc0ZBO0FBdEZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFqR0E7QUFBQTtBQUFBO0FBQUE7QUF1SEE7QUF2SEE7QUFBQTtBQTRIQTtBQUNBO0FBN0hBO0FBK0hBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUVBO0FBQ0E7QUExSUE7QUE2SUE7QUFDQTtBQTlJQTtBQWdKQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdKQTtBQWdLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyS0E7QUF5S0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBZkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFPQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBSUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhFQTtBQTJFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBUUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUdBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpOQTtBQW9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFqTUE7QUFuVEE7QUF3ZkE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQU5BO0FBU0E7QUFUQTtBQWVBO0FBR0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBWkE7QUFjQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQVBBO0FBU0E7QUFUQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQU9BO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN
46184BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUtBO0FBekNBO0FBZ0RBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFHQTtBQTlFQTtBQUNBO0FBZ0ZBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaERBO0FBa0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFJQTtBQUpBO0FBT0E7QUFQQTtBQVVBO0FBVkE7QUFhQTtBQWJBO0FBZ0JBO0FBaEJBO0FBbUJBO0FBbkJBO0FBc0JBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhFQTtBQW1FQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBakhBO0FBQ0E7QUFtSEE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUpBO0FBQUE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFFQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUF6RUE7QUE0RUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBVUE7QUFTQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBOQTtBQVpBO0FBQ0E7QUFvT0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFHQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBSEE7QUFNQTtBQU5BO0FBU0E7QUFUQTtBQUFBO0FBYUE7QUFiQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6VkE7QUE4VkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM0JBO0FBOEJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUlBO0FBZ0pBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoRkE7QUFvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUEvREE7QUFrRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQWpFQTtBQW1FQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBUkE7QUFBQTtBQUFBO0FBYUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBcUJBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWJBO0FBQ0E7QUFnQkE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUF2QkE7QUF5QkE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUhBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWdCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUExQ0E7QUE1VkE7QUFDQTtBQWtaQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBSUE7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5DQTtBQUNBO0FBc0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6REE7QUE2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWxCQTtBQW9CQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBM0NBO0FBK0NBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFlQTtBQWZBO0FBQ0E7QUFrQkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU9BO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTt
46184BQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvRUE7QUFrRkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBeklBO0FBNElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFjQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBQUE7QUFQQTtBQVNBO0FBQ0E7QUFGQTtBQVJBO0FBQUE7QUFDQTtBQWdCQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFEQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBZ0JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2SkE7QUEwSkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFZQTtBQUNBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdERBO0FBd0RBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUF0QkE7QUFDQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBekNBO0FBNENBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbENBO0FBREE7QUF3Q0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBVUE7QUFDQTtBQUVBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMUNBO0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXhDQTtBQTNDQTtBQUNBO0FBc0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFIQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBckNBO0FBQ0E7QUF1Q0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUpBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF4SEE7QUEySEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUxBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBWUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBWEE7QUFEQTtBQWdCQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVFQTtBQUNBO0FBK0VBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFWQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBS0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBWUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZCQTtBQURBO0FBNEJBO0FBQ0E7QUFDQTtBQUZBO0FBN0RBO0FBb0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2QkE7QUF5QkE7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3SkE7QUFtS0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsRUE7QUFxRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBY0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBdEVBO0FBZkE7QUFEQTtBQUNBO0FBMkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRkE7QUFNQTtBQUNBO0FBaEtBO0FBb0tBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTt
46184BQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbENBO0FBc0NBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQVBBO0FBQUE7QUFDQTtBQVVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUEzQkE7QUE4QkE7QUE5QkE7QUFpQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQVpBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQTlEQTtBQW9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFIQTtBQU1BO0FBTkE7QUFBQTtBQVVBO0FBVkE7QUFhQTtBQWJBO0FBZ0JBO0FBaEJBO0FBbUJBO0FBbkJBO0FBc0JBO0FBdEJBO0FBeUJBO0FBekJBO0FBNEJBO0FBNUJBO0FBK0JBO0FBL0JBO0FBa0NBO0FBbENBO0FBd0NBO0FBeENBO0FBQUE7QUE0Q0E7QUE1Q0E7QUErQ0E7QUEvQ0E7QUFBQTtBQW1EQTtBQW5EQTtBQXNEQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQXBFQTtBQUNBO0FBQ0E7QUFzRUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQTFoQkE7QUE2aEJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBV0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvREE7QUFDQTtBQWtFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUEE7QUFBQTtBQVdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuSUE7QUFxSUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFSQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZCQTtBQXlCQTtBQUNBO0FBS0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBU0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVdBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBakRBO0F
46184Bb0RBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhHQTtBQUNBO0FBMkdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBbEJBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzblVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlOQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7OztBQ3ZMQTs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUlBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBck1BO0FBdU1BO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzV0QkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRHQUlBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFMQTtBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFRQTtBQUNBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTs7OztBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFhQTs7OztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQVFBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUE7QUFiQTtBQUNBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBRkE7QUFLQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBVEE7QUFXQTtBQVhBO0FBYUE7QUFiQTtBQWVBO0FBZkE7QUFpQkE7QUFqQkE7QUFtQkE7QUFuQkE7QUFzQkE7QUF0QkE7QUFBQTtBQUNBO0FBeUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEZBO0FBQ0E7QUEwRkE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFKQTtBQU9BO0FBUEE
461847QUFBQTtBQVdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBcENBO0FBc0NBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBSUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFqQkE7QUFvQkE7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFHQTtBQUhBO0FBTUE7QUFOQTtBQUFBO0FBQUE7QUFZQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBSUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQWJBO0FBQ0E7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFJQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5DQTtBQXNDQTtBQUNBO0FBQ0E7QUFXQTtBQWJBO0FBQ0E7QUE2QkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVZBO0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhCQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBeEJBO0FBMkJBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQVZBO0FBWUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNUZBO0FBK0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhDQTtBQW1DQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0QkE7QUF5QkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBZUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6R0E7QUE0R0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFnQkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEZBO0FBbUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUEzQkE7QUE4QkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkNBO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM0RBO0FBK0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBOUNBO0FBa0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBaEJBO0FBbUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFqREE7QUFvREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyREE7QUF3REE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFnQkE7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBWEE7QUFjQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFnQkE7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUFBO0FBRUE7QUFGQTtBQUlBO0FBSkE7QUFNQTtBQU5BO0FBQUE7QUFBQTtBQVFBO0FBUkE7QUFVQTtBQVZBO0FBQUE7QUFDQTtBQVdBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUFBO0FBRUE7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsRkE7QUFDQTtBQW1GQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvSUE7QUFpSkE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQU5BO0FBU0E7QUFHQTtBQUVBO0FBUEE7QUFTQTtBQUdBO0FBRUE7QUFHQTtBQUVBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUdBO0FBQ0E7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUN
46184BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsc0JBO0FBQ0E7QUFvc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFaQTtBQWNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExQkE7QUE0QkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBL1JBO0FBQ0E7QUFpU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBbkJBO0FBcUJBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXBDQTtBQXNDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQWZBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqQkE7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5Q0E
461847QUFnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOU5BO0FBQ0E7QUFnT0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBekJBO0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQTdDQTtBQWdEQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUEzQ0E7QUE4Q0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBMUJBO0FBNkJBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBbEJBO0FBb0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBcEpBO0FBdUpBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBN0NBO0FBZ0RBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFuQ0E7QUFzQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVlBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBdENBO0FBeUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQWhGQTtBQW1GQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBMkJBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQW5EQTtBQXNEQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQW5DQTtBQXNDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQXRGQTtBQXlGQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBeEJBO0FBNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBMURBO0FBNkRBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQTNDQTtBQThDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQXZFQTtBQTBFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQW5HQTtBQXFHQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBVUE7Ozs7QUFHQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUVBOzs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBekNBO0FBQ0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9CQTtBQWlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBSUE7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUF4aFBBO0FBMUNBO0FBbWtQQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0FDOWtQQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUV
46184BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHJCQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekRBOzs7Ozs7QUFNQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQU1BO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7OztBQ3hOQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVFBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRUE
461847Ozs7OztBQU1BOzs7QUFJQTtBQUVBOzs7O0FBR0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9CQTs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkZBOzs7Ozs7QUFNQTs7O0FBR0E7QUFDQTtBQUdBOzs7O0FBR0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTs7O0FBR0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7OztBQzlNQTs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWZBO0FBaUJBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSEE7Ozs7OztBQU1BOzs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBVUE7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBc0JBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQXJKQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBcUpBOzs7Ozs7Ozs7Ozs7QUMvUkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdERBOzs7Ozs7QUFNQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaGFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUEE7Ozs7O0FBS0E7OztBQUdBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFLQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JVQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7O0FDekdBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTs7O0FBR0E7QUFFQTs7Ozs7QUFJQTtBQUVBOzs7OztBQUlBO0FBRUE7Ozs7QUFHQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5Q0E
461847QUFpREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFGQTtBQU9BOzs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWVBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFGQTtBQU9BO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBTEE7QUFPQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQW5DQTtBQXVDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFDQTtBQWNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFYQTtBQUNBO0FBYUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVVBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBUUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7O0FBR0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQTdIQTtBQWlJQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUFHQTtBQUNBO0FBQUE7QUFDQTs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxCQTtBQUNBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFHQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FDNzRCQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIQTs7OztBIiwic291cmNlUm9vdCI6IiJ9
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.